mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-07 04:20:12 +02:00
82 lines
2.4 KiB
TypeScript
82 lines
2.4 KiB
TypeScript
import { useQuery } from '@tanstack/react-query';
|
|
import { useEffect, useRef } from 'react';
|
|
|
|
import { api } from '/@/renderer/api';
|
|
import { TranscodingConfig } from '/@/renderer/store';
|
|
import { QueueSong } from '/@/shared/types/domain-types';
|
|
|
|
export function useSongUrl(
|
|
song: QueueSong | undefined,
|
|
current: boolean,
|
|
transcode: TranscodingConfig,
|
|
): string | undefined {
|
|
const prior = useRef(['', '']);
|
|
const shouldReusePrior = Boolean(
|
|
song?._serverId && current && prior.current[0] === song._uniqueId && prior.current[1],
|
|
);
|
|
|
|
const { data: queryStreamUrl } = useQuery({
|
|
enabled: Boolean(song?._serverId) && !shouldReusePrior,
|
|
queryFn: () =>
|
|
api.controller.getStreamUrl({
|
|
apiClientProps: { serverId: song!._serverId },
|
|
query: {
|
|
bitrate: transcode.bitrate,
|
|
format: transcode.format,
|
|
id: song!.id,
|
|
transcode: transcode.enabled,
|
|
},
|
|
}),
|
|
queryKey: [
|
|
song?._serverId,
|
|
'stream-url',
|
|
song?.id,
|
|
shouldReusePrior ? 'reuse-prior' : transcode.bitrate,
|
|
shouldReusePrior ? 'reuse-prior' : transcode.format,
|
|
shouldReusePrior ? 'reuse-prior' : transcode.enabled,
|
|
] as const,
|
|
staleTime: 60 * 1000,
|
|
});
|
|
|
|
useEffect(() => {
|
|
if (!song?._serverId) {
|
|
prior.current = ['', ''];
|
|
return;
|
|
}
|
|
|
|
if (!queryStreamUrl) {
|
|
return;
|
|
}
|
|
|
|
// Save resolved URL to avoid restarting current track on transcode setting changes.
|
|
prior.current = [song._uniqueId, queryStreamUrl];
|
|
}, [song?._serverId, song?._uniqueId, queryStreamUrl]);
|
|
|
|
useEffect(() => {
|
|
if (!song?._serverId) {
|
|
prior.current = ['', ''];
|
|
}
|
|
}, [song?._serverId]);
|
|
|
|
return shouldReusePrior ? prior.current[1] : queryStreamUrl;
|
|
}
|
|
|
|
export const getSongUrl = async (
|
|
song: QueueSong,
|
|
transcode: TranscodingConfig,
|
|
skipAutoTranscode?: boolean,
|
|
) => {
|
|
const url = await api.controller.getStreamUrl({
|
|
apiClientProps: { serverId: song._serverId },
|
|
query: {
|
|
bitrate: transcode.bitrate,
|
|
format: transcode.format,
|
|
id: song.id,
|
|
skipAutoTranscode,
|
|
transcode: transcode.enabled,
|
|
},
|
|
});
|
|
|
|
return url;
|
|
};
|