@rocksky/cli 0.2.0 → 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 (170) hide show
  1. package/README.md +21 -9
  2. package/dist/drizzle/0000_parallel_paper_doll.sql +220 -0
  3. package/dist/drizzle/meta/0000_snapshot.json +1559 -0
  4. package/dist/drizzle/meta/_journal.json +13 -0
  5. package/dist/index.js +8280 -254
  6. package/drizzle/0000_parallel_paper_doll.sql +220 -0
  7. package/drizzle/meta/0000_snapshot.json +1559 -0
  8. package/drizzle/meta/_journal.json +13 -0
  9. package/drizzle.config.ts +18 -0
  10. package/package.json +31 -3
  11. package/src/client.ts +32 -14
  12. package/src/cmd/scrobble-api.ts +457 -0
  13. package/src/cmd/scrobble.ts +14 -61
  14. package/src/cmd/search.ts +27 -25
  15. package/src/cmd/sync.ts +812 -0
  16. package/src/cmd/whoami.ts +36 -7
  17. package/src/context.ts +24 -0
  18. package/src/drizzle.ts +53 -0
  19. package/src/index.ts +66 -26
  20. package/src/jetstream.ts +285 -0
  21. package/src/lexicon/index.ts +1321 -0
  22. package/src/lexicon/lexicons.ts +5453 -0
  23. package/src/lexicon/types/app/bsky/actor/profile.ts +38 -0
  24. package/src/lexicon/types/app/rocksky/actor/defs.ts +146 -0
  25. package/src/lexicon/types/app/rocksky/actor/getActorAlbums.ts +56 -0
  26. package/src/lexicon/types/app/rocksky/actor/getActorArtists.ts +56 -0
  27. package/src/lexicon/types/app/rocksky/actor/getActorCompatibility.ts +48 -0
  28. package/src/lexicon/types/app/rocksky/actor/getActorLovedSongs.ts +52 -0
  29. package/src/lexicon/types/app/rocksky/actor/getActorNeighbours.ts +48 -0
  30. package/src/lexicon/types/app/rocksky/actor/getActorPlaylists.ts +52 -0
  31. package/src/lexicon/types/app/rocksky/actor/getActorScrobbles.ts +52 -0
  32. package/src/lexicon/types/app/rocksky/actor/getActorSongs.ts +56 -0
  33. package/src/lexicon/types/app/rocksky/actor/getProfile.ts +43 -0
  34. package/src/lexicon/types/app/rocksky/album/defs.ts +85 -0
  35. package/src/lexicon/types/app/rocksky/album/getAlbum.ts +43 -0
  36. package/src/lexicon/types/app/rocksky/album/getAlbumTracks.ts +48 -0
  37. package/src/lexicon/types/app/rocksky/album/getAlbums.ts +50 -0
  38. package/src/lexicon/types/app/rocksky/album.ts +51 -0
  39. package/src/lexicon/types/app/rocksky/apikey/createApikey.ts +51 -0
  40. package/src/lexicon/types/app/rocksky/apikey/defs.ts +31 -0
  41. package/src/lexicon/types/app/rocksky/apikey/getApikeys.ts +50 -0
  42. package/src/lexicon/types/app/rocksky/apikey/removeApikey.ts +43 -0
  43. package/src/lexicon/types/app/rocksky/apikey/updateApikey.ts +53 -0
  44. package/src/lexicon/types/app/rocksky/apikeys/defs.ts +7 -0
  45. package/src/lexicon/types/app/rocksky/artist/defs.ts +140 -0
  46. package/src/lexicon/types/app/rocksky/artist/getArtist.ts +43 -0
  47. package/src/lexicon/types/app/rocksky/artist/getArtistAlbums.ts +48 -0
  48. package/src/lexicon/types/app/rocksky/artist/getArtistListeners.ts +52 -0
  49. package/src/lexicon/types/app/rocksky/artist/getArtistTracks.ts +52 -0
  50. package/src/lexicon/types/app/rocksky/artist/getArtists.ts +52 -0
  51. package/src/lexicon/types/app/rocksky/artist.ts +41 -0
  52. package/src/lexicon/types/app/rocksky/charts/defs.ts +44 -0
  53. package/src/lexicon/types/app/rocksky/charts/getScrobblesChart.ts +49 -0
  54. package/src/lexicon/types/app/rocksky/dropbox/defs.ts +71 -0
  55. package/src/lexicon/types/app/rocksky/dropbox/downloadFile.ts +42 -0
  56. package/src/lexicon/types/app/rocksky/dropbox/getFiles.ts +43 -0
  57. package/src/lexicon/types/app/rocksky/dropbox/getMetadata.ts +43 -0
  58. package/src/lexicon/types/app/rocksky/dropbox/getTemporaryLink.ts +43 -0
  59. package/src/lexicon/types/app/rocksky/feed/defs.ts +182 -0
  60. package/src/lexicon/types/app/rocksky/feed/describeFeedGenerator.ts +48 -0
  61. package/src/lexicon/types/app/rocksky/feed/generator.ts +29 -0
  62. package/src/lexicon/types/app/rocksky/feed/getFeed.ts +47 -0
  63. package/src/lexicon/types/app/rocksky/feed/getFeedGenerator.ts +48 -0
  64. package/src/lexicon/types/app/rocksky/feed/getFeedGenerators.ts +43 -0
  65. package/src/lexicon/types/app/rocksky/feed/getFeedSkeleton.ts +56 -0
  66. package/src/lexicon/types/app/rocksky/feed/getNowPlayings.ts +43 -0
  67. package/src/lexicon/types/app/rocksky/feed/search.ts +43 -0
  68. package/src/lexicon/types/app/rocksky/googledrive/defs.ts +42 -0
  69. package/src/lexicon/types/app/rocksky/googledrive/downloadFile.ts +42 -0
  70. package/src/lexicon/types/app/rocksky/googledrive/getFile.ts +43 -0
  71. package/src/lexicon/types/app/rocksky/googledrive/getFiles.ts +43 -0
  72. package/src/lexicon/types/app/rocksky/graph/defs.ts +47 -0
  73. package/src/lexicon/types/app/rocksky/graph/follow.ts +28 -0
  74. package/src/lexicon/types/app/rocksky/graph/followAccount.ts +50 -0
  75. package/src/lexicon/types/app/rocksky/graph/getFollowers.ts +56 -0
  76. package/src/lexicon/types/app/rocksky/graph/getFollows.ts +56 -0
  77. package/src/lexicon/types/app/rocksky/graph/getKnownFollowers.ts +52 -0
  78. package/src/lexicon/types/app/rocksky/graph/unfollowAccount.ts +50 -0
  79. package/src/lexicon/types/app/rocksky/like/dislikeShout.ts +49 -0
  80. package/src/lexicon/types/app/rocksky/like/dislikeSong.ts +49 -0
  81. package/src/lexicon/types/app/rocksky/like/likeShout.ts +49 -0
  82. package/src/lexicon/types/app/rocksky/like/likeSong.ts +49 -0
  83. package/src/lexicon/types/app/rocksky/like.ts +27 -0
  84. package/src/lexicon/types/app/rocksky/player/addDirectoryToQueue.ts +40 -0
  85. package/src/lexicon/types/app/rocksky/player/addItemsToQueue.ts +39 -0
  86. package/src/lexicon/types/app/rocksky/player/defs.ts +57 -0
  87. package/src/lexicon/types/app/rocksky/player/getCurrentlyPlaying.ts +44 -0
  88. package/src/lexicon/types/app/rocksky/player/getPlaybackQueue.ts +42 -0
  89. package/src/lexicon/types/app/rocksky/player/next.ts +34 -0
  90. package/src/lexicon/types/app/rocksky/player/pause.ts +34 -0
  91. package/src/lexicon/types/app/rocksky/player/play.ts +34 -0
  92. package/src/lexicon/types/app/rocksky/player/playDirectory.ts +38 -0
  93. package/src/lexicon/types/app/rocksky/player/playFile.ts +35 -0
  94. package/src/lexicon/types/app/rocksky/player/previous.ts +34 -0
  95. package/src/lexicon/types/app/rocksky/player/seek.ts +36 -0
  96. package/src/lexicon/types/app/rocksky/playlist/createPlaylist.ts +37 -0
  97. package/src/lexicon/types/app/rocksky/playlist/defs.ts +86 -0
  98. package/src/lexicon/types/app/rocksky/playlist/getPlaylist.ts +43 -0
  99. package/src/lexicon/types/app/rocksky/playlist/getPlaylists.ts +50 -0
  100. package/src/lexicon/types/app/rocksky/playlist/insertDirectory.ts +39 -0
  101. package/src/lexicon/types/app/rocksky/playlist/insertFiles.ts +38 -0
  102. package/src/lexicon/types/app/rocksky/playlist/removePlaylist.ts +35 -0
  103. package/src/lexicon/types/app/rocksky/playlist/removeTrack.ts +37 -0
  104. package/src/lexicon/types/app/rocksky/playlist/startPlaylist.ts +39 -0
  105. package/src/lexicon/types/app/rocksky/playlist.ts +43 -0
  106. package/src/lexicon/types/app/rocksky/radio/defs.ts +63 -0
  107. package/src/lexicon/types/app/rocksky/radio.ts +37 -0
  108. package/src/lexicon/types/app/rocksky/scrobble/createScrobble.ts +91 -0
  109. package/src/lexicon/types/app/rocksky/scrobble/defs.ts +93 -0
  110. package/src/lexicon/types/app/rocksky/scrobble/getScrobble.ts +43 -0
  111. package/src/lexicon/types/app/rocksky/scrobble/getScrobbles.ts +54 -0
  112. package/src/lexicon/types/app/rocksky/scrobble.ts +75 -0
  113. package/src/lexicon/types/app/rocksky/shout/createShout.ts +49 -0
  114. package/src/lexicon/types/app/rocksky/shout/defs.ts +58 -0
  115. package/src/lexicon/types/app/rocksky/shout/getAlbumShouts.ts +52 -0
  116. package/src/lexicon/types/app/rocksky/shout/getArtistShouts.ts +52 -0
  117. package/src/lexicon/types/app/rocksky/shout/getProfileShouts.ts +52 -0
  118. package/src/lexicon/types/app/rocksky/shout/getShoutReplies.ts +52 -0
  119. package/src/lexicon/types/app/rocksky/shout/getTrackShouts.ts +48 -0
  120. package/src/lexicon/types/app/rocksky/shout/removeShout.ts +43 -0
  121. package/src/lexicon/types/app/rocksky/shout/replyShout.ts +51 -0
  122. package/src/lexicon/types/app/rocksky/shout/reportShout.ts +51 -0
  123. package/src/lexicon/types/app/rocksky/shout.ts +30 -0
  124. package/src/lexicon/types/app/rocksky/song/createSong.ts +71 -0
  125. package/src/lexicon/types/app/rocksky/song/defs.ts +103 -0
  126. package/src/lexicon/types/app/rocksky/song/getSong.ts +43 -0
  127. package/src/lexicon/types/app/rocksky/song/getSongs.ts +50 -0
  128. package/src/lexicon/types/app/rocksky/song.ts +74 -0
  129. package/src/lexicon/types/app/rocksky/spotify/defs.ts +35 -0
  130. package/src/lexicon/types/app/rocksky/spotify/getCurrentlyPlaying.ts +43 -0
  131. package/src/lexicon/types/app/rocksky/spotify/next.ts +32 -0
  132. package/src/lexicon/types/app/rocksky/spotify/pause.ts +32 -0
  133. package/src/lexicon/types/app/rocksky/spotify/play.ts +32 -0
  134. package/src/lexicon/types/app/rocksky/spotify/previous.ts +32 -0
  135. package/src/lexicon/types/app/rocksky/spotify/seek.ts +35 -0
  136. package/src/lexicon/types/app/rocksky/stats/defs.ts +33 -0
  137. package/src/lexicon/types/app/rocksky/stats/getStats.ts +43 -0
  138. package/src/lexicon/types/com/atproto/repo/strongRef.ts +26 -0
  139. package/src/lexicon/util.ts +13 -0
  140. package/src/lib/agent.ts +56 -0
  141. package/src/lib/cleanUpJetstreamLock.ts +66 -0
  142. package/src/lib/cleanUpSyncLock.ts +56 -0
  143. package/src/lib/didUnstorageCache.ts +72 -0
  144. package/src/lib/env.ts +25 -0
  145. package/src/lib/extractPdsFromDid.ts +33 -0
  146. package/src/lib/getDidAndHandle.ts +39 -0
  147. package/src/lib/idResolver.ts +52 -0
  148. package/src/lib/lastfm.ts +26 -0
  149. package/src/lib/matchTrack.ts +47 -0
  150. package/src/logger.ts +18 -0
  151. package/src/schema/album-tracks.ts +30 -0
  152. package/src/schema/albums.ts +29 -0
  153. package/src/schema/artist-albums.ts +29 -0
  154. package/src/schema/artist-genres.ts +17 -0
  155. package/src/schema/artist-tracks.ts +29 -0
  156. package/src/schema/artists.ts +30 -0
  157. package/src/schema/auth-session.ts +18 -0
  158. package/src/schema/genres.ts +18 -0
  159. package/src/schema/index.ts +33 -0
  160. package/src/schema/loved-tracks.ts +27 -0
  161. package/src/schema/scrobbles.ts +30 -0
  162. package/src/schema/tracks.ts +39 -0
  163. package/src/schema/user-albums.ts +31 -0
  164. package/src/schema/user-artists.ts +32 -0
  165. package/src/schema/user-tracks.ts +31 -0
  166. package/src/schema/users.ts +21 -0
  167. package/src/scrobble.ts +410 -0
  168. package/src/sqliteKv.ts +173 -0
  169. package/src/types.ts +308 -0
  170. package/tsconfig.json +26 -29
@@ -0,0 +1,103 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
5
+ import { lexicons } from '../../../../lexicons'
6
+ import { isObj, hasProp } from '../../../../util'
7
+ import { CID } from 'multiformats/cid'
8
+
9
+ export interface SongViewBasic {
10
+ /** The unique identifier of the song. */
11
+ id?: string
12
+ /** The title of the song. */
13
+ title?: string
14
+ /** The artist of the song. */
15
+ artist?: string
16
+ /** The artist of the album the song belongs to. */
17
+ albumArtist?: string
18
+ /** The URL of the album art image. */
19
+ albumArt?: string
20
+ /** The URI of the song. */
21
+ uri?: string
22
+ /** The album of the song. */
23
+ album?: string
24
+ /** The duration of the song in milliseconds. */
25
+ duration?: number
26
+ /** The track number of the song in the album. */
27
+ trackNumber?: number
28
+ /** The disc number of the song in the album. */
29
+ discNumber?: number
30
+ /** The number of times the song has been played. */
31
+ playCount?: number
32
+ /** The number of unique listeners who have played the song. */
33
+ uniqueListeners?: number
34
+ /** The URI of the album the song belongs to. */
35
+ albumUri?: string
36
+ /** The URI of the artist of the song. */
37
+ artistUri?: string
38
+ /** The SHA256 hash of the song. */
39
+ sha256?: string
40
+ /** The timestamp when the song was created. */
41
+ createdAt?: string
42
+ [k: string]: unknown
43
+ }
44
+
45
+ export function isSongViewBasic(v: unknown): v is SongViewBasic {
46
+ return (
47
+ isObj(v) &&
48
+ hasProp(v, '$type') &&
49
+ v.$type === 'app.rocksky.song.defs#songViewBasic'
50
+ )
51
+ }
52
+
53
+ export function validateSongViewBasic(v: unknown): ValidationResult {
54
+ return lexicons.validate('app.rocksky.song.defs#songViewBasic', v)
55
+ }
56
+
57
+ export interface SongViewDetailed {
58
+ /** The unique identifier of the song. */
59
+ id?: string
60
+ /** The title of the song. */
61
+ title?: string
62
+ /** The artist of the song. */
63
+ artist?: string
64
+ /** The artist of the album the song belongs to. */
65
+ albumArtist?: string
66
+ /** The URL of the album art image. */
67
+ albumArt?: string
68
+ /** The URI of the song. */
69
+ uri?: string
70
+ /** The album of the song. */
71
+ album?: string
72
+ /** The duration of the song in milliseconds. */
73
+ duration?: number
74
+ /** The track number of the song in the album. */
75
+ trackNumber?: number
76
+ /** The disc number of the song in the album. */
77
+ discNumber?: number
78
+ /** The number of times the song has been played. */
79
+ playCount?: number
80
+ /** The number of unique listeners who have played the song. */
81
+ uniqueListeners?: number
82
+ /** The URI of the album the song belongs to. */
83
+ albumUri?: string
84
+ /** The URI of the artist of the song. */
85
+ artistUri?: string
86
+ /** The SHA256 hash of the song. */
87
+ sha256?: string
88
+ /** The timestamp when the song was created. */
89
+ createdAt?: string
90
+ [k: string]: unknown
91
+ }
92
+
93
+ export function isSongViewDetailed(v: unknown): v is SongViewDetailed {
94
+ return (
95
+ isObj(v) &&
96
+ hasProp(v, '$type') &&
97
+ v.$type === 'app.rocksky.song.defs#songViewDetailed'
98
+ )
99
+ }
100
+
101
+ export function validateSongViewDetailed(v: unknown): ValidationResult {
102
+ return lexicons.validate('app.rocksky.song.defs#songViewDetailed', v)
103
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express'
5
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
6
+ import { lexicons } from '../../../../lexicons'
7
+ import { isObj, hasProp } from '../../../../util'
8
+ import { CID } from 'multiformats/cid'
9
+ import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server'
10
+ import * as AppRockskySongDefs from './defs'
11
+
12
+ export interface QueryParams {
13
+ /** The unique identifier of the song to retrieve */
14
+ uri: string
15
+ }
16
+
17
+ export type InputSchema = undefined
18
+ export type OutputSchema = AppRockskySongDefs.SongViewDetailed
19
+ export type HandlerInput = undefined
20
+
21
+ export interface HandlerSuccess {
22
+ encoding: 'application/json'
23
+ body: OutputSchema
24
+ headers?: { [key: string]: string }
25
+ }
26
+
27
+ export interface HandlerError {
28
+ status: number
29
+ message?: string
30
+ }
31
+
32
+ export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough
33
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
34
+ auth: HA
35
+ params: QueryParams
36
+ input: HandlerInput
37
+ req: express.Request
38
+ res: express.Response
39
+ resetRouteRateLimits: () => Promise<void>
40
+ }
41
+ export type Handler<HA extends HandlerAuth = never> = (
42
+ ctx: HandlerReqCtx<HA>,
43
+ ) => Promise<HandlerOutput> | HandlerOutput
@@ -0,0 +1,50 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express'
5
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
6
+ import { lexicons } from '../../../../lexicons'
7
+ import { isObj, hasProp } from '../../../../util'
8
+ import { CID } from 'multiformats/cid'
9
+ import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server'
10
+ import * as AppRockskySongDefs from './defs'
11
+
12
+ export interface QueryParams {
13
+ /** The maximum number of songs to return */
14
+ limit?: number
15
+ /** The offset for pagination */
16
+ offset?: number
17
+ }
18
+
19
+ export type InputSchema = undefined
20
+
21
+ export interface OutputSchema {
22
+ songs?: AppRockskySongDefs.SongViewBasic[]
23
+ [k: string]: unknown
24
+ }
25
+
26
+ export type HandlerInput = undefined
27
+
28
+ export interface HandlerSuccess {
29
+ encoding: 'application/json'
30
+ body: OutputSchema
31
+ headers?: { [key: string]: string }
32
+ }
33
+
34
+ export interface HandlerError {
35
+ status: number
36
+ message?: string
37
+ }
38
+
39
+ export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough
40
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
41
+ auth: HA
42
+ params: QueryParams
43
+ input: HandlerInput
44
+ req: express.Request
45
+ res: express.Response
46
+ resetRouteRateLimits: () => Promise<void>
47
+ }
48
+ export type Handler<HA extends HandlerAuth = never> = (
49
+ ctx: HandlerReqCtx<HA>,
50
+ ) => Promise<HandlerOutput> | HandlerOutput
@@ -0,0 +1,74 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
5
+ import { lexicons } from '../../../lexicons'
6
+ import { isObj, hasProp } from '../../../util'
7
+ import { CID } from 'multiformats/cid'
8
+ import * as AppRockskyArtistDefs from './artist/defs'
9
+
10
+ export interface Record {
11
+ /** The title of the song. */
12
+ title: string
13
+ /** The artist of the song. */
14
+ artist: string
15
+ /** The artists of the song with MusicBrainz IDs. */
16
+ artists?: AppRockskyArtistDefs.ArtistMbid[]
17
+ /** The album artist of the song. */
18
+ albumArtist: string
19
+ /** The album of the song. */
20
+ album: string
21
+ /** The duration of the song in seconds. */
22
+ duration: number
23
+ /** The track number of the song in the album. */
24
+ trackNumber?: number
25
+ /** The disc number of the song in the album. */
26
+ discNumber?: number
27
+ /** The release date of the song. */
28
+ releaseDate?: string
29
+ /** The year the song was released. */
30
+ year?: number
31
+ /** The genre of the song. */
32
+ genre?: string
33
+ /** The tags of the song. */
34
+ tags?: string[]
35
+ /** The composer of the song. */
36
+ composer?: string
37
+ /** The lyrics of the song. */
38
+ lyrics?: string
39
+ /** The copyright message of the song. */
40
+ copyrightMessage?: string
41
+ /** Informations about the song */
42
+ wiki?: string
43
+ /** The album art of the song. */
44
+ albumArt?: BlobRef
45
+ /** The URL of the album art of the song. */
46
+ albumArtUrl?: string
47
+ /** The YouTube link of the song. */
48
+ youtubeLink?: string
49
+ /** The Spotify link of the song. */
50
+ spotifyLink?: string
51
+ /** The Tidal link of the song. */
52
+ tidalLink?: string
53
+ /** The Apple Music link of the song. */
54
+ appleMusicLink?: string
55
+ /** The date when the song was created. */
56
+ createdAt: string
57
+ /** The MusicBrainz ID of the song. */
58
+ mbid?: string
59
+ /** The label of the song. */
60
+ label?: string
61
+ [k: string]: unknown
62
+ }
63
+
64
+ export function isRecord(v: unknown): v is Record {
65
+ return (
66
+ isObj(v) &&
67
+ hasProp(v, '$type') &&
68
+ (v.$type === 'app.rocksky.song#main' || v.$type === 'app.rocksky.song')
69
+ )
70
+ }
71
+
72
+ export function validateRecord(v: unknown): ValidationResult {
73
+ return lexicons.validate('app.rocksky.song#main', v)
74
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
5
+ import { lexicons } from '../../../../lexicons'
6
+ import { isObj, hasProp } from '../../../../util'
7
+ import { CID } from 'multiformats/cid'
8
+
9
+ export interface SpotifyTrackView {
10
+ /** The unique identifier of the Spotify track. */
11
+ id?: string
12
+ /** The name of the track. */
13
+ name?: string
14
+ /** The name of the artist. */
15
+ artist?: string
16
+ /** The name of the album. */
17
+ album?: string
18
+ /** The duration of the track in milliseconds. */
19
+ duration?: number
20
+ /** A URL to a preview of the track. */
21
+ previewUrl?: string
22
+ [k: string]: unknown
23
+ }
24
+
25
+ export function isSpotifyTrackView(v: unknown): v is SpotifyTrackView {
26
+ return (
27
+ isObj(v) &&
28
+ hasProp(v, '$type') &&
29
+ v.$type === 'app.rocksky.spotify.defs#spotifyTrackView'
30
+ )
31
+ }
32
+
33
+ export function validateSpotifyTrackView(v: unknown): ValidationResult {
34
+ return lexicons.validate('app.rocksky.spotify.defs#spotifyTrackView', v)
35
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express'
5
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
6
+ import { lexicons } from '../../../../lexicons'
7
+ import { isObj, hasProp } from '../../../../util'
8
+ import { CID } from 'multiformats/cid'
9
+ import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server'
10
+ import * as AppRockskyPlayerDefs from '../player/defs'
11
+
12
+ export interface QueryParams {
13
+ /** Handle or DID of the actor to retrieve the currently playing track for. If not provided, defaults to the current user. */
14
+ actor?: string
15
+ }
16
+
17
+ export type InputSchema = undefined
18
+ export type OutputSchema = AppRockskyPlayerDefs.CurrentlyPlayingViewDetailed
19
+ export type HandlerInput = undefined
20
+
21
+ export interface HandlerSuccess {
22
+ encoding: 'application/json'
23
+ body: OutputSchema
24
+ headers?: { [key: string]: string }
25
+ }
26
+
27
+ export interface HandlerError {
28
+ status: number
29
+ message?: string
30
+ }
31
+
32
+ export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough
33
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
34
+ auth: HA
35
+ params: QueryParams
36
+ input: HandlerInput
37
+ req: express.Request
38
+ res: express.Response
39
+ resetRouteRateLimits: () => Promise<void>
40
+ }
41
+ export type Handler<HA extends HandlerAuth = never> = (
42
+ ctx: HandlerReqCtx<HA>,
43
+ ) => Promise<HandlerOutput> | HandlerOutput
@@ -0,0 +1,32 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express'
5
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
6
+ import { lexicons } from '../../../../lexicons'
7
+ import { isObj, hasProp } from '../../../../util'
8
+ import { CID } from 'multiformats/cid'
9
+ import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server'
10
+
11
+ export interface QueryParams {}
12
+
13
+ export type InputSchema = undefined
14
+ export type HandlerInput = undefined
15
+
16
+ export interface HandlerError {
17
+ status: number
18
+ message?: string
19
+ }
20
+
21
+ export type HandlerOutput = HandlerError | void
22
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
23
+ auth: HA
24
+ params: QueryParams
25
+ input: HandlerInput
26
+ req: express.Request
27
+ res: express.Response
28
+ resetRouteRateLimits: () => Promise<void>
29
+ }
30
+ export type Handler<HA extends HandlerAuth = never> = (
31
+ ctx: HandlerReqCtx<HA>,
32
+ ) => Promise<HandlerOutput> | HandlerOutput
@@ -0,0 +1,32 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express'
5
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
6
+ import { lexicons } from '../../../../lexicons'
7
+ import { isObj, hasProp } from '../../../../util'
8
+ import { CID } from 'multiformats/cid'
9
+ import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server'
10
+
11
+ export interface QueryParams {}
12
+
13
+ export type InputSchema = undefined
14
+ export type HandlerInput = undefined
15
+
16
+ export interface HandlerError {
17
+ status: number
18
+ message?: string
19
+ }
20
+
21
+ export type HandlerOutput = HandlerError | void
22
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
23
+ auth: HA
24
+ params: QueryParams
25
+ input: HandlerInput
26
+ req: express.Request
27
+ res: express.Response
28
+ resetRouteRateLimits: () => Promise<void>
29
+ }
30
+ export type Handler<HA extends HandlerAuth = never> = (
31
+ ctx: HandlerReqCtx<HA>,
32
+ ) => Promise<HandlerOutput> | HandlerOutput
@@ -0,0 +1,32 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express'
5
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
6
+ import { lexicons } from '../../../../lexicons'
7
+ import { isObj, hasProp } from '../../../../util'
8
+ import { CID } from 'multiformats/cid'
9
+ import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server'
10
+
11
+ export interface QueryParams {}
12
+
13
+ export type InputSchema = undefined
14
+ export type HandlerInput = undefined
15
+
16
+ export interface HandlerError {
17
+ status: number
18
+ message?: string
19
+ }
20
+
21
+ export type HandlerOutput = HandlerError | void
22
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
23
+ auth: HA
24
+ params: QueryParams
25
+ input: HandlerInput
26
+ req: express.Request
27
+ res: express.Response
28
+ resetRouteRateLimits: () => Promise<void>
29
+ }
30
+ export type Handler<HA extends HandlerAuth = never> = (
31
+ ctx: HandlerReqCtx<HA>,
32
+ ) => Promise<HandlerOutput> | HandlerOutput
@@ -0,0 +1,32 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express'
5
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
6
+ import { lexicons } from '../../../../lexicons'
7
+ import { isObj, hasProp } from '../../../../util'
8
+ import { CID } from 'multiformats/cid'
9
+ import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server'
10
+
11
+ export interface QueryParams {}
12
+
13
+ export type InputSchema = undefined
14
+ export type HandlerInput = undefined
15
+
16
+ export interface HandlerError {
17
+ status: number
18
+ message?: string
19
+ }
20
+
21
+ export type HandlerOutput = HandlerError | void
22
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
23
+ auth: HA
24
+ params: QueryParams
25
+ input: HandlerInput
26
+ req: express.Request
27
+ res: express.Response
28
+ resetRouteRateLimits: () => Promise<void>
29
+ }
30
+ export type Handler<HA extends HandlerAuth = never> = (
31
+ ctx: HandlerReqCtx<HA>,
32
+ ) => Promise<HandlerOutput> | HandlerOutput
@@ -0,0 +1,35 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express'
5
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
6
+ import { lexicons } from '../../../../lexicons'
7
+ import { isObj, hasProp } from '../../../../util'
8
+ import { CID } from 'multiformats/cid'
9
+ import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server'
10
+
11
+ export interface QueryParams {
12
+ /** The position in seconds to seek to */
13
+ position: number
14
+ }
15
+
16
+ export type InputSchema = undefined
17
+ export type HandlerInput = undefined
18
+
19
+ export interface HandlerError {
20
+ status: number
21
+ message?: string
22
+ }
23
+
24
+ export type HandlerOutput = HandlerError | void
25
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
26
+ auth: HA
27
+ params: QueryParams
28
+ input: HandlerInput
29
+ req: express.Request
30
+ res: express.Response
31
+ resetRouteRateLimits: () => Promise<void>
32
+ }
33
+ export type Handler<HA extends HandlerAuth = never> = (
34
+ ctx: HandlerReqCtx<HA>,
35
+ ) => Promise<HandlerOutput> | HandlerOutput
@@ -0,0 +1,33 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
5
+ import { lexicons } from '../../../../lexicons'
6
+ import { isObj, hasProp } from '../../../../util'
7
+ import { CID } from 'multiformats/cid'
8
+
9
+ export interface StatsView {
10
+ /** The total number of scrobbles. */
11
+ scrobbles?: number
12
+ /** The total number of unique artists scrobbled. */
13
+ artists?: number
14
+ /** The total number of tracks marked as loved. */
15
+ lovedTracks?: number
16
+ /** The total number of unique albums scrobbled. */
17
+ albums?: number
18
+ /** The total number of unique tracks scrobbled. */
19
+ tracks?: number
20
+ [k: string]: unknown
21
+ }
22
+
23
+ export function isStatsView(v: unknown): v is StatsView {
24
+ return (
25
+ isObj(v) &&
26
+ hasProp(v, '$type') &&
27
+ v.$type === 'app.rocksky.stats.defs#statsView'
28
+ )
29
+ }
30
+
31
+ export function validateStatsView(v: unknown): ValidationResult {
32
+ return lexicons.validate('app.rocksky.stats.defs#statsView', v)
33
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express'
5
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
6
+ import { lexicons } from '../../../../lexicons'
7
+ import { isObj, hasProp } from '../../../../util'
8
+ import { CID } from 'multiformats/cid'
9
+ import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server'
10
+ import * as AppRockskyStatsDefs from './defs'
11
+
12
+ export interface QueryParams {
13
+ /** The DID or handle of the user to get stats for. */
14
+ did: string
15
+ }
16
+
17
+ export type InputSchema = undefined
18
+ export type OutputSchema = AppRockskyStatsDefs.StatsView
19
+ export type HandlerInput = undefined
20
+
21
+ export interface HandlerSuccess {
22
+ encoding: 'application/json'
23
+ body: OutputSchema
24
+ headers?: { [key: string]: string }
25
+ }
26
+
27
+ export interface HandlerError {
28
+ status: number
29
+ message?: string
30
+ }
31
+
32
+ export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough
33
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
34
+ auth: HA
35
+ params: QueryParams
36
+ input: HandlerInput
37
+ req: express.Request
38
+ res: express.Response
39
+ resetRouteRateLimits: () => Promise<void>
40
+ }
41
+ export type Handler<HA extends HandlerAuth = never> = (
42
+ ctx: HandlerReqCtx<HA>,
43
+ ) => Promise<HandlerOutput> | HandlerOutput
@@ -0,0 +1,26 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import { ValidationResult, BlobRef } from '@atproto/lexicon'
5
+ import { lexicons } from '../../../../lexicons'
6
+ import { isObj, hasProp } from '../../../../util'
7
+ import { CID } from 'multiformats/cid'
8
+
9
+ export interface Main {
10
+ uri: string
11
+ cid: string
12
+ [k: string]: unknown
13
+ }
14
+
15
+ export function isMain(v: unknown): v is Main {
16
+ return (
17
+ isObj(v) &&
18
+ hasProp(v, '$type') &&
19
+ (v.$type === 'com.atproto.repo.strongRef#main' ||
20
+ v.$type === 'com.atproto.repo.strongRef')
21
+ )
22
+ }
23
+
24
+ export function validateMain(v: unknown): ValidationResult {
25
+ return lexicons.validate('com.atproto.repo.strongRef#main', v)
26
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ export function isObj(v: unknown): v is Record<string, unknown> {
5
+ return typeof v === 'object' && v !== null
6
+ }
7
+
8
+ export function hasProp<K extends PropertyKey>(
9
+ data: object,
10
+ prop: K,
11
+ ): data is Record<K, unknown> {
12
+ return prop in data
13
+ }