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