diff --git a/server/player/index.html b/server/player/index.html
index 64b00ee..4c3f50b 100644
--- a/server/player/index.html
+++ b/server/player/index.html
@@ -139,16 +139,24 @@
['click', 'touchstart', 'keydown'].forEach(evt => {
document.addEventListener(evt, () => {
userHasInteracted = true;
- // Try to unmute any playing HTML5 video
+ // HTML5 video: setting muted=false on a video that's been muted-autoplaying
+ // causes the browser to pause it as a side effect. We have a real user
+ // gesture here, so play() should succeed — but if it doesn't, fall back to
+ // muted playback rather than leaving a black/paused screen.
const video = document.querySelector('#playerContainer video');
if (video && video.muted) {
video.muted = false;
- video.play().catch(() => {});
- console.log('Unmuted video after user interaction');
+ video.play()
+ .then(() => console.log('Unmuted video after user interaction'))
+ .catch(err => {
+ console.warn('Unmuted play() rejected, falling back to muted:', err?.message || err);
+ video.muted = true;
+ video.play().catch(e => console.warn('Muted fallback play() failed:', e?.message || e));
+ });
}
// Unmute YouTube player if active
if (activeYtPlayer && typeof activeYtPlayer.unMute === 'function') {
- try { activeYtPlayer.unMute(); console.log('Unmuted YouTube player'); } catch {}
+ try { activeYtPlayer.unMute(); activeYtPlayer.setVolume(100); console.log('Unmuted YouTube player'); } catch {}
}
}, { once: false });
});
diff --git a/server/player/sw.js b/server/player/sw.js
index 8f841b7..f4899d6 100644
--- a/server/player/sw.js
+++ b/server/player/sw.js
@@ -1,4 +1,4 @@
-const CACHE_NAME = 'rd-player-v8';
+const CACHE_NAME = 'rd-player-v9';
// Install: skip waiting to activate immediately
self.addEventListener('install', (event) => {