Radioplayer-with-Presets/metadata.php
simonpipe 6c1b185fc6 Upload files to "/"
Neu aufgeteilter Code
2025-12-18 17:17:16 +01:00

69 lines
No EOL
1.8 KiB
PHP

<?php
/**
* optional/metadata.php
* Optimierte Version zum Auslesen von Metadaten
*/
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
$url = isset($_GET['url']) ? $_GET['url'] : '';
if (empty($url) || !filter_var($url, FILTER_VALIDATE_URL)) {
echo json_encode(['error' => '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']);
}