From 8de374cd3582e9e454ced661aaecb5f5a54a27b7 Mon Sep 17 00:00:00 2001 From: Admin Date: Wed, 4 Mar 2026 16:27:38 +0500 Subject: [PATCH] fix(audio): fix auto-next reliability issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Clear autoStartPending if goto() fails to avoid spurious auto-starts on future navigations - Clear audioStore.nextChapter on AudioPlayer unmount so a stale chapter can't trigger navigation after leaving a chapter page - Remove redundant nextChapter write in startPlayback() — the already keeps it in sync --- ui/src/lib/components/AudioPlayer.svelte | 7 ++++++- ui/src/routes/+layout.svelte | 8 +++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/ui/src/lib/components/AudioPlayer.svelte b/ui/src/lib/components/AudioPlayer.svelte index e6ad0be..ac1a244 100644 --- a/ui/src/lib/components/AudioPlayer.svelte +++ b/ui/src/lib/components/AudioPlayer.svelte @@ -46,8 +46,13 @@ // Keep nextChapter in the store so the layout's onended can navigate. // Run as an effect so it stays in sync if the prop ever changes. + // On unmount, clear it so a stale value can't trigger navigation after + // the user leaves the chapter page. $effect(() => { audioStore.nextChapter = nextChapter ?? null; + return () => { + audioStore.nextChapter = null; + }; }); // Auto-start: if the layout navigated here via auto-next, kick off playback. @@ -128,7 +133,7 @@ audioStore.bookTitle = bookTitle; audioStore.voice = voice; audioStore.speed = speed; - audioStore.nextChapter = nextChapter ?? null; + // nextChapter is kept in sync by the $effect above — no need to write it here audioStore.status = 'loading'; audioStore.errorMsg = ''; diff --git a/ui/src/routes/+layout.svelte b/ui/src/routes/+layout.svelte index 20ca88f..db8360c 100644 --- a/ui/src/routes/+layout.svelte +++ b/ui/src/routes/+layout.svelte @@ -179,9 +179,11 @@ audioStore.isPlaying = false; saveAudioTime(); if (audioStore.autoNext && audioStore.nextChapter !== null && audioStore.slug) { - audioStore.autoStartPending = true; - goto(`/books/${audioStore.slug}/chapters/${audioStore.nextChapter}`); - } + audioStore.autoStartPending = true; + goto(`/books/${audioStore.slug}/chapters/${audioStore.nextChapter}`).catch(() => { + audioStore.autoStartPending = false; + }); + } }} preload="metadata" style="display:none"