A decentralized music tracking and discovery platform built on AT Protocol 馃幍
at fix/spotify 217 lines 7.0 kB view raw
1use serde::Deserialize; 2use serde_json::Value; 3 4#[derive(Debug, Deserialize)] 5pub struct Root { 6 pub did: String, 7 pub time_us: i64, 8 pub kind: String, 9 pub commit: Option<Commit>, 10} 11 12#[derive(Debug, Deserialize)] 13pub struct Commit { 14 pub rev: String, 15 pub operation: String, 16 pub collection: String, 17 pub rkey: String, 18 pub record: Value, 19 pub cid: String, 20} 21 22#[derive(Debug, Deserialize, Clone)] 23#[serde(rename_all = "camelCase")] 24pub struct Blob { 25 #[serde(rename = "$type")] 26 pub r#type: String, 27 pub r#ref: Ref, 28 pub mime_type: String, 29 pub size: i32, 30} 31 32#[derive(Debug, Deserialize, Clone)] 33pub struct Ref { 34 #[serde(rename = "$link")] 35 pub link: String, 36} 37 38#[derive(Debug, Deserialize, Clone)] 39#[serde(rename_all = "camelCase")] 40pub struct ScrobbleRecord { 41 #[serde(skip_serializing_if = "Option::is_none")] 42 pub track_number: Option<i32>, 43 #[serde(skip_serializing_if = "Option::is_none")] 44 pub disc_number: Option<i32>, 45 pub title: String, 46 pub artist: String, 47 pub album_artist: String, 48 pub album: String, 49 pub duration: i32, 50 #[serde(skip_serializing_if = "Option::is_none")] 51 pub release_date: Option<String>, 52 #[serde(skip_serializing_if = "Option::is_none")] 53 pub year: Option<i32>, 54 #[serde(skip_serializing_if = "Option::is_none")] 55 pub genre: Option<String>, 56 #[serde(skip_serializing_if = "Option::is_none")] 57 pub tags: Option<Vec<String>>, 58 #[serde(skip_serializing_if = "Option::is_none")] 59 pub composer: Option<String>, 60 #[serde(skip_serializing_if = "Option::is_none")] 61 pub lyrics: Option<String>, 62 #[serde(skip_serializing_if = "Option::is_none")] 63 pub copyright_message: Option<String>, 64 #[serde(skip_serializing_if = "Option::is_none")] 65 pub wiki: Option<String>, 66 #[serde(skip_serializing_if = "Option::is_none")] 67 pub album_art: Option<ImageBlob>, 68 #[serde(skip_serializing_if = "Option::is_none")] 69 pub youtube_link: Option<String>, 70 #[serde(skip_serializing_if = "Option::is_none")] 71 pub spotify_link: Option<String>, 72 #[serde(skip_serializing_if = "Option::is_none")] 73 pub tidal_link: Option<String>, 74 #[serde(skip_serializing_if = "Option::is_none")] 75 pub apple_music_link: Option<String>, 76 pub created_at: String, 77 #[serde(skip_serializing_if = "Option::is_none")] 78 pub label: Option<String>, 79 #[serde(skip_serializing_if = "Option::is_none")] 80 pub mbid: Option<String>, 81} 82 83#[derive(Debug, Deserialize)] 84pub struct ProfileResponse { 85 pub uri: String, 86 pub cid: String, 87 pub value: Profile, 88} 89 90#[derive(Debug, Deserialize)] 91#[serde(rename_all = "camelCase")] 92pub struct Profile { 93 #[serde(rename = "$type")] 94 pub r#type: String, 95 pub avatar: Option<Blob>, 96 pub banner: Option<Blob>, 97 pub created_at: Option<String>, 98 pub pinned_post: Option<PinnedPost>, 99 pub description: Option<String>, 100 pub display_name: Option<String>, 101 pub handle: Option<String>, 102} 103 104#[derive(Debug, Deserialize, Clone)] 105#[serde(rename_all = "camelCase")] 106pub struct ImageBlob { 107 #[serde(rename = "$type")] 108 pub r#type: String, 109 #[serde(rename = "ref")] 110 pub r#ref: BlobRef, 111 pub mime_type: String, 112 pub size: u64, 113} 114 115#[derive(Debug, Deserialize, Clone)] 116pub struct BlobRef { 117 #[serde(rename = "$link")] 118 pub link: String, 119} 120 121#[derive(Debug, Deserialize)] 122pub struct PinnedPost { 123 pub cid: String, 124 pub uri: String, 125} 126 127#[derive(Debug, Deserialize, Clone)] 128#[serde(rename_all = "camelCase")] 129pub struct ArtistRecord { 130 pub name: String, 131 #[serde(skip_serializing_if = "Option::is_none")] 132 pub bio: Option<String>, 133 #[serde(skip_serializing_if = "Option::is_none")] 134 pub picture: Option<ImageBlob>, 135 #[serde(skip_serializing_if = "Option::is_none")] 136 pub tags: Option<Vec<String>>, 137 #[serde(skip_serializing_if = "Option::is_none")] 138 pub born: Option<String>, 139 #[serde(skip_serializing_if = "Option::is_none")] 140 pub died: Option<String>, 141 #[serde(skip_serializing_if = "Option::is_none")] 142 pub born_in: Option<String>, 143 pub created_at: String, 144} 145 146#[derive(Debug, Deserialize, Clone)] 147#[serde(rename_all = "camelCase")] 148pub struct AlbumRecord { 149 pub title: String, 150 pub artist: String, 151 #[serde(skip_serializing_if = "Option::is_none")] 152 pub duration: Option<i32>, 153 #[serde(skip_serializing_if = "Option::is_none")] 154 pub release_date: Option<String>, 155 #[serde(skip_serializing_if = "Option::is_none")] 156 pub year: Option<i32>, 157 #[serde(skip_serializing_if = "Option::is_none")] 158 pub genre: Option<String>, 159 #[serde(skip_serializing_if = "Option::is_none")] 160 pub album_art: Option<ImageBlob>, 161 #[serde(skip_serializing_if = "Option::is_none")] 162 pub tags: Option<Vec<String>>, 163 #[serde(skip_serializing_if = "Option::is_none")] 164 pub youtube_link: Option<String>, 165 #[serde(skip_serializing_if = "Option::is_none")] 166 pub spotify_link: Option<String>, 167 #[serde(skip_serializing_if = "Option::is_none")] 168 pub tidal_link: Option<String>, 169 #[serde(skip_serializing_if = "Option::is_none")] 170 pub apple_music_link: Option<String>, 171 pub created_at: String, 172} 173 174#[derive(Debug, Deserialize, Clone)] 175#[serde(rename_all = "camelCase")] 176pub struct SongRecord { 177 pub title: String, 178 pub artist: String, 179 pub album: String, 180 pub album_artist: String, 181 pub duration: i32, 182 pub created_at: String, 183 #[serde(skip_serializing_if = "Option::is_none")] 184 pub track_number: Option<i32>, 185 #[serde(skip_serializing_if = "Option::is_none")] 186 pub disc_number: Option<i32>, 187 #[serde(skip_serializing_if = "Option::is_none")] 188 pub genre: Option<String>, 189 #[serde(skip_serializing_if = "Option::is_none")] 190 pub release_date: Option<String>, 191 #[serde(skip_serializing_if = "Option::is_none")] 192 pub year: Option<i32>, 193 #[serde(skip_serializing_if = "Option::is_none")] 194 pub tags: Option<Vec<String>>, 195 #[serde(skip_serializing_if = "Option::is_none")] 196 pub composer: Option<String>, 197 #[serde(skip_serializing_if = "Option::is_none")] 198 pub lyrics: Option<String>, 199 #[serde(skip_serializing_if = "Option::is_none")] 200 pub copyright_message: Option<String>, 201 #[serde(skip_serializing_if = "Option::is_none")] 202 pub wiki: Option<String>, 203 #[serde(skip_serializing_if = "Option::is_none")] 204 pub album_art: Option<ImageBlob>, 205 #[serde(skip_serializing_if = "Option::is_none")] 206 pub youtube_link: Option<String>, 207 #[serde(skip_serializing_if = "Option::is_none")] 208 pub spotify_link: Option<String>, 209 #[serde(skip_serializing_if = "Option::is_none")] 210 pub tidal_link: Option<String>, 211 #[serde(skip_serializing_if = "Option::is_none")] 212 pub apple_music_link: Option<String>, 213 #[serde(skip_serializing_if = "Option::is_none")] 214 pub label: Option<String>, 215 #[serde(skip_serializing_if = "Option::is_none")] 216 pub mbid: Option<String>, 217}