@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.
- package/README.md +270 -1
- package/TOOLS.md +194 -0
- package/bun.lock +28 -0
- package/dist/drizzle/0000_parallel_paper_doll.sql +220 -0
- package/dist/drizzle/meta/0000_snapshot.json +1559 -0
- package/dist/drizzle/meta/_journal.json +13 -0
- package/dist/index.js +8718 -165
- package/drizzle/0000_parallel_paper_doll.sql +220 -0
- package/drizzle/meta/0000_snapshot.json +1559 -0
- package/drizzle/meta/_journal.json +13 -0
- package/drizzle.config.ts +18 -0
- package/package.json +34 -4
- package/src/client.ts +32 -14
- package/src/cmd/mcp.ts +8 -0
- package/src/cmd/scrobble-api.ts +457 -0
- package/src/cmd/scrobble.ts +14 -61
- package/src/cmd/search.ts +27 -25
- package/src/cmd/sync.ts +812 -0
- package/src/cmd/whoami.ts +36 -7
- package/src/context.ts +24 -0
- package/src/drizzle.ts +53 -0
- package/src/index.ts +72 -23
- package/src/jetstream.ts +285 -0
- package/src/lexicon/index.ts +1321 -0
- package/src/lexicon/lexicons.ts +5453 -0
- package/src/lexicon/types/app/bsky/actor/profile.ts +38 -0
- package/src/lexicon/types/app/rocksky/actor/defs.ts +146 -0
- package/src/lexicon/types/app/rocksky/actor/getActorAlbums.ts +56 -0
- package/src/lexicon/types/app/rocksky/actor/getActorArtists.ts +56 -0
- package/src/lexicon/types/app/rocksky/actor/getActorCompatibility.ts +48 -0
- package/src/lexicon/types/app/rocksky/actor/getActorLovedSongs.ts +52 -0
- package/src/lexicon/types/app/rocksky/actor/getActorNeighbours.ts +48 -0
- package/src/lexicon/types/app/rocksky/actor/getActorPlaylists.ts +52 -0
- package/src/lexicon/types/app/rocksky/actor/getActorScrobbles.ts +52 -0
- package/src/lexicon/types/app/rocksky/actor/getActorSongs.ts +56 -0
- package/src/lexicon/types/app/rocksky/actor/getProfile.ts +43 -0
- package/src/lexicon/types/app/rocksky/album/defs.ts +85 -0
- package/src/lexicon/types/app/rocksky/album/getAlbum.ts +43 -0
- package/src/lexicon/types/app/rocksky/album/getAlbumTracks.ts +48 -0
- package/src/lexicon/types/app/rocksky/album/getAlbums.ts +50 -0
- package/src/lexicon/types/app/rocksky/album.ts +51 -0
- package/src/lexicon/types/app/rocksky/apikey/createApikey.ts +51 -0
- package/src/lexicon/types/app/rocksky/apikey/defs.ts +31 -0
- package/src/lexicon/types/app/rocksky/apikey/getApikeys.ts +50 -0
- package/src/lexicon/types/app/rocksky/apikey/removeApikey.ts +43 -0
- package/src/lexicon/types/app/rocksky/apikey/updateApikey.ts +53 -0
- package/src/lexicon/types/app/rocksky/apikeys/defs.ts +7 -0
- package/src/lexicon/types/app/rocksky/artist/defs.ts +140 -0
- package/src/lexicon/types/app/rocksky/artist/getArtist.ts +43 -0
- package/src/lexicon/types/app/rocksky/artist/getArtistAlbums.ts +48 -0
- package/src/lexicon/types/app/rocksky/artist/getArtistListeners.ts +52 -0
- package/src/lexicon/types/app/rocksky/artist/getArtistTracks.ts +52 -0
- package/src/lexicon/types/app/rocksky/artist/getArtists.ts +52 -0
- package/src/lexicon/types/app/rocksky/artist.ts +41 -0
- package/src/lexicon/types/app/rocksky/charts/defs.ts +44 -0
- package/src/lexicon/types/app/rocksky/charts/getScrobblesChart.ts +49 -0
- package/src/lexicon/types/app/rocksky/dropbox/defs.ts +71 -0
- package/src/lexicon/types/app/rocksky/dropbox/downloadFile.ts +42 -0
- package/src/lexicon/types/app/rocksky/dropbox/getFiles.ts +43 -0
- package/src/lexicon/types/app/rocksky/dropbox/getMetadata.ts +43 -0
- package/src/lexicon/types/app/rocksky/dropbox/getTemporaryLink.ts +43 -0
- package/src/lexicon/types/app/rocksky/feed/defs.ts +182 -0
- package/src/lexicon/types/app/rocksky/feed/describeFeedGenerator.ts +48 -0
- package/src/lexicon/types/app/rocksky/feed/generator.ts +29 -0
- package/src/lexicon/types/app/rocksky/feed/getFeed.ts +47 -0
- package/src/lexicon/types/app/rocksky/feed/getFeedGenerator.ts +48 -0
- package/src/lexicon/types/app/rocksky/feed/getFeedGenerators.ts +43 -0
- package/src/lexicon/types/app/rocksky/feed/getFeedSkeleton.ts +56 -0
- package/src/lexicon/types/app/rocksky/feed/getNowPlayings.ts +43 -0
- package/src/lexicon/types/app/rocksky/feed/search.ts +43 -0
- package/src/lexicon/types/app/rocksky/googledrive/defs.ts +42 -0
- package/src/lexicon/types/app/rocksky/googledrive/downloadFile.ts +42 -0
- package/src/lexicon/types/app/rocksky/googledrive/getFile.ts +43 -0
- package/src/lexicon/types/app/rocksky/googledrive/getFiles.ts +43 -0
- package/src/lexicon/types/app/rocksky/graph/defs.ts +47 -0
- package/src/lexicon/types/app/rocksky/graph/follow.ts +28 -0
- package/src/lexicon/types/app/rocksky/graph/followAccount.ts +50 -0
- package/src/lexicon/types/app/rocksky/graph/getFollowers.ts +56 -0
- package/src/lexicon/types/app/rocksky/graph/getFollows.ts +56 -0
- package/src/lexicon/types/app/rocksky/graph/getKnownFollowers.ts +52 -0
- package/src/lexicon/types/app/rocksky/graph/unfollowAccount.ts +50 -0
- package/src/lexicon/types/app/rocksky/like/dislikeShout.ts +49 -0
- package/src/lexicon/types/app/rocksky/like/dislikeSong.ts +49 -0
- package/src/lexicon/types/app/rocksky/like/likeShout.ts +49 -0
- package/src/lexicon/types/app/rocksky/like/likeSong.ts +49 -0
- package/src/lexicon/types/app/rocksky/like.ts +27 -0
- package/src/lexicon/types/app/rocksky/player/addDirectoryToQueue.ts +40 -0
- package/src/lexicon/types/app/rocksky/player/addItemsToQueue.ts +39 -0
- package/src/lexicon/types/app/rocksky/player/defs.ts +57 -0
- package/src/lexicon/types/app/rocksky/player/getCurrentlyPlaying.ts +44 -0
- package/src/lexicon/types/app/rocksky/player/getPlaybackQueue.ts +42 -0
- package/src/lexicon/types/app/rocksky/player/next.ts +34 -0
- package/src/lexicon/types/app/rocksky/player/pause.ts +34 -0
- package/src/lexicon/types/app/rocksky/player/play.ts +34 -0
- package/src/lexicon/types/app/rocksky/player/playDirectory.ts +38 -0
- package/src/lexicon/types/app/rocksky/player/playFile.ts +35 -0
- package/src/lexicon/types/app/rocksky/player/previous.ts +34 -0
- package/src/lexicon/types/app/rocksky/player/seek.ts +36 -0
- package/src/lexicon/types/app/rocksky/playlist/createPlaylist.ts +37 -0
- package/src/lexicon/types/app/rocksky/playlist/defs.ts +86 -0
- package/src/lexicon/types/app/rocksky/playlist/getPlaylist.ts +43 -0
- package/src/lexicon/types/app/rocksky/playlist/getPlaylists.ts +50 -0
- package/src/lexicon/types/app/rocksky/playlist/insertDirectory.ts +39 -0
- package/src/lexicon/types/app/rocksky/playlist/insertFiles.ts +38 -0
- package/src/lexicon/types/app/rocksky/playlist/removePlaylist.ts +35 -0
- package/src/lexicon/types/app/rocksky/playlist/removeTrack.ts +37 -0
- package/src/lexicon/types/app/rocksky/playlist/startPlaylist.ts +39 -0
- package/src/lexicon/types/app/rocksky/playlist.ts +43 -0
- package/src/lexicon/types/app/rocksky/radio/defs.ts +63 -0
- package/src/lexicon/types/app/rocksky/radio.ts +37 -0
- package/src/lexicon/types/app/rocksky/scrobble/createScrobble.ts +91 -0
- package/src/lexicon/types/app/rocksky/scrobble/defs.ts +93 -0
- package/src/lexicon/types/app/rocksky/scrobble/getScrobble.ts +43 -0
- package/src/lexicon/types/app/rocksky/scrobble/getScrobbles.ts +54 -0
- package/src/lexicon/types/app/rocksky/scrobble.ts +75 -0
- package/src/lexicon/types/app/rocksky/shout/createShout.ts +49 -0
- package/src/lexicon/types/app/rocksky/shout/defs.ts +58 -0
- package/src/lexicon/types/app/rocksky/shout/getAlbumShouts.ts +52 -0
- package/src/lexicon/types/app/rocksky/shout/getArtistShouts.ts +52 -0
- package/src/lexicon/types/app/rocksky/shout/getProfileShouts.ts +52 -0
- package/src/lexicon/types/app/rocksky/shout/getShoutReplies.ts +52 -0
- package/src/lexicon/types/app/rocksky/shout/getTrackShouts.ts +48 -0
- package/src/lexicon/types/app/rocksky/shout/removeShout.ts +43 -0
- package/src/lexicon/types/app/rocksky/shout/replyShout.ts +51 -0
- package/src/lexicon/types/app/rocksky/shout/reportShout.ts +51 -0
- package/src/lexicon/types/app/rocksky/shout.ts +30 -0
- package/src/lexicon/types/app/rocksky/song/createSong.ts +71 -0
- package/src/lexicon/types/app/rocksky/song/defs.ts +103 -0
- package/src/lexicon/types/app/rocksky/song/getSong.ts +43 -0
- package/src/lexicon/types/app/rocksky/song/getSongs.ts +50 -0
- package/src/lexicon/types/app/rocksky/song.ts +74 -0
- package/src/lexicon/types/app/rocksky/spotify/defs.ts +35 -0
- package/src/lexicon/types/app/rocksky/spotify/getCurrentlyPlaying.ts +43 -0
- package/src/lexicon/types/app/rocksky/spotify/next.ts +32 -0
- package/src/lexicon/types/app/rocksky/spotify/pause.ts +32 -0
- package/src/lexicon/types/app/rocksky/spotify/play.ts +32 -0
- package/src/lexicon/types/app/rocksky/spotify/previous.ts +32 -0
- package/src/lexicon/types/app/rocksky/spotify/seek.ts +35 -0
- package/src/lexicon/types/app/rocksky/stats/defs.ts +33 -0
- package/src/lexicon/types/app/rocksky/stats/getStats.ts +43 -0
- package/src/lexicon/types/com/atproto/repo/strongRef.ts +26 -0
- package/src/lexicon/util.ts +13 -0
- package/src/lib/agent.ts +56 -0
- package/src/lib/cleanUpJetstreamLock.ts +66 -0
- package/src/lib/cleanUpSyncLock.ts +56 -0
- package/src/lib/didUnstorageCache.ts +72 -0
- package/src/lib/env.ts +25 -0
- package/src/lib/extractPdsFromDid.ts +33 -0
- package/src/lib/getDidAndHandle.ts +39 -0
- package/src/lib/idResolver.ts +52 -0
- package/src/lib/lastfm.ts +26 -0
- package/src/lib/matchTrack.ts +47 -0
- package/src/logger.ts +18 -0
- package/src/mcp/index.ts +269 -0
- package/src/mcp/tools/albums.ts +13 -0
- package/src/mcp/tools/artists.ts +17 -0
- package/src/mcp/tools/create.ts +27 -0
- package/src/mcp/tools/myscrobbles.ts +42 -0
- package/src/mcp/tools/nowplaying.ts +53 -0
- package/src/mcp/tools/scrobbles.ts +39 -0
- package/src/mcp/tools/search.ts +88 -0
- package/src/mcp/tools/stats.ts +40 -0
- package/src/mcp/tools/tracks.ts +15 -0
- package/src/mcp/tools/whoami.ts +27 -0
- package/src/schema/album-tracks.ts +30 -0
- package/src/schema/albums.ts +29 -0
- package/src/schema/artist-albums.ts +29 -0
- package/src/schema/artist-genres.ts +17 -0
- package/src/schema/artist-tracks.ts +29 -0
- package/src/schema/artists.ts +30 -0
- package/src/schema/auth-session.ts +18 -0
- package/src/schema/genres.ts +18 -0
- package/src/schema/index.ts +33 -0
- package/src/schema/loved-tracks.ts +27 -0
- package/src/schema/scrobbles.ts +30 -0
- package/src/schema/tracks.ts +39 -0
- package/src/schema/user-albums.ts +31 -0
- package/src/schema/user-artists.ts +32 -0
- package/src/schema/user-tracks.ts +31 -0
- package/src/schema/users.ts +21 -0
- package/src/scrobble.ts +410 -0
- package/src/sqliteKv.ts +173 -0
- package/src/types.ts +308 -0
- 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
|
+
}
|