fix: use audio.autoplay flag to unblock autoplay policy on chapter auto-advance
When the auto-next feature navigated to a new chapter and startAudio was called on page load (outside a user gesture), the browser's autoplay policy blocked the audio.play() call inside onCanPlay. Fix by setting audio.autoplay = true before audio.load() when started automatically, then resetting it in onCanPlay so manual pause/play is unaffected.
This commit is contained in:
@@ -2871,7 +2871,7 @@ const chapterTmpl = `
|
||||
if (!activePara || activePara !== paras[idx]) highlightPara(idx);
|
||||
}
|
||||
|
||||
function onCanPlay() { if (stale()) { audio.removeEventListener('canplay', onCanPlay); return; } if (audio.paused) audio.play().then(setPlaying).catch(function(e){ setError(e.message); }); }
|
||||
function onCanPlay() { if (stale()) { audio.removeEventListener('canplay', onCanPlay); return; } audio.autoplay = false; if (audio.paused) audio.play().then(setPlaying).catch(function(e){ setError(e.message); }); }
|
||||
function onWaiting() { if (!stale()) setStatus('Buffering\u2026'); }
|
||||
function onPlaying() { if (!stale()) setPlaying(); }
|
||||
function onPause() { if (!stale() && !audio.ended) setPaused(); }
|
||||
@@ -2921,11 +2921,12 @@ const chapterTmpl = `
|
||||
navigator.mediaSession.setActionHandler('seekto', function(d) { if (isFinite(d.seekTime)) { audio.currentTime = d.seekTime; updateSeek(); } });
|
||||
}
|
||||
|
||||
function startAudio() {
|
||||
function startAudio(autoplay) {
|
||||
setGenerating();
|
||||
highlightPara(0);
|
||||
generateAudio(CHAPTER_N, function (url) {
|
||||
if (stale()) return;
|
||||
if (autoplay) audio.autoplay = true;
|
||||
audio.src = url; audio.load();
|
||||
registerMediaSession();
|
||||
});
|
||||
@@ -2948,10 +2949,10 @@ const chapterTmpl = `
|
||||
if (_autostart) {
|
||||
try { localStorage.removeItem('tts_autostart'); } catch(_) {}
|
||||
autoplayChk.checked = true;
|
||||
setTimeout(startAudio, 100);
|
||||
setTimeout(function() { startAudio(true); }, 100);
|
||||
} else if (new URLSearchParams(window.location.search).get('autoplay') === '1') {
|
||||
autoplayChk.checked = true;
|
||||
setTimeout(startAudio, 100);
|
||||
setTimeout(function() { startAudio(true); }, 100);
|
||||
}
|
||||
|
||||
// ── double-tap left/right to navigate ────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user