app.rocksky.song.defs
Schema Diff
+83 -0
Compatibility Analysis
Backward Compatible
Backward compatible. 36 non-breaking changes.
Non-Breaking Changes (36)
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#firstScrobbleView" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#firstScrobbleView.avatar" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#firstScrobbleView.handle" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#firstScrobbleView.timestamp" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.avatar" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.did" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.displayName" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.handle" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.id" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.scrobbleUri" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.timestamp" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#songViewBasic.isrc" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#songViewBasic.mbid" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#songViewDetailed.artists" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#songViewDetailed.artists:items" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#songViewDetailed.firstScrobble" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#songViewDetailed.isrc" }
- AddedVertex AddedVertex { vertex_id: "app.rocksky.song.defs#songViewDetailed.mbid" }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#firstScrobbleView", tgt: "app.rocksky.song.defs#firstScrobbleView.avatar", kind: "prop", name: Some("avatar") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#firstScrobbleView", tgt: "app.rocksky.song.defs#firstScrobbleView.handle", kind: "prop", name: Some("handle") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#firstScrobbleView", tgt: "app.rocksky.song.defs#firstScrobbleView.timestamp", kind: "prop", name: Some("timestamp") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.avatar", kind: "prop", name: Some("avatar") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.did", kind: "prop", name: Some("did") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.displayName", kind: "prop", name: Some("displayName") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.handle", kind: "prop", name: Some("handle") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.id", kind: "prop", name: Some("id") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.scrobbleUri", kind: "prop", name: Some("scrobbleUri") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.timestamp", kind: "prop", name: Some("timestamp") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#songViewBasic", tgt: "app.rocksky.song.defs#songViewBasic.isrc", kind: "prop", name: Some("isrc") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#songViewBasic", tgt: "app.rocksky.song.defs#songViewBasic.mbid", kind: "prop", name: Some("mbid") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#songViewDetailed", tgt: "app.rocksky.song.defs#songViewDetailed.artists", kind: "prop", name: Some("artists") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#songViewDetailed", tgt: "app.rocksky.song.defs#songViewDetailed.firstScrobble", kind: "prop", name: Some("firstScrobble") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#songViewDetailed", tgt: "app.rocksky.song.defs#songViewDetailed.isrc", kind: "prop", name: Some("isrc") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#songViewDetailed", tgt: "app.rocksky.song.defs#songViewDetailed.mbid", kind: "prop", name: Some("mbid") }
- AddedEdge AddedEdge { src: "app.rocksky.song.defs#songViewDetailed.artists", tgt: "app.rocksky.song.defs#songViewDetailed.artists:items", kind: "items", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "app.rocksky.song.defs#firstScrobbleView" }AddedVertex { vertex_id: "app.rocksky.song.defs#firstScrobbleView.avatar" }AddedVertex { vertex_id: "app.rocksky.song.defs#firstScrobbleView.handle" }AddedVertex { vertex_id: "app.rocksky.song.defs#firstScrobbleView.timestamp" }AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView" }AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.avatar" }AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.did" }AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.displayName" }AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.handle" }AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.id" }AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.scrobbleUri" }AddedVertex { vertex_id: "app.rocksky.song.defs#recentListenerView.timestamp" }AddedVertex { vertex_id: "app.rocksky.song.defs#songViewBasic.isrc" }AddedVertex { vertex_id: "app.rocksky.song.defs#songViewBasic.mbid" }AddedVertex { vertex_id: "app.rocksky.song.defs#songViewDetailed.artists" }AddedVertex { vertex_id: "app.rocksky.song.defs#songViewDetailed.artists:items" }AddedVertex { vertex_id: "app.rocksky.song.defs#songViewDetailed.firstScrobble" }AddedVertex { vertex_id: "app.rocksky.song.defs#songViewDetailed.isrc" }AddedVertex { vertex_id: "app.rocksky.song.defs#songViewDetailed.mbid" }
Additional Notes
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#firstScrobbleView", tgt: "app.rocksky.song.defs#firstScrobbleView.avatar", kind: "prop", name: Some("avatar") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#firstScrobbleView", tgt: "app.rocksky.song.defs#firstScrobbleView.handle", kind: "prop", name: Some("handle") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#firstScrobbleView", tgt: "app.rocksky.song.defs#firstScrobbleView.timestamp", kind: "prop", name: Some("timestamp") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.avatar", kind: "prop", name: Some("avatar") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.did", kind: "prop", name: Some("did") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.displayName", kind: "prop", name: Some("displayName") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.handle", kind: "prop", name: Some("handle") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.id", kind: "prop", name: Some("id") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.scrobbleUri", kind: "prop", name: Some("scrobbleUri") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#recentListenerView", tgt: "app.rocksky.song.defs#recentListenerView.timestamp", kind: "prop", name: Some("timestamp") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#songViewBasic", tgt: "app.rocksky.song.defs#songViewBasic.isrc", kind: "prop", name: Some("isrc") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#songViewBasic", tgt: "app.rocksky.song.defs#songViewBasic.mbid", kind: "prop", name: Some("mbid") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#songViewDetailed", tgt: "app.rocksky.song.defs#songViewDetailed.artists", kind: "prop", name: Some("artists") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#songViewDetailed", tgt: "app.rocksky.song.defs#songViewDetailed.firstScrobble", kind: "prop", name: Some("firstScrobble") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#songViewDetailed", tgt: "app.rocksky.song.defs#songViewDetailed.isrc", kind: "prop", name: Some("isrc") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#songViewDetailed", tgt: "app.rocksky.song.defs#songViewDetailed.mbid", kind: "prop", name: Some("mbid") }
- Non-breaking: AddedEdge { src: "app.rocksky.song.defs#songViewDetailed.artists", tgt: "app.rocksky.song.defs#songViewDetailed.artists:items", kind: "items", name: None }
1
1
{
2
2
"id": "app.rocksky.song.defs",
3
3
"defs": {
4
4
"songViewBasic": {
5
5
"type": "object",
6
6
"properties": {
7
7
"id": {
8
8
"type": "string",
9
9
"description": "The unique identifier of the song."
10
10
},
11
11
"uri": {
12
12
"type": "string",
13
13
"format": "at-uri",
14
14
"description": "The URI of the song."
15
15
},
16
+
"isrc": {
17
+
"type": "string",
18
+
"description": "The International Standard Recording Code (ISRC) of the song."
19
+
},
20
+
"mbid": {
21
+
"type": "string",
22
+
"description": "The MusicBrainz ID of the song."
23
+
},
16
24
"tags": {
17
25
"type": "array",
18
26
"items": {
19
27
"type": "string"
20
28
}
21
29
},
22
30
"album": {
23
31
"type": "string",
24
32
"description": "The album of the song."
25
33
},
26
34
"title": {
27
35
"type": "string",
28
36
"description": "The title of the song."
29
37
},
30
38
"artist": {
31
39
"type": "string",
32
40
"description": "The artist of the song."
33
41
},
34
42
"sha256": {
35
43
"type": "string",
36
44
"description": "The SHA256 hash of the song."
37
45
},
38
46
"albumArt": {
39
47
"type": "string",
40
48
"format": "uri",
41
49
"description": "The URL of the album art image."
42
50
},
43
51
"albumUri": {
44
52
"type": "string",
45
53
"format": "at-uri",
46
54
"description": "The URI of the album the song belongs to."
47
55
},
48
56
"duration": {
49
57
"type": "integer",
50
58
"description": "The duration of the song in milliseconds."
51
59
},
52
60
"artistUri": {
53
61
"type": "string",
54
62
"format": "at-uri",
55
63
"description": "The URI of the artist of the song."
56
64
},
57
65
"createdAt": {
58
66
"type": "string",
59
67
"format": "datetime",
60
68
"description": "The timestamp when the song was created."
61
69
},
62
70
"playCount": {
63
71
"type": "integer",
64
72
"minimum": 0,
65
73
"description": "The number of times the song has been played."
66
74
},
67
75
"discNumber": {
68
76
"type": "integer",
69
77
"description": "The disc number of the song in the album."
70
78
},
71
79
"albumArtist": {
72
80
"type": "string",
73
81
"description": "The artist of the album the song belongs to."
74
82
},
75
83
"trackNumber": {
76
84
"type": "integer",
77
85
"description": "The track number of the song in the album."
78
86
},
79
87
"uniqueListeners": {
80
88
"type": "integer",
81
89
"minimum": 0,
82
90
"description": "The number of unique listeners who have played the song."
83
91
}
84
92
}
85
93
},
86
94
"songViewDetailed": {
87
95
"type": "object",
88
96
"properties": {
89
97
"id": {
90
98
"type": "string",
91
99
"description": "The unique identifier of the song."
92
100
},
93
101
"uri": {
94
102
"type": "string",
95
103
"format": "at-uri",
96
104
"description": "The URI of the song."
97
105
},
106
+
"isrc": {
107
+
"type": "string",
108
+
"description": "The International Standard Recording Code (ISRC) of the song."
109
+
},
110
+
"mbid": {
111
+
"type": "string",
112
+
"description": "The MusicBrainz ID of the song."
113
+
},
98
114
"tags": {
99
115
"type": "array",
100
116
"items": {
101
117
"type": "string"
102
118
}
103
119
},
104
120
"album": {
105
121
"type": "string",
106
122
"description": "The album of the song."
107
123
},
108
124
"title": {
109
125
"type": "string",
110
126
"description": "The title of the song."
111
127
},
112
128
"artist": {
113
129
"type": "string",
114
130
"description": "The artist of the song."
115
131
},
116
132
"sha256": {
117
133
"type": "string",
118
134
"description": "The SHA256 hash of the song."
119
135
},
136
+
"artists": {
137
+
"type": "array",
138
+
"items": {
139
+
"ref": "app.rocksky.artist.defs#artistViewBasic",
140
+
"type": "ref"
141
+
}
142
+
},
120
143
"albumArt": {
121
144
"type": "string",
122
145
"format": "uri",
123
146
"description": "The URL of the album art image."
124
147
},
125
148
"albumUri": {
126
149
"type": "string",
127
150
"format": "at-uri",
128
151
"description": "The URI of the album the song belongs to."
129
152
},
130
153
"duration": {
131
154
"type": "integer",
132
155
"description": "The duration of the song in milliseconds."
133
156
},
134
157
"artistUri": {
135
158
"type": "string",
136
159
"format": "at-uri",
137
160
"description": "The URI of the artist of the song."
138
161
},
139
162
"createdAt": {
140
163
"type": "string",
141
164
"format": "datetime",
142
165
"description": "The timestamp when the song was created."
143
166
},
144
167
"playCount": {
145
168
"type": "integer",
146
169
"minimum": 0,
147
170
"description": "The number of times the song has been played."
148
171
},
149
172
"discNumber": {
150
173
"type": "integer",
151
174
"description": "The disc number of the song in the album."
152
175
},
153
176
"albumArtist": {
154
177
"type": "string",
155
178
"description": "The artist of the album the song belongs to."
156
179
},
157
180
"trackNumber": {
158
181
"type": "integer",
159
182
"description": "The track number of the song in the album."
160
183
},
184
+
"firstScrobble": {
185
+
"ref": "app.rocksky.song.defs#firstScrobbleView",
186
+
"type": "ref",
187
+
"description": "The first scrobble of this song on Rocksky."
188
+
},
161
189
"uniqueListeners": {
162
190
"type": "integer",
163
191
"minimum": 0,
164
192
"description": "The number of unique listeners who have played the song."
165
193
}
166
194
}
195
+
},
196
+
"firstScrobbleView": {
197
+
"type": "object",
198
+
"properties": {
199
+
"avatar": {
200
+
"type": "string",
201
+
"format": "uri",
202
+
"description": "The avatar URL of the user who first scrobbled this song."
203
+
},
204
+
"handle": {
205
+
"type": "string",
206
+
"description": "The handle of the user who first scrobbled this song."
207
+
},
208
+
"timestamp": {
209
+
"type": "string",
210
+
"format": "datetime",
211
+
"description": "The timestamp of the first scrobble."
212
+
}
213
+
}
214
+
},
215
+
"recentListenerView": {
216
+
"type": "object",
217
+
"properties": {
218
+
"id": {
219
+
"type": "string",
220
+
"description": "The unique identifier of the listener."
221
+
},
222
+
"did": {
223
+
"type": "string",
224
+
"description": "The DID of the listener."
225
+
},
226
+
"avatar": {
227
+
"type": "string",
228
+
"format": "uri",
229
+
"description": "The URL of the listener's avatar image."
230
+
},
231
+
"handle": {
232
+
"type": "string",
233
+
"description": "The handle of the listener."
234
+
},
235
+
"timestamp": {
236
+
"type": "string",
237
+
"format": "datetime",
238
+
"description": "The timestamp of the listener's most recent scrobble of this song."
239
+
},
240
+
"displayName": {
241
+
"type": "string",
242
+
"description": "The display name of the listener."
243
+
},
244
+
"scrobbleUri": {
245
+
"type": "string",
246
+
"format": "at-uri",
247
+
"description": "The URI of the listener's most recent scrobble of this song."
248
+
}
249
+
}
167
250
}
168
251
},
169
252
"$type": "com.atproto.lexicon.schema",
170
253
"lexicon": 1
171
254
}