diff --git a/stream/index.html b/stream/index.html index 6925240..47b515f 100644 --- a/stream/index.html +++ b/stream/index.html @@ -14,6 +14,19 @@ background: radial-gradient(circle at 30% 20%, #2a2140, #0d0b14 70%); color: #f2f0f7; } + /* Fond façon écran de connexion Navidrome : une image aléatoire tirée de + leur galerie, posée derrière la carte avec un voile sombre pour garder + le texte lisible. Le dégradé du body reste visible tant que l'image + n'est pas chargée (ou en cas d'échec réseau). */ + .bg { + position: fixed; inset: 0; z-index: -1; background-size: cover; + background-position: center; opacity: 0; transition: opacity .8s ease; + } + .bg.loaded { opacity: 1; } + .bg::after { + content: ""; position: absolute; inset: 0; + background: radial-gradient(circle at 30% 20%, rgba(20,16,34,.72), rgba(13,11,20,.9) 75%); + } .card { width: min(90vw, 420px); padding: 2.5rem 2rem; background: rgba(255,255,255,.04); border: 1px solid rgba(255,255,255,.08); @@ -82,6 +95,7 @@ +
Préchargement
@@ -107,6 +121,33 @@ document.getElementById("stationName").textContent = "◈ " + STATION_NAME; document.getElementById("pageTitle").textContent = STATION_NAME; + // Fond aléatoire repris de l'écran de connexion Navidrome : on récupère la + // liste de leur galerie (index.yml, CORS ouvert), on tire un nom au hasard + // et on sert la version .webp depuis leur CDN — même logique que Navidrome, + // qui retire l'extension du nom listé. On précharge l'image avant de + // l'afficher pour éviter tout flash, et on ignore silencieusement les + // échecs (le dégradé du body reste alors le fond). + (async () => { + const BASE = "https://www.navidrome.org/images/"; + try { + const r = await fetch(BASE + "index.yml", { cache: "no-store" }); + const names = (await r.text()) + .split("\n") + .map((l) => l.replace(/^\s*-\s*/, "").trim()) + .filter(Boolean); + if (!names.length) return; + const name = names[Math.floor(Math.random() * names.length)]; + const url = BASE + name.replace(/\.[^.]+$/, "") + ".webp"; + const img = new Image(); + img.onload = () => { + const bg = document.getElementById("bg"); + bg.style.backgroundImage = `url("${url}")`; + bg.classList.add("loaded"); + }; + img.src = url; + } catch (e) { /* pas de fond : on garde le dégradé */ } + })(); + const titleEl = document.getElementById("title"); const artistEl = document.getElementById("artist"); const npLabel = document.getElementById("npLabel");