Как отобразить «Проигрывается» на моем веб-сайте с помощью Icecast2 и Liquidsoap

Я не смог найти лучшего ответа на этот вопрос в Интернете, даже документ по жидкому мылу не помог. Я хочу получить текущее название песни и исполнителя, воспроизводимого на моем потоковом сервере (icecast). Я нашел на каком-то форуме, что они смогли это сделать, но они не объяснили, как это сделать, вот скрипт LiquidSoap, который они использовали:

def apply_metadata(m) =
  title = m["title"]
  artist = m["artist"]
  album = m["album"]
  [("artist","#{artist}"),("title","#{album} - #{title}")]
end

centovacast.callback_autodj := fun(s) -> map_metadata(apply_metadata,s)

Я считаю, что этот скрипт также предназначен только для Centova и Autodj. Хотя я не использую эти технологии (я использую Ubuntu 16.04, Icecast2, Liquisoap, PHP, HTML5/CSS), возможно ли это сделать с помощью инструментов, которые я сейчас использую?


person user3807803    schedule 18.01.2018    source источник


Ответы (3)


Раньше я использовал веб-сокеты для получения метаданных, но меня расстраивало то, что они всегда не синхронизировались.

Единственный способ решить эту проблему — закодировать метаданные в поток, чтобы вы получали их одновременно со звуком.

Я немного покопался, чтобы узнать, как это делают серверы icecast, и собрал сценарий сервисного работника, который добавляет необходимый заголовок к вашему запросу для получения потока, включая метаданные, а затем извлекает его для вас.

Код здесь и простая демонстрация здесь

person miknik    schedule 14.07.2018

Я не уверен, почему вы перетаскиваете сюда исходный клиент.

Правильный поток, отправленный на точку монтирования Icecast, будет иметь метаданные для воспроизводимого в данный момент аудио.

На это указывалось в другом месте. Icecast начиная с версии 2.4.1 обеспечивает правильный экспорт метаданных JSON.

Запросы JSON с веб-сайта — это в значительной степени решаемая проблема, которая считается упражнением для склонного читателя.

person TBR    schedule 18.01.2018
comment
Хорошо, я получил файл json, и теперь я тоже могу его разобрать. Проблема в том, что он не синхронизируется с плеером: при смене песни название песни не меняется... - person user3807803; 19.01.2018
comment
Да, это ожидаемое и известное ограничение. Большинство игроков буферизируют данные перед началом игры. Кроме того, буфер может увеличиваться со временем по нескольким причинам. Это означает, что пока сервер уже видит следующую песню, игрок может добраться до нее только через 5-60 секунд. Синхронизированные метаданные можно получить, только прочитав их из потока, но стандартного способа сделать это в браузере не существует. NB: Есть довольно много игроков, которые ошибаются даже в этом. Они читают метаданные по мере поступления, а не из буфера. - person TBR; 19.01.2018

Почему бы вам не взять это напрямую в icecast?

PHP:

function get_icecast_info($server_ip, $server_port, $admin_user, $admin_password) {
    $index = @file_get_contents("http://".$admin_user.":".$admin_password."@".$server_ip.":".$server_port."/admin/stats.xml");
    if($index) {
        $xml = new DOMDocument(); if(!$xml->loadXML($index)) return false; $arr = array(); $listItem = $xml->getElementsByTagName("source");
        foreach($listItem as $element) {
            if($element->childNodes->length) {
                foreach($element->childNodes as $i){ $arr[$element->getAttribute("mount")][$i->nodeName] = $i->nodeValue; }
            }
        }
        return $arr;
    } return false;
}

И это вывод (массив):

$arr = get_icecast_info($ice_host, $ice_aport, $ice_user, $ice_pass);
person weserWEB    schedule 19.01.2018
comment
Обратите внимание, что приведенный выше ответ касается непосредственно запроса Icecast и не требует доступа на уровне администратора. - person TBR; 24.01.2018