mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 07:15:47 +00:00
a66d932afe
* fix(preview): Symphonia format sniff and cluster member stream URLs Resolve preview container hints from HTTP headers, Subsonic suffix, and magic-byte sniff after Symphonia 0.6. Route preview streams through clusterBrowseServerId like main playback; guard CoverArtImage when the preview cover ref is still loading. * fix(preview): adapt Symphonia sniff branch for main without cluster routing Keep formatSuffix and cover-ref guards from the cluster work; use buildStreamUrl on the active server instead of clusterBrowseServerId. * fix(preview): use ranged HTTP so preview starts without full-file download Open preview via RangedHttpSource when the server supports byte ranges; fall back to buffered download otherwise. Gate in-memory probe with ProbeSeekGate so Symphonia 0.6 does not scan the entire file before audio. * docs: CHANGELOG and credits for preview fix PR #1006 * chore: drop PR #1006 from settings credits (minor fix) * fix(preview): allow clippy too_many_arguments on audio_preview_play formatSuffix pushed the Tauri command to 8 args; matches other IPC commands.
24 lines
969 B
TypeScript
24 lines
969 B
TypeScript
import { useCallback, useEffect } from 'react';
|
|
import { previewInputFromSong, usePreviewStore } from '../store/previewStore';
|
|
import type { SubsonicSong } from '../api/subsonicTypes';
|
|
|
|
export function usePlaylistPreview(): {
|
|
startPreview: (song: SubsonicSong) => void;
|
|
} {
|
|
// Pause/resume of the main player + timer + cancel-on-supersede are all
|
|
// handled in `audio_preview_play` / `audio_preview_stop`. The store mirrors
|
|
// engine events so we just dispatch here and read `previewingId` for UI.
|
|
const startPreview = useCallback((song: SubsonicSong) => {
|
|
usePreviewStore.getState().startPreview(previewInputFromSong(song), 'suggestions').catch(() => { /* engine errored — store already rolled back */ });
|
|
}, []);
|
|
|
|
// Cancel any in-flight preview when the user navigates away.
|
|
useEffect(() => () => {
|
|
if (usePreviewStore.getState().previewingId) {
|
|
usePreviewStore.getState().stopPreview();
|
|
}
|
|
}, []);
|
|
|
|
return { startPreview };
|
|
}
|