Получение настроек модуля вывода Icecast в обработчике on_metadata Liquidosap

Я создал потоковый сервер, который совместим с источниками Icecast, но может принимать дополнительные метаданные. Типичный исходный клиент Icecast отправит свой внеполосный запрос на обновление метаданных на сервер следующим образом:

/admin/metadata?pass=hackme&mode=updinfo&song=Artist%20-%20Title

Мой сервер принимает дополнительные параметры строки запроса, такие как meta[album] а также meta[filename]:

/admin/metadata?pass=hackme&mode=updinfo&song=Artist%20-%20Title&meta[album]=Album%02Name&meta[filename]=somefile.mp3

Я пытаюсь настроить Liquidsoap для отправки расширенных метаданных. Согласно документации, кажется, я могу отключить встроенные обновления метаданных, установив icy_metadata=false, Оттуда я должен быть в состоянии написать свою собственную функцию для обработки on_metadata, Документация дает следующую подпись для on_metadata звонки:

(?id:string,(([(string*string)])->unit),source('a))->
source('a)

Вызовите данный обработчик для пакетов метаданных.

  • id (строка - по умолчанию ""): принудительно установить значение исходного идентификатора.

  • (без метки) (([(string*string)])->unit): функция вызывается для каждого пакета метаданных в потоке. Это должно быть быстро, потому что он запускается в основном потоке.

  • (без маркировки) (источник ('a))

Я не полностью понимаю эту подпись, но я нашел сообщение в списке рассылки, в котором есть хороший пример:

def send_meta(m) =
  system("/path/to/script #{m["title"]} #{m["artist"]}")
end

source = on_metadata(send_meta, source)

Имея эту информацию, я смогу вызвать cURL, чтобы сделать запрос на мой сервер, обновив метаданные. Что-то вроде этого:

system("curl \"http://HOST:PORT/admin/metadata?pass=PASSWORD&mode=updinfo&song=#{m["artist"]}%20-%20#{m["title"]}&filename=#{m["filename"]}\"")

Я близко, но я не могу понять последние части этого:

  • Как я могу получить настроенный хост, порт и пароль для связанного выхода Icecast?
  • Как правильно URL-кодировать параметры метаданных?
  • Есть ли какой-нибудь отладочный вывод, который я могу использовать, чтобы показать все доступные переменные?

1 ответ

Решение

Все оказалось очень просто.

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

Это невозможно, напрямую. Обработчик метаданных не получает ссылку на источник. Однако написать функцию, которая настраивает обе функции одновременно, тривиально.

def output.my_custom_output(encoder, source, host, port, password, mount, genre, url, name) =
  def send_meta(m) = 
    # Code to send metadata here.
    # You can use source, host, port, etc
  end

  output.icecast(...)
end

Как правильно URL-кодировать параметры метаданных?

url.encode(m['filename'])

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

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

log(json_of(m))
Другие вопросы по тегам