From a4def535d87c683b5c806874a70736fe81476f2b Mon Sep 17 00:00:00 2001 From: Admin Date: Sun, 1 Mar 2026 15:39:18 +0500 Subject: [PATCH] feat: persist TTS speed, voice, and auto-next in localStorage Settings are loaded on page init and saved on every change so they carry over across chapter navigation and page reloads. --- scraper/internal/server/ui.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/scraper/internal/server/ui.go b/scraper/internal/server/ui.go index b9565b0..e894037 100644 --- a/scraper/internal/server/ui.go +++ b/scraper/internal/server/ui.go @@ -718,10 +718,44 @@ const chapterTmpl = ` var prefetchAbort = null; var prefetchReady = false; // true once canplay fired on prefetchAudio + // ── localStorage persistence ───────────────────────────────────────────────── + // Settings saved: tts_speed, tts_voice, tts_autonext + // Loaded once on page init; written on every change. + + var LS_SPEED = 'tts_speed'; + var LS_VOICE = 'tts_voice'; + var LS_AUTONEXT = 'tts_autonext'; + + (function loadSettings() { + var savedSpeed = localStorage.getItem(LS_SPEED); + if (savedSpeed !== null) { + speedSlider.value = savedSpeed; + speedLabel.textContent = parseFloat(savedSpeed).toFixed(1) + '\u00D7'; + } + var savedVoice = localStorage.getItem(LS_VOICE); + if (savedVoice !== null) { + var opt = voiceSel.querySelector('option[value="' + savedVoice + '"]'); + if (opt) voiceSel.value = savedVoice; + } + var savedAutoNext = localStorage.getItem(LS_AUTONEXT); + if (savedAutoNext !== null) { + autoplayChk.checked = savedAutoNext === 'true'; + } + })(); + // ── speed slider ───────────────────────────────────────────────────────────── speedSlider.addEventListener('input', function () { speedLabel.textContent = parseFloat(speedSlider.value).toFixed(1) + '\u00D7'; + localStorage.setItem(LS_SPEED, speedSlider.value); + }); + + voiceSel.addEventListener('change', function () { + localStorage.setItem(LS_VOICE, voiceSel.value); + }); + + autoplayChk.addEventListener('change', function () { + localStorage.setItem(LS_AUTONEXT, autoplayChk.checked ? 'true' : 'false'); }); // ── paragraph indexing ───────────────────────────────────────────────────────