'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 (falls der Sender ISO-8859-1 schickt) if (!mb_check_encoding($title, 'UTF-8')) { $title = utf8_encode($title); } if (empty($title)) { echo json_encode(['title' => null, 'status' => 'empty']); } else { echo json_encode(['title' => $title]); } } else { echo json_encode(['title' => null, 'error' => 'Keine Metadaten gefunden']); }