Как извлечь информацию о «текущем треке / текущем воспроизведении» из радиопотока shoutcast / icecast? Я пробовал следующие решения:
Все вышеперечисленные методы работают для некоторых радиостанций, таких как
http://icecast.vrtcdn.be/stubru-high.mp3
Однако для ряда потоков icecast / shoutcast все они терпят неудачу. Пример: http://icecast -qmusic.cdp.triple-it.nl / Qmusic_be_live_64.aac . При анализе самого аудиопотока streamTitle всегда пуст. Файл xspf всегда имеет пустой тег заголовка. Тем не менее, я заметил, что другие приложения и веб-сайты успешно собирают информацию о текущей дорожке для этой радиостанции. Домашняя страница радиостанции также содержит информацию о текущем треке / списке воспроизведения: https://qmusic.be/playlist/qmusic.
Я знаю, что могу пойти и написать html-скребок, который извлекает эти данные, но я хочу использовать это только в качестве крайней меры. Кроме того, у меня есть несколько потоков с похожими проблемами, и это не будет общим решением, которое можно применить ко всем из них.
Итак, я что-то упустил? Есть ли другой способ извлечения метаданных с сервера icecast / shoutcast? Я также пытался использовать файл 7.html или файлы / stats? Sid = 1, но мне не очень повезло с этими подходами (как в случае: файлы отсутствуют / недействительные ссылки). Ниже скрипт php от одной из гиперссылок, которая работает в некоторых случаях. Любая помощь или отзывы будут с благодарностью!
PS: извините за перепутывание инструментов / фреймворков / языков. Перепробовал много вещей здесь. Большое спасибо за ответы, совместимые с React-Native!
<?php
function getMp3StreamTitle($streamingUrl, $interval, $offset = 0, $headers = true)
{
$needle = 'StreamTitle=';
$ua = 'Mozilla';
$opts = [
'http' => [
'header' => 'Icy-MetaData: 1',
'user_agent' => $ua
]
];
if (($headers = get_headers($streamingUrl))) {
foreach ($headers as $h) {
if (strpos(strtolower($h), 'icy-metaint') !== false && ($interval = explode(':', $h)[1])) {
break;
}
}
}
$context = stream_context_create($opts);
if ($stream = fopen($streamingUrl, 'r', false, $context)) {
$buffer = stream_get_contents($stream, $interval, $offset);
fclose($stream);
if (strpos($buffer, $needle) !== false) {
$title = explode($needle, $buffer)[1];
return substr($title, 1, strpos($title, ';') - 2);
} else {
return getMp3StreamTitle($streamingUrl, $interval, $offset + $interval, false);
}
} else {
throw new Exception("Unable to open stream [{$streamingUrl}]");
}
}
var_dump(getMp3StreamTitle('http://icecast.vrtcdn.be/stubru-high.mp3', 16000));