@bzenky/spoti 0.2.0 → 0.4.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 (70) hide show
  1. package/README.md +122 -4
  2. package/dist/app.d.ts +23 -1
  3. package/dist/app.js +397 -36
  4. package/dist/app.js.map +1 -1
  5. package/dist/auth/config.d.ts +1 -1
  6. package/dist/auth/config.js +3 -3
  7. package/dist/auth/config.js.map +1 -1
  8. package/dist/cli.js +54 -0
  9. package/dist/cli.js.map +1 -1
  10. package/dist/services/auth.service.d.ts +1 -1
  11. package/dist/services/auth.service.js +9 -3
  12. package/dist/services/auth.service.js.map +1 -1
  13. package/dist/services/catalog.service.d.ts +9 -0
  14. package/dist/services/catalog.service.js +22 -0
  15. package/dist/services/catalog.service.js.map +1 -0
  16. package/dist/services/device.service.js +22 -2
  17. package/dist/services/device.service.js.map +1 -1
  18. package/dist/services/library.service.d.ts +13 -0
  19. package/dist/services/library.service.js +46 -0
  20. package/dist/services/library.service.js.map +1 -0
  21. package/dist/services/mappers.d.ts +10 -0
  22. package/dist/services/mappers.js +104 -0
  23. package/dist/services/mappers.js.map +1 -0
  24. package/dist/services/models.d.ts +45 -0
  25. package/dist/services/player.service.d.ts +4 -1
  26. package/dist/services/player.service.js +21 -14
  27. package/dist/services/player.service.js.map +1 -1
  28. package/dist/services/playlist.service.d.ts +9 -0
  29. package/dist/services/playlist.service.js +33 -0
  30. package/dist/services/playlist.service.js.map +1 -0
  31. package/dist/services/recent.service.d.ts +7 -0
  32. package/dist/services/recent.service.js +24 -0
  33. package/dist/services/recent.service.js.map +1 -0
  34. package/dist/services/search.service.d.ts +5 -1
  35. package/dist/services/search.service.js +32 -17
  36. package/dist/services/search.service.js.map +1 -1
  37. package/dist/services/update.service.d.ts +57 -0
  38. package/dist/services/update.service.js +313 -0
  39. package/dist/services/update.service.js.map +1 -0
  40. package/dist/spotify/client.js +14 -1
  41. package/dist/spotify/client.js.map +1 -1
  42. package/dist/spotify/scopes.d.ts +1 -1
  43. package/dist/spotify/scopes.js +4 -0
  44. package/dist/spotify/scopes.js.map +1 -1
  45. package/dist/spotify/types.d.ts +110 -8
  46. package/dist/storage/config.d.ts +5 -1
  47. package/dist/storage/config.js +21 -1
  48. package/dist/storage/config.js.map +1 -1
  49. package/dist/storage/update-cache.d.ts +29 -0
  50. package/dist/storage/update-cache.js +135 -0
  51. package/dist/storage/update-cache.js.map +1 -0
  52. package/dist/ui/completions.d.ts +3 -0
  53. package/dist/ui/completions.js +237 -0
  54. package/dist/ui/completions.js.map +1 -0
  55. package/dist/ui/interactive-search.d.ts +33 -0
  56. package/dist/ui/interactive-search.js +174 -0
  57. package/dist/ui/interactive-search.js.map +1 -0
  58. package/dist/ui/output.d.ts +10 -1
  59. package/dist/ui/output.js +60 -0
  60. package/dist/ui/output.js.map +1 -1
  61. package/dist/ui/progress.d.ts +6 -0
  62. package/dist/ui/progress.js +25 -0
  63. package/dist/ui/progress.js.map +1 -0
  64. package/dist/ui/prompts.d.ts +12 -1
  65. package/dist/ui/prompts.js +73 -6
  66. package/dist/ui/prompts.js.map +1 -1
  67. package/dist/update-worker.d.ts +9 -0
  68. package/dist/update-worker.js +91 -0
  69. package/dist/update-worker.js.map +1 -0
  70. package/package.json +1 -1
@@ -1,19 +1,86 @@
1
1
  import { createInterface } from 'node:readline/promises';
2
2
  import { stdin, stdout } from 'node:process';
3
- import { formatTrack } from './output.js';
3
+ import { formatAlbum, formatArtist, formatPlaylist, formatTrack } from './output.js';
4
4
  export async function selectTrack(tracks) {
5
- if (tracks.length === 0)
5
+ return selectItem(tracks, formatTrack);
6
+ }
7
+ export async function selectAlbum(albums) {
8
+ return selectItem(albums, formatAlbum);
9
+ }
10
+ export async function selectArtist(artists) {
11
+ return selectItem(artists, formatArtist);
12
+ }
13
+ export async function selectPlaylist(playlists) {
14
+ return selectItem(playlists, formatPlaylist);
15
+ }
16
+ export async function selectAlbumAction() {
17
+ return selectAction([
18
+ { value: 'play-album', label: 'Play the entire album' },
19
+ { value: 'play-track', label: 'Select a track' },
20
+ ]);
21
+ }
22
+ export async function selectArtistAction() {
23
+ return selectAction([
24
+ { value: 'play-artist', label: 'Play the artist' },
25
+ { value: 'select-album', label: 'Select an album' },
26
+ ]);
27
+ }
28
+ export async function selectPlaylistAction() {
29
+ return selectAction([{ value: 'play-playlist', label: 'Play the playlist' }]);
30
+ }
31
+ export async function promptSpotifyClientId() {
32
+ if (!stdin.isTTY || !stdout.isTTY)
33
+ return null;
34
+ const prompt = createInterface({ input: stdin, output: stdout });
35
+ try {
36
+ const answer = await prompt.question('Spotify Client ID: ');
37
+ return answer.trim() || null;
38
+ }
39
+ finally {
40
+ prompt.close();
41
+ }
42
+ }
43
+ export async function confirmUpdate(currentVersion, latestVersion) {
44
+ if (!stdin.isTTY || !stdout.isTTY)
45
+ return false;
46
+ const prompt = createInterface({ input: stdin, output: stdout });
47
+ try {
48
+ const answer = await prompt.question(`Update spoti ${currentVersion} → ${latestVersion} with npm? [Y/n] `);
49
+ return answer.trim() === '' || /^y(?:es)?$/i.test(answer.trim());
50
+ }
51
+ finally {
52
+ prompt.close();
53
+ }
54
+ }
55
+ async function selectAction(actions) {
56
+ if (!stdin.isTTY || !stdout.isTTY)
57
+ return null;
58
+ stdout.write(`\nWhat do you want to play?\n\n${actions
59
+ .map((action, index) => `${index + 1}. ${action.label}`)
60
+ .join('\n')}\n${actions.length + 1}. Nothing\n\n`);
61
+ const prompt = createInterface({ input: stdin, output: stdout });
62
+ try {
63
+ const answer = await prompt.question(`Select [1-${actions.length + 1}]: `);
64
+ const index = Number.parseInt(answer, 10) - 1;
65
+ return actions[index]?.value ?? null;
66
+ }
67
+ finally {
68
+ prompt.close();
69
+ }
70
+ }
71
+ async function selectItem(items, format) {
72
+ if (items.length === 0)
6
73
  return null;
7
74
  if (!stdin.isTTY || !stdout.isTTY)
8
- return tracks[0] ?? null;
9
- stdout.write(`${tracks.map((track, index) => formatTrack(track, index)).join('\n')}\n\n`);
75
+ return items[0] ?? null;
76
+ stdout.write(`${items.map((item, index) => format(item, index)).join('\n')}\n\n`);
10
77
  const prompt = createInterface({ input: stdin, output: stdout });
11
78
  try {
12
- const answer = await prompt.question(`Select [1-${tracks.length}] (Enter to cancel): `);
79
+ const answer = await prompt.question(`Select [1-${items.length}] (Enter to cancel): `);
13
80
  if (!answer.trim())
14
81
  return null;
15
82
  const index = Number.parseInt(answer, 10) - 1;
16
- return tracks[index] ?? null;
83
+ return items[index] ?? null;
17
84
  }
18
85
  finally {
19
86
  prompt.close();
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAe;IAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAE5D,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,aAAa,MAAM,CAAC,MAAM,uBAAuB,CAAC,CAAC;QACxF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC/B,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAe;IAC/C,OAAO,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAe;IAC/C,OAAO,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAiB;IAClD,OAAO,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAqB;IACxD,OAAO,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AAC/C,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,OAAO,YAAY,CAAC;QAClB,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,uBAAuB,EAAE;QACvD,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE;KACjD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,OAAO,YAAY,CAAC;QAClB,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE;QAClD,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,iBAAiB,EAAE;KACpD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,OAAO,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;QAC5D,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC/B,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,cAAsB,EAAE,aAAqB;IAC/E,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAChD,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAClC,gBAAgB,cAAc,MAAM,aAAa,mBAAmB,CACrE,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,OAAwD;IAExD,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,CAAC,KAAK,CACV,kCAAkC,OAAO;SACtC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;SACvD,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,eAAe,CACpD,CAAC;IACF,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,aAAa,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;IACvC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,KAAa,EACb,MAA8C;IAE9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAE3D,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,aAAa,KAAK,CAAC,MAAM,uBAAuB,CAAC,CAAC;QACvF,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type UpdateChecker, type UpdateCheckResult } from './services/update.service.js';
2
+ /** Automatic update failures are intentionally hidden from normal CLI commands. */
3
+ export declare function runBackgroundUpdateCheck(checker: UpdateChecker): Promise<UpdateCheckResult | null>;
4
+ /**
5
+ * Starts at most one independent refresh process. The process can finish after the invoking
6
+ * CLI exits and writes the cache for a later invocation to display.
7
+ */
8
+ export declare function startUpdateWorker(currentVersion: string, cachePath: string): Promise<boolean>;
9
+ export declare function acquireUpdateWorkerLock(lockPath: string): Promise<boolean>;
@@ -0,0 +1,91 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { mkdir, open, stat, unlink } from 'node:fs/promises';
3
+ import { dirname } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { UpdateService, } from './services/update.service.js';
6
+ const WORKER_FLAG = '--spoti-update-worker';
7
+ const STALE_LOCK_MS = 60_000;
8
+ /** Automatic update failures are intentionally hidden from normal CLI commands. */
9
+ export async function runBackgroundUpdateCheck(checker) {
10
+ try {
11
+ return await checker.checkInBackground();
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ /**
18
+ * Starts at most one independent refresh process. The process can finish after the invoking
19
+ * CLI exits and writes the cache for a later invocation to display.
20
+ */
21
+ export async function startUpdateWorker(currentVersion, cachePath) {
22
+ const lockPath = `${cachePath}.lock`;
23
+ if (!(await acquireUpdateWorkerLock(lockPath)))
24
+ return false;
25
+ const modulePath = fileURLToPath(import.meta.url);
26
+ const runtimeArguments = modulePath.endsWith('.ts') ? process.execArgv : [];
27
+ try {
28
+ const child = spawn(process.execPath, [...runtimeArguments, modulePath, WORKER_FLAG, currentVersion, lockPath], {
29
+ detached: true,
30
+ stdio: 'ignore',
31
+ shell: false,
32
+ });
33
+ child.once('error', () => {
34
+ void unlink(lockPath).catch(() => undefined);
35
+ });
36
+ child.unref();
37
+ return true;
38
+ }
39
+ catch {
40
+ await unlink(lockPath).catch(() => undefined);
41
+ return false;
42
+ }
43
+ }
44
+ export async function acquireUpdateWorkerLock(lockPath) {
45
+ try {
46
+ await mkdir(dirname(lockPath), { recursive: true, mode: 0o700 });
47
+ const handle = await open(lockPath, 'wx', 0o600);
48
+ await handle.close();
49
+ return true;
50
+ }
51
+ catch (error) {
52
+ if (!hasCode(error, 'EEXIST'))
53
+ return false;
54
+ }
55
+ try {
56
+ const lock = await stat(lockPath);
57
+ if (Date.now() - lock.mtimeMs < STALE_LOCK_MS)
58
+ return false;
59
+ await unlink(lockPath);
60
+ const handle = await open(lockPath, 'wx', 0o600);
61
+ await handle.close();
62
+ return true;
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ async function workerMain(currentVersion, lockPath) {
69
+ try {
70
+ await new UpdateService(currentVersion).checkForeground();
71
+ }
72
+ catch {
73
+ // The foreground method records a failed timestamp; automatic checks remain silent.
74
+ }
75
+ finally {
76
+ await unlink(lockPath).catch(() => undefined);
77
+ }
78
+ }
79
+ function hasCode(error, code) {
80
+ return (typeof error === 'object' &&
81
+ error !== null &&
82
+ 'code' in error &&
83
+ error.code === code);
84
+ }
85
+ if (process.argv[2] === WORKER_FLAG) {
86
+ const currentVersion = process.argv[3];
87
+ const lockPath = process.argv[4];
88
+ if (currentVersion && lockPath)
89
+ await workerMain(currentVersion, lockPath);
90
+ }
91
+ //# sourceMappingURL=update-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-worker.js","sourceRoot":"","sources":["../src/update-worker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bzenky/spoti",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "A local-first command-line client for controlling Spotify",
5
5
  "type": "module",
6
6
  "bin": {