diff --git a/server/player/index.html b/server/player/index.html
index b142510..d11f640 100644
--- a/server/player/index.html
+++ b/server/player/index.html
@@ -539,7 +539,8 @@
video.playsInline = true;
video.crossOrigin = 'anonymous';
video.style.cssText = 'width:100%;height:100%;object-fit:contain;background:#000';
- video.onended = () => nextItem();
+ video.loop = (playlist.length === 1);
+ video.onended = () => { if (!video.loop) nextItem(); };
video.onerror = (e) => { console.error('Video error:', src, e); setTimeout(nextItem, 3000); };
video.onloadeddata = () => {
console.log('Video loaded:', item.filename, 'muted:', video.muted);
diff --git a/server/player/sw.js b/server/player/sw.js
index 4460dbd..7e4f70a 100644
--- a/server/player/sw.js
+++ b/server/player/sw.js
@@ -1,4 +1,4 @@
-const CACHE_NAME = 'rd-player-v1';
+const CACHE_NAME = 'rd-player-v2';
const STATIC_ASSETS = ['/player/', '/player/index.html', '/socket.io/socket.io.js'];
// Install: cache static assets
@@ -29,7 +29,7 @@ self.addEventListener('fetch', (event) => {
caches.match(event.request).then(cached => {
if (cached) return cached;
return fetch(event.request).then(response => {
- if (response.ok) {
+ if (response.ok && response.status === 200) {
const clone = response.clone();
caches.open(CACHE_NAME).then(cache => cache.put(event.request, clone));
}