From ffe7f12fb93ab6eae0b03a1b8aa3faaacbbd64da Mon Sep 17 00:00:00 2001 From: sucupira Date: Thu, 23 Jul 2026 01:19:22 -0400 Subject: [PATCH] Porte la section Funkwhale (MIZIK) et corrige la CSP par page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/lib/server/funkwhale.ts : 50 morceaux aléatoires de mizik.o-k-i.net, filtre local, mapping vers le lecteur audio intégré (10 affichés) - Section « Morceaux » sur l'accueil entre podcast et timeline, FR/EN - Bus audio partagé (audio-bus.svelte.ts) : un seul flux à la fois entre le lecteur podcast et le lecteur musique - Lecteur audio : méta générique (artiste — album) pour les morceaux - CSP : mizik.o-k-i.net ajouté à img-src/media-src - Fix critique : la balise meta CSP embarque désormais la politique complète (lue depuis _headers) — default-src 'self' seul bloquait par intersection les images et médias des instances ; frame-ancestors retiré de la meta (ignoré hors en-tête) --- scripts/postbuild-csp.mjs | 18 +++++- src/lib/audio-bus.svelte.ts | 14 +++++ src/lib/components/AudioPlayer.svelte | 20 ++++-- src/lib/config.ts | 8 +++ src/lib/i18n/en.json | 6 ++ src/lib/i18n/fr.json | 6 ++ src/lib/server/funkwhale.ts | 66 ++++++++++++++++++++ src/routes/[[locale=locale]]/+page.server.ts | 7 ++- src/routes/[[locale=locale]]/+page.svelte | 18 +++++- static/.htaccess | 2 +- static/_headers | 2 +- 11 files changed, 156 insertions(+), 11 deletions(-) create mode 100644 src/lib/audio-bus.svelte.ts create mode 100644 src/lib/server/funkwhale.ts diff --git a/scripts/postbuild-csp.mjs b/scripts/postbuild-csp.mjs index da48462..24a25bf 100644 --- a/scripts/postbuild-csp.mjs +++ b/scripts/postbuild-csp.mjs @@ -14,6 +14,20 @@ function* walk(dir) { } } +// La politique complète (hors script-src) est lue depuis build/_headers, +// unique source de vérité partagée avec .htaccess +const headers = readFileSync(join(BUILD_DIR, '_headers'), 'utf8'); +const cspLine = headers + .split('\n') + .map((line) => line.trim()) + .find((line) => line.startsWith('Content-Security-Policy:')); +if (!cspLine) throw new Error('[csp] Content-Security-Policy introuvable dans build/_headers'); +const sharedPolicy = cspLine + .slice('Content-Security-Policy:'.length) + .trim() + // frame-ancestors est ignoré (et logué) dans une balise meta : il reste porté par l'en-tête HTTP + .replace(/frame-ancestors 'none';\s*/, ''); + let pages = 0; for (const file of walk(BUILD_DIR)) { @@ -28,7 +42,7 @@ for (const file of walk(BUILD_DIR)) { if (hashes.size === 0) continue; - const csp = `default-src 'self'; script-src 'self' ${[...hashes].join(' ')}`; + const csp = `default-src 'self'; script-src 'self' ${[...hashes].join(' ')}; ${sharedPolicy}`; const meta = ``; const anchor = html.match(//); @@ -41,4 +55,4 @@ for (const file of walk(BUILD_DIR)) { pages++; } -console.log(`[csp] meta CSP injectée dans ${pages} page(s)`); +console.log(`[csp] meta CSP complète injectée dans ${pages} page(s)`); diff --git a/src/lib/audio-bus.svelte.ts b/src/lib/audio-bus.svelte.ts new file mode 100644 index 0000000..0381c45 --- /dev/null +++ b/src/lib/audio-bus.svelte.ts @@ -0,0 +1,14 @@ +let current: HTMLAudioElement | null = $state(null); + +export function claimAudio(element: HTMLAudioElement) { + if (current && current !== element) { + current.pause(); + } + current = element; +} + +export function releaseAudio(element: HTMLAudioElement) { + if (current === element) { + current = null; + } +} diff --git a/src/lib/components/AudioPlayer.svelte b/src/lib/components/AudioPlayer.svelte index 39d9eed..c015508 100644 --- a/src/lib/components/AudioPlayer.svelte +++ b/src/lib/components/AudioPlayer.svelte @@ -1,5 +1,6 @@