forked from
rocksky.app/rocksky
A decentralized music tracking and discovery platform built on AT Protocol 馃幍
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}