const audio = document.getElementById('audio');
const playBtn = document.getElementById('playBtn');
const stopBtn = document.getElementById('stopBtn');
const vol = document.getElementById('vol');
const muteBtn = document.getElementById('muteBtn');
const statusEl = document.getElementById('status');
const metaEl = document.getElementById('meta');
const streamUrlEl = document.getElementById('streamUrl');
//streamUrlEl.textContent = ICECAST_URL;
audio.src = ICECAST_URL;
audio.crossOrigin = "anonymous"; // utile si vous souhaitez analyser l'audio plus tard
let reconnectDelay = 3000;
let reconnectTimeout = null;
let userStopped = true;
function setStatus(txt){
statusEl.textContent = txt;
}
function startStream(){
userStopped = false;
setStatus("Connexion...");
audio.load();
const playPromise = audio.play();
if (playPromise !== undefined) {
playPromise.then(()=> {
setStatus("En direct");
playBtn.innerHTML = "
";
}).catch(err => {
setStatus("{
if (audio.paused){
startStream();
} else {
pauseStream();
}
});
stopBtn.addEventListener('click', stopStream);
// Volume & mute
audio.volume = parseFloat(vol.value);
vol.addEventListener('input', ()=> {
audio.volume = parseFloat(vol.value);
if (audio.volume === 0) muteBtn.textContent = "🔇"; else muteBtn.textContent = "🔊";
});
muteBtn.addEventListener('click', ()=> {
audio.muted = !audio.muted;
muteBtn.textContent = audio.muted ? "🔇" : "🔊";
});
// Reconnexion automatique en cas d'erreur réseau
audio.addEventListener('error', (e)=>{
console.warn("Audio error", e);
setStatus("Reconnexion dans 3s");
scheduleReconnect();
});
audio.addEventListener('stalled', ()=>{
setStatus("Reconnexion dans 3s");
scheduleReconnect();
});
audio.addEventListener('waiting', ()=>{
setStatus("Connexion...");
});
audio.addEventListener('playing', ()=>{
setStatus("En direct");
});
audio.addEventListener('pause', ()=>{
if (!userStopped) setStatus("En pause");
});
function scheduleReconnect(){
if (userStopped) return;
if (reconnectTimeout) clearTimeout(reconnectTimeout);
reconnectTimeout = setTimeout(()=>{
setStatus("Reconnexion...");
audio.load();
const p = audio.play();
if (p && typeof p.then === 'function') p.catch(()=>{ / ignore / });
}, reconnectDelay);
}
// Lecture automatique si l'utilisateur lance la page (après interaction requise sur certains navigateurs)
// Ne pas lancer automatiquement sans interaction pour éviter blocage; démarrer sur clic utilisateur.
// Tentative simple d'afficher metadata ICY via une requête HEAD vers le serveur Icecast (peut nécessiter CORS)
// Si votre Icecast autorise CORS, décommentez la fonction fetchMetadata() et ajustez l'URL.
// async function fetchMetadata(){
// try {
// const resp = await fetch(ICECAST_URL, { method: 'GET', mode: 'cors' });
// const txt = await resp.text();
// tentatif: chercher "icy-name" ou "" dans la page de mount
// const m = txt.match(/([^<]+)<\/title>/i) || txt.match(/icy-name:\s*([^\r\n]+)/i);
// if (m) metaEl.textContent = "Meta: " + m[1].trim();
// else metaEl.textContent = "Meta: —";
// } catch(err){
// metaEl.textContent = "Meta: indisponible (CORS ou non supporté)";
// }
// }
//fetchMetadata();
// Initialisation visuelle
setStatus("Arrêté");