From bafc14b55af286b46a2f243f14daa0a0a316d740 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Sat, 11 Jul 2026 18:18:06 -0700 Subject: [PATCH] fix mpv playback resume on queue end / stop --- .../player/audio-player/engine/mpv-player-engine.tsx | 4 +++- src/renderer/store/player.store.ts | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/renderer/features/player/audio-player/engine/mpv-player-engine.tsx b/src/renderer/features/player/audio-player/engine/mpv-player-engine.tsx index db7a33fa2..ad963156f 100644 --- a/src/renderer/features/player/audio-player/engine/mpv-player-engine.tsx +++ b/src/renderer/features/player/audio-player/engine/mpv-player-engine.tsx @@ -278,7 +278,9 @@ export const MpvPlayerEngine = (props: MpvPlayerEngineProps) => { const handleTrackEnded = () => { const { player } = usePlayerStore.getState(); - if (player.status !== PlayerStatus.PLAYING) { + // mpv often emits `stopped` before this event, which already set STOPPED + // via mediaStop. Still run mediaAutoNext so end-of-queue seek/reset runs. + if (player.status !== PlayerStatus.PLAYING && player.status !== PlayerStatus.STOPPED) { return; } diff --git a/src/renderer/store/player.store.ts b/src/renderer/store/player.store.ts index 110bc7849..6444a2a2e 100644 --- a/src/renderer/store/player.store.ts +++ b/src/renderer/store/player.store.ts @@ -1299,6 +1299,11 @@ export const usePlayerStoreBase = createWithEqualityFn()( }); }, mediaTogglePlayPause: () => { + // Restarting from STOPPED (e.g. end of queue) needs a full play + // event so engines like mpv can reload the current track — play() + // alone is a no-op when mpv's playlist-pos is -1. + const wasStopped = get().player.status === PlayerStatus.STOPPED; + set((state) => { if (state.player.status === PlayerStatus.PLAYING) { state.player.status = PlayerStatus.PAUSED; @@ -1306,6 +1311,10 @@ export const usePlayerStoreBase = createWithEqualityFn()( state.player.status = PlayerStatus.PLAYING; } }); + + if (wasStopped) { + emitPlayerPlayEvent(undefined, set, get); + } }, moveSelectedTo: (items: QueueSong[], uniqueId: string, edge: 'bottom' | 'top') => { const itemUniqueIds = items.map((item) => item._uniqueId);