mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 23:35:44 +00:00
67 lines
2.1 KiB
TypeScript
67 lines
2.1 KiB
TypeScript
import { api, apiForServer, apiPostFormForServer, isHttp414, serverSupportsFormPost } from '@/lib/api/subsonicClient';
|
|
import type { SubsonicSong } from '@/lib/api/subsonicTypes';
|
|
|
|
export type PlayQueueResult = { current?: string; position?: number; songs: SubsonicSong[] };
|
|
|
|
function parsePlayQueueResponse(
|
|
data: { playQueue?: { current?: string; position?: number; entry?: SubsonicSong[] } },
|
|
): PlayQueueResult {
|
|
const pq = data.playQueue;
|
|
return { current: pq?.current, position: pq?.position, songs: pq?.entry ?? [] };
|
|
}
|
|
|
|
export async function getPlayQueue(): Promise<PlayQueueResult> {
|
|
try {
|
|
const data = await api<{ playQueue: { current?: string; position?: number; entry?: SubsonicSong[] } }>('getPlayQueue.view');
|
|
return parsePlayQueueResponse(data);
|
|
} catch {
|
|
return { songs: [] };
|
|
}
|
|
}
|
|
|
|
export async function getPlayQueueForServer(serverId: string): Promise<PlayQueueResult> {
|
|
if (!serverId) return { songs: [] };
|
|
try {
|
|
const data = await apiForServer<{ playQueue: { current?: string; position?: number; entry?: SubsonicSong[] } }>(
|
|
serverId,
|
|
'getPlayQueue.view',
|
|
);
|
|
return parsePlayQueueResponse(data);
|
|
} catch {
|
|
return { songs: [] };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Persist the play queue. Uses OpenSubsonic form POST when the server advertises
|
|
* `formPost` (avoids HTTP 414 on large queues behind reverse proxies). Otherwise
|
|
* GET, with a one-shot POST retry if the proxy returns 414.
|
|
*/
|
|
export async function savePlayQueue(
|
|
songIds: string[],
|
|
current: string | undefined,
|
|
position: number | undefined,
|
|
serverId: string,
|
|
): Promise<void> {
|
|
if (!serverId) return;
|
|
const params: Record<string, unknown> = {};
|
|
if (songIds.length > 0) params.id = songIds;
|
|
if (current !== undefined) params.current = current;
|
|
if (position !== undefined) params.position = position;
|
|
|
|
if (serverSupportsFormPost(serverId)) {
|
|
await apiPostFormForServer(serverId, 'savePlayQueue.view', params);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await apiForServer(serverId, 'savePlayQueue.view', params);
|
|
} catch (err) {
|
|
if (isHttp414(err)) {
|
|
await apiPostFormForServer(serverId, 'savePlayQueue.view', params);
|
|
return;
|
|
}
|
|
throw err;
|
|
}
|
|
}
|