Radioplayer-with-Presets/js/meta-handler.js
2025-12-19 15:34:10 +01:00

112 lines
No EOL
3.9 KiB
JavaScript

/**
* meta-handler.js
* Verwaltet das Abrufen und Anzeigen von Stream-Metadaten (Songtitel)
*/
const MetaHandler = {
proxyPath: 'php/metadata.php',
updateInterval: 20000,
intervalId: null,
proxyActive: false,
async init() {
try {
const response = await fetch(this.proxyPath, { method: 'HEAD' });
this.proxyActive = response.ok;
} catch (e) {
this.proxyActive = false;
}
},
async fetchTitle(streamUrl) {
if (!this.proxyActive || !streamUrl) return;
try {
const res = await fetch(`${this.proxyPath}?url=${encodeURIComponent(streamUrl)}`);
const data = await res.json();
if (data && data.title) {
this.updateUI(data.title);
}
} catch (e) {
console.error("Metadaten-Fehler:", e);
}
},
updateUI(title) {
const stationDisplay = document.getElementById('current-station-name');
if (!stationDisplay) return;
// 1. Alles vor dem Songtitel isolieren
let currentContent = stationDisplay.innerHTML;
let stationPart = currentContent.split('&nbsp;')[0].split(' <i class="fa-solid fa-music"')[0].trim();
// 2. Dubletten-Check & Fehler-Filter
const tempDiv = document.createElement("div");
tempDiv.innerHTML = stationPart;
const stationNameOnly = tempDiv.textContent.trim();
const cleanTitle = title.toLowerCase().trim();
const cleanStation = stationNameOnly.toLowerCase();
// --- NEU: Liste der unerwünschten Titel ---
const isErrorTitle = cleanTitle.includes('error code:') ||
cleanTitle.includes('internal server error') ||
cleanTitle.includes('500 error');
// Überprüfung auf Dubletten, Telefonnummern ODER Fehlermeldungen
if (cleanTitle === cleanStation ||
cleanTitle.includes(cleanStation) ||
title.includes('0848') ||
isErrorTitle) { // <--- Hier wird der Fehler-Filter angewendet
stationDisplay.innerHTML = stationPart; // Nur Sendername anzeigen
} else {
// 3. Anzeige neu zusammenbauen
stationDisplay.innerHTML = `${stationPart}&nbsp;&nbsp;<i class="fa-solid fa-music"></i> ${title}`;
}
// --- LAUFSCHRIFT-ÜBERPRÜFUNG ---
setTimeout(() => this.checkMarqueeOverflow(), 50);
},
checkMarqueeOverflow() {
const senderContainer = document.getElementById('aktueller-sender');
const textElement = document.getElementById('current-station-name');
if (textElement && senderContainer) {
textElement.classList.remove('marquee-active');
// Wir messen die verfügbare Breite im Container abzüglich des Paddings
const availableWidth = senderContainer.clientWidth - 20; // 20px Abzug für das seitliche Padding (15px links/rechts)
// Wenn der Text breiter ist als der verfügbare Platz innen
if (textElement.scrollWidth > availableWidth) {
textElement.classList.add('marquee-active');
}
}
},
start(streamUrl) {
this.stop();
this.fetchTitle(streamUrl);
this.intervalId = setInterval(() => {
this.fetchTitle(streamUrl);
}, this.updateInterval);
},
stop() {
if (this.intervalId) {
clearInterval(this.intervalId);
this.intervalId = null;
}
const stationDisplay = document.getElementById('current-station-name');
if (stationDisplay) {
stationDisplay.classList.remove('marquee-active');
// Hinweis: Der Inhalt wird beim Stoppen meist durch die main.js auf "Wähle einen Sender" zurückgesetzt
}
}
};
window.MetaHandler = MetaHandler;
MetaHandler.init();