morille 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.
- package/README.md +15 -3
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +2 -1
- package/dist/app.js.map +1 -1
- package/dist/components/device-indicator.d.ts +18 -0
- package/dist/components/device-indicator.d.ts.map +1 -0
- package/dist/components/device-indicator.js +53 -0
- package/dist/components/device-indicator.js.map +1 -0
- package/dist/components/device-picker-view.d.ts +10 -0
- package/dist/components/device-picker-view.d.ts.map +1 -0
- package/dist/components/device-picker-view.js +65 -0
- package/dist/components/device-picker-view.js.map +1 -0
- package/dist/components/panel-content.d.ts.map +1 -1
- package/dist/components/panel-content.js +4 -0
- package/dist/components/panel-content.js.map +1 -0
- package/dist/components/player.d.ts.map +1 -1
- package/dist/components/player.js +35 -3
- package/dist/components/player.js.map +1 -1
- package/dist/contexts/devices-context.d.ts +28 -0
- package/dist/contexts/devices-context.d.ts.map +1 -0
- package/dist/contexts/devices-context.js +33 -0
- package/dist/contexts/devices-context.js.map +1 -0
- package/dist/contexts/panel-mode-context.d.ts +2 -1
- package/dist/contexts/panel-mode-context.d.ts.map +1 -0
- package/dist/contexts/panel-mode-context.js +3 -0
- package/dist/contexts/panel-mode-context.js.map +1 -0
- package/dist/hooks/use-album-art.d.ts.map +1 -1
- package/dist/hooks/use-album-art.js +2 -1
- package/dist/hooks/use-album-art.js.map +1 -1
- package/dist/hooks/use-browse.d.ts.map +1 -1
- package/dist/hooks/use-browse.js +4 -3
- package/dist/hooks/use-browse.js.map +1 -1
- package/dist/hooks/use-devices.d.ts +24 -0
- package/dist/hooks/use-devices.d.ts.map +1 -0
- package/dist/hooks/use-devices.js +106 -0
- package/dist/hooks/use-devices.js.map +1 -0
- package/dist/hooks/use-playback.d.ts +7 -0
- package/dist/hooks/use-playback.d.ts.map +1 -1
- package/dist/hooks/use-playback.js +31 -9
- package/dist/hooks/use-playback.js.map +1 -1
- package/dist/hooks/use-player-input.d.ts.map +1 -1
- package/dist/hooks/use-player-input.js +31 -2
- package/dist/hooks/use-player-input.js.map +1 -0
- package/dist/hooks/use-queue.d.ts.map +1 -1
- package/dist/hooks/use-queue.js +3 -2
- package/dist/hooks/use-queue.js.map +1 -1
- package/dist/hooks/use-search.d.ts.map +1 -1
- package/dist/hooks/use-search.js +2 -1
- package/dist/hooks/use-search.js.map +1 -0
- package/dist/icons.d.ts +7 -0
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +8 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +15 -0
- package/dist/logger.js.map +1 -0
- package/dist/spotify/auth.d.ts.map +1 -1
- package/dist/spotify/auth.js +2 -1
- package/dist/spotify/auth.js.map +1 -1
- package/dist/spotify/client.d.ts.map +1 -1
- package/dist/spotify/client.js +2 -1
- package/dist/spotify/client.js.map +1 -1
- package/dist/spotify/devices.d.ts +36 -0
- package/dist/spotify/devices.d.ts.map +1 -0
- package/dist/spotify/devices.js +72 -0
- package/dist/spotify/devices.js.map +1 -0
- package/dist/spotify/fetch-with-retry.d.ts.map +1 -1
- package/dist/spotify/fetch-with-retry.js +5 -4
- package/dist/spotify/fetch-with-retry.js.map +1 -0
- package/dist/spotify/lyrics.d.ts.map +1 -1
- package/dist/spotify/lyrics.js +3 -2
- package/dist/spotify/lyrics.js.map +1 -1
- package/dist/spotify/playback.d.ts +3 -0
- package/dist/spotify/playback.d.ts.map +1 -1
- package/dist/spotify/playback.js +39 -21
- package/dist/spotify/playback.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/spotify/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/spotify/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAIrD;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAapC;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAoB9G"}
|
package/dist/spotify/client.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SpotifyApi } from '@spotify/web-api-ts-sdk';
|
|
2
2
|
import { DEFAULT_SPOTIFY_CLIENT_ID } from '../config.js';
|
|
3
|
+
import { logger } from '../logger.js';
|
|
3
4
|
import { authenticate, isTokenExpired, loadStoredToken, refreshToken, storeToken } from './auth.js';
|
|
4
5
|
import { fetchWithRetry } from './fetch-with-retry.js';
|
|
5
6
|
/**
|
|
@@ -35,7 +36,7 @@ export async function createSpotifyClient(clientId, options) {
|
|
|
35
36
|
token = await refreshToken(clientId, token);
|
|
36
37
|
}
|
|
37
38
|
catch (err) {
|
|
38
|
-
|
|
39
|
+
logger.error('Token refresh failed, falling back to full re-auth:', err);
|
|
39
40
|
token = null;
|
|
40
41
|
}
|
|
41
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/spotify/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/spotify/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,UAAU,WAAW;IACzB,+GAA+G;IAC/G,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,yBAAyB,CAAC;IAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,mCAAmC;YACjC,oEAAoE;YACpE,wEAAwE;YACxE,mDAAmD,CACtD,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB,EAAE,OAA6B;IACvF,IAAI,KAAK,GAAG,eAAe,EAAE,CAAC;IAE9B,IAAI,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QAC1D,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,qDAAqD,EAAE,GAAG,CAAC,CAAC;YACzE,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,UAAU,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE;QACjD,KAAK,EAAE,cAAc;KACtB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { SpotifyApi } from '@spotify/web-api-ts-sdk';
|
|
2
|
+
export type DeviceType = 'Computer' | 'Smartphone' | 'Speaker' | 'TV' | 'AVR' | 'STB' | 'AudioDongle' | 'GameConsole' | 'CastVideo' | 'CastAudio' | 'Automobile' | 'Unknown';
|
|
3
|
+
export type SpotifyDevice = {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
type: DeviceType;
|
|
7
|
+
isActive: boolean;
|
|
8
|
+
isRestricted: boolean;
|
|
9
|
+
volumePercent: number | null;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Narrows the SDK's `string` device type to the `DeviceType` union,
|
|
13
|
+
* falling back to `'Unknown'` for any value Spotify adds later that we do
|
|
14
|
+
* not recognise yet.
|
|
15
|
+
*/
|
|
16
|
+
export declare function normalizeDeviceType(value: string | null | undefined): DeviceType;
|
|
17
|
+
/**
|
|
18
|
+
* Lists every Spotify Connect device visible to the current user. Ghost
|
|
19
|
+
* entries with `id === null` (briefly returned during state transitions)
|
|
20
|
+
* are filtered out so callers never have to handle them.
|
|
21
|
+
* @param client - Authenticated Spotify API client
|
|
22
|
+
* @returns Array of devices ready to display and target
|
|
23
|
+
*/
|
|
24
|
+
export declare function fetchDevices(client: SpotifyApi): Promise<SpotifyDevice[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Transfers playback to a target device via the Spotify Connect API.
|
|
27
|
+
* The SDK's deserializer calls JSON.parse on any non-204 response body, and
|
|
28
|
+
* this endpoint sometimes returns 200 with a non-JSON body — the transfer
|
|
29
|
+
* still succeeds server-side, so the resulting SyntaxError is swallowed
|
|
30
|
+
* (same behavior as `playback.ts#ignoreSdkParseError`).
|
|
31
|
+
* @param client - Authenticated Spotify API client
|
|
32
|
+
* @param deviceId - Target device ID
|
|
33
|
+
* @param resume - When true, playback resumes on the new device; when false,
|
|
34
|
+
* the session is transferred but the playing state is preserved
|
|
35
|
+
*/
|
|
36
|
+
export declare function transferPlayback(client: SpotifyApi, deviceId: string, resume: boolean): Promise<void>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../src/spotify/devices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,YAAY,GACZ,SAAS,GACT,IAAI,GACJ,KAAK,GACL,KAAK,GACL,aAAa,GACb,aAAa,GACb,WAAW,GACX,WAAW,GACX,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAiBF;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,CAKhF;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAe/E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3G"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const KNOWN_DEVICE_TYPES = new Set([
|
|
2
|
+
'Computer',
|
|
3
|
+
'Smartphone',
|
|
4
|
+
'Speaker',
|
|
5
|
+
'TV',
|
|
6
|
+
'AVR',
|
|
7
|
+
'STB',
|
|
8
|
+
'AudioDongle',
|
|
9
|
+
'GameConsole',
|
|
10
|
+
'CastVideo',
|
|
11
|
+
'CastAudio',
|
|
12
|
+
'Automobile',
|
|
13
|
+
'Unknown',
|
|
14
|
+
]);
|
|
15
|
+
/**
|
|
16
|
+
* Narrows the SDK's `string` device type to the `DeviceType` union,
|
|
17
|
+
* falling back to `'Unknown'` for any value Spotify adds later that we do
|
|
18
|
+
* not recognise yet.
|
|
19
|
+
*/
|
|
20
|
+
export function normalizeDeviceType(value) {
|
|
21
|
+
if (value && KNOWN_DEVICE_TYPES.has(value)) {
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
return 'Unknown';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Lists every Spotify Connect device visible to the current user. Ghost
|
|
28
|
+
* entries with `id === null` (briefly returned during state transitions)
|
|
29
|
+
* are filtered out so callers never have to handle them.
|
|
30
|
+
* @param client - Authenticated Spotify API client
|
|
31
|
+
* @returns Array of devices ready to display and target
|
|
32
|
+
*/
|
|
33
|
+
export async function fetchDevices(client) {
|
|
34
|
+
const response = await client.player.getAvailableDevices();
|
|
35
|
+
const devices = [];
|
|
36
|
+
for (const raw of response.devices) {
|
|
37
|
+
if (!raw.id)
|
|
38
|
+
continue;
|
|
39
|
+
devices.push({
|
|
40
|
+
id: raw.id,
|
|
41
|
+
name: raw.name,
|
|
42
|
+
type: normalizeDeviceType(raw.type),
|
|
43
|
+
isActive: raw.is_active,
|
|
44
|
+
isRestricted: raw.is_restricted,
|
|
45
|
+
volumePercent: raw.volume_percent,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return devices;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Transfers playback to a target device via the Spotify Connect API.
|
|
52
|
+
* The SDK's deserializer calls JSON.parse on any non-204 response body, and
|
|
53
|
+
* this endpoint sometimes returns 200 with a non-JSON body — the transfer
|
|
54
|
+
* still succeeds server-side, so the resulting SyntaxError is swallowed
|
|
55
|
+
* (same behavior as `playback.ts#ignoreSdkParseError`).
|
|
56
|
+
* @param client - Authenticated Spotify API client
|
|
57
|
+
* @param deviceId - Target device ID
|
|
58
|
+
* @param resume - When true, playback resumes on the new device; when false,
|
|
59
|
+
* the session is transferred but the playing state is preserved
|
|
60
|
+
*/
|
|
61
|
+
export async function transferPlayback(client, deviceId, resume) {
|
|
62
|
+
try {
|
|
63
|
+
await client.player.transferPlayback([
|
|
64
|
+
deviceId,
|
|
65
|
+
], resume);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (err instanceof SyntaxError)
|
|
69
|
+
return;
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/spotify/devices.ts"],"names":[],"mappings":"AAyBA,MAAM,kBAAkB,GAA4B,IAAI,GAAG,CAAa;IACtE,UAAU;IACV,YAAY;IACZ,SAAS;IACT,IAAI;IACJ,KAAK;IACL,KAAK;IACL,aAAa;IACb,aAAa;IACb,WAAW;IACX,WAAW;IACX,YAAY;IACZ,SAAS;CACV,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAgC;IAClE,IAAI,KAAK,IAAK,kBAA0C,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpE,OAAO,KAAmB,CAAC;IAC7B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAkB;IACnD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,SAAS;QACtB,OAAO,CAAC,IAAI,CAAC;YACX,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,aAAa,EAAE,GAAG,CAAC,cAAc;SAClC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAkB,EAAE,QAAgB,EAAE,MAAe;IAC1F,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAClC;YACE,QAAQ;SACT,EACD,MAAM,CACP,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW;YAAE,OAAO;QACvC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-with-retry.d.ts","sourceRoot":"","sources":["../../src/spotify/fetch-with-retry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch-with-retry.d.ts","sourceRoot":"","sources":["../../src/spotify/fetch-with-retry.ts"],"names":[],"mappings":"AA8BA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwB9F"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { USER_AGENT } from '../config.js';
|
|
2
|
+
import { logger } from '../logger.js';
|
|
2
3
|
const MAX_RETRIES = 3;
|
|
3
4
|
const DEFAULT_RETRY_AFTER_S = 1;
|
|
4
5
|
const MAX_RETRY_AFTER_S = 5;
|
|
@@ -30,11 +31,11 @@ function withUserAgent(init) {
|
|
|
30
31
|
export function fetchWithRetry(input, init) {
|
|
31
32
|
const initWithUa = withUserAgent(init);
|
|
32
33
|
const key = getCacheKey(input, initWithUa);
|
|
33
|
-
|
|
34
|
+
logger.error(`fetchWithRetry: ${key}`);
|
|
34
35
|
// Only deduplicate GET requests - mutations must always go through
|
|
35
36
|
const method = initWithUa.method ?? 'GET';
|
|
36
37
|
if (method !== 'GET') {
|
|
37
|
-
|
|
38
|
+
logger.error(`fetchWithRetry: Body`, initWithUa.body);
|
|
38
39
|
return attempt(input, initWithUa, MAX_RETRIES);
|
|
39
40
|
}
|
|
40
41
|
const pending = inflight.get(key);
|
|
@@ -55,7 +56,7 @@ async function attempt(input, init, retryCount) {
|
|
|
55
56
|
// Calling `.text()` on the original response would leave the body unusable
|
|
56
57
|
// and trigger "Body is unusable: Body has already been read" downstream.
|
|
57
58
|
const bodyText = await response.clone().text();
|
|
58
|
-
|
|
59
|
+
logger.error(`Request failed with status ${response.status} for ${input.toString()}`, bodyText);
|
|
59
60
|
}
|
|
60
61
|
if (response.status !== 429 || retryCount >= MAX_RETRIES) {
|
|
61
62
|
return response;
|
|
@@ -64,7 +65,7 @@ async function attempt(input, init, retryCount) {
|
|
|
64
65
|
const retryAfterS = retryAfterHeader ? Number.parseInt(retryAfterHeader, 10) : Number.NaN;
|
|
65
66
|
const clampedS = Number.isNaN(retryAfterS) ? DEFAULT_RETRY_AFTER_S : Math.min(retryAfterS, MAX_RETRY_AFTER_S);
|
|
66
67
|
const delayMs = clampedS * 1000;
|
|
67
|
-
|
|
68
|
+
logger.error(`Received 429 for ${input.toString()}. Retrying after ${clampedS} seconds (retry ${retryCount + 1}/${MAX_RETRIES})`);
|
|
68
69
|
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
69
70
|
return attempt(input, init, retryCount + 1);
|
|
70
71
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-with-retry.js","sourceRoot":"","sources":["../../src/spotify/fetch-with-retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lyrics.d.ts","sourceRoot":"","sources":["../../src/spotify/lyrics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lyrics.d.ts","sourceRoot":"","sources":["../../src/spotify/lyrics.ts"],"names":[],"mappings":"AAgCA,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AA8CF;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAc7G;AAiCD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAUhG"}
|
package/dist/spotify/lyrics.js
CHANGED
|
@@ -2,6 +2,7 @@ import { createHash } from 'node:crypto';
|
|
|
2
2
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { CONFIG_DIR } from '../config.js';
|
|
5
|
+
import { logger } from '../logger.js';
|
|
5
6
|
import { fetchWithRetry } from './fetch-with-retry.js';
|
|
6
7
|
const LYRICS_CACHE_DIR = join(CONFIG_DIR, 'lyrics-cache');
|
|
7
8
|
function getCachePath(trackName, artistName) {
|
|
@@ -16,7 +17,7 @@ function readDiskCache(trackName, artistName) {
|
|
|
16
17
|
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
17
18
|
}
|
|
18
19
|
catch (err) {
|
|
19
|
-
|
|
20
|
+
logger.error(`Failed to read lyrics cache at ${path}:`, err);
|
|
20
21
|
return null;
|
|
21
22
|
}
|
|
22
23
|
}
|
|
@@ -108,7 +109,7 @@ async function doFetch(trackName, artistName, durationMs) {
|
|
|
108
109
|
return lyrics;
|
|
109
110
|
}
|
|
110
111
|
catch (err) {
|
|
111
|
-
|
|
112
|
+
logger.error(`Failed to fetch lyrics for "${trackName}" by "${artistName}":`, err);
|
|
112
113
|
return null;
|
|
113
114
|
}
|
|
114
115
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lyrics.js","sourceRoot":"","sources":["../../src/spotify/lyrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAE1D,SAAS,YAAY,CAAC,SAAiB,EAAE,UAAkB;IACzD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,KAAK,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnG,OAAO,IAAI,CAAC,gBAAgB,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,aAAa,CAAC,SAAiB,EAAE,UAAkB;IAC1D,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAW,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,
|
|
1
|
+
{"version":3,"file":"lyrics.js","sourceRoot":"","sources":["../../src/spotify/lyrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { PlaybackState, SpotifyApi } from '@spotify/web-api-ts-sdk';
|
|
2
|
+
import type { DeviceType } from './devices.js';
|
|
2
3
|
export type RepeatMode = 'off' | 'context' | 'track';
|
|
3
4
|
export type PlaybackContext = {
|
|
4
5
|
type: string;
|
|
@@ -12,6 +13,8 @@ export type TrackInfo = {
|
|
|
12
13
|
progressMs: number;
|
|
13
14
|
durationMs: number;
|
|
14
15
|
deviceId: string | null;
|
|
16
|
+
deviceName: string | null;
|
|
17
|
+
deviceType: DeviceType | null;
|
|
15
18
|
volume: number | null;
|
|
16
19
|
shuffle: boolean;
|
|
17
20
|
repeat: RepeatMode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playback.d.ts","sourceRoot":"","sources":["../../src/spotify/playback.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"playback.d.ts","sourceRoot":"","sources":["../../src/spotify/playback.ts"],"names":[],"mappings":"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"}
|
package/dist/spotify/playback.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { logger } from '../logger.js';
|
|
2
|
+
import { normalizeDeviceType } from './devices.js';
|
|
1
3
|
/**
|
|
2
4
|
* Fetches the current playback state from Spotify.
|
|
3
5
|
* @param client - Authenticated Spotify API client
|
|
@@ -135,10 +137,10 @@ async function ignoreSdkParseError(fn) {
|
|
|
135
137
|
}
|
|
136
138
|
// Translate the SDK's misleading 403 message for player restriction errors
|
|
137
139
|
if (err instanceof Error && err.message.includes('Restriction violated')) {
|
|
138
|
-
|
|
140
|
+
logger.error('Action failed due to Spotify playback restrictions:', err);
|
|
139
141
|
throw new Error('Action not available for the current playback context');
|
|
140
142
|
}
|
|
141
|
-
|
|
143
|
+
logger.error('Unexpected error during playback control:', err);
|
|
142
144
|
throw err;
|
|
143
145
|
}
|
|
144
146
|
}
|
|
@@ -164,17 +166,7 @@ export async function togglePlayback(client) {
|
|
|
164
166
|
await play(client, deviceId);
|
|
165
167
|
return true;
|
|
166
168
|
}
|
|
167
|
-
|
|
168
|
-
* Fetches simplified info about the currently playing track.
|
|
169
|
-
* @param client - Authenticated Spotify API client
|
|
170
|
-
* @returns Current track info, or `null` if nothing is playing
|
|
171
|
-
*/
|
|
172
|
-
export async function getCurrentTrackInfo(client) {
|
|
173
|
-
const state = await getPlaybackState(client);
|
|
174
|
-
if (!state?.item) {
|
|
175
|
-
return null;
|
|
176
|
-
}
|
|
177
|
-
const { item } = state;
|
|
169
|
+
function extractTrackMetadata(item) {
|
|
178
170
|
const artist = 'artists' in item ? item.artists.map((a) => a.name).join(', ') : 'Unknown';
|
|
179
171
|
const album = 'album' in item ? item.album.name : '';
|
|
180
172
|
const albumImageUrl = 'album' in item && item.album.images.length > 0 ? item.album.images[item.album.images.length - 1].url : null;
|
|
@@ -187,17 +179,43 @@ export async function getCurrentTrackInfo(client) {
|
|
|
187
179
|
const isrcRaw = 'external_ids' in item ? item.external_ids?.isrc : undefined;
|
|
188
180
|
const isrcCountry = isrcRaw && isrcRaw.length >= 2 ? isrcRaw.slice(0, 2).toUpperCase() : null;
|
|
189
181
|
return {
|
|
190
|
-
name: item.name,
|
|
191
182
|
artist,
|
|
192
183
|
album,
|
|
184
|
+
albumImageUrl,
|
|
185
|
+
releaseYear,
|
|
186
|
+
popularity,
|
|
187
|
+
explicit,
|
|
188
|
+
artistCount,
|
|
189
|
+
albumTotalTracks,
|
|
190
|
+
isrcCountry,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Fetches simplified info about the currently playing track.
|
|
195
|
+
* @param client - Authenticated Spotify API client
|
|
196
|
+
* @returns Current track info, or `null` if nothing is playing
|
|
197
|
+
*/
|
|
198
|
+
export async function getCurrentTrackInfo(client) {
|
|
199
|
+
const state = await getPlaybackState(client);
|
|
200
|
+
if (!state?.item) {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
const { item } = state;
|
|
204
|
+
const meta = extractTrackMetadata(item);
|
|
205
|
+
return {
|
|
206
|
+
name: item.name,
|
|
207
|
+
artist: meta.artist,
|
|
208
|
+
album: meta.album,
|
|
193
209
|
isPlaying: state.is_playing,
|
|
194
210
|
progressMs: state.progress_ms,
|
|
195
211
|
durationMs: item.duration_ms,
|
|
196
212
|
deviceId: state.device.id,
|
|
213
|
+
deviceName: state.device.name ?? null,
|
|
214
|
+
deviceType: state.device.type ? normalizeDeviceType(state.device.type) : null,
|
|
197
215
|
volume: state.device.volume_percent,
|
|
198
216
|
shuffle: state.shuffle_state,
|
|
199
217
|
repeat: state.repeat_state,
|
|
200
|
-
albumImageUrl,
|
|
218
|
+
albumImageUrl: meta.albumImageUrl,
|
|
201
219
|
context: state.context
|
|
202
220
|
? {
|
|
203
221
|
type: state.context.type,
|
|
@@ -205,11 +223,11 @@ export async function getCurrentTrackInfo(client) {
|
|
|
205
223
|
}
|
|
206
224
|
: null,
|
|
207
225
|
uri: item.uri,
|
|
208
|
-
releaseYear,
|
|
209
|
-
popularity,
|
|
210
|
-
explicit,
|
|
211
|
-
artistCount,
|
|
212
|
-
albumTotalTracks,
|
|
213
|
-
isrcCountry,
|
|
226
|
+
releaseYear: meta.releaseYear,
|
|
227
|
+
popularity: meta.popularity,
|
|
228
|
+
explicit: meta.explicit,
|
|
229
|
+
artistCount: meta.artistCount,
|
|
230
|
+
albumTotalTracks: meta.albumTotalTracks,
|
|
231
|
+
isrcCountry: meta.isrcCountry,
|
|
214
232
|
};
|
|
215
233
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playback.js","sourceRoot":"","sources":["../../src/spotify/playback.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"playback.js","sourceRoot":"","sources":["../../src/spotify/playback.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED