@bzenky/spoti 0.1.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 +144 -4
- package/dist/app.d.ts +27 -1
- package/dist/app.js +514 -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/auth/spotify-auth-client.d.ts +1 -0
- package/dist/auth/spotify-auth-client.js +4 -0
- package/dist/auth/spotify-auth-client.js.map +1 -1
- package/dist/cli.js +61 -1
- package/dist/cli.js.map +1 -1
- package/dist/services/auth.service.d.ts +1 -1
- package/dist/services/auth.service.js +17 -4
- 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.d.ts +20 -0
- package/dist/services/device.service.js +81 -0
- package/dist/services/device.service.js.map +1 -0
- 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 +12 -2
- package/dist/services/player.service.js +80 -15
- 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/queue.service.d.ts +18 -0
- package/dist/services/queue.service.js +43 -0
- package/dist/services/queue.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 +2 -1
- package/dist/spotify/scopes.js +9 -1
- package/dist/spotify/scopes.js.map +1 -1
- package/dist/spotify/types.d.ts +112 -8
- package/dist/storage/config.d.ts +30 -0
- package/dist/storage/config.js +128 -0
- package/dist/storage/config.js.map +1 -0
- package/dist/storage/credentials.d.ts +1 -0
- package/dist/storage/credentials.js +1 -0
- package/dist/storage/credentials.js.map +1 -1
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.js +1 -0
- package/dist/storage/index.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/ui/watch.d.ts +7 -0
- package/dist/ui/watch.js +44 -0
- package/dist/ui/watch.js.map +1 -0
- package/dist/update-worker.d.ts +9 -0
- package/dist/update-worker.js +91 -0
- package/dist/update-worker.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -1
package/dist/app.js
CHANGED
|
@@ -1,13 +1,58 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { UPDATE_COMMAND, } from './services/update.service.js';
|
|
3
|
+
import { CONFIG_KEYS, parseConfigValue, } from './storage/config.js';
|
|
4
|
+
import { formatAlbumDetail, formatArtistDetail, formatPlayback, formatPlaylist, formatPlaylistOverview, formatRecentlyPlayed, formatSavedTrack, formatTrack, } from './ui/output.js';
|
|
5
|
+
import { confirmUpdate, promptSpotifyClientId, selectAlbum, selectAlbumAction, selectArtist, selectArtistAction, selectPlaylist, selectPlaylistAction, selectTrack, } from './ui/prompts.js';
|
|
6
|
+
import { watchPlayback } from './ui/watch.js';
|
|
7
|
+
import { ConfigurationError } from './utils/errors.js';
|
|
8
|
+
import { formatDuration } from './utils/time.js';
|
|
9
|
+
import { VERSION } from './version.js';
|
|
4
10
|
export function createProgram(dependencies) {
|
|
5
11
|
const program = new Command();
|
|
6
12
|
const chooseTrack = dependencies.chooseTrack ?? selectTrack;
|
|
13
|
+
const chooseAlbum = dependencies.chooseAlbum ?? selectAlbum;
|
|
14
|
+
const chooseArtist = dependencies.chooseArtist ?? selectArtist;
|
|
15
|
+
const choosePlaylist = dependencies.choosePlaylist ?? selectPlaylist;
|
|
16
|
+
const chooseAlbumAction = dependencies.chooseAlbumAction ?? selectAlbumAction;
|
|
17
|
+
const chooseArtistAction = dependencies.chooseArtistAction ?? selectArtistAction;
|
|
18
|
+
const choosePlaylistAction = dependencies.choosePlaylistAction ?? selectPlaylistAction;
|
|
19
|
+
const requestClientId = dependencies.requestSpotifyClientId ?? promptSpotifyClientId;
|
|
20
|
+
const requestUpdateConfirmation = dependencies.confirmUpdate ?? confirmUpdate;
|
|
21
|
+
const startWatching = dependencies.watchPlayback ?? watchPlayback;
|
|
22
|
+
const runAlbumAction = async (album) => {
|
|
23
|
+
const detail = await dependencies.catalog.getAlbum(album.id);
|
|
24
|
+
dependencies.output.log(formatAlbumDetail(detail));
|
|
25
|
+
const action = await chooseAlbumAction();
|
|
26
|
+
if (action === 'play-album') {
|
|
27
|
+
await dependencies.player.playContext(detail.uri);
|
|
28
|
+
dependencies.output.log(`▶ Playing album ${detail.name}`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (action === 'play-track') {
|
|
32
|
+
const track = await chooseTrack(detail.tracks);
|
|
33
|
+
if (!track)
|
|
34
|
+
return;
|
|
35
|
+
await dependencies.player.playTrack(track.uri);
|
|
36
|
+
dependencies.output.log(`▶ Playing ${track.name} — ${track.artists.join(', ')}`);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
7
39
|
program
|
|
8
40
|
.name('spoti')
|
|
9
41
|
.description('Control Spotify from your terminal')
|
|
10
|
-
.version(
|
|
42
|
+
.version(VERSION);
|
|
43
|
+
program
|
|
44
|
+
.command('setup')
|
|
45
|
+
.description('Save your Spotify application client ID')
|
|
46
|
+
.argument('[client-id]', 'Spotify application client ID')
|
|
47
|
+
.action(async (providedClientId) => {
|
|
48
|
+
const clientId = providedClientId ?? (await requestClientId());
|
|
49
|
+
if (!clientId) {
|
|
50
|
+
throw new ConfigurationError('A Spotify client ID is required.\n\nRun: spoti setup <client-id>');
|
|
51
|
+
}
|
|
52
|
+
const validatedClientId = parseConfigValue('spotifyClientId', clientId);
|
|
53
|
+
await dependencies.config.set('spotifyClientId', validatedClientId);
|
|
54
|
+
dependencies.output.log('✓ Spotify client ID saved.\n\nNext: spoti login');
|
|
55
|
+
});
|
|
11
56
|
program
|
|
12
57
|
.command('login')
|
|
13
58
|
.description('Log in to Spotify')
|
|
@@ -34,10 +79,52 @@ export function createProgram(dependencies) {
|
|
|
34
79
|
const user = await dependencies.auth.getCurrentUser();
|
|
35
80
|
dependencies.output.log(`✓ Logged in as ${user.displayName}`);
|
|
36
81
|
});
|
|
82
|
+
const configCommand = program
|
|
83
|
+
.command('config')
|
|
84
|
+
.description('View and update spoti configuration')
|
|
85
|
+
.action(async () => {
|
|
86
|
+
dependencies.output.log(formatConfig(await dependencies.config.read()));
|
|
87
|
+
});
|
|
88
|
+
configCommand
|
|
89
|
+
.command('get')
|
|
90
|
+
.description('Read a configuration value')
|
|
91
|
+
.argument('<key>', 'configuration key')
|
|
92
|
+
.action(async (keyName) => {
|
|
93
|
+
const key = parseConfigKey(keyName);
|
|
94
|
+
const config = await dependencies.config.read();
|
|
95
|
+
dependencies.output.log(String(config[key]));
|
|
96
|
+
});
|
|
97
|
+
configCommand
|
|
98
|
+
.command('set')
|
|
99
|
+
.description('Set a configuration value')
|
|
100
|
+
.argument('<key>', 'configuration key')
|
|
101
|
+
.argument('<value>', 'new value')
|
|
102
|
+
.action(async (keyName, rawValue) => {
|
|
103
|
+
const key = parseConfigKey(keyName);
|
|
104
|
+
const value = parseConfigValue(key, rawValue);
|
|
105
|
+
await dependencies.config.set(key, value);
|
|
106
|
+
dependencies.output.log(`✓ ${key} = ${String(value)}`);
|
|
107
|
+
});
|
|
108
|
+
configCommand
|
|
109
|
+
.command('reset')
|
|
110
|
+
.description('Reset configuration to defaults')
|
|
111
|
+
.action(async () => {
|
|
112
|
+
await dependencies.config.reset();
|
|
113
|
+
dependencies.output.log('✓ Configuration reset');
|
|
114
|
+
});
|
|
37
115
|
program
|
|
38
116
|
.command('now')
|
|
39
117
|
.description('Show the current Spotify playback')
|
|
40
|
-
.
|
|
118
|
+
.option('-w, --watch', 'continuously refresh playback information')
|
|
119
|
+
.action(async (options) => {
|
|
120
|
+
if (options.watch) {
|
|
121
|
+
const config = await dependencies.config.read();
|
|
122
|
+
await startWatching({
|
|
123
|
+
player: dependencies.player,
|
|
124
|
+
refreshIntervalMs: config.refreshIntervalMs,
|
|
125
|
+
});
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
41
128
|
const playback = await dependencies.player.getCurrentPlayback();
|
|
42
129
|
dependencies.output.log(playback ? formatPlayback(playback) : 'Nothing is currently playing.');
|
|
43
130
|
});
|
|
@@ -71,6 +158,277 @@ export function createProgram(dependencies) {
|
|
|
71
158
|
await dependencies.player.previous();
|
|
72
159
|
dependencies.output.log('⏮ Returned to previous track');
|
|
73
160
|
});
|
|
161
|
+
program
|
|
162
|
+
.command('devices')
|
|
163
|
+
.description('List available Spotify Connect devices')
|
|
164
|
+
.action(async () => {
|
|
165
|
+
const devices = await dependencies.device.getDevices();
|
|
166
|
+
if (devices.length === 0) {
|
|
167
|
+
dependencies.output.log('No Spotify devices are available. Open Spotify on a device and try again.');
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
dependencies.output.log(devices
|
|
171
|
+
.map((device, index) => {
|
|
172
|
+
const state = device.isActive
|
|
173
|
+
? 'active'
|
|
174
|
+
: device.isRestricted
|
|
175
|
+
? 'restricted'
|
|
176
|
+
: 'available';
|
|
177
|
+
const volume = device.volumePercent === null ? '' : ` · ${device.volumePercent}%`;
|
|
178
|
+
return `${index + 1}. ${device.name} · ${device.type} · ${state}${volume}`;
|
|
179
|
+
})
|
|
180
|
+
.join('\n'));
|
|
181
|
+
});
|
|
182
|
+
program
|
|
183
|
+
.command('device')
|
|
184
|
+
.description('Transfer playback to a Spotify Connect device')
|
|
185
|
+
.argument('<number-name-or-id...>', 'displayed number, exact device name, or ID')
|
|
186
|
+
.action(async (nameOrIdParts) => {
|
|
187
|
+
const device = await dependencies.device.findDevice(nameOrIdParts.join(' '));
|
|
188
|
+
if (!device.id)
|
|
189
|
+
throw new ConfigurationError('The selected device has no usable ID.');
|
|
190
|
+
await dependencies.device.transferPlayback(device.id);
|
|
191
|
+
dependencies.output.log(`✓ Active device: ${device.name}`);
|
|
192
|
+
});
|
|
193
|
+
program
|
|
194
|
+
.command('seek')
|
|
195
|
+
.description('Seek within the current track')
|
|
196
|
+
.argument('<position>', 'absolute time such as 1:30, or a change such as +30 or -10')
|
|
197
|
+
.allowUnknownOption()
|
|
198
|
+
.action(async (rawPosition) => {
|
|
199
|
+
const input = parseSeekInput(rawPosition);
|
|
200
|
+
const position = input.relative
|
|
201
|
+
? await dependencies.player.changePosition(input.milliseconds)
|
|
202
|
+
: await dependencies.player.seek(input.milliseconds);
|
|
203
|
+
dependencies.output.log(`⏩ Position: ${formatDuration(position)}`);
|
|
204
|
+
});
|
|
205
|
+
program
|
|
206
|
+
.command('volume')
|
|
207
|
+
.description('Set or adjust the active device volume')
|
|
208
|
+
.argument('<value>', 'volume from 0-100, or a relative change such as +10 or -10')
|
|
209
|
+
.allowUnknownOption()
|
|
210
|
+
.action(async (rawValue) => {
|
|
211
|
+
const input = parseVolumeInput(rawValue);
|
|
212
|
+
const volume = input.relative
|
|
213
|
+
? await dependencies.player.changeVolume(input.value)
|
|
214
|
+
: await dependencies.player.setVolume(input.value);
|
|
215
|
+
dependencies.output.log(`${volume === 0 ? '🔇' : '🔊'} Volume: ${volume}%`);
|
|
216
|
+
});
|
|
217
|
+
program
|
|
218
|
+
.command('queue')
|
|
219
|
+
.description('Show the playback queue or add a searched track')
|
|
220
|
+
.argument('[query...]', 'track name to add')
|
|
221
|
+
.option('--first', 'queue the first search result without prompting')
|
|
222
|
+
.action(async (queryParts, options) => {
|
|
223
|
+
const query = queryParts.join(' ').trim();
|
|
224
|
+
if (!query) {
|
|
225
|
+
const playbackQueue = await dependencies.queue.getQueue();
|
|
226
|
+
const lines = playbackQueue.currentlyPlaying
|
|
227
|
+
? [
|
|
228
|
+
`Now: ${formatQueueItem(playbackQueue.currentlyPlaying)}`,
|
|
229
|
+
'',
|
|
230
|
+
'Up next:',
|
|
231
|
+
]
|
|
232
|
+
: ['Up next:'];
|
|
233
|
+
if (playbackQueue.queue.length === 0)
|
|
234
|
+
lines.push('Queue is empty.');
|
|
235
|
+
else {
|
|
236
|
+
lines.push(...playbackQueue.queue.map((item, index) => `${index + 1}. ${formatQueueItem(item)}`));
|
|
237
|
+
}
|
|
238
|
+
dependencies.output.log(lines.join('\n'));
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
const tracks = await dependencies.search.searchTracks(query);
|
|
242
|
+
if (tracks.length === 0) {
|
|
243
|
+
dependencies.output.log(`No tracks found for "${query}".`);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const track = options.first ? tracks[0] : await chooseTrack(tracks);
|
|
247
|
+
if (!track) {
|
|
248
|
+
dependencies.output.log('Selection cancelled.');
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
await dependencies.queue.addItem(track.uri);
|
|
252
|
+
dependencies.output.log(`✓ Queued ${track.name} — ${track.artists.join(', ')}`);
|
|
253
|
+
});
|
|
254
|
+
program
|
|
255
|
+
.command('shuffle')
|
|
256
|
+
.description('Turn playback shuffle on or off')
|
|
257
|
+
.argument('<state>', 'on or off')
|
|
258
|
+
.action(async (state) => {
|
|
259
|
+
if (state !== 'on' && state !== 'off') {
|
|
260
|
+
throw new ConfigurationError('Shuffle state must be either "on" or "off".');
|
|
261
|
+
}
|
|
262
|
+
await dependencies.player.setShuffle(state === 'on');
|
|
263
|
+
dependencies.output.log(`✓ Shuffle ${state}`);
|
|
264
|
+
});
|
|
265
|
+
program
|
|
266
|
+
.command('repeat')
|
|
267
|
+
.description('Set the playback repeat mode')
|
|
268
|
+
.argument('<mode>', 'off, track, or context')
|
|
269
|
+
.action(async (mode) => {
|
|
270
|
+
if (mode !== 'off' && mode !== 'track' && mode !== 'context') {
|
|
271
|
+
throw new ConfigurationError('Repeat mode must be "off", "track", or "context".');
|
|
272
|
+
}
|
|
273
|
+
await dependencies.player.setRepeat(mode);
|
|
274
|
+
dependencies.output.log(`✓ Repeat: ${mode}`);
|
|
275
|
+
});
|
|
276
|
+
program
|
|
277
|
+
.command('album')
|
|
278
|
+
.description('Search for and show an album')
|
|
279
|
+
.argument('<query...>', 'album name')
|
|
280
|
+
.option('--first', 'select the first result without prompting')
|
|
281
|
+
.action(async (queryParts, options) => {
|
|
282
|
+
const query = queryParts.join(' ').trim();
|
|
283
|
+
const albums = await dependencies.search.searchAlbums(query);
|
|
284
|
+
if (albums.length === 0) {
|
|
285
|
+
dependencies.output.log(`No albums found for "${query}".`);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const album = options.first ? albums[0] : await chooseAlbum(albums);
|
|
289
|
+
if (!album) {
|
|
290
|
+
dependencies.output.log('Selection cancelled.');
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
await runAlbumAction(album);
|
|
294
|
+
});
|
|
295
|
+
program
|
|
296
|
+
.command('artist')
|
|
297
|
+
.description('Search for and show an artist')
|
|
298
|
+
.argument('<query...>', 'artist name')
|
|
299
|
+
.option('--first', 'select the first result without prompting')
|
|
300
|
+
.action(async (queryParts, options) => {
|
|
301
|
+
const query = queryParts.join(' ').trim();
|
|
302
|
+
const artists = await dependencies.search.searchArtists(query);
|
|
303
|
+
if (artists.length === 0) {
|
|
304
|
+
dependencies.output.log(`No artists found for "${query}".`);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
const artist = options.first ? artists[0] : await chooseArtist(artists);
|
|
308
|
+
if (!artist) {
|
|
309
|
+
dependencies.output.log('Selection cancelled.');
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const detail = await dependencies.catalog.getArtist(artist.id);
|
|
313
|
+
dependencies.output.log(formatArtistDetail(detail));
|
|
314
|
+
const action = await chooseArtistAction();
|
|
315
|
+
if (action === 'play-artist') {
|
|
316
|
+
await dependencies.player.playContext(detail.uri);
|
|
317
|
+
dependencies.output.log(`▶ Playing artist ${detail.name}`);
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
if (action === 'select-album') {
|
|
321
|
+
const albums = await dependencies.catalog.getArtistAlbums(detail.id);
|
|
322
|
+
if (albums.length === 0) {
|
|
323
|
+
dependencies.output.log(`No albums found for ${detail.name}.`);
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
const album = await chooseAlbum(albums);
|
|
327
|
+
if (album)
|
|
328
|
+
await runAlbumAction(album);
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
program
|
|
332
|
+
.command('playlists')
|
|
333
|
+
.description('List your Spotify playlists')
|
|
334
|
+
.option('-l, --limit <number>', 'maximum number of playlists', parseCollectionLimit, 50)
|
|
335
|
+
.action(async (options) => {
|
|
336
|
+
const playlists = await dependencies.playlist.listPlaylists(options.limit);
|
|
337
|
+
dependencies.output.log(playlists.length === 0
|
|
338
|
+
? 'No playlists found.'
|
|
339
|
+
: playlists.map((playlist, index) => formatPlaylist(playlist, index)).join('\n'));
|
|
340
|
+
});
|
|
341
|
+
program
|
|
342
|
+
.command('playlist')
|
|
343
|
+
.description('Show one of your Spotify playlists')
|
|
344
|
+
.argument('<query...>', 'playlist name')
|
|
345
|
+
.option('--first', 'select the first match without prompting')
|
|
346
|
+
.action(async (queryParts, options) => {
|
|
347
|
+
const query = queryParts.join(' ').trim();
|
|
348
|
+
const allPlaylists = await dependencies.playlist.listPlaylists(50);
|
|
349
|
+
let playlist;
|
|
350
|
+
if (/^\d+$/.test(query)) {
|
|
351
|
+
playlist = findNumberedPlaylist(allPlaylists, query);
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
const matches = allPlaylists.filter((playlist) => playlist.name.toLocaleLowerCase().includes(query.toLocaleLowerCase()));
|
|
355
|
+
if (matches.length === 0) {
|
|
356
|
+
dependencies.output.log(`No playlists found for "${query}".`);
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
playlist = options.first ? matches[0] : await choosePlaylist(matches);
|
|
360
|
+
}
|
|
361
|
+
if (!playlist) {
|
|
362
|
+
dependencies.output.log('Selection cancelled.');
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
dependencies.output.log(formatPlaylistOverview(playlist));
|
|
366
|
+
if ((await choosePlaylistAction()) === 'play-playlist') {
|
|
367
|
+
await dependencies.player.playContext(playlist.uri);
|
|
368
|
+
dependencies.output.log(`▶ Playing playlist ${playlist.name}`);
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
program
|
|
372
|
+
.command('liked')
|
|
373
|
+
.description('List your liked tracks')
|
|
374
|
+
.option('-l, --limit <number>', 'maximum number of tracks', parseCollectionLimit, 20)
|
|
375
|
+
.action(async (options) => {
|
|
376
|
+
const tracks = await dependencies.library.getLikedTracks(options.limit);
|
|
377
|
+
dependencies.output.log(tracks.length === 0
|
|
378
|
+
? 'No liked tracks found.'
|
|
379
|
+
: tracks.map((item, index) => formatSavedTrack(item, index)).join('\n'));
|
|
380
|
+
});
|
|
381
|
+
program
|
|
382
|
+
.command('like')
|
|
383
|
+
.description('Add the current track to your Spotify library')
|
|
384
|
+
.action(async () => {
|
|
385
|
+
const track = await dependencies.library.likeCurrentTrack();
|
|
386
|
+
dependencies.output.log(track
|
|
387
|
+
? `♥ Liked ${track.name} — ${track.artists.join(', ')}`
|
|
388
|
+
: 'No playable track is currently selected.');
|
|
389
|
+
});
|
|
390
|
+
program
|
|
391
|
+
.command('unlike')
|
|
392
|
+
.description('Remove the current track from your Spotify library')
|
|
393
|
+
.action(async () => {
|
|
394
|
+
const track = await dependencies.library.unlikeCurrentTrack();
|
|
395
|
+
dependencies.output.log(track
|
|
396
|
+
? `♡ Unliked ${track.name} — ${track.artists.join(', ')}`
|
|
397
|
+
: 'No playable track is currently selected.');
|
|
398
|
+
});
|
|
399
|
+
program
|
|
400
|
+
.command('recent')
|
|
401
|
+
.description('Show recently played tracks')
|
|
402
|
+
.option('-l, --limit <number>', 'maximum number of tracks', parseCollectionLimit, 20)
|
|
403
|
+
.action(async (options) => {
|
|
404
|
+
const tracks = await dependencies.recent.getRecentlyPlayed(options.limit);
|
|
405
|
+
dependencies.output.log(tracks.length === 0
|
|
406
|
+
? 'No recently played tracks found.'
|
|
407
|
+
: tracks.map((item, index) => formatRecentlyPlayed(item, index)).join('\n'));
|
|
408
|
+
});
|
|
409
|
+
program
|
|
410
|
+
.command('update')
|
|
411
|
+
.description('Check for or install the latest spoti version')
|
|
412
|
+
.option('--check', 'check without installing')
|
|
413
|
+
.action(async (options) => {
|
|
414
|
+
const result = await dependencies.update.checkForeground();
|
|
415
|
+
if (result.status === 'current') {
|
|
416
|
+
dependencies.output.log(`✓ spoti ${result.currentVersion} is up to date.`);
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
dependencies.output.log(`Update available: ${result.currentVersion} → ${result.latestVersion}`);
|
|
420
|
+
if (options.check) {
|
|
421
|
+
dependencies.output.log(`Run: ${UPDATE_COMMAND}`);
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
const confirmed = await requestUpdateConfirmation(result.currentVersion, result.latestVersion);
|
|
425
|
+
if (!confirmed) {
|
|
426
|
+
dependencies.output.log(`Update cancelled.\nRun manually: ${UPDATE_COMMAND}`);
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
await dependencies.update.installLatest(true, result.latestVersion);
|
|
430
|
+
dependencies.output.log(`✓ Updated spoti to ${result.latestVersion}.`);
|
|
431
|
+
});
|
|
74
432
|
program
|
|
75
433
|
.command('search')
|
|
76
434
|
.description('Search Spotify tracks')
|
|
@@ -87,31 +445,164 @@ export function createProgram(dependencies) {
|
|
|
87
445
|
});
|
|
88
446
|
program
|
|
89
447
|
.command('play')
|
|
90
|
-
.description('
|
|
91
|
-
.argument('[query...]', 'track
|
|
448
|
+
.description('Play a track or an explicit album, artist, or playlist context')
|
|
449
|
+
.argument('[query...]', 'track query, or: track|album|artist|playlist <query>')
|
|
92
450
|
.option('--first', 'play the first search result without prompting')
|
|
451
|
+
.option('--watch', 'continuously refresh playback information')
|
|
452
|
+
.option('--no-watch', 'return to the shell after starting playback')
|
|
93
453
|
.action(async (queryParts, options) => {
|
|
94
454
|
const query = queryParts.join(' ').trim();
|
|
95
455
|
if (!query) {
|
|
456
|
+
const config = await dependencies.config.read();
|
|
457
|
+
const shouldWatch = options.watch ?? config.watchAfterPlay;
|
|
96
458
|
await dependencies.player.resume();
|
|
97
459
|
dependencies.output.log('▶ Resumed');
|
|
460
|
+
if (shouldWatch) {
|
|
461
|
+
await startWatching({
|
|
462
|
+
player: dependencies.player,
|
|
463
|
+
refreshIntervalMs: config.refreshIntervalMs,
|
|
464
|
+
});
|
|
465
|
+
}
|
|
98
466
|
return;
|
|
99
467
|
}
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
468
|
+
const firstPart = queryParts[0];
|
|
469
|
+
const hasExplicitType = queryParts.length > 1 && isSpotifyPlayableType(firstPart);
|
|
470
|
+
const explicitType = hasExplicitType ? firstPart : 'track';
|
|
471
|
+
const searchQuery = hasExplicitType ? queryParts.slice(1).join(' ').trim() : query;
|
|
472
|
+
const selection = await selectPlaybackItem({
|
|
473
|
+
type: explicitType,
|
|
474
|
+
query: searchQuery,
|
|
475
|
+
first: options.first ?? false,
|
|
476
|
+
dependencies,
|
|
477
|
+
chooseTrack,
|
|
478
|
+
chooseAlbum,
|
|
479
|
+
chooseArtist,
|
|
480
|
+
choosePlaylist,
|
|
481
|
+
});
|
|
482
|
+
if (!selection)
|
|
108
483
|
return;
|
|
484
|
+
const config = await dependencies.config.read();
|
|
485
|
+
const shouldWatch = options.watch ?? config.watchAfterPlay;
|
|
486
|
+
if (selection.type === 'track')
|
|
487
|
+
await dependencies.player.playTrack(selection.uri);
|
|
488
|
+
else
|
|
489
|
+
await dependencies.player.playContext(selection.uri);
|
|
490
|
+
dependencies.output.log(`▶ Playing ${selection.label}`);
|
|
491
|
+
if (shouldWatch) {
|
|
492
|
+
await startWatching({
|
|
493
|
+
player: dependencies.player,
|
|
494
|
+
refreshIntervalMs: config.refreshIntervalMs,
|
|
495
|
+
});
|
|
109
496
|
}
|
|
110
|
-
await dependencies.player.playTrack(track.uri);
|
|
111
|
-
dependencies.output.log(`▶ Playing ${track.name} — ${track.artists.join(', ')}`);
|
|
112
497
|
});
|
|
113
498
|
return program;
|
|
114
499
|
}
|
|
500
|
+
async function selectPlaybackItem(options) {
|
|
501
|
+
const { dependencies, first, query } = options;
|
|
502
|
+
let selected;
|
|
503
|
+
if (options.type === 'track') {
|
|
504
|
+
const items = await dependencies.search.searchTracks(query);
|
|
505
|
+
if (items.length === 0)
|
|
506
|
+
return reportNoResults(dependencies.output, 'tracks', query);
|
|
507
|
+
selected = first ? items[0] : await options.chooseTrack(items);
|
|
508
|
+
}
|
|
509
|
+
else if (options.type === 'album') {
|
|
510
|
+
const items = await dependencies.search.searchAlbums(query);
|
|
511
|
+
if (items.length === 0)
|
|
512
|
+
return reportNoResults(dependencies.output, 'albums', query);
|
|
513
|
+
selected = first ? items[0] : await options.chooseAlbum(items);
|
|
514
|
+
}
|
|
515
|
+
else if (options.type === 'artist') {
|
|
516
|
+
const items = await dependencies.search.searchArtists(query);
|
|
517
|
+
if (items.length === 0)
|
|
518
|
+
return reportNoResults(dependencies.output, 'artists', query);
|
|
519
|
+
selected = first ? items[0] : await options.chooseArtist(items);
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
if (/^\d+$/.test(query)) {
|
|
523
|
+
selected = findNumberedPlaylist(await dependencies.playlist.listPlaylists(50), query);
|
|
524
|
+
}
|
|
525
|
+
else {
|
|
526
|
+
const items = await dependencies.search.searchPlaylists(query);
|
|
527
|
+
if (items.length === 0)
|
|
528
|
+
return reportNoResults(dependencies.output, 'playlists', query);
|
|
529
|
+
selected = first ? items[0] : await options.choosePlaylist(items);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
if (!selected) {
|
|
533
|
+
dependencies.output.log('Selection cancelled.');
|
|
534
|
+
return null;
|
|
535
|
+
}
|
|
536
|
+
if (options.type === 'track') {
|
|
537
|
+
const track = selected;
|
|
538
|
+
return {
|
|
539
|
+
type: 'track',
|
|
540
|
+
uri: track.uri,
|
|
541
|
+
label: `${track.name} — ${track.artists.join(', ')}`,
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
return { type: options.type, uri: selected.uri, label: selected.name };
|
|
545
|
+
}
|
|
546
|
+
function findNumberedPlaylist(playlists, number) {
|
|
547
|
+
const index = Number(number) - 1;
|
|
548
|
+
const playlist = Number.isSafeInteger(index) ? playlists[index] : undefined;
|
|
549
|
+
if (!playlist) {
|
|
550
|
+
throw new ConfigurationError(`Playlist number ${number} is out of range. Run: spoti playlists`);
|
|
551
|
+
}
|
|
552
|
+
return playlist;
|
|
553
|
+
}
|
|
554
|
+
function reportNoResults(output, type, query) {
|
|
555
|
+
output.log(`No ${type} found for "${query}".`);
|
|
556
|
+
return null;
|
|
557
|
+
}
|
|
558
|
+
function isSpotifyPlayableType(value) {
|
|
559
|
+
return value === 'track' || value === 'album' || value === 'artist' || value === 'playlist';
|
|
560
|
+
}
|
|
561
|
+
function parseSeekInput(value) {
|
|
562
|
+
const relative = value.startsWith('+') || value.startsWith('-');
|
|
563
|
+
const sign = value.startsWith('-') ? -1 : 1;
|
|
564
|
+
const time = relative ? value.slice(1) : value;
|
|
565
|
+
const parts = time.split(':');
|
|
566
|
+
if (parts.length > 2 || parts.some((part) => !/^\d+$/.test(part))) {
|
|
567
|
+
throw new ConfigurationError('Seek position must be seconds or minutes:seconds, such as 90, 1:30, +30, or -10.');
|
|
568
|
+
}
|
|
569
|
+
const minutes = parts.length === 2 ? Number(parts[0]) : 0;
|
|
570
|
+
const seconds = Number(parts.at(-1));
|
|
571
|
+
if (!Number.isSafeInteger(minutes) || !Number.isSafeInteger(seconds) || seconds >= 60 && parts.length === 2) {
|
|
572
|
+
throw new ConfigurationError('Seek position must be seconds or minutes:seconds, such as 90, 1:30, +30, or -10.');
|
|
573
|
+
}
|
|
574
|
+
return {
|
|
575
|
+
relative,
|
|
576
|
+
milliseconds: sign * (minutes * 60 + seconds) * 1_000,
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
function formatQueueItem(item) {
|
|
580
|
+
return `${item.name} — ${item.subtitle} · ${formatDuration(item.durationMs)}`;
|
|
581
|
+
}
|
|
582
|
+
function parseVolumeInput(value) {
|
|
583
|
+
if (/^[+-]\d+$/.test(value)) {
|
|
584
|
+
const delta = Number(value);
|
|
585
|
+
if (Number.isSafeInteger(delta) && Math.abs(delta) <= 100) {
|
|
586
|
+
return { relative: true, value: delta };
|
|
587
|
+
}
|
|
588
|
+
throw new ConfigurationError('Relative volume must be between -100 and +100.');
|
|
589
|
+
}
|
|
590
|
+
if (/^\d+$/.test(value)) {
|
|
591
|
+
const volume = Number(value);
|
|
592
|
+
if (Number.isSafeInteger(volume) && volume <= 100) {
|
|
593
|
+
return { relative: false, value: volume };
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
throw new ConfigurationError('Volume must be from 0 to 100, or a change such as +10 or -10.');
|
|
597
|
+
}
|
|
598
|
+
function parseConfigKey(value) {
|
|
599
|
+
if (CONFIG_KEYS.includes(value))
|
|
600
|
+
return value;
|
|
601
|
+
throw new ConfigurationError(`Unknown configuration key "${value}". Valid keys: ${CONFIG_KEYS.join(', ')}.`);
|
|
602
|
+
}
|
|
603
|
+
function formatConfig(config) {
|
|
604
|
+
return CONFIG_KEYS.map((key) => `${key}: ${String(config[key])}`).join('\n');
|
|
605
|
+
}
|
|
115
606
|
function parseLimit(value) {
|
|
116
607
|
const limit = /^\d+$/.test(value) ? Number(value) : Number.NaN;
|
|
117
608
|
if (!Number.isInteger(limit) || limit < 1 || limit > 10) {
|
|
@@ -119,4 +610,11 @@ function parseLimit(value) {
|
|
|
119
610
|
}
|
|
120
611
|
return limit;
|
|
121
612
|
}
|
|
613
|
+
function parseCollectionLimit(value) {
|
|
614
|
+
const limit = /^\d+$/.test(value) ? Number(value) : Number.NaN;
|
|
615
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 50) {
|
|
616
|
+
throw new Error('Limit must be an integer between 1 and 50.');
|
|
617
|
+
}
|
|
618
|
+
return limit;
|
|
619
|
+
}
|
|
122
620
|
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/config.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ export interface AuthConfig {
|
|
|
3
3
|
clientId: string;
|
|
4
4
|
redirectUri: string;
|
|
5
5
|
}
|
|
6
|
-
export declare function loadAuthConfig(environment?: NodeJS.ProcessEnv): AuthConfig;
|
|
6
|
+
export declare function loadAuthConfig(environment?: NodeJS.ProcessEnv, storedClientId?: string | null): AuthConfig;
|
|
7
7
|
export declare function validateRedirectUri(redirectUri: string): URL;
|