A decentralized music tracking and discovery platform built on AT Protocol 馃幍
at main 253 lines 8.1 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 album_art_url: Option<String>, 70 #[serde(skip_serializing_if = "Option::is_none")] 71 pub youtube_link: Option<String>, 72 #[serde(skip_serializing_if = "Option::is_none")] 73 pub spotify_link: Option<String>, 74 #[serde(skip_serializing_if = "Option::is_none")] 75 pub tidal_link: Option<String>, 76 #[serde(skip_serializing_if = "Option::is_none")] 77 pub apple_music_link: Option<String>, 78 pub created_at: String, 79 #[serde(skip_serializing_if = "Option::is_none")] 80 pub label: Option<String>, 81 #[serde(skip_serializing_if = "Option::is_none")] 82 pub mbid: Option<String>, 83 #[serde(skip_serializing_if = "Option::is_none")] 84 pub artists: Option<Vec<ArtistMbid>>, 85} 86 87#[derive(Debug, Deserialize, Clone)] 88pub struct ArtistMbid { 89 #[serde(skip_serializing_if = "Option::is_none")] 90 pub mbid: Option<String>, 91 pub name: String, 92} 93 94#[derive(Debug, Deserialize)] 95pub struct ProfileResponse { 96 pub uri: String, 97 pub cid: String, 98 pub value: Profile, 99} 100 101#[derive(Debug, Deserialize)] 102#[serde(rename_all = "camelCase")] 103pub struct Profile { 104 #[serde(rename = "$type")] 105 pub r#type: String, 106 pub avatar: Option<Blob>, 107 pub banner: Option<Blob>, 108 pub created_at: Option<String>, 109 pub pinned_post: Option<PinnedPost>, 110 pub description: Option<String>, 111 pub display_name: Option<String>, 112 pub handle: Option<String>, 113} 114 115#[derive(Debug, Deserialize, Clone)] 116#[serde(rename_all = "camelCase")] 117pub struct ImageBlob { 118 #[serde(rename = "$type")] 119 pub r#type: String, 120 #[serde(rename = "ref")] 121 pub r#ref: BlobRef, 122 pub mime_type: String, 123 pub size: u64, 124} 125 126#[derive(Debug, Deserialize, Clone)] 127pub struct BlobRef { 128 #[serde(rename = "$link")] 129 pub link: String, 130} 131 132#[derive(Debug, Deserialize)] 133pub struct PinnedPost { 134 pub cid: String, 135 pub uri: String, 136} 137 138#[derive(Debug, Deserialize, Clone)] 139#[serde(rename_all = "camelCase")] 140pub struct ArtistRecord { 141 pub name: String, 142 #[serde(skip_serializing_if = "Option::is_none")] 143 pub bio: Option<String>, 144 #[serde(skip_serializing_if = "Option::is_none")] 145 pub picture: Option<ImageBlob>, 146 #[serde(skip_serializing_if = "Option::is_none")] 147 pub picture_url: Option<String>, 148 #[serde(skip_serializing_if = "Option::is_none")] 149 pub tags: Option<Vec<String>>, 150 #[serde(skip_serializing_if = "Option::is_none")] 151 pub born: Option<String>, 152 #[serde(skip_serializing_if = "Option::is_none")] 153 pub died: Option<String>, 154 #[serde(skip_serializing_if = "Option::is_none")] 155 pub born_in: Option<String>, 156 pub created_at: String, 157} 158 159#[derive(Debug, Deserialize, Clone)] 160#[serde(rename_all = "camelCase")] 161pub struct AlbumRecord { 162 pub title: String, 163 pub artist: String, 164 #[serde(skip_serializing_if = "Option::is_none")] 165 pub duration: Option<i32>, 166 #[serde(skip_serializing_if = "Option::is_none")] 167 pub release_date: Option<String>, 168 #[serde(skip_serializing_if = "Option::is_none")] 169 pub year: Option<i32>, 170 #[serde(skip_serializing_if = "Option::is_none")] 171 pub genre: Option<String>, 172 #[serde(skip_serializing_if = "Option::is_none")] 173 pub album_art: Option<ImageBlob>, 174 #[serde(skip_serializing_if = "Option::is_none")] 175 pub album_art_url: Option<String>, 176 #[serde(skip_serializing_if = "Option::is_none")] 177 pub tags: Option<Vec<String>>, 178 #[serde(skip_serializing_if = "Option::is_none")] 179 pub youtube_link: Option<String>, 180 #[serde(skip_serializing_if = "Option::is_none")] 181 pub spotify_link: Option<String>, 182 #[serde(skip_serializing_if = "Option::is_none")] 183 pub tidal_link: Option<String>, 184 #[serde(skip_serializing_if = "Option::is_none")] 185 pub apple_music_link: Option<String>, 186 pub created_at: String, 187} 188 189#[derive(Debug, Deserialize, Clone)] 190#[serde(rename_all = "camelCase")] 191pub struct SongRecord { 192 pub title: String, 193 pub artist: String, 194 pub album: String, 195 pub album_artist: String, 196 pub duration: i32, 197 pub created_at: String, 198 #[serde(skip_serializing_if = "Option::is_none")] 199 pub track_number: Option<i32>, 200 #[serde(skip_serializing_if = "Option::is_none")] 201 pub disc_number: Option<i32>, 202 #[serde(skip_serializing_if = "Option::is_none")] 203 pub genre: Option<String>, 204 #[serde(skip_serializing_if = "Option::is_none")] 205 pub release_date: Option<String>, 206 #[serde(skip_serializing_if = "Option::is_none")] 207 pub year: Option<i32>, 208 #[serde(skip_serializing_if = "Option::is_none")] 209 pub tags: Option<Vec<String>>, 210 #[serde(skip_serializing_if = "Option::is_none")] 211 pub composer: Option<String>, 212 #[serde(skip_serializing_if = "Option::is_none")] 213 pub lyrics: Option<String>, 214 #[serde(skip_serializing_if = "Option::is_none")] 215 pub copyright_message: Option<String>, 216 #[serde(skip_serializing_if = "Option::is_none")] 217 pub wiki: Option<String>, 218 #[serde(skip_serializing_if = "Option::is_none")] 219 pub album_art: Option<ImageBlob>, 220 #[serde(skip_serializing_if = "Option::is_none")] 221 pub album_art_url: Option<String>, 222 #[serde(skip_serializing_if = "Option::is_none")] 223 pub youtube_link: Option<String>, 224 #[serde(skip_serializing_if = "Option::is_none")] 225 pub spotify_link: Option<String>, 226 #[serde(skip_serializing_if = "Option::is_none")] 227 pub tidal_link: Option<String>, 228 #[serde(skip_serializing_if = "Option::is_none")] 229 pub apple_music_link: Option<String>, 230 #[serde(skip_serializing_if = "Option::is_none")] 231 pub label: Option<String>, 232 #[serde(skip_serializing_if = "Option::is_none")] 233 pub mbid: Option<String>, 234} 235 236#[derive(Debug, Deserialize, Clone)] 237#[serde(rename_all = "camelCase")] 238pub struct FeedGeneratorRecord { 239 pub display_name: String, 240 #[serde(skip_serializing_if = "Option::is_none")] 241 pub description: Option<String>, 242 #[serde(skip_serializing_if = "Option::is_none")] 243 pub avatar: Option<ImageBlob>, 244 pub did: String, 245 pub created_at: String, 246} 247 248#[derive(Debug, Deserialize, Clone)] 249#[serde(rename_all = "camelCase")] 250pub struct FollowRecord { 251 pub subject: String, 252 pub created_at: String, 253}