diff --git a/stream/index.html b/stream/index.html index 7c66b34..62ba6fb 100644 --- a/stream/index.html +++ b/stream/index.html @@ -313,10 +313,11 @@ const player = document.getElementById("player"); // Noms d'affichage des providers d'ingestion (champ `origin` du morceau). - // Inconnu → on réutilise tel quel, faute de mieux. + // Inconnu → on réutilise tel quel, faute de mieux. yt-dlp est absent + // volontairement : il pioche sur de nombreux sites, donc on nomme sa + // provenance d'après le domaine de la page source (voir hostLabel). const PROVIDER_NAMES = { subsonic: "OpenSubsonic", - ytdlp: "YouTube", listenbrainz: "ListenBrainz", // Filet de secours : morceau rejoué depuis le cache local (déjà diffusé), // quand l'ingest n'a rien à proposer (démarrage, panne…). @@ -325,6 +326,36 @@ request: "une demande", }; + // Noms lisibles par domaine, pour les morceaux yt-dlp dont l'origine réelle + // est le site de la page source (www.youtube.com → YouTube). La clé est le + // domaine enregistrable ; les sous-domaines (artiste.bandcamp.com) sont + // ramenés à cette clé par hostLabel. + const HOST_NAMES = { + "youtube.com": "YouTube", + "youtu.be": "YouTube", + "bandcamp.com": "Bandcamp", + "soundcloud.com": "SoundCloud", + "vimeo.com": "Vimeo", + "dailymotion.com": "Dailymotion", + "mixcloud.com": "Mixcloud", + }; + + // Nom d'affichage d'un hôte : on retire le « www. » puis on remonte de + // sous-domaine en sous-domaine (foo.bar.bandcamp.com → bar.bandcamp.com → + // bandcamp.com) pour retrouver une entrée connue ; à défaut, on renvoie + // l'hôte nu, qui reste une provenance lisible. + function hostLabel(host) { + host = host.replace(/^www\./, ""); + let h = host; + while (h) { + if (HOST_NAMES[h]) return HOST_NAMES[h]; + const dot = h.indexOf("."); + if (dot < 0) break; + h = h.slice(dot + 1); + } + return host; + } + // Tant que le buffer de préchargement (PREFETCH côté ingest) n'est pas // rempli, on affiche « Préchargement N/M » plutôt que « en cours ». L'info // vient du daemon d'ingestion, relayée par le stream via /ingest/status. @@ -486,9 +517,17 @@ : escapeHtml(label); artistEl.textContent = a; // Provenance discrète : nom lisible du provider, masqué s'il est absent. + // yt-dlp pioche sur de nombreux sites : on nomme sa provenance d'après + // le domaine de la page source (u) plutôt qu'un « YouTube » systématique. const origin = (m.origin || "").trim(); - if (origin) { - providerEl.textContent = "via " + (PROVIDER_NAMES[origin] || origin); + let provider = ""; + if (origin === "ytdlp" && u) { + try { provider = hostLabel(new URL(u).hostname); } catch (e) { /* url invalide */ } + } else if (origin) { + provider = PROVIDER_NAMES[origin] || origin; + } + if (provider) { + providerEl.textContent = "via " + provider; providerEl.hidden = false; } else { providerEl.hidden = true;