Радиопоток Icecast/Shoutcast: извлечение информации о текущем воспроизведении

Как извлечь информацию «текущая дорожка / сейчас воспроизводится» из радиопотока 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, но мне не очень повезло с этими подходами (например: файлы отсутствуют/неверные URL-адреса). Ниже 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));

person Jenever    schedule 18.03.2019    source источник
comment
Какие плееры для http://icecast-qmusic.cdp.triple-it.nl/Qmusic_be_live_64.aac могут показывать данные о трансляции? Я слушаю его сейчас и не вижу никаких метаданных в этом потоке.   -  person Brad    schedule 19.03.2019
comment
Кроме того, перестаньте устанавливать для своего пользовательского агента значение Mozilla. Это нарушит совместимость со старыми версиями SHOUTcast. Ваша строка пользовательского агента должна не содержать Mozilla для серверов SHOUTcast v1. Кроме того, URL-адрес должен иметь точку с запятой ; для этих серверов. (Но не используйте этот хак без необходимости! Он не совместим с большинством других серверов.)   -  person Brad    schedule 19.03.2019
comment
Спасибо за ваш отзыв, Брэд (я действительно прочитал некоторые из ваших ценных сообщений здесь, в Stack Overflow, прежде чем задать этот вопрос). Полезно знать о пользовательском агенте, я удалил свойство заголовка. Что касается плееров, которые показывают данные потоков, то есть radiobelgium.be, который на самом деле является приложением, а не веб-сайтом/ услуга. И, конечно же, всегда есть домашняя страница радиостанции, хотя они, вероятно, могут использовать совершенно другие методы отображения данных о потоке...   -  person Jenever    schedule 19.03.2019
comment
Да, не все станции встраивают метаданные в поток, но большинство это делают. Метаданные в стиле ICY наиболее распространены, и это то, что вы видите для большинства потоков MP3 и ADTS (это то, с чем обычно обертывается AAC). Потоки Ogg (гораздо менее распространенные) имеют свои собственные метаданные, которые вы должны прочитать, проанализировав сам поток Ogg.   -  person Brad    schedule 19.03.2019