Радиопоток Icecast / Shoutcast: извлечение информации об игре - PullRequest
0 голосов
/ 18 марта 2019

Как извлечь информацию о «текущем треке / текущем воспроизведении» из радиопотока 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));
...