A decentralized music tracking and discovery platform built on AT Protocol 馃幍
rocksky.app
spotify
atproto
lastfm
musicbrainz
scrobbling
listenbrainz
1amends "../../schema/lexicon.pkl"
2
3lexicon = 1
4id = "app.rocksky.song.defs"
5defs = new Mapping<String, ObjectType> {
6 ["songViewBasic"] {
7 type = "object"
8 properties {
9 ["id"] = new StringType {
10 type = "string"
11 description = "The unique identifier of the song."
12 }
13 ["title"] = new StringType {
14 type = "string"
15 description = "The title of the song."
16 }
17 ["artist"] = new StringType {
18 type = "string"
19 description = "The artist of the song."
20 }
21 ["albumArtist"] = new StringType {
22 type = "string"
23 description = "The artist of the album the song belongs to."
24 }
25 ["albumArt"] = new StringType {
26 type = "string"
27 format = "uri"
28 description = "The URL of the album art image."
29 }
30 ["uri"] = new StringType {
31 type = "string"
32 format = "at-uri"
33 description = "The URI of the song."
34 }
35 ["album"] = new StringType {
36 type = "string"
37 description = "The album of the song."
38 }
39 ["duration"] = new IntegerType {
40 type = "integer"
41 description = "The duration of the song in milliseconds."
42 }
43 ["trackNumber"] = new IntegerType {
44 type = "integer"
45 description = "The track number of the song in the album."
46 }
47 ["discNumber"] = new IntegerType {
48 type = "integer"
49 description = "The disc number of the song in the album."
50 }
51 ["playCount"] = new IntegerType {
52 type = "integer"
53 description = "The number of times the song has been played."
54 minimum = 0
55 }
56 ["uniqueListeners"] = new IntegerType {
57 type = "integer"
58 description = "The number of unique listeners who have played the song."
59 minimum = 0
60 }
61 ["albumUri"] = new StringType {
62 type = "string"
63 format = "at-uri"
64 description = "The URI of the album the song belongs to."
65 }
66 ["artistUri"] = new StringType {
67 type = "string"
68 format = "at-uri"
69 description = "The URI of the artist of the song."
70 }
71 ["sha256"] = new StringType {
72 type = "string"
73 description = "The SHA256 hash of the song."
74 }
75 ["mbid"] = new StringType {
76 type = "string"
77 description = "The MusicBrainz ID of the song."
78 }
79 ["isrc"] = new StringType {
80 type = "string"
81 description = "The International Standard Recording Code (ISRC) of the song."
82 }
83 ["tags"] = new Array {
84 type = "array"
85 items = new StringType {
86 type = "string"
87 }
88 }
89 ["createdAt"] = new StringType {
90 type = "string"
91 format = "datetime"
92 description = "The timestamp when the song was created."
93 }
94 }
95 }
96 ["songViewDetailed"] {
97 type = "object"
98 properties {
99 ["id"] = new StringType {
100 type = "string"
101 description = "The unique identifier of the song."
102 }
103 ["title"] = new StringType {
104 type = "string"
105 description = "The title of the song."
106 }
107 ["artist"] = new StringType {
108 type = "string"
109 description = "The artist of the song."
110 }
111 ["albumArtist"] = new StringType {
112 type = "string"
113 description = "The artist of the album the song belongs to."
114 }
115 ["albumArt"] = new StringType {
116 type = "string"
117 format = "uri"
118 description = "The URL of the album art image."
119 }
120 ["uri"] = new StringType {
121 type = "string"
122 format = "at-uri"
123 description = "The URI of the song."
124 }
125 ["album"] = new StringType {
126 type = "string"
127 description = "The album of the song."
128 }
129 ["duration"] = new IntegerType {
130 type = "integer"
131 description = "The duration of the song in milliseconds."
132 }
133 ["trackNumber"] = new IntegerType {
134 type = "integer"
135 description = "The track number of the song in the album."
136 }
137 ["discNumber"] = new IntegerType {
138 type = "integer"
139 description = "The disc number of the song in the album."
140 }
141 ["playCount"] = new IntegerType {
142 type = "integer"
143 description = "The number of times the song has been played."
144 minimum = 0
145 }
146 ["uniqueListeners"] = new IntegerType {
147 type = "integer"
148 description = "The number of unique listeners who have played the song."
149 minimum = 0
150 }
151 ["albumUri"] = new StringType {
152 type = "string"
153 format = "at-uri"
154 description = "The URI of the album the song belongs to."
155 }
156 ["artistUri"] = new StringType {
157 type = "string"
158 format = "at-uri"
159 description = "The URI of the artist of the song."
160 }
161 ["sha256"] = new StringType {
162 type = "string"
163 description = "The SHA256 hash of the song."
164 }
165 ["mbid"] = new StringType {
166 type = "string"
167 description = "The MusicBrainz ID of the song."
168 }
169 ["isrc"] = new StringType {
170 type = "string"
171 description = "The International Standard Recording Code (ISRC) of the song."
172 }
173 ["tags"] = new Array {
174 type = "array"
175 items = new StringType {
176 type = "string"
177 }
178 }
179 ["createdAt"] = new StringType {
180 type = "string"
181 format = "datetime"
182 description = "The timestamp when the song was created."
183 }
184 ["artists"] = new Array {
185 type = "array"
186 items = new Ref {
187 ref = "app.rocksky.artist.defs#artistViewBasic"
188 }
189 }
190 ["firstScrobble"] = new Ref {
191 type = "ref"
192 ref = "app.rocksky.song.defs#firstScrobbleView"
193 description = "The first scrobble of this song on Rocksky."
194 }
195 ["matches"] = new Array {
196 type = "array"
197 description = "Ranked list of candidate matches from external metadata providers (e.g. Deezer). Additive field returned by matchSong; may be empty."
198 items = new Ref {
199 ref = "app.rocksky.song.defs#songMatchView"
200 }
201 }
202 }
203 }
204
205 ["songMatchView"] {
206 type = "object"
207 description = "A ranked candidate match for a song from an external metadata provider."
208 properties {
209 ["id"] = new IntegerType {
210 type = "integer"
211 description = "The provider's numeric identifier for the matched track."
212 }
213 ["title"] = new StringType {
214 type = "string"
215 description = "The title of the matched track."
216 }
217 ["artist"] = new StringType {
218 type = "string"
219 description = "The artist of the matched track."
220 }
221 ["album"] = new StringType {
222 type = "string"
223 description = "The album of the matched track."
224 }
225 ["albumArt"] = new StringType {
226 type = "string"
227 format = "uri"
228 description = "The URL of the matched track's album art image."
229 }
230 ["isrc"] = new StringType {
231 type = "string"
232 description = "The International Standard Recording Code (ISRC) of the matched track."
233 }
234 ["durationMs"] = new IntegerType {
235 type = "integer"
236 minimum = 0
237 description = "The duration of the matched track in milliseconds."
238 }
239 ["trackNumber"] = new IntegerType {
240 type = "integer"
241 description = "The track number of the matched track in its album."
242 }
243 ["discNumber"] = new IntegerType {
244 type = "integer"
245 description = "The disc number of the matched track in its album."
246 }
247 ["link"] = new StringType {
248 type = "string"
249 format = "uri"
250 description = "A URL to the matched track on the provider."
251 }
252 ["preview"] = new StringType {
253 type = "string"
254 format = "uri"
255 description = "A URL to a short audio preview of the matched track."
256 }
257 ["rank"] = new IntegerType {
258 type = "integer"
259 description = "The provider's popularity rank for the matched track."
260 }
261 ["explicit"] = new BooleanType {
262 type = "boolean"
263 description = "Whether the matched track has explicit lyrics."
264 }
265 ["score"] = new IntegerType {
266 type = "integer"
267 minimum = 0
268 maximum = 100
269 description = "Match confidence score in the range 0-100 (higher is better)."
270 }
271 }
272 }
273
274 ["recentListenerView"] {
275 type = "object"
276 properties {
277 ["id"] = new StringType {
278 type = "string"
279 description = "The unique identifier of the listener."
280 }
281 ["did"] = new StringType {
282 type = "string"
283 description = "The DID of the listener."
284 }
285 ["handle"] = new StringType {
286 type = "string"
287 description = "The handle of the listener."
288 }
289 ["displayName"] = new StringType {
290 type = "string"
291 description = "The display name of the listener."
292 }
293 ["avatar"] = new StringType {
294 type = "string"
295 format = "uri"
296 description = "The URL of the listener's avatar image."
297 }
298 ["timestamp"] = new StringType {
299 type = "string"
300 format = "datetime"
301 description = "The timestamp of the listener's most recent scrobble of this song."
302 }
303 ["scrobbleUri"] = new StringType {
304 type = "string"
305 format = "at-uri"
306 description = "The URI of the listener's most recent scrobble of this song."
307 }
308 }
309 }
310
311 ["firstScrobbleView"] {
312 type = "object"
313 properties {
314 ["handle"] = new StringType {
315 type = "string"
316 description = "The handle of the user who first scrobbled this song."
317 }
318 ["avatar"] = new StringType {
319 type = "string"
320 format = "uri"
321 description = "The avatar URL of the user who first scrobbled this song."
322 }
323 ["timestamp"] = new StringType {
324 type = "string"
325 format = "datetime"
326 description = "The timestamp of the first scrobble."
327 }
328 }
329 }
330}