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}
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}