From 7243ed7f154fb3684ef2304a0295695824d2ac16 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Sun, 31 May 2026 23:09:33 -0700 Subject: [PATCH] fix timestamp restore when song switched before playback start (#2094) --- .../player/hooks/use-queue-restore.ts | 57 ++++++++++++++++--- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/src/renderer/features/player/hooks/use-queue-restore.ts b/src/renderer/features/player/hooks/use-queue-restore.ts index 9b06feebf..b836927f8 100644 --- a/src/renderer/features/player/hooks/use-queue-restore.ts +++ b/src/renderer/features/player/hooks/use-queue-restore.ts @@ -19,6 +19,8 @@ import { import { toast } from '/@/shared/components/toast/toast'; import { PlayerStatus } from '/@/shared/types/types'; +let startupRestoreSessionHandled = false; + export const useQueueRestoreTimestamp = () => { const { mediaSeekToTimestamp } = usePlayerActions(); @@ -51,28 +53,65 @@ export const useInitialTimestampRestore = () => { const startupRestoreInitializedRef = useRef(false); const startupSeekArmedRef = useRef(null); + const startupSeekTargetUniqueIdRef = useRef(null); const startupSeekAppliedRef = useRef(false); - const applyStartupSeek = useCallback(() => { + const cancelStartupSeek = useCallback(() => { if (startupSeekAppliedRef.current) { return; } - const seekTimestamp = startupSeekArmedRef.current; - if (!seekTimestamp || seekTimestamp <= 0) { - return; - } - startupSeekAppliedRef.current = true; startupSeekArmedRef.current = null; + startupSeekTargetUniqueIdRef.current = null; + }, []); + + const applyStartupSeek = useCallback(() => { + const seekTimestamp = startupSeekArmedRef.current; + + if (startupSeekAppliedRef.current) { + return; + } + + if (!seekTimestamp || seekTimestamp <= 0) { + return; + } + + const targetUniqueId = startupSeekTargetUniqueIdRef.current; + const currentUniqueId = usePlayerStore.getState().getQueue().items[ + usePlayerStore.getState().player.index + ]?._uniqueId; + + if (targetUniqueId && currentUniqueId !== targetUniqueId) { + cancelStartupSeek(); + return; + } + + startupSeekAppliedRef.current = true; + startupSeekArmedRef.current = null; + startupSeekTargetUniqueIdRef.current = null; setTimeout(() => { mediaSeekToTimestamp(seekTimestamp); }, 100); - }, [mediaSeekToTimestamp]); + }, [cancelStartupSeek, mediaSeekToTimestamp]); useEffect(() => { - if (startupRestoreInitializedRef.current) { + const targetUniqueId = startupSeekTargetUniqueIdRef.current; + if ( + !targetUniqueId || + startupSeekAppliedRef.current || + !currentSong || + currentSong._uniqueId === targetUniqueId + ) { + return; + } + + cancelStartupSeek(); + }, [cancelStartupSeek, currentSong]); + + useEffect(() => { + if (startupRestoreInitializedRef.current || startupRestoreSessionHandled) { return; } @@ -81,9 +120,11 @@ export const useInitialTimestampRestore = () => { } startupRestoreInitializedRef.current = true; + startupRestoreSessionHandled = true; if (timestamp > 0) { startupSeekArmedRef.current = timestamp; + startupSeekTargetUniqueIdRef.current = currentSong._uniqueId; } if (playerStatus === PlayerStatus.PLAYING) {