use schemars::JsonSchema; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, JsonSchema)] pub(super) struct ArtistCard { pub(super) id: i64, pub(super) name: String, pub(super) image_url: Option, pub(super) release_count: i64, pub(super) track_count: i64, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct Paginated { pub(super) items: Vec, pub(super) total: i64, pub(super) page: i32, pub(super) per_page: i32, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct ReleaseCard { pub(super) id: i64, pub(super) title: String, pub(super) release_type: String, pub(super) year: Option, pub(super) cover_url: Option, pub(super) track_count: i64, pub(super) uploaders: Vec, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct ArtistDetail { pub(super) id: i64, pub(super) name: String, pub(super) image_url: Option, pub(super) total_track_count: i64, pub(super) total_play_count: i64, pub(super) top_tracks: Vec, pub(super) releases: Vec, pub(super) featured_tracks: Vec, } #[derive(Debug, Clone, Serialize, JsonSchema)] pub(super) struct ArtistRef { pub(super) id: i64, pub(super) name: String, } #[derive(Debug, Clone, Serialize, JsonSchema)] pub(super) struct TrackItem { pub(super) id: i64, pub(super) title: String, pub(super) track_number: Option, pub(super) disc_number: Option, pub(super) duration_seconds: f64, pub(super) artists: Vec, pub(super) featured_artists: Vec, pub(super) release_id: i64, pub(super) release_title: String, pub(super) release_year: Option, pub(super) cover_url: Option, pub(super) stream_url: String, pub(super) uploader_name: String, pub(super) audio_format: Option, pub(super) audio_bitrate: Option, pub(super) audio_sample_rate: Option, pub(super) audio_bit_depth: Option, pub(super) file_size_bytes: Option, pub(super) lastfm_listeners: Option, pub(super) lastfm_playcount: Option, pub(super) lastfm_rating: Option, pub(super) lastfm_updated_at: Option, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct ArtistAppearanceTrack { pub(super) id: i64, pub(super) title: String, pub(super) release_id: i64, pub(super) release_title: String, pub(super) release_year: Option, pub(super) duration_seconds: f64, pub(super) artists: Vec, pub(super) featured_artists: Vec, pub(super) cover_url: Option, pub(super) stream_url: String, pub(super) uploader_name: String, pub(super) audio_format: Option, pub(super) audio_bitrate: Option, pub(super) audio_sample_rate: Option, pub(super) audio_bit_depth: Option, pub(super) file_size_bytes: Option, pub(super) lastfm_listeners: Option, pub(super) lastfm_playcount: Option, pub(super) lastfm_rating: Option, pub(super) lastfm_updated_at: Option, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct ReleaseDetail { pub(super) id: i64, pub(super) title: String, pub(super) release_type: String, pub(super) year: Option, pub(super) cover_url: Option, pub(super) artists: Vec, pub(super) tracks: Vec, pub(super) uploaders: Vec, } #[derive(Debug, Clone, Serialize, JsonSchema)] pub(super) struct UploaderSummary { pub(super) name: String, pub(super) track_count: i64, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct PlaylistCard { pub(super) id: i64, pub(super) title: String, pub(super) track_count: i64, pub(super) is_own: bool, pub(super) owner_name: Option, pub(super) is_public: bool, pub(super) is_saved: bool, pub(super) kind: String, } #[derive(Debug, Serialize, Deserialize, JsonSchema)] pub(super) struct PlaybackStateDto { pub(super) current_track_id: Option, pub(super) position_ms: i32, pub(super) queue: Vec, pub(super) queue_position: i32, pub(super) shuffle: bool, pub(super) repeat_mode: String, pub(super) volume: f64, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct DeviceHeartbeatRequest { pub(super) device_id: String, pub(super) user_agent: Option, pub(super) current_jam_id: Option, pub(super) playback_state: Option, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct DeviceSelectRequest { pub(super) device_id: String, pub(super) current_device_id: Option, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct DeviceCommandRequest { pub(super) target_device_id: Option, pub(super) jam_id: Option, pub(super) command: String, #[serde(default)] pub(super) payload: serde_json::Value, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct PlayerDeviceDto { pub(super) id: String, pub(super) name: String, pub(super) kind: String, pub(super) is_current: bool, pub(super) is_active: bool, pub(super) last_seen_ms: i64, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct PlayerJamDto { pub(super) id: String, pub(super) name: String, pub(super) host_user_id: i64, pub(super) host_name: String, pub(super) is_owner: bool, pub(super) is_member: bool, pub(super) is_pending: bool, pub(super) is_active: bool, pub(super) member_count: i64, pub(super) host_last_seen_ms: i64, pub(super) host_device_online: bool, pub(super) members: Vec, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct PlayerJamMemberDto { pub(super) user_id: i64, pub(super) name: String, pub(super) is_joined: bool, pub(super) is_current_user: bool, pub(super) last_seen_ms: i64, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct PlayerJamCreateRequest { pub(super) device_id: String, #[serde(default)] pub(super) invitee_user_ids: Vec, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct PlayerJamInviteRequest { pub(super) jam_id: String, pub(super) device_id: String, #[serde(default)] pub(super) invitee_user_ids: Vec, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct PlayerJamJoinRequest { pub(super) jam_id: String, pub(super) device_id: String, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct PlayerJamLeaveRequest { pub(super) jam_id: String, pub(super) device_id: String, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct PlayerJamUserDto { pub(super) id: i64, pub(super) username: String, pub(super) display_name: Option, pub(super) email: Option, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct PlayerDeviceCommandDto { pub(super) id: String, pub(super) command: String, pub(super) payload: serde_json::Value, } #[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] pub(super) struct PlayerDevicePlaybackStateDto { pub(super) track: Option, #[serde(default)] pub(super) tracks: Vec, pub(super) index: i32, pub(super) position_seconds: f64, pub(super) duration_seconds: f64, pub(super) paused: bool, pub(super) shuffle: bool, pub(super) repeat_mode: String, pub(super) volume: f64, #[serde(default)] pub(super) updated_at_ms: i64, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct PlayerDevicesResponse { pub(super) device_id: String, pub(super) active_device_id: Option, pub(super) devices: Vec, pub(super) jams: Vec, pub(super) current_jam_id: Option, pub(super) playback_state: Option, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct PlayerDevicePollResponse { pub(super) device_id: String, pub(super) active_device_id: Option, pub(super) devices: Vec, pub(super) jams: Vec, pub(super) current_jam_id: Option, pub(super) commands: Vec, pub(super) playback_state: Option, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct PlaylistDetail { pub(super) id: i64, pub(super) title: String, pub(super) description: Option, pub(super) is_own: bool, pub(super) owner_name: Option, pub(super) is_public: bool, pub(super) is_saved: bool, pub(super) kind: String, pub(super) tracks: Vec, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct SearchResults { pub(super) artists: Vec, pub(super) releases: Vec, pub(super) tracks: Vec, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct UserStats { pub(super) liked_tracks: i64, pub(super) playlists: i64, pub(super) plays: i64, pub(super) listened_minutes: i64, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct UserProfile { pub(super) id: i64, pub(super) name: String, pub(super) role: String, pub(super) stats: UserStats, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct LastfmStatus { pub(super) configured: bool, pub(super) connected: bool, pub(super) username: Option, pub(super) reauth_required: bool, pub(super) last_error: Option, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct LastfmActionResponse { pub(super) ok: bool, pub(super) queued: bool, pub(super) sent: bool, pub(super) message: Option, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct LastfmNowPlayingRequest { pub(super) track_id: i64, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct LastfmScrobbleRequest { pub(super) track_id: i64, pub(super) started_at: Option, pub(super) listened_seconds: i32, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct AgentQueueStatus { pub(super) queued_count: i64, pub(super) processing_count: i64, } #[derive(Debug, Clone, Serialize, JsonSchema)] pub(super) struct UserUploadTrack { pub(super) track: TrackItem, pub(super) media_file_id: i64, pub(super) is_hidden: bool, pub(super) release_is_hidden: bool, pub(super) release_type: String, pub(super) year: Option, pub(super) uploaded_at: String, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct UserUploadRelease { pub(super) id: i64, pub(super) title: String, pub(super) release_type: String, pub(super) year: Option, pub(super) is_hidden: bool, pub(super) artists: Vec, pub(super) tracks: Vec, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct UserUploadReviewFields { pub(super) title: String, pub(super) artist: String, pub(super) album: String, pub(super) year: String, pub(super) track_number: String, pub(super) genre: String, pub(super) featured_artists: Vec, pub(super) release_type: String, pub(super) notes: String, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct UserUploadReviewItem { pub(super) id: i64, pub(super) status: String, pub(super) filename: String, pub(super) created_at: String, pub(super) updated_at: String, pub(super) error_message: Option, pub(super) fields: UserUploadReviewFields, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct UserUploadQueueItem { pub(super) id: i64, pub(super) status: String, pub(super) filename: String, pub(super) created_at: String, pub(super) updated_at: String, pub(super) error_message: Option, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct UserUploadsPage { pub(super) tracks: Vec, pub(super) releases: Vec, pub(super) pending: Vec, pub(super) queued: Vec, pub(super) pending_total: i64, pub(super) queued_total: i64, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct UserUploadTrackUpdateRequest { pub(super) title: Option, pub(super) artist_names: Option>, pub(super) featured_artist_names: Option>, pub(super) release_title: Option, pub(super) release_type: Option, pub(super) release_year: Option, pub(super) track_number: Option, pub(super) disc_number: Option, pub(super) is_hidden: Option, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct UserUploadReleaseUpdateRequest { pub(super) title: Option, pub(super) artist_names: Option>, pub(super) release_type: Option, pub(super) year: Option, pub(super) is_hidden: Option, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct UserUploadBulkTrackUpdateRequest { pub(super) track_ids: Vec, pub(super) artist_names: Option>, pub(super) featured_artist_names: Option>, pub(super) release_title: Option, pub(super) release_type: Option, pub(super) release_year: Option, pub(super) is_hidden: Option, } #[derive(Debug, Deserialize, JsonSchema)] pub(super) struct UserUploadReviewUpdateRequest { pub(super) title: Option, pub(super) artist: Option, pub(super) album: Option, pub(super) year: Option, pub(super) track_number: Option, pub(super) genre: Option, pub(super) featured_artists: Option>, pub(super) release_type: Option, pub(super) notes: Option, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct PlayHistoryItem { pub(super) id: i64, pub(super) track_id: i64, pub(super) track_title: String, pub(super) release_title: Option, pub(super) track: TrackItem, pub(super) played_at: String, pub(super) duration_listened: Option, pub(super) completed: bool, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct PlayHistoryPage { pub(super) items: Vec, pub(super) total: i64, pub(super) page: i32, pub(super) per_page: i32, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct LikeStatus { pub(super) liked: bool, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct LikedIds { pub(super) track_ids: Vec, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct FollowStatus { pub(super) followed: bool, } #[derive(Debug, Serialize, JsonSchema)] pub(super) struct FollowedArtists { pub(super) artist_ids: Vec, pub(super) artists: Vec, }