Получение настроек модуля вывода 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))