use serde::Deserialize; use serde_json::Value; #[derive(Debug, Deserialize)] pub struct Root { pub did: String, pub time_us: i64, pub kind: String, pub commit: Option, } #[derive(Debug, Deserialize)] pub struct Commit { pub rev: String, pub operation: String, pub collection: String, pub rkey: String, pub record: Value, pub cid: String, } #[derive(Debug, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct Blob { #[serde(rename = "$type")] pub r#type: String, pub r#ref: Ref, pub mime_type: String, pub size: i32, } #[derive(Debug, Deserialize, Clone)] pub struct Ref { #[serde(rename = "$link")] pub link: String, } #[derive(Debug, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct ScrobbleRecord { #[serde(skip_serializing_if = "Option::is_none")] pub track_number: Option, #[serde(skip_serializing_if = "Option::is_none")] pub disc_number: Option, pub title: String, pub artist: String, pub album_artist: String, pub album: String, pub duration: i32, #[serde(skip_serializing_if = "Option::is_none")] pub release_date: Option, #[serde(skip_serializing_if = "Option::is_none")] pub year: Option, #[serde(skip_serializing_if = "Option::is_none")] pub genre: Option, #[serde(skip_serializing_if = "Option::is_none")] pub tags: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub composer: Option, #[serde(skip_serializing_if = "Option::is_none")] pub lyrics: Option, #[serde(skip_serializing_if = "Option::is_none")] pub copyright_message: Option, #[serde(skip_serializing_if = "Option::is_none")] pub wiki: Option, #[serde(skip_serializing_if = "Option::is_none")] pub album_art: Option, #[serde(skip_serializing_if = "Option::is_none")] pub youtube_link: Option, #[serde(skip_serializing_if = "Option::is_none")] pub spotify_link: Option, #[serde(skip_serializing_if = "Option::is_none")] pub tidal_link: Option, #[serde(skip_serializing_if = "Option::is_none")] pub apple_music_link: Option, pub created_at: String, #[serde(skip_serializing_if = "Option::is_none")] pub label: Option, #[serde(skip_serializing_if = "Option::is_none")] pub mbid: Option, } #[derive(Debug, Deserialize)] pub struct ProfileResponse { pub uri: String, pub cid: String, pub value: Profile, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Profile { #[serde(rename = "$type")] pub r#type: String, pub avatar: Option, pub banner: Option, pub created_at: Option, pub pinned_post: Option, pub description: Option, pub display_name: Option, pub handle: Option, } #[derive(Debug, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct ImageBlob { #[serde(rename = "$type")] pub r#type: String, #[serde(rename = "ref")] pub r#ref: BlobRef, pub mime_type: String, pub size: u64, } #[derive(Debug, Deserialize, Clone)] pub struct BlobRef { #[serde(rename = "$link")] pub link: String, } #[derive(Debug, Deserialize)] pub struct PinnedPost { pub cid: String, pub uri: String, } #[derive(Debug, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct ArtistRecord { pub name: String, #[serde(skip_serializing_if = "Option::is_none")] pub bio: Option, #[serde(skip_serializing_if = "Option::is_none")] pub picture: Option, #[serde(skip_serializing_if = "Option::is_none")] pub tags: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub born: Option, #[serde(skip_serializing_if = "Option::is_none")] pub died: Option, #[serde(skip_serializing_if = "Option::is_none")] pub born_in: Option, pub created_at: String, } #[derive(Debug, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct AlbumRecord { pub title: String, pub artist: String, #[serde(skip_serializing_if = "Option::is_none")] pub duration: Option, #[serde(skip_serializing_if = "Option::is_none")] pub release_date: Option, #[serde(skip_serializing_if = "Option::is_none")] pub year: Option, #[serde(skip_serializing_if = "Option::is_none")] pub genre: Option, #[serde(skip_serializing_if = "Option::is_none")] pub album_art: Option, #[serde(skip_serializing_if = "Option::is_none")] pub tags: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub youtube_link: Option, #[serde(skip_serializing_if = "Option::is_none")] pub spotify_link: Option, #[serde(skip_serializing_if = "Option::is_none")] pub tidal_link: Option, #[serde(skip_serializing_if = "Option::is_none")] pub apple_music_link: Option, pub created_at: String, } #[derive(Debug, Deserialize, Clone)] #[serde(rename_all = "camelCase")] pub struct SongRecord { pub title: String, pub artist: String, pub album: String, pub album_artist: String, pub duration: i32, pub created_at: String, #[serde(skip_serializing_if = "Option::is_none")] pub track_number: Option, #[serde(skip_serializing_if = "Option::is_none")] pub disc_number: Option, #[serde(skip_serializing_if = "Option::is_none")] pub genre: Option, #[serde(skip_serializing_if = "Option::is_none")] pub release_date: Option, #[serde(skip_serializing_if = "Option::is_none")] pub year: Option, #[serde(skip_serializing_if = "Option::is_none")] pub tags: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub composer: Option, #[serde(skip_serializing_if = "Option::is_none")] pub lyrics: Option, #[serde(skip_serializing_if = "Option::is_none")] pub copyright_message: Option, #[serde(skip_serializing_if = "Option::is_none")] pub wiki: Option, #[serde(skip_serializing_if = "Option::is_none")] pub album_art: Option, #[serde(skip_serializing_if = "Option::is_none")] pub youtube_link: Option, #[serde(skip_serializing_if = "Option::is_none")] pub spotify_link: Option, #[serde(skip_serializing_if = "Option::is_none")] pub tidal_link: Option, #[serde(skip_serializing_if = "Option::is_none")] pub apple_music_link: Option, #[serde(skip_serializing_if = "Option::is_none")] pub label: Option, #[serde(skip_serializing_if = "Option::is_none")] pub mbid: Option, }