fix mpv seek error on queue end

This commit is contained in:
jeffvli
2026-04-03 19:05:34 -07:00
parent f3a6027e6d
commit 1494c8e044
3 changed files with 22 additions and 11 deletions
@@ -80,7 +80,7 @@ export const useMainPlayerListener = () => {
mpvPlayerListener.rendererStop(() => { mpvPlayerListener.rendererStop(() => {
if (!isRadioActive) { if (!isRadioActive) {
mediaStop(); mediaStop({ reset: false });
} }
}); });
@@ -64,7 +64,7 @@ export interface PlayerContext {
mediaSeekToTimestamp: (timestamp: number) => void; mediaSeekToTimestamp: (timestamp: number) => void;
mediaSkipBackward: () => void; mediaSkipBackward: () => void;
mediaSkipForward: () => void; mediaSkipForward: () => void;
mediaStop: () => void; mediaStop: (options?: { reset?: boolean }) => void;
mediaToggleMute: () => void; mediaToggleMute: () => void;
mediaTogglePlayPause: () => void; mediaTogglePlayPause: () => void;
moveSelectedTo: (items: QueueSong[], edge: 'bottom' | 'top', uniqueId: string) => void; moveSelectedTo: (items: QueueSong[], edge: 'bottom' | 'top', uniqueId: string) => void;
@@ -596,13 +596,17 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => {
storeActions.mediaPrevious(); storeActions.mediaPrevious();
}, [storeActions]); }, [storeActions]);
const mediaStop = useCallback(() => { const mediaStop = useCallback(
logFn.debug(logMsg[LogCategory.PLAYER].mediaStop, { (options?: { reset?: boolean }) => {
category: LogCategory.PLAYER, logFn.debug(logMsg[LogCategory.PLAYER].mediaStop, {
}); category: LogCategory.PLAYER,
meta: { reset: options?.reset },
});
storeActions.mediaStop(); storeActions.mediaStop(options);
}, [storeActions]); },
[storeActions],
);
const mediaSeekToTimestamp = useCallback( const mediaSeekToTimestamp = useCallback(
(timestamp: number) => { (timestamp: number) => {
+10 -3
View File
@@ -59,7 +59,11 @@ interface Actions {
mediaSeekToTimestamp: (timestamp: number) => void; mediaSeekToTimestamp: (timestamp: number) => void;
mediaSkipBackward: (offset?: number) => void; mediaSkipBackward: (offset?: number) => void;
mediaSkipForward: (offset?: number) => void; mediaSkipForward: (offset?: number) => void;
mediaStop: () => void; /**
* @param options.reset - When true (default), sets seekToTimestamp(0) so the engine seeks to start.
* Timestamp display is always cleared to 0. Use false when the engine is already idle (e.g. mpv `stopped`) to skip that seek.
*/
mediaStop: (options?: { reset?: boolean }) => void;
mediaToggleMute: () => void; mediaToggleMute: () => void;
mediaTogglePlayPause: () => void; mediaTogglePlayPause: () => void;
moveSelectedTo: (items: QueueSong[], uniqueId: string, edge: 'bottom' | 'top') => void; moveSelectedTo: (items: QueueSong[], uniqueId: string, edge: 'bottom' | 'top') => void;
@@ -1164,11 +1168,14 @@ export const usePlayerStoreBase = createWithEqualityFn<PlayerState>()(
state.player.seekToTimestamp = uniqueSeekToTimestamp(newTimestamp); state.player.seekToTimestamp = uniqueSeekToTimestamp(newTimestamp);
}); });
}, },
mediaStop: () => { mediaStop: (options?: { reset?: boolean }) => {
const reset = options?.reset !== false;
set((state) => { set((state) => {
state.player.status = PlayerStatus.PAUSED; state.player.status = PlayerStatus.PAUSED;
state.player.seekToTimestamp = uniqueSeekToTimestamp(0);
setTimestampStore(0); setTimestampStore(0);
if (reset) {
state.player.seekToTimestamp = uniqueSeekToTimestamp(0);
}
}); });
}, },
mediaToggleMute: () => { mediaToggleMute: () => {