@rocksky/cli 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/README.md +270 -1
  2. package/TOOLS.md +194 -0
  3. package/bun.lock +28 -0
  4. package/dist/drizzle/0000_parallel_paper_doll.sql +220 -0
  5. package/dist/drizzle/meta/0000_snapshot.json +1559 -0
  6. package/dist/drizzle/meta/_journal.json +13 -0
  7. package/dist/index.js +8718 -165
  8. package/drizzle/0000_parallel_paper_doll.sql +220 -0
  9. package/drizzle/meta/0000_snapshot.json +1559 -0
  10. package/drizzle/meta/_journal.json +13 -0
  11. package/drizzle.config.ts +18 -0
  12. package/package.json +34 -4
  13. package/src/client.ts +32 -14
  14. package/src/cmd/mcp.ts +8 -0
  15. package/src/cmd/scrobble-api.ts +457 -0
  16. package/src/cmd/scrobble.ts +14 -61
  17. package/src/cmd/search.ts +27 -25
  18. package/src/cmd/sync.ts +812 -0
  19. package/src/cmd/whoami.ts +36 -7
  20. package/src/context.ts +24 -0
  21. package/src/drizzle.ts +53 -0
  22. package/src/index.ts +72 -23
  23. package/src/jetstream.ts +285 -0
  24. package/src/lexicon/index.ts +1321 -0
  25. package/src/lexicon/lexicons.ts +5453 -0
  26. package/src/lexicon/types/app/bsky/actor/profile.ts +38 -0
  27. package/src/lexicon/types/app/rocksky/actor/defs.ts +146 -0
  28. package/src/lexicon/types/app/rocksky/actor/getActorAlbums.ts +56 -0
  29. package/src/lexicon/types/app/rocksky/actor/getActorArtists.ts +56 -0
  30. package/src/lexicon/types/app/rocksky/actor/getActorCompatibility.ts +48 -0
  31. package/src/lexicon/types/app/rocksky/actor/getActorLovedSongs.ts +52 -0
  32. package/src/lexicon/types/app/rocksky/actor/getActorNeighbours.ts +48 -0
  33. package/src/lexicon/types/app/rocksky/actor/getActorPlaylists.ts +52 -0
  34. package/src/lexicon/types/app/rocksky/actor/getActorScrobbles.ts +52 -0
  35. package/src/lexicon/types/app/rocksky/actor/getActorSongs.ts +56 -0
  36. package/src/lexicon/types/app/rocksky/actor/getProfile.ts +43 -0
  37. package/src/lexicon/types/app/rocksky/album/defs.ts +85 -0
  38. package/src/lexicon/types/app/rocksky/album/getAlbum.ts +43 -0
  39. package/src/lexicon/types/app/rocksky/album/getAlbumTracks.ts +48 -0
  40. package/src/lexicon/types/app/rocksky/album/getAlbums.ts +50 -0
  41. package/src/lexicon/types/app/rocksky/album.ts +51 -0
  42. package/src/lexicon/types/app/rocksky/apikey/createApikey.ts +51 -0
  43. package/src/lexicon/types/app/rocksky/apikey/defs.ts +31 -0
  44. package/src/lexicon/types/app/rocksky/apikey/getApikeys.ts +50 -0
  45. package/src/lexicon/types/app/rocksky/apikey/removeApikey.ts +43 -0
  46. package/src/lexicon/types/app/rocksky/apikey/updateApikey.ts +53 -0
  47. package/src/lexicon/types/app/rocksky/apikeys/defs.ts +7 -0
  48. package/src/lexicon/types/app/rocksky/artist/defs.ts +140 -0
  49. package/src/lexicon/types/app/rocksky/artist/getArtist.ts +43 -0
  50. package/src/lexicon/types/app/rocksky/artist/getArtistAlbums.ts +48 -0
  51. package/src/lexicon/types/app/rocksky/artist/getArtistListeners.ts +52 -0
  52. package/src/lexicon/types/app/rocksky/artist/getArtistTracks.ts +52 -0
  53. package/src/lexicon/types/app/rocksky/artist/getArtists.ts +52 -0
  54. package/src/lexicon/types/app/rocksky/artist.ts +41 -0
  55. package/src/lexicon/types/app/rocksky/charts/defs.ts +44 -0
  56. package/src/lexicon/types/app/rocksky/charts/getScrobblesChart.ts +49 -0
  57. package/src/lexicon/types/app/rocksky/dropbox/defs.ts +71 -0
  58. package/src/lexicon/types/app/rocksky/dropbox/downloadFile.ts +42 -0
  59. package/src/lexicon/types/app/rocksky/dropbox/getFiles.ts +43 -0
  60. package/src/lexicon/types/app/rocksky/dropbox/getMetadata.ts +43 -0
  61. package/src/lexicon/types/app/rocksky/dropbox/getTemporaryLink.ts +43 -0
  62. package/src/lexicon/types/app/rocksky/feed/defs.ts +182 -0
  63. package/src/lexicon/types/app/rocksky/feed/describeFeedGenerator.ts +48 -0
  64. package/src/lexicon/types/app/rocksky/feed/generator.ts +29 -0
  65. package/src/lexicon/types/app/rocksky/feed/getFeed.ts +47 -0
  66. package/src/lexicon/types/app/rocksky/feed/getFeedGenerator.ts +48 -0
  67. package/src/lexicon/types/app/rocksky/feed/getFeedGenerators.ts +43 -0
  68. package/src/lexicon/types/app/rocksky/feed/getFeedSkeleton.ts +56 -0
  69. package/src/lexicon/types/app/rocksky/feed/getNowPlayings.ts +43 -0
  70. package/src/lexicon/types/app/rocksky/feed/search.ts +43 -0
  71. package/src/lexicon/types/app/rocksky/googledrive/defs.ts +42 -0
  72. package/src/lexicon/types/app/rocksky/googledrive/downloadFile.ts +42 -0
  73. package/src/lexicon/types/app/rocksky/googledrive/getFile.ts +43 -0
  74. package/src/lexicon/types/app/rocksky/googledrive/getFiles.ts +43 -0
  75. package/src/lexicon/types/app/rocksky/graph/defs.ts +47 -0
  76. package/src/lexicon/types/app/rocksky/graph/follow.ts +28 -0
  77. package/src/lexicon/types/app/rocksky/graph/followAccount.ts +50 -0
  78. package/src/lexicon/types/app/rocksky/graph/getFollowers.ts +56 -0
  79. package/src/lexicon/types/app/rocksky/graph/getFollows.ts +56 -0
  80. package/src/lexicon/types/app/rocksky/graph/getKnownFollowers.ts +52 -0
  81. package/src/lexicon/types/app/rocksky/graph/unfollowAccount.ts +50 -0
  82. package/src/lexicon/types/app/rocksky/like/dislikeShout.ts +49 -0
  83. package/src/lexicon/types/app/rocksky/like/dislikeSong.ts +49 -0
  84. package/src/lexicon/types/app/rocksky/like/likeShout.ts +49 -0
  85. package/src/lexicon/types/app/rocksky/like/likeSong.ts +49 -0
  86. package/src/lexicon/types/app/rocksky/like.ts +27 -0
  87. package/src/lexicon/types/app/rocksky/player/addDirectoryToQueue.ts +40 -0
  88. package/src/lexicon/types/app/rocksky/player/addItemsToQueue.ts +39 -0
  89. package/src/lexicon/types/app/rocksky/player/defs.ts +57 -0
  90. package/src/lexicon/types/app/rocksky/player/getCurrentlyPlaying.ts +44 -0
  91. package/src/lexicon/types/app/rocksky/player/getPlaybackQueue.ts +42 -0
  92. package/src/lexicon/types/app/rocksky/player/next.ts +34 -0
  93. package/src/lexicon/types/app/rocksky/player/pause.ts +34 -0
  94. package/src/lexicon/types/app/rocksky/player/play.ts +34 -0
  95. package/src/lexicon/types/app/rocksky/player/playDirectory.ts +38 -0
  96. package/src/lexicon/types/app/rocksky/player/playFile.ts +35 -0
  97. package/src/lexicon/types/app/rocksky/player/previous.ts +34 -0
  98. package/src/lexicon/types/app/rocksky/player/seek.ts +36 -0
  99. package/src/lexicon/types/app/rocksky/playlist/createPlaylist.ts +37 -0
  100. package/src/lexicon/types/app/rocksky/playlist/defs.ts +86 -0
  101. package/src/lexicon/types/app/rocksky/playlist/getPlaylist.ts +43 -0
  102. package/src/lexicon/types/app/rocksky/playlist/getPlaylists.ts +50 -0
  103. package/src/lexicon/types/app/rocksky/playlist/insertDirectory.ts +39 -0
  104. package/src/lexicon/types/app/rocksky/playlist/insertFiles.ts +38 -0
  105. package/src/lexicon/types/app/rocksky/playlist/removePlaylist.ts +35 -0
  106. package/src/lexicon/types/app/rocksky/playlist/removeTrack.ts +37 -0
  107. package/src/lexicon/types/app/rocksky/playlist/startPlaylist.ts +39 -0
  108. package/src/lexicon/types/app/rocksky/playlist.ts +43 -0
  109. package/src/lexicon/types/app/rocksky/radio/defs.ts +63 -0
  110. package/src/lexicon/types/app/rocksky/radio.ts +37 -0
  111. package/src/lexicon/types/app/rocksky/scrobble/createScrobble.ts +91 -0
  112. package/src/lexicon/types/app/rocksky/scrobble/defs.ts +93 -0
  113. package/src/lexicon/types/app/rocksky/scrobble/getScrobble.ts +43 -0
  114. package/src/lexicon/types/app/rocksky/scrobble/getScrobbles.ts +54 -0
  115. package/src/lexicon/types/app/rocksky/scrobble.ts +75 -0
  116. package/src/lexicon/types/app/rocksky/shout/createShout.ts +49 -0
  117. package/src/lexicon/types/app/rocksky/shout/defs.ts +58 -0
  118. package/src/lexicon/types/app/rocksky/shout/getAlbumShouts.ts +52 -0
  119. package/src/lexicon/types/app/rocksky/shout/getArtistShouts.ts +52 -0
  120. package/src/lexicon/types/app/rocksky/shout/getProfileShouts.ts +52 -0
  121. package/src/lexicon/types/app/rocksky/shout/getShoutReplies.ts +52 -0
  122. package/src/lexicon/types/app/rocksky/shout/getTrackShouts.ts +48 -0
  123. package/src/lexicon/types/app/rocksky/shout/removeShout.ts +43 -0
  124. package/src/lexicon/types/app/rocksky/shout/replyShout.ts +51 -0
  125. package/src/lexicon/types/app/rocksky/shout/reportShout.ts +51 -0
  126. package/src/lexicon/types/app/rocksky/shout.ts +30 -0
  127. package/src/lexicon/types/app/rocksky/song/createSong.ts +71 -0
  128. package/src/lexicon/types/app/rocksky/song/defs.ts +103 -0
  129. package/src/lexicon/types/app/rocksky/song/getSong.ts +43 -0
  130. package/src/lexicon/types/app/rocksky/song/getSongs.ts +50 -0
  131. package/src/lexicon/types/app/rocksky/song.ts +74 -0
  132. package/src/lexicon/types/app/rocksky/spotify/defs.ts +35 -0
  133. package/src/lexicon/types/app/rocksky/spotify/getCurrentlyPlaying.ts +43 -0
  134. package/src/lexicon/types/app/rocksky/spotify/next.ts +32 -0
  135. package/src/lexicon/types/app/rocksky/spotify/pause.ts +32 -0
  136. package/src/lexicon/types/app/rocksky/spotify/play.ts +32 -0
  137. package/src/lexicon/types/app/rocksky/spotify/previous.ts +32 -0
  138. package/src/lexicon/types/app/rocksky/spotify/seek.ts +35 -0
  139. package/src/lexicon/types/app/rocksky/stats/defs.ts +33 -0
  140. package/src/lexicon/types/app/rocksky/stats/getStats.ts +43 -0
  141. package/src/lexicon/types/com/atproto/repo/strongRef.ts +26 -0
  142. package/src/lexicon/util.ts +13 -0
  143. package/src/lib/agent.ts +56 -0
  144. package/src/lib/cleanUpJetstreamLock.ts +66 -0
  145. package/src/lib/cleanUpSyncLock.ts +56 -0
  146. package/src/lib/didUnstorageCache.ts +72 -0
  147. package/src/lib/env.ts +25 -0
  148. package/src/lib/extractPdsFromDid.ts +33 -0
  149. package/src/lib/getDidAndHandle.ts +39 -0
  150. package/src/lib/idResolver.ts +52 -0
  151. package/src/lib/lastfm.ts +26 -0
  152. package/src/lib/matchTrack.ts +47 -0
  153. package/src/logger.ts +18 -0
  154. package/src/mcp/index.ts +269 -0
  155. package/src/mcp/tools/albums.ts +13 -0
  156. package/src/mcp/tools/artists.ts +17 -0
  157. package/src/mcp/tools/create.ts +27 -0
  158. package/src/mcp/tools/myscrobbles.ts +42 -0
  159. package/src/mcp/tools/nowplaying.ts +53 -0
  160. package/src/mcp/tools/scrobbles.ts +39 -0
  161. package/src/mcp/tools/search.ts +88 -0
  162. package/src/mcp/tools/stats.ts +40 -0
  163. package/src/mcp/tools/tracks.ts +15 -0
  164. package/src/mcp/tools/whoami.ts +27 -0
  165. package/src/schema/album-tracks.ts +30 -0
  166. package/src/schema/albums.ts +29 -0
  167. package/src/schema/artist-albums.ts +29 -0
  168. package/src/schema/artist-genres.ts +17 -0
  169. package/src/schema/artist-tracks.ts +29 -0
  170. package/src/schema/artists.ts +30 -0
  171. package/src/schema/auth-session.ts +18 -0
  172. package/src/schema/genres.ts +18 -0
  173. package/src/schema/index.ts +33 -0
  174. package/src/schema/loved-tracks.ts +27 -0
  175. package/src/schema/scrobbles.ts +30 -0
  176. package/src/schema/tracks.ts +39 -0
  177. package/src/schema/user-albums.ts +31 -0
  178. package/src/schema/user-artists.ts +32 -0
  179. package/src/schema/user-tracks.ts +31 -0
  180. package/src/schema/users.ts +21 -0
  181. package/src/scrobble.ts +410 -0
  182. package/src/sqliteKv.ts +173 -0
  183. package/src/types.ts +308 -0
  184. package/tsconfig.json +26 -29
package/src/types.ts ADDED
@@ -0,0 +1,308 @@
1
+ import { z } from "zod";
2
+
3
+ export namespace WebScrobbler {
4
+ /* -------------------------------- Connector -------------------------------- */
5
+
6
+ export const ConnectorSchema = z.object({
7
+ id: z.string(),
8
+ js: z.string(),
9
+ label: z.string(),
10
+ matches: z.array(z.string()),
11
+ });
12
+
13
+ /* ----------------------- IsRegrexEditedByUser ----------------------- */
14
+
15
+ export const IsRegrexEditedByUserSchema = z.object({
16
+ album: z.boolean(),
17
+ albumArtist: z.boolean(),
18
+ artist: z.boolean(),
19
+ track: z.boolean(),
20
+ });
21
+
22
+ /* ---------------------------------- Flags ---------------------------------- */
23
+
24
+ export const FlagsSchema = z.object({
25
+ finishedProcessing: z.boolean(),
26
+ hasBlockedTag: z.boolean(),
27
+ isAlbumFetched: z.boolean(),
28
+ isCorrectedByUser: z.boolean(),
29
+ isLovedInService: z.boolean().optional(),
30
+ isMarkedAsPlaying: z.boolean(),
31
+ isRegexEditedByUser: IsRegrexEditedByUserSchema,
32
+ isReplaying: z.boolean(),
33
+ isScrobbled: z.boolean(),
34
+ isSkipped: z.boolean(),
35
+ isValid: z.boolean(),
36
+ });
37
+
38
+ /* -------------------------------- Metadata -------------------------------- */
39
+
40
+ export const MetadataSchema = z.object({
41
+ albumUrl: z.string().url().optional(),
42
+ artistUrl: z.string().url().optional(),
43
+ label: z.string(),
44
+ startTimestamp: z.number().int().nonnegative(),
45
+ trackUrl: z.string().url().optional(),
46
+ userPlayCount: z.number().int().nonnegative().optional(),
47
+ userloved: z.boolean().optional(),
48
+ });
49
+
50
+ /* -------------------------------- NoRegex -------------------------------- */
51
+
52
+ export const NoRegexSchema = z.object({
53
+ album: z.string().optional(),
54
+ albumArtist: z.string().optional(),
55
+ artist: z.string(),
56
+ duration: z.number().int().nonnegative().optional(),
57
+ track: z.string(),
58
+ });
59
+
60
+ /* ---------------------------------- Parsed --------------------------------- */
61
+
62
+ export const ParsedSchema = z.object({
63
+ album: z.string().optional(),
64
+ albumArtist: z.string().optional(),
65
+ artist: z.string(),
66
+ currentTime: z.number().int().nonnegative().optional(),
67
+ duration: z.number().int().nonnegative().optional(),
68
+ isPlaying: z.boolean(),
69
+ isPodcast: z.boolean(),
70
+ originUrl: z.string().url().optional(),
71
+ scrobblingDisallowedReason: z.string().optional(),
72
+ track: z.string(),
73
+ trackArt: z.string().url().optional(),
74
+ uniqueID: z.string().optional(),
75
+ });
76
+
77
+ /* ----------------------------------- Song ---------------------------------- */
78
+
79
+ export const SongSchema = z.object({
80
+ connector: ConnectorSchema,
81
+ controllerTabId: z.number().int().nonnegative(),
82
+ flags: FlagsSchema,
83
+ metadata: MetadataSchema,
84
+ noRegex: NoRegexSchema,
85
+ parsed: ParsedSchema,
86
+ });
87
+
88
+ /* -------------------------------- Processed -------------------------------- */
89
+
90
+ export const ProcessedSchema = z.object({
91
+ album: z.string(),
92
+ albumArtist: z.string().optional(),
93
+ artist: z.string(),
94
+ duration: z.number().int().nonnegative(),
95
+ track: z.string(),
96
+ });
97
+
98
+ /* --------------------------------- Scrobble -------------------------------- */
99
+
100
+ export const ScrobbleSchema = z.object({
101
+ song: SongSchema,
102
+ });
103
+
104
+ /* ------------------------------ ScrobbleRequest ----------------------------- */
105
+
106
+ export const ScrobbleRequestSchema = z.object({
107
+ data: ScrobbleSchema,
108
+ eventName: z.string(),
109
+ time: z.number().int().nonnegative(),
110
+ });
111
+
112
+ export type Song = z.infer<typeof SongSchema>;
113
+ export type Processed = z.infer<typeof ProcessedSchema>;
114
+ export type Scrobble = z.infer<typeof ScrobbleSchema>;
115
+ export type ScrobbleRequest = z.infer<typeof ScrobbleRequestSchema>;
116
+ export type ScrobbleRequestData = z.infer<
117
+ typeof ScrobbleRequestSchema
118
+ >["data"];
119
+ }
120
+
121
+ export namespace Lastfm {
122
+ /* -------------------------------- Legacy API Schemas -------------------------------- */
123
+
124
+ export const LegacyNowPlayingRequestSchema = z.object({
125
+ s: z.string(), // session ID
126
+ a: z.string(), // artist
127
+ t: z.string(), // track
128
+ b: z.string().optional(), // album
129
+ l: z.string().optional(), // length in seconds
130
+ n: z.string().optional(), // track number
131
+ m: z.string().optional(), // MusicBrainz ID
132
+ });
133
+
134
+ export const LegacySubmissionRequestSchema = z.object({
135
+ s: z.string(), // session ID
136
+ "a[0]": z.string(), // artist
137
+ "t[0]": z.string(), // track
138
+ "i[0]": z.string(), // timestamp
139
+ "o[0]": z.string().optional(), // source (P/R/E/L/U/B)
140
+ "r[0]": z.string().optional(), // rating (L/B/S)
141
+ "l[0]": z.string().optional(), // length in seconds
142
+ "b[0]": z.string().optional(), // album
143
+ "n[0]": z.string().optional(), // track number
144
+ "m[0]": z.string().optional(), // MusicBrainz ID
145
+ });
146
+
147
+ /* -------------------------------- Auth Request -------------------------------- */
148
+
149
+ export const AuthRequestSchema = z.object({
150
+ method: z.string(),
151
+ api_key: z.string(),
152
+ api_sig: z.string(),
153
+ format: z.string().optional(),
154
+ });
155
+
156
+ /* -------------------------------- Auth GetSession Request -------------------------------- */
157
+
158
+ export const AuthGetSessionRequestSchema = z.object({
159
+ method: z.literal("auth.getSession"),
160
+ api_key: z.string(),
161
+ token: z.string(),
162
+ api_sig: z.string(),
163
+ format: z.string().optional(),
164
+ });
165
+
166
+ /* -------------------------------- Auth GetSession Response -------------------------------- */
167
+
168
+ export const AuthGetSessionResponseSchema = z.object({
169
+ session: z.object({
170
+ name: z.string(),
171
+ key: z.string(),
172
+ subscriber: z.number(),
173
+ }),
174
+ });
175
+
176
+ /* -------------------------------- Track Scrobble Request -------------------------------- */
177
+
178
+ export const TrackScrobbleRequestSchema = z.object({
179
+ method: z.literal("track.scrobble"),
180
+ api_key: z.string(),
181
+ api_sig: z.string(),
182
+ sk: z.string(),
183
+ "track[0]": z.string(),
184
+ "artist[0]": z.string(),
185
+ "timestamp[0]": z.string(),
186
+ "album[0]": z.string().optional(),
187
+ "albumArtist[0]": z.string().optional(),
188
+ "duration[0]": z.string().optional(),
189
+ format: z.string().optional(),
190
+ });
191
+
192
+ /* -------------------------------- Track Update Now Playing Request -------------------------------- */
193
+
194
+ export const TrackUpdateNowPlayingRequestSchema = z.object({
195
+ method: z.literal("track.updateNowPlaying"),
196
+ api_key: z.string(),
197
+ api_sig: z.string(),
198
+ sk: z.string(),
199
+ track: z.string(),
200
+ artist: z.string(),
201
+ album: z.string().optional(),
202
+ albumArtist: z.string().optional(),
203
+ duration: z.string().optional(),
204
+ format: z.string().optional(),
205
+ });
206
+
207
+ /* -------------------------------- Scrobble Response -------------------------------- */
208
+
209
+ export const ScrobbleResponseSchema = z.object({
210
+ scrobbles: z.object({
211
+ "@attr": z.object({
212
+ accepted: z.number(),
213
+ ignored: z.number(),
214
+ }),
215
+ scrobble: z
216
+ .object({
217
+ artist: z.object({ "#text": z.string() }),
218
+ track: z.object({ "#text": z.string() }),
219
+ album: z.object({ "#text": z.string() }).optional(),
220
+ albumArtist: z.object({ "#text": z.string() }).optional(),
221
+ timestamp: z.string(),
222
+ ignoredMessage: z
223
+ .object({ code: z.string(), "#text": z.string() })
224
+ .optional(),
225
+ })
226
+ .optional(),
227
+ }),
228
+ });
229
+
230
+ /* -------------------------------- Error Response -------------------------------- */
231
+
232
+ export const ErrorResponseSchema = z.object({
233
+ error: z.number(),
234
+ message: z.string(),
235
+ });
236
+
237
+ export type LegacyNowPlayingRequest = z.infer<
238
+ typeof LegacyNowPlayingRequestSchema
239
+ >;
240
+ export type LegacySubmissionRequest = z.infer<
241
+ typeof LegacySubmissionRequestSchema
242
+ >;
243
+ export type AuthRequest = z.infer<typeof AuthRequestSchema>;
244
+ export type AuthGetSessionRequest = z.infer<
245
+ typeof AuthGetSessionRequestSchema
246
+ >;
247
+ export type AuthGetSessionResponse = z.infer<
248
+ typeof AuthGetSessionResponseSchema
249
+ >;
250
+ export type TrackScrobbleRequest = z.infer<typeof TrackScrobbleRequestSchema>;
251
+ export type TrackUpdateNowPlayingRequest = z.infer<
252
+ typeof TrackUpdateNowPlayingRequestSchema
253
+ >;
254
+ export type ScrobbleResponse = z.infer<typeof ScrobbleResponseSchema>;
255
+ export type ErrorResponse = z.infer<typeof ErrorResponseSchema>;
256
+ }
257
+
258
+ export namespace Listenbrainz {
259
+ /* -------------------------------- TrackMetadata -------------------------------- */
260
+
261
+ export const TrackMetadataSchema = z.object({
262
+ artist_name: z.string(),
263
+ track_name: z.string(),
264
+ release_name: z.string().optional(),
265
+ additional_info: z.record(z.any()).optional(),
266
+ });
267
+
268
+ /* -------------------------------- Payload -------------------------------- */
269
+
270
+ export const PayloadSchema = z.object({
271
+ listened_at: z.number().int().nonnegative().optional(),
272
+ track_metadata: TrackMetadataSchema,
273
+ });
274
+
275
+ /* -------------------------------- SubmitListensRequest -------------------------------- */
276
+
277
+ export const SubmitListensRequestSchema = z.object({
278
+ listen_type: z.enum(["single", "playing_now", "import"]),
279
+ payload: z.array(PayloadSchema),
280
+ });
281
+
282
+ /* -------------------------------- SubmitListensResponse -------------------------------- */
283
+
284
+ export const SubmitListensResponseSchema = z.object({
285
+ status: z.string(),
286
+ code: z.number().int(),
287
+ });
288
+
289
+ /* -------------------------------- ValidateTokenResponse -------------------------------- */
290
+
291
+ export const ValidateTokenResponseSchema = z.object({
292
+ code: z.number().int(),
293
+ message: z.string(),
294
+ valid: z.boolean(),
295
+ user_name: z.string().optional(),
296
+ });
297
+
298
+ export type TrackMetadata = z.infer<typeof TrackMetadataSchema>;
299
+
300
+ export type Payload = z.infer<typeof PayloadSchema>;
301
+ export type SubmitListensRequest = z.infer<typeof SubmitListensRequestSchema>;
302
+ export type SubmitListensResponse = z.infer<
303
+ typeof SubmitListensResponseSchema
304
+ >;
305
+ export type ValidateTokenResponse = z.infer<
306
+ typeof ValidateTokenResponseSchema
307
+ >;
308
+ }
package/tsconfig.json CHANGED
@@ -1,31 +1,28 @@
1
1
  {
2
- "compilerOptions": {
3
- "allowJs": true,
4
- "allowSyntheticDefaultImports": true,
5
- "baseUrl": "src",
6
- "declaration": true,
7
- "sourceMap": true,
8
- "esModuleInterop": true,
9
- "inlineSourceMap": false,
10
- "lib": ["esnext", "DOM"],
11
- "listEmittedFiles": false,
12
- "listFiles": false,
13
- "moduleResolution": "node",
14
- "noFallthroughCasesInSwitch": true,
15
- "pretty": true,
16
- "resolveJsonModule": true,
17
- "rootDir": ".",
18
- "skipLibCheck": true,
19
- "strict": false,
20
- "traceResolution": false,
21
- "outDir": "",
22
- "target": "esnext",
23
- "module": "esnext",
24
- "types": [
25
- "@types/node",
26
- "@types/express",
27
- ]
28
- },
29
- "exclude": ["node_modules", "dist", "tests"],
30
- "include": ["src", "scripts"]
2
+ "compilerOptions": {
3
+ "allowJs": true,
4
+ "allowSyntheticDefaultImports": true,
5
+ "baseUrl": "src",
6
+ "declaration": true,
7
+ "sourceMap": true,
8
+ "esModuleInterop": true,
9
+ "inlineSourceMap": false,
10
+ "lib": ["esnext", "DOM"],
11
+ "listEmittedFiles": false,
12
+ "listFiles": false,
13
+ "moduleResolution": "node",
14
+ "noFallthroughCasesInSwitch": true,
15
+ "pretty": true,
16
+ "resolveJsonModule": true,
17
+ "rootDir": ".",
18
+ "skipLibCheck": true,
19
+ "strict": false,
20
+ "traceResolution": false,
21
+ "outDir": "",
22
+ "target": "esnext",
23
+ "module": "esnext",
24
+ "types": ["@types/node", "@types/express"],
25
+ },
26
+ "exclude": ["node_modules", "dist", "tests"],
27
+ "include": ["src", "scripts"],
31
28
  }