'Ungültige oder fehlende URL']); exit; } // WICHTIG: Die Header müssen Icy-MetaData enthalten, sonst senden viele Server gar nichts! $opts = [ "http" => [ "method" => "GET", "header" => "Icy-MetaData: 1\r\n", "timeout" => 5, "user_agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) RadioMetadataProxy/1.0" ] ]; $context = stream_context_create($opts); $fp = @fopen($url, 'r', false, $context); if (!$fp) { echo json_encode(['error' => 'Stream konnte nicht geöffnet werden']); exit; } // Puffer erhöhen: Wir lesen bis zu 192 KB, um auch langsame Metadaten zu finden $max_read = 196608; $data = ''; $read_size = 0; while (!feof($fp) && $read_size < $max_read) { $chunk = fread($fp, 8192); if ($chunk === false) break; $data .= $chunk; $read_size += strlen($chunk); // Vorzeitig abbrechen, wenn der Titel gefunden wurde if (strpos($data, 'StreamTitle=') !== false) { break; } } fclose($fp); // Suche nach dem StreamTitle if (preg_match("/StreamTitle='(.*?)';/", $data, $matches)) { $title = trim($matches[1]); // UTF-8 Korrektur if (!mb_check_encoding($title, 'UTF-8')) { $title = mb_convert_encoding($title, 'UTF-8', 'ISO-8859-1'); } // --- NEU: FILTER FÜR UNERWÜNSCHTE TITEL --- $clean_title = strtolower($title); $bad_patterns = ['error code:', 'internal server error', '500 error', '404 not found']; foreach ($bad_patterns as $pattern) { if (strpos($clean_title, $pattern) !== false) { $title = ''; // Titel leeren, wenn Fehler erkannt wurde break; } } if (empty($title)) { // Sende title als null, damit JS weiß: Kein Songtitel vorhanden echo json_encode(['title' => null]); } else { echo json_encode(['title' => $title]); } } else { // Keine Metadaten gefunden - wir senden einfach null statt einer Fehlermeldung echo json_encode(['title' => null]); }