fix: prevent notification close on skip and background audio stall

- playCurrent: set _trackChanging flag and update media session metadata
  before changing src, so the pause event fired by src-swap does not
  set playbackState='paused' and dismiss the Samsung cover screen notification
- Remove stalled->load() handler that silently paused audio with no recovery
- Error handler now retries regardless of paused state (load() causes paused)
- Add .catch() to audio.play() in playCurrent

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
HoneyandClaude Sonnet 4.6 committed 2026-05-03 20:23:51 +02:00
1 parent f2c77f975d
commit 89e169b70a
8 files changed
+632 -9

No files matched your search

+6 -5
View File
@@ -126,6 +126,7 @@ window.addEventListener('load', () => {
S.audio.addEventListener('timeupdate', updateProgress);
S.audio.addEventListener('ended', onEnded);
S.audio.addEventListener('play', () => {
S._trackChanging = false;
absInterrupt();
setPlayIcon(true);
document.getElementById('player-art').classList.add('spinning');
@@ -134,16 +135,16 @@ window.addEventListener('load', () => {
S.audio.addEventListener('pause', () => {
setPlayIcon(false);
document.getElementById('player-art').classList.remove('spinning');
if(navigator.mediaSession) navigator.mediaSession.playbackState = 'paused';
// Suppress during track change — src swap fires pause before the new track starts
if(!S._trackChanging && navigator.mediaSession) navigator.mediaSession.playbackState = 'paused';
});
S.previewAudio.addEventListener('timeupdate', updatePreviewProgress);
S.previewAudio.addEventListener('ended', stopPreview);
// Recovery: try to resume if audio stalls (network hiccup, background throttle)
S.audio.addEventListener('stalled', () => { if(!S.audio.paused) S.audio.load(); });
S.audio.addEventListener('waiting', () => { /* let browser handle buffering */ });
// stalled = browser buffer ran out briefly; let the browser retry naturally.
// The watchdog below catches genuine long freezes.
S.audio.addEventListener('error', () => {
if(!S.audio.paused && S.queue[S.qIdx]) {
if(S.queue[S.qIdx]) {
const t = setTimeout(() => { S.audio.load(); S.audio.play().catch(()=>{}); }, 2000);
S.audio.addEventListener('play', () => clearTimeout(t), { once: true });
}