// Funzione per caricare i dati dell'EPG da un file XML function fetchEPGDataFromXML(xmlURL) { return new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE) { if (xhr.status === 200) { var parser = new DOMParser(); var xmlDoc = parser.parseFromString(xhr.responseText, "text/xml"); var now = new Date(); // Ottieni l'ora attuale var programs = xmlDoc.getElementsByTagName("programme"); var currentProgram = null; // Trova il programma corrente for (var i = 0; i < programs.length; i++) { var start = parseDateTime(programs[i].getAttribute("start")); var stop = parseDateTime(programs[i].getAttribute("stop")); if (start <= now && now <= stop) { currentProgram = programs[i]; break; } } // Estrai il titolo del programma corrente, se presente if (currentProgram) { var title = currentProgram.getElementsByTagName("title")[0].textContent; var startTime = parseDateTime(currentProgram.getAttribute("start")); var endTime = parseDateTime(currentProgram.getAttribute("stop")); var epgData = { title: title, startTime: startTime, endTime: endTime }; resolve(epgData); } else { reject("Nessun programma in onda al momento"); } } else { reject("Errore durante il caricamento del file XML"); } } }; xhr.open("GET", xmlURL, true); xhr.send(); }); } // Funzione per analizzare una stringa di data/ora nel formato XMLTV e restituire un oggetto Data function parseDateTime(dateTimeString) { // Il formato XMLTV è "YYYYMMDDHHMMSS Z", dove Z è l'offset del fuso orario var year = parseInt(dateTimeString.substr(0, 4)); var month = parseInt(dateTimeString.substr(4, 2)) - 1; // Mese è 0-based in JavaScript var day = parseInt(dateTimeString.substr(6, 2)); var hour = parseInt(dateTimeString.substr(8, 2)); var minute = parseInt(dateTimeString.substr(10, 2)); var second = parseInt(dateTimeString.substr(12, 2)); return new Date(year, month, day, hour, minute, second); } // Funzione per aggiornare la sovrapposizione dell'EPG e gestire il pulsante DVR function updateEPGOverlay(epgData) { var epgOverlay = document.getElementById('epgOverlay'); var dvrButton = document.getElementById('dvrButton'); var reloadButton = document.getElementById('reloadButton'); if (epgData && epgData.title) { var startTimeStr = epgData.startTime.toLocaleTimeString('it-IT', { hour: '2-digit', minute: '2-digit' }); var endTimeStr = epgData.endTime.toLocaleTimeString('it-IT', { hour: '2-digit', minute: '2-digit' }); epgOverlay.innerHTML = 'Ora in onda: ' + epgData.title + ' (' + startTimeStr + ' - ' + endTimeStr + ')'; epgOverlay.style.display = 'block'; function getCurrentTime() { return new Date(); } // Mostra il pulsante DVR e imposta l'azione di restart dvrButton.style.display = 'block'; dvrButton.onclick = function() { var restartTime = epgData.startTime.getTime(); // Otteniamo l'orario di inizio del programma attualmente in onda var currentTime = new Date().getTime(); // Otteniamo l'orario attuale var offset = restartTime - currentTime; // Calcoliamo l'offset in millisecondi var newTime = player.currentTime() + (offset / 1000); // Convertiamo l'offset in secondi e aggiorniamo il tempo del player player.currentTime(newTime); // Imposta il nuovo tempo del player console.log("Orario di inizio programma:", new Date(restartTime)); // Log dell'orario di inizio del programma console.log("Orario corrente:", new Date(currentTime)); // Log dell'orario attuale console.log("Offset:", offset); // Log dell'offset dvrButton.style.display = 'none'; // Nasconde il pulsante "Restart" // Mostra il pulsante "Torna alla Live" dopo aver premuto "Restart" reloadButton.style.display = 'block'; }; // Nascondi il pulsante "Torna alla Live" se il player è già in live reloadButton.style.display = 'none'; } else { epgOverlay.style.display = 'none'; dvrButton.style.display = 'none'; reloadButton.style.display = 'none'; } } // Funzione per gestire il pulsante "Torna alla Live" function handleReloadButton() { var reloadButton = document.getElementById('reloadButton'); reloadButton.onclick = function() { location.reload(); }; } handleReloadButton(); // Funzione per avviare il caricamento iniziale e l'aggiornamento periodico dell'EPG function startEPGUpdate(xmlURL, updateInterval) { function updateEPG() { fetchEPGDataFromXML(xmlURL).then(function(epgData) { updateEPGOverlay(epgData); }).catch(function(error) { console.error(error); }); } updateEPG(); setInterval(updateEPG, updateInterval); } const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); const url = urlParams.get('url'); const poster = urlParams.get('poster'); player.poster(poster); player.src({ src: url, type: "application/x-mpegURL", }); player.play();