@bzenky/spoti 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.
- package/README.md +72 -4
- package/dist/app.d.ts +19 -1
- package/dist/app.js +310 -16
- package/dist/app.js.map +1 -1
- package/dist/auth/config.d.ts +1 -1
- package/dist/auth/config.js +3 -3
- package/dist/auth/config.js.map +1 -1
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -1
- package/dist/services/auth.service.d.ts +1 -1
- package/dist/services/auth.service.js +9 -3
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/catalog.service.d.ts +9 -0
- package/dist/services/catalog.service.js +22 -0
- package/dist/services/catalog.service.js.map +1 -0
- package/dist/services/device.service.js +22 -2
- package/dist/services/device.service.js.map +1 -1
- package/dist/services/library.service.d.ts +13 -0
- package/dist/services/library.service.js +46 -0
- package/dist/services/library.service.js.map +1 -0
- package/dist/services/mappers.d.ts +10 -0
- package/dist/services/mappers.js +104 -0
- package/dist/services/mappers.js.map +1 -0
- package/dist/services/models.d.ts +45 -0
- package/dist/services/player.service.d.ts +4 -1
- package/dist/services/player.service.js +21 -14
- package/dist/services/player.service.js.map +1 -1
- package/dist/services/playlist.service.d.ts +9 -0
- package/dist/services/playlist.service.js +33 -0
- package/dist/services/playlist.service.js.map +1 -0
- package/dist/services/recent.service.d.ts +7 -0
- package/dist/services/recent.service.js +24 -0
- package/dist/services/recent.service.js.map +1 -0
- package/dist/services/search.service.d.ts +5 -1
- package/dist/services/search.service.js +32 -17
- package/dist/services/search.service.js.map +1 -1
- package/dist/services/update.service.d.ts +57 -0
- package/dist/services/update.service.js +313 -0
- package/dist/services/update.service.js.map +1 -0
- package/dist/spotify/client.js +14 -1
- package/dist/spotify/client.js.map +1 -1
- package/dist/spotify/scopes.d.ts +1 -1
- package/dist/spotify/scopes.js +4 -0
- package/dist/spotify/scopes.js.map +1 -1
- package/dist/spotify/types.d.ts +110 -8
- package/dist/storage/config.d.ts +2 -1
- package/dist/storage/config.js +18 -1
- package/dist/storage/config.js.map +1 -1
- package/dist/storage/update-cache.d.ts +29 -0
- package/dist/storage/update-cache.js +135 -0
- package/dist/storage/update-cache.js.map +1 -0
- package/dist/ui/output.d.ts +10 -1
- package/dist/ui/output.js +60 -0
- package/dist/ui/output.js.map +1 -1
- package/dist/ui/prompts.d.ts +12 -1
- package/dist/ui/prompts.js +73 -6
- package/dist/ui/prompts.js.map +1 -1
- package/dist/update-worker.d.ts +9 -0
- package/dist/update-worker.js +91 -0
- package/dist/update-worker.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player.service.js","sourceRoot":"","sources":["../../src/services/player.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"player.service.js","sourceRoot":"","sources":["../../src/services/player.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SpotifyApi } from '../spotify/client.js';
|
|
2
|
+
import type { Playlist, PlaylistDetail, Track } from './models.js';
|
|
3
|
+
export declare class PlaylistService {
|
|
4
|
+
private readonly spotify;
|
|
5
|
+
constructor(spotify: SpotifyApi);
|
|
6
|
+
listPlaylists(limit?: number): Promise<Playlist[]>;
|
|
7
|
+
getPlaylist(id: string, itemLimit?: number): Promise<PlaylistDetail>;
|
|
8
|
+
getPlaylistItems(id: string, limit?: number): Promise<Track[]>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { mapPlaybackItem, mapPlaylist, normalizeLimit } from './mappers.js';
|
|
2
|
+
const DEFAULT_PLAYLIST_LIMIT = 20;
|
|
3
|
+
const DEFAULT_ITEM_LIMIT = 50;
|
|
4
|
+
export class PlaylistService {
|
|
5
|
+
spotify;
|
|
6
|
+
constructor(spotify) {
|
|
7
|
+
this.spotify = spotify;
|
|
8
|
+
}
|
|
9
|
+
async listPlaylists(limit = DEFAULT_PLAYLIST_LIMIT) {
|
|
10
|
+
const response = await this.spotify.get('/me/playlists', { query: { limit: normalizeLimit(limit) } });
|
|
11
|
+
return response.items.map(mapPlaylist).sort(comparePlaylists);
|
|
12
|
+
}
|
|
13
|
+
async getPlaylist(id, itemLimit = DEFAULT_ITEM_LIMIT) {
|
|
14
|
+
const playlist = await this.spotify.get(`/playlists/${encodeURIComponent(id)}`);
|
|
15
|
+
const tracks = await this.getPlaylistItems(id, itemLimit);
|
|
16
|
+
return { ...mapPlaylist(playlist), tracks };
|
|
17
|
+
}
|
|
18
|
+
async getPlaylistItems(id, limit = DEFAULT_ITEM_LIMIT) {
|
|
19
|
+
const response = await this.spotify.get(`/playlists/${encodeURIComponent(id)}/items`, { query: { limit: normalizeLimit(limit) } });
|
|
20
|
+
return response.items
|
|
21
|
+
.map(({ item }) => mapPlaybackItem(item))
|
|
22
|
+
.filter((track) => track !== null);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function comparePlaylists(left, right) {
|
|
26
|
+
const nameComparison = left.name.localeCompare(right.name, undefined, {
|
|
27
|
+
sensitivity: 'base',
|
|
28
|
+
});
|
|
29
|
+
if (nameComparison !== 0)
|
|
30
|
+
return nameComparison;
|
|
31
|
+
return left.id.localeCompare(right.id);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=playlist.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playlist.service.js","sourceRoot":"","sources":["../../src/services/playlist.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG5E,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAClC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;IAAG,CAAC;IAEpD,KAAK,CAAC,aAAa,CAAC,KAAK,GAAG,sBAAsB;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CACrC,eAAe,EACf,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAC5C,CAAC;QACF,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU,EAAE,SAAS,GAAG,kBAAkB;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CACrC,cAAc,kBAAkB,CAAC,EAAE,CAAC,EAAE,CACvC,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC1D,OAAO,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,EAAU,EAAE,KAAK,GAAG,kBAAkB;QAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CACrC,cAAc,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAC5C,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAC5C,CAAC;QACF,OAAO,QAAQ,CAAC,KAAK;aAClB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;aACxC,MAAM,CAAC,CAAC,KAAK,EAAkB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IACvD,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,IAAc,EAAE,KAAe;IACvD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE;QACpE,WAAW,EAAE,MAAM;KACpB,CAAC,CAAC;IACH,IAAI,cAAc,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IAChD,OAAO,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SpotifyApi } from '../spotify/client.js';
|
|
2
|
+
import type { RecentlyPlayedTrack } from './models.js';
|
|
3
|
+
export declare class RecentService {
|
|
4
|
+
private readonly spotify;
|
|
5
|
+
constructor(spotify: SpotifyApi);
|
|
6
|
+
getRecentlyPlayed(limit?: number): Promise<RecentlyPlayedTrack[]>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { mapPlaybackItem, normalizeLimit } from './mappers.js';
|
|
2
|
+
const DEFAULT_RECENT_LIMIT = 20;
|
|
3
|
+
export class RecentService {
|
|
4
|
+
spotify;
|
|
5
|
+
constructor(spotify) {
|
|
6
|
+
this.spotify = spotify;
|
|
7
|
+
}
|
|
8
|
+
async getRecentlyPlayed(limit = DEFAULT_RECENT_LIMIT) {
|
|
9
|
+
const response = await this.spotify.get('/me/player/recently-played', { query: { limit: normalizeLimit(limit) } });
|
|
10
|
+
return response.items.flatMap(({ track, played_at: playedAt, context }) => {
|
|
11
|
+
const mapped = mapPlaybackItem(track);
|
|
12
|
+
if (!mapped)
|
|
13
|
+
return [];
|
|
14
|
+
return [
|
|
15
|
+
{
|
|
16
|
+
playedAt,
|
|
17
|
+
track: mapped,
|
|
18
|
+
...(context?.uri ? { contextUri: context.uri } : {}),
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=recent.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recent.service.js","sourceRoot":"","sources":["../../src/services/recent.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG/D,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;IAAG,CAAC;IAEpD,KAAK,CAAC,iBAAiB,CAAC,KAAK,GAAG,oBAAoB;QAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CACrC,4BAA4B,EAC5B,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,CAC5C,CAAC;QACF,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;YACxE,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM;gBAAE,OAAO,EAAE,CAAC;YACvB,OAAO;gBACL;oBACE,QAAQ;oBACR,KAAK,EAAE,MAAM;oBACb,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACrD;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { SpotifyApi } from '../spotify/client.js';
|
|
2
|
-
import type { Track } from './models.js';
|
|
2
|
+
import type { Album, Artist, Playlist, Track } from './models.js';
|
|
3
3
|
export declare class SearchService {
|
|
4
4
|
private readonly spotify;
|
|
5
5
|
constructor(spotify: SpotifyApi);
|
|
6
6
|
searchTracks(query: string, limit?: number): Promise<Track[]>;
|
|
7
|
+
searchAlbums(query: string, limit?: number): Promise<Album[]>;
|
|
8
|
+
searchArtists(query: string, limit?: number): Promise<Artist[]>;
|
|
9
|
+
searchPlaylists(query: string, limit?: number): Promise<Playlist[]>;
|
|
10
|
+
private search;
|
|
7
11
|
}
|
|
@@ -1,28 +1,43 @@
|
|
|
1
|
+
import { mapAlbum, mapArtist, mapPlaylist, mapTrack, normalizeLimit } from './mappers.js';
|
|
2
|
+
const DEFAULT_SEARCH_LIMIT = 10;
|
|
1
3
|
export class SearchService {
|
|
2
4
|
spotify;
|
|
3
5
|
constructor(spotify) {
|
|
4
6
|
this.spotify = spotify;
|
|
5
7
|
}
|
|
6
|
-
async searchTracks(query, limit =
|
|
8
|
+
async searchTracks(query, limit = DEFAULT_SEARCH_LIMIT) {
|
|
9
|
+
const response = await this.search(query, 'track', limit);
|
|
10
|
+
return (response?.tracks?.items ?? [])
|
|
11
|
+
.map(mapTrack)
|
|
12
|
+
.filter((track) => track !== null);
|
|
13
|
+
}
|
|
14
|
+
async searchAlbums(query, limit = DEFAULT_SEARCH_LIMIT) {
|
|
15
|
+
const response = await this.search(query, 'album', limit);
|
|
16
|
+
return (response?.albums?.items ?? [])
|
|
17
|
+
.map(mapAlbum)
|
|
18
|
+
.filter((album) => album !== null);
|
|
19
|
+
}
|
|
20
|
+
async searchArtists(query, limit = DEFAULT_SEARCH_LIMIT) {
|
|
21
|
+
const response = await this.search(query, 'artist', limit);
|
|
22
|
+
return (response?.artists?.items ?? []).map(mapArtist);
|
|
23
|
+
}
|
|
24
|
+
async searchPlaylists(query, limit = DEFAULT_SEARCH_LIMIT) {
|
|
25
|
+
const response = await this.search(query, 'playlist', limit);
|
|
26
|
+
return (response?.playlists?.items ?? [])
|
|
27
|
+
.filter((playlist) => playlist !== null)
|
|
28
|
+
.map(mapPlaylist);
|
|
29
|
+
}
|
|
30
|
+
async search(query, type, limit) {
|
|
7
31
|
const normalizedQuery = query.trim();
|
|
8
32
|
if (!normalizedQuery)
|
|
9
|
-
return
|
|
10
|
-
|
|
11
|
-
query: {
|
|
33
|
+
return null;
|
|
34
|
+
return this.spotify.get('/search', {
|
|
35
|
+
query: {
|
|
36
|
+
q: normalizedQuery,
|
|
37
|
+
type,
|
|
38
|
+
limit: normalizeLimit(limit, DEFAULT_SEARCH_LIMIT, 10),
|
|
39
|
+
},
|
|
12
40
|
});
|
|
13
|
-
return response.tracks.items.map(mapTrack);
|
|
14
41
|
}
|
|
15
42
|
}
|
|
16
|
-
function mapTrack(track) {
|
|
17
|
-
const externalUrl = track.external_urls?.spotify;
|
|
18
|
-
return {
|
|
19
|
-
id: track.id,
|
|
20
|
-
uri: track.uri,
|
|
21
|
-
name: track.name,
|
|
22
|
-
artists: track.artists.map((artist) => artist.name),
|
|
23
|
-
album: track.album.name,
|
|
24
|
-
durationMs: track.duration_ms,
|
|
25
|
-
...(externalUrl ? { externalUrl } : {}),
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
43
|
//# sourceMappingURL=search.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.service.js","sourceRoot":"","sources":["../../src/services/search.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"search.service.js","sourceRoot":"","sources":["../../src/services/search.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG1F,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEhC,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;IAAG,CAAC;IAEpD,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,KAAK,GAAG,oBAAoB;QAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1D,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC;aACnC,GAAG,CAAC,QAAQ,CAAC;aACb,MAAM,CAAC,CAAC,KAAK,EAAkB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,KAAK,GAAG,oBAAoB;QAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1D,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC;aACnC,GAAG,CAAC,QAAQ,CAAC;aACb,MAAM,CAAC,CAAC,KAAK,EAAkB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,KAAK,GAAG,oBAAoB;QAC7D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,KAAK,GAAG,oBAAoB;QAC/D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAC7D,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC;aACtC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC;aACvC,GAAG,CAAC,WAAW,CAAC,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,MAAM,CAClB,KAAa,EACb,IAA+C,EAC/C,KAAa;QAEb,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,eAAe;YAAE,OAAO,IAAI,CAAC;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAwB,SAAS,EAAE;YACxD,KAAK,EAAE;gBACL,CAAC,EAAE,eAAe;gBAClB,IAAI;gBACJ,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,oBAAoB,EAAE,EAAE,CAAC;aACvD;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type UpdateCacheStore } from '../storage/update-cache.js';
|
|
2
|
+
export declare const SPOTI_PACKAGE_NAME = "@bzenky/spoti";
|
|
3
|
+
export declare const NPM_REGISTRY_URL = "https://registry.npmjs.org/%40bzenky%2Fspoti";
|
|
4
|
+
export declare const UPDATE_CHECK_INTERVAL_MS: number;
|
|
5
|
+
export declare const UPDATE_CHECK_TIMEOUT_MS = 3000;
|
|
6
|
+
export declare const UPDATE_COMMAND = "npm install -g @bzenky/spoti@latest";
|
|
7
|
+
export type UpdateStatus = 'current' | 'update-available';
|
|
8
|
+
export type UpdateCheckSource = 'cache' | 'registry';
|
|
9
|
+
export interface UpdateCheckResult {
|
|
10
|
+
status: UpdateStatus;
|
|
11
|
+
currentVersion: string;
|
|
12
|
+
latestVersion: string;
|
|
13
|
+
checkedAt: number;
|
|
14
|
+
source: UpdateCheckSource;
|
|
15
|
+
}
|
|
16
|
+
export interface UpdateChecker {
|
|
17
|
+
checkInBackground(): Promise<UpdateCheckResult | null>;
|
|
18
|
+
}
|
|
19
|
+
export interface UpdateCommandRunner {
|
|
20
|
+
run(command: string, args: readonly string[]): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export interface UpdateServiceDependencies {
|
|
23
|
+
cache?: UpdateCacheStore;
|
|
24
|
+
fetch?: typeof globalThis.fetch;
|
|
25
|
+
now?: () => number;
|
|
26
|
+
timeoutMs?: number;
|
|
27
|
+
checkIntervalMs?: number;
|
|
28
|
+
commandRunner?: UpdateCommandRunner;
|
|
29
|
+
}
|
|
30
|
+
export declare class UpdateCheckError extends Error {
|
|
31
|
+
constructor(message: string, options?: ErrorOptions);
|
|
32
|
+
}
|
|
33
|
+
export declare class UpdateInstallError extends Error {
|
|
34
|
+
constructor(message: string, options?: ErrorOptions);
|
|
35
|
+
}
|
|
36
|
+
export declare class UpdateService implements UpdateChecker {
|
|
37
|
+
private readonly currentVersion;
|
|
38
|
+
private readonly cache;
|
|
39
|
+
private readonly fetchImplementation;
|
|
40
|
+
private readonly clock;
|
|
41
|
+
private readonly timeoutMs;
|
|
42
|
+
private readonly checkIntervalMs;
|
|
43
|
+
private readonly commandRunner;
|
|
44
|
+
constructor(currentVersion: string, dependencies?: UpdateServiceDependencies);
|
|
45
|
+
/** Always contacts npm and reports actionable failures. Intended for `spoti update --check`. */
|
|
46
|
+
checkForeground(): Promise<UpdateCheckResult>;
|
|
47
|
+
/** Uses the 24-hour cache and hides failures so normal commands remain unaffected. */
|
|
48
|
+
checkInBackground(): Promise<UpdateCheckResult | null>;
|
|
49
|
+
/** The caller must obtain explicit user confirmation before setting `confirmed` to true. */
|
|
50
|
+
installLatest(confirmed: boolean, version: string): Promise<void>;
|
|
51
|
+
private fetchLatest;
|
|
52
|
+
private recordFailedCheck;
|
|
53
|
+
}
|
|
54
|
+
export declare class NodeUpdateCommandRunner implements UpdateCommandRunner {
|
|
55
|
+
run(command: string, args: readonly string[]): Promise<void>;
|
|
56
|
+
}
|
|
57
|
+
export declare function compareSemanticVersions(left: string, right: string): number;
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { FileUpdateCacheStore, } from '../storage/update-cache.js';
|
|
3
|
+
export const SPOTI_PACKAGE_NAME = '@bzenky/spoti';
|
|
4
|
+
export const NPM_REGISTRY_URL = 'https://registry.npmjs.org/%40bzenky%2Fspoti';
|
|
5
|
+
export const UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1_000;
|
|
6
|
+
export const UPDATE_CHECK_TIMEOUT_MS = 3_000;
|
|
7
|
+
export const UPDATE_COMMAND = 'npm install -g @bzenky/spoti@latest';
|
|
8
|
+
export class UpdateCheckError extends Error {
|
|
9
|
+
constructor(message, options) {
|
|
10
|
+
super(message, options);
|
|
11
|
+
this.name = 'UpdateCheckError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class UpdateInstallError extends Error {
|
|
15
|
+
constructor(message, options) {
|
|
16
|
+
super(message, options);
|
|
17
|
+
this.name = 'UpdateInstallError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class UpdateService {
|
|
21
|
+
currentVersion;
|
|
22
|
+
cache;
|
|
23
|
+
fetchImplementation;
|
|
24
|
+
clock;
|
|
25
|
+
timeoutMs;
|
|
26
|
+
checkIntervalMs;
|
|
27
|
+
commandRunner;
|
|
28
|
+
constructor(currentVersion, dependencies = {}) {
|
|
29
|
+
this.currentVersion = currentVersion;
|
|
30
|
+
parseSemanticVersion(currentVersion);
|
|
31
|
+
this.cache = dependencies.cache ?? new FileUpdateCacheStore();
|
|
32
|
+
this.fetchImplementation = dependencies.fetch ?? globalThis.fetch;
|
|
33
|
+
this.clock = dependencies.now ?? Date.now;
|
|
34
|
+
this.timeoutMs = dependencies.timeoutMs ?? UPDATE_CHECK_TIMEOUT_MS;
|
|
35
|
+
this.checkIntervalMs = dependencies.checkIntervalMs ?? UPDATE_CHECK_INTERVAL_MS;
|
|
36
|
+
this.commandRunner = dependencies.commandRunner ?? new NodeUpdateCommandRunner();
|
|
37
|
+
if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0) {
|
|
38
|
+
throw new RangeError('Update check timeout must be a positive number.');
|
|
39
|
+
}
|
|
40
|
+
if (!Number.isFinite(this.checkIntervalMs) || this.checkIntervalMs <= 0) {
|
|
41
|
+
throw new RangeError('Update check interval must be a positive number.');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Always contacts npm and reports actionable failures. Intended for `spoti update --check`. */
|
|
45
|
+
async checkForeground() {
|
|
46
|
+
const checkedAt = this.clock();
|
|
47
|
+
try {
|
|
48
|
+
const result = await this.fetchLatest(checkedAt);
|
|
49
|
+
await this.cache.write(successCache(result));
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
await this.recordFailedCheck(checkedAt);
|
|
54
|
+
if (error instanceof UpdateCheckError)
|
|
55
|
+
throw error;
|
|
56
|
+
throw new UpdateCheckError(`Unable to check for updates: ${errorMessage(error)}`, {
|
|
57
|
+
cause: error,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Uses the 24-hour cache and hides failures so normal commands remain unaffected. */
|
|
62
|
+
async checkInBackground() {
|
|
63
|
+
const now = this.clock();
|
|
64
|
+
try {
|
|
65
|
+
const cached = await this.cache.read();
|
|
66
|
+
if (cached && isFresh(cached.lastCheckedAt, now, this.checkIntervalMs)) {
|
|
67
|
+
if (cached.lastFailedCheckAt === cached.lastCheckedAt)
|
|
68
|
+
return null;
|
|
69
|
+
if (cached.lastSuccessfulCheck?.currentVersion === this.currentVersion) {
|
|
70
|
+
try {
|
|
71
|
+
return resultFromSuccessfulCache(cached.lastSuccessfulCheck);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Invalid cached versions are recoverable; refresh them from the registry.
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const result = await this.fetchLatest(now);
|
|
80
|
+
await this.cache.write(successCache(result, cached));
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
await this.recordFailedCheck(now, cached);
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** The caller must obtain explicit user confirmation before setting `confirmed` to true. */
|
|
93
|
+
async installLatest(confirmed, version) {
|
|
94
|
+
if (!confirmed) {
|
|
95
|
+
throw new UpdateInstallError(`Update not installed because confirmation is required. To update manually, run: ${UPDATE_COMMAND}`);
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
parseSemanticVersion(version);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
throw new UpdateInstallError(`Refusing to install invalid version ${JSON.stringify(version)}.`, {
|
|
102
|
+
cause: error,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
await this.commandRunner.run('npm', [
|
|
107
|
+
'install',
|
|
108
|
+
'--global',
|
|
109
|
+
`${SPOTI_PACKAGE_NAME}@${version}`,
|
|
110
|
+
]);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw new UpdateInstallError(`Unable to install the latest spoti version: ${errorMessage(error)}\n\nRun manually: ${UPDATE_COMMAND}`, { cause: error });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async fetchLatest(checkedAt) {
|
|
117
|
+
const controller = new AbortController();
|
|
118
|
+
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
119
|
+
timeout.unref?.();
|
|
120
|
+
let response;
|
|
121
|
+
try {
|
|
122
|
+
response = await this.fetchImplementation(NPM_REGISTRY_URL, {
|
|
123
|
+
headers: { accept: 'application/vnd.npm.install-v1+json' },
|
|
124
|
+
signal: controller.signal,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (controller.signal.aborted || isAbortError(error)) {
|
|
129
|
+
throw new UpdateCheckError(`Update check timed out after ${this.timeoutMs}ms. Check your network connection and try again.`, { cause: error });
|
|
130
|
+
}
|
|
131
|
+
throw new UpdateCheckError(`Unable to reach the npm registry: ${errorMessage(error)}. Check your network connection and try again.`, { cause: error });
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
clearTimeout(timeout);
|
|
135
|
+
}
|
|
136
|
+
if (!response.ok) {
|
|
137
|
+
throw new UpdateCheckError(`The npm registry returned HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : ''}. Try again later.`);
|
|
138
|
+
}
|
|
139
|
+
let metadata;
|
|
140
|
+
try {
|
|
141
|
+
metadata = await response.json();
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
throw new UpdateCheckError('The npm registry returned malformed JSON. Try again later or check the npm registry status.', { cause: error });
|
|
145
|
+
}
|
|
146
|
+
const latestVersion = readLatestVersion(metadata);
|
|
147
|
+
let comparison;
|
|
148
|
+
try {
|
|
149
|
+
comparison = compareSemanticVersions(latestVersion, this.currentVersion);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
throw new UpdateCheckError(`The npm registry returned an invalid latest version (${JSON.stringify(latestVersion)}). Try again later.`, { cause: error });
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
status: comparison > 0 ? 'update-available' : 'current',
|
|
156
|
+
currentVersion: this.currentVersion,
|
|
157
|
+
latestVersion,
|
|
158
|
+
checkedAt,
|
|
159
|
+
source: 'registry',
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
async recordFailedCheck(at, previous) {
|
|
163
|
+
let cache = previous;
|
|
164
|
+
if (cache === undefined) {
|
|
165
|
+
try {
|
|
166
|
+
cache = await this.cache.read();
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
cache = null;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
await this.cache
|
|
173
|
+
.write({
|
|
174
|
+
version: 1,
|
|
175
|
+
lastCheckedAt: at,
|
|
176
|
+
...(cache?.lastSuccessfulCheck
|
|
177
|
+
? { lastSuccessfulCheck: cache.lastSuccessfulCheck }
|
|
178
|
+
: {}),
|
|
179
|
+
lastFailedCheckAt: at,
|
|
180
|
+
})
|
|
181
|
+
.catch(() => undefined);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
export class NodeUpdateCommandRunner {
|
|
185
|
+
run(command, args) {
|
|
186
|
+
return new Promise((resolve, reject) => {
|
|
187
|
+
const child = spawn(command, [...args], { stdio: 'inherit', shell: false });
|
|
188
|
+
child.once('error', reject);
|
|
189
|
+
child.once('exit', (code, signal) => {
|
|
190
|
+
if (code === 0) {
|
|
191
|
+
resolve();
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
reject(new Error(signal
|
|
195
|
+
? `npm was terminated by signal ${signal}`
|
|
196
|
+
: `npm exited with status ${String(code)}`));
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
export function compareSemanticVersions(left, right) {
|
|
202
|
+
const leftVersion = parseSemanticVersion(left);
|
|
203
|
+
const rightVersion = parseSemanticVersion(right);
|
|
204
|
+
for (const key of ['major', 'minor', 'patch']) {
|
|
205
|
+
const comparison = compareNumericIdentifiers(leftVersion[key], rightVersion[key]);
|
|
206
|
+
if (comparison !== 0)
|
|
207
|
+
return comparison;
|
|
208
|
+
}
|
|
209
|
+
if (!leftVersion.prerelease && !rightVersion.prerelease)
|
|
210
|
+
return 0;
|
|
211
|
+
if (!leftVersion.prerelease)
|
|
212
|
+
return 1;
|
|
213
|
+
if (!rightVersion.prerelease)
|
|
214
|
+
return -1;
|
|
215
|
+
const length = Math.max(leftVersion.prerelease.length, rightVersion.prerelease.length);
|
|
216
|
+
for (let index = 0; index < length; index += 1) {
|
|
217
|
+
const leftIdentifier = leftVersion.prerelease[index];
|
|
218
|
+
const rightIdentifier = rightVersion.prerelease[index];
|
|
219
|
+
if (leftIdentifier === undefined)
|
|
220
|
+
return -1;
|
|
221
|
+
if (rightIdentifier === undefined)
|
|
222
|
+
return 1;
|
|
223
|
+
if (leftIdentifier === rightIdentifier)
|
|
224
|
+
continue;
|
|
225
|
+
const leftNumeric = /^\d+$/.test(leftIdentifier);
|
|
226
|
+
const rightNumeric = /^\d+$/.test(rightIdentifier);
|
|
227
|
+
if (leftNumeric && rightNumeric) {
|
|
228
|
+
return compareNumericIdentifiers(leftIdentifier, rightIdentifier);
|
|
229
|
+
}
|
|
230
|
+
if (leftNumeric)
|
|
231
|
+
return -1;
|
|
232
|
+
if (rightNumeric)
|
|
233
|
+
return 1;
|
|
234
|
+
return leftIdentifier < rightIdentifier ? -1 : 1;
|
|
235
|
+
}
|
|
236
|
+
return 0;
|
|
237
|
+
}
|
|
238
|
+
const SEMANTIC_VERSION_PATTERN = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
|
|
239
|
+
function parseSemanticVersion(value) {
|
|
240
|
+
const match = SEMANTIC_VERSION_PATTERN.exec(value);
|
|
241
|
+
if (!match) {
|
|
242
|
+
throw new TypeError(`Invalid semantic version: ${JSON.stringify(value)}`);
|
|
243
|
+
}
|
|
244
|
+
const major = match[1];
|
|
245
|
+
const minor = match[2];
|
|
246
|
+
const patch = match[3];
|
|
247
|
+
if (major === undefined || minor === undefined || patch === undefined) {
|
|
248
|
+
throw new TypeError(`Invalid semantic version: ${JSON.stringify(value)}`);
|
|
249
|
+
}
|
|
250
|
+
const prerelease = match[4];
|
|
251
|
+
return {
|
|
252
|
+
major,
|
|
253
|
+
minor,
|
|
254
|
+
patch,
|
|
255
|
+
...(prerelease === undefined ? {} : { prerelease: prerelease.split('.') }),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
function compareNumericIdentifiers(left, right) {
|
|
259
|
+
if (left.length !== right.length)
|
|
260
|
+
return left.length < right.length ? -1 : 1;
|
|
261
|
+
if (left === right)
|
|
262
|
+
return 0;
|
|
263
|
+
return left < right ? -1 : 1;
|
|
264
|
+
}
|
|
265
|
+
function readLatestVersion(metadata) {
|
|
266
|
+
if (typeof metadata !== 'object' ||
|
|
267
|
+
metadata === null ||
|
|
268
|
+
!('dist-tags' in metadata) ||
|
|
269
|
+
typeof metadata['dist-tags'] !== 'object' ||
|
|
270
|
+
metadata['dist-tags'] === null ||
|
|
271
|
+
!('latest' in metadata['dist-tags']) ||
|
|
272
|
+
typeof metadata['dist-tags'].latest !== 'string' ||
|
|
273
|
+
metadata['dist-tags'].latest.length === 0) {
|
|
274
|
+
throw new UpdateCheckError('The npm registry response did not include a latest version. Try again later.');
|
|
275
|
+
}
|
|
276
|
+
return metadata['dist-tags'].latest;
|
|
277
|
+
}
|
|
278
|
+
function successCache(result, previous) {
|
|
279
|
+
return {
|
|
280
|
+
version: 1,
|
|
281
|
+
lastCheckedAt: result.checkedAt,
|
|
282
|
+
lastSuccessfulCheck: {
|
|
283
|
+
checkedAt: result.checkedAt,
|
|
284
|
+
currentVersion: result.currentVersion,
|
|
285
|
+
latestVersion: result.latestVersion,
|
|
286
|
+
},
|
|
287
|
+
...(previous?.lastFailedCheckAt === undefined
|
|
288
|
+
? {}
|
|
289
|
+
: { lastFailedCheckAt: previous.lastFailedCheckAt }),
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
function resultFromSuccessfulCache(cache) {
|
|
293
|
+
return {
|
|
294
|
+
status: compareSemanticVersions(cache.latestVersion, cache.currentVersion) > 0
|
|
295
|
+
? 'update-available'
|
|
296
|
+
: 'current',
|
|
297
|
+
currentVersion: cache.currentVersion,
|
|
298
|
+
latestVersion: cache.latestVersion,
|
|
299
|
+
checkedAt: cache.checkedAt,
|
|
300
|
+
source: 'cache',
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
function isFresh(checkedAt, now, intervalMs) {
|
|
304
|
+
const age = now - checkedAt;
|
|
305
|
+
return age >= 0 && age < intervalMs;
|
|
306
|
+
}
|
|
307
|
+
function isAbortError(error) {
|
|
308
|
+
return error instanceof Error && error.name === 'AbortError';
|
|
309
|
+
}
|
|
310
|
+
function errorMessage(error) {
|
|
311
|
+
return error instanceof Error ? error.message : String(error);
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=update.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.service.js","sourceRoot":"","sources":["../../src/services/update.service.ts"],"names":[],"mappings":"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"}
|
package/dist/spotify/client.js
CHANGED
|
@@ -78,7 +78,20 @@ export class SpotifyClient {
|
|
|
78
78
|
if (response.status === 204)
|
|
79
79
|
return undefined;
|
|
80
80
|
const text = await response.text();
|
|
81
|
-
|
|
81
|
+
if (!text)
|
|
82
|
+
return undefined;
|
|
83
|
+
const contentType = response.headers.get('content-type')?.toLocaleLowerCase() ?? '';
|
|
84
|
+
if (!contentType.includes('json')) {
|
|
85
|
+
if (method !== 'GET')
|
|
86
|
+
return undefined;
|
|
87
|
+
throw new SpotifyApiError('Spotify returned an unexpected non-JSON response.', response.status);
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
return JSON.parse(text);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
throw new SpotifyApiError('Spotify returned malformed JSON.', response.status);
|
|
94
|
+
}
|
|
82
95
|
}
|
|
83
96
|
}
|
|
84
97
|
function getRetryAfterMilliseconds(response) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/spotify/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/spotify/client.ts"],"names":[],"mappings":"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"}
|
package/dist/spotify/scopes.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const LEGACY_SPOTIFY_SCOPES: readonly ["user-read-playback-state", "user-modify-playback-state"];
|
|
2
|
-
export declare const SPOTIFY_SCOPES: readonly ["user-read-playback-state", "user-modify-playback-state", "user-read-currently-playing"];
|
|
2
|
+
export declare const SPOTIFY_SCOPES: readonly ["user-read-playback-state", "user-modify-playback-state", "user-read-currently-playing", "playlist-read-private", "user-library-read", "user-library-modify", "user-read-recently-played"];
|