mirror of
https://github.com/screentinker/screentinker.git
synced 2026-05-15 07:32:23 -06:00
- Replace raw iframe YouTube embeds with official YT IFrame Player API for proper error handling (150/153/100/101) and unmute support - Fix playlist not updating when single item changes by comparing full content fingerprint (id + url + filepath + filename) instead of just content_id - Add click-to-unmute overlay for YouTube since iframe swallows click events - Remove hardcoded origin param from server-side YouTube URLs (caused Error 153 when player domain differs from server) - Switch service worker to network-first for player assets so deploys take effect without hard refresh; keep cache-first for uploaded content Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
56 lines
1.8 KiB
JavaScript
56 lines
1.8 KiB
JavaScript
const CACHE_NAME = 'rd-player-v3';
|
|
const CONTENT_CACHE = 'rd-content-v1';
|
|
|
|
// Install: skip waiting to activate immediately
|
|
self.addEventListener('install', (event) => {
|
|
self.skipWaiting();
|
|
});
|
|
|
|
// Activate: clean old caches, claim clients
|
|
self.addEventListener('activate', (event) => {
|
|
event.waitUntil(
|
|
caches.keys().then(keys => Promise.all(
|
|
keys.filter(k => k !== CACHE_NAME && k !== CONTENT_CACHE).map(k => caches.delete(k))
|
|
)).then(() => self.clients.claim())
|
|
);
|
|
});
|
|
|
|
// Fetch handler
|
|
self.addEventListener('fetch', (event) => {
|
|
const url = new URL(event.request.url);
|
|
|
|
// Content files (videos, images): cache on first fetch for offline playback
|
|
if (url.pathname.startsWith('/uploads/content/')) {
|
|
event.respondWith(
|
|
caches.match(event.request).then(cached => {
|
|
if (cached) return cached;
|
|
return fetch(event.request).then(response => {
|
|
if (response.ok) {
|
|
const clone = response.clone();
|
|
caches.open(CONTENT_CACHE).then(cache => cache.put(event.request, clone));
|
|
}
|
|
return response;
|
|
}).catch(() => new Response('Offline', { status: 503 }));
|
|
})
|
|
);
|
|
return;
|
|
}
|
|
|
|
// Player page and static assets: network-first, fall back to cache
|
|
if (url.pathname.startsWith('/player') || url.pathname === '/socket.io/socket.io.js') {
|
|
event.respondWith(
|
|
fetch(event.request).then(response => {
|
|
if (response.ok) {
|
|
const clone = response.clone();
|
|
caches.open(CACHE_NAME).then(cache => cache.put(event.request, clone));
|
|
}
|
|
return response;
|
|
}).catch(() => caches.match(event.request).then(cached => cached || new Response('Offline', { status: 503 })))
|
|
);
|
|
return;
|
|
}
|
|
|
|
// Everything else: network only
|
|
event.respondWith(fetch(event.request));
|
|
});
|