diff --git a/src/renderer/features/player/audio-player/hooks/use-main-player-listener.tsx b/src/renderer/features/player/audio-player/hooks/use-main-player-listener.tsx index c51a64204..01d005c08 100644 --- a/src/renderer/features/player/audio-player/hooks/use-main-player-listener.tsx +++ b/src/renderer/features/player/audio-player/hooks/use-main-player-listener.tsx @@ -80,7 +80,7 @@ export const useMainPlayerListener = () => { mpvPlayerListener.rendererStop(() => { if (!isRadioActive) { - mediaStop(); + mediaStop({ reset: false }); } }); diff --git a/src/renderer/features/player/context/player-context.tsx b/src/renderer/features/player/context/player-context.tsx index e96da23b2..e0915afa1 100644 --- a/src/renderer/features/player/context/player-context.tsx +++ b/src/renderer/features/player/context/player-context.tsx @@ -64,7 +64,7 @@ export interface PlayerContext { mediaSeekToTimestamp: (timestamp: number) => void; mediaSkipBackward: () => void; mediaSkipForward: () => void; - mediaStop: () => void; + mediaStop: (options?: { reset?: boolean }) => void; mediaToggleMute: () => void; mediaTogglePlayPause: () => void; moveSelectedTo: (items: QueueSong[], edge: 'bottom' | 'top', uniqueId: string) => void; @@ -596,13 +596,17 @@ export const PlayerProvider = ({ children }: { children: React.ReactNode }) => { storeActions.mediaPrevious(); }, [storeActions]); - const mediaStop = useCallback(() => { - logFn.debug(logMsg[LogCategory.PLAYER].mediaStop, { - category: LogCategory.PLAYER, - }); + const mediaStop = useCallback( + (options?: { reset?: boolean }) => { + logFn.debug(logMsg[LogCategory.PLAYER].mediaStop, { + category: LogCategory.PLAYER, + meta: { reset: options?.reset }, + }); - storeActions.mediaStop(); - }, [storeActions]); + storeActions.mediaStop(options); + }, + [storeActions], + ); const mediaSeekToTimestamp = useCallback( (timestamp: number) => { diff --git a/src/renderer/store/player.store.ts b/src/renderer/store/player.store.ts index e34debccb..6b73530a4 100644 --- a/src/renderer/store/player.store.ts +++ b/src/renderer/store/player.store.ts @@ -59,7 +59,11 @@ interface Actions { mediaSeekToTimestamp: (timestamp: number) => void; mediaSkipBackward: (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; mediaTogglePlayPause: () => void; moveSelectedTo: (items: QueueSong[], uniqueId: string, edge: 'bottom' | 'top') => void; @@ -1164,11 +1168,14 @@ export const usePlayerStoreBase = createWithEqualityFn()( state.player.seekToTimestamp = uniqueSeekToTimestamp(newTimestamp); }); }, - mediaStop: () => { + mediaStop: (options?: { reset?: boolean }) => { + const reset = options?.reset !== false; set((state) => { state.player.status = PlayerStatus.PAUSED; - state.player.seekToTimestamp = uniqueSeekToTimestamp(0); setTimestampStore(0); + if (reset) { + state.player.seekToTimestamp = uniqueSeekToTimestamp(0); + } }); }, mediaToggleMute: () => {