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