Отправка метаданных #
Суть примера: при изменении трека, а следовательно при измененнии метаданных мы будем создавать json файл с текущими данными. Затем этот файл можно будет получать с фронтенда и показывать текущий трек в плеере на странице.
За основу возьмем скрипт Играем одну папку
# включаем вывод отладочной информации
set("log.stdout", true)
# устанавливаем уровень 3 - для отладки достаточно
set("log.level", 3)
# предварительно описываем функцию, которая будет вызываться при изменении метаданных. в `m` содержатся метаданные
def send_metadata(m) =
title = m["title"]
artist = m["artist"]
file.write(data = "{\"title\":\"#{title}\", \"artist\":\"#{artist}\"}", "now.json")
log(level=3,label="SEND","[META] отправлена #{m['artist']} #{m['title']}")
end
# описываем источник (папку на диске. Указываем либо полный путь, либо папку рядом со скриптом, либо ссылку на плейлист)
radio = playlist('my_mp3')
# обязательное условие сделать источник безопасным, то есть не допускать остановок
radio = mksafe(radio)
# отправляем метаданные асинхронно чтобы не тормозить основной поток и не лагать
radio = on_metadata(id='air', fun(md) -> add_timeout(0., {send_metadata(md); 0.-1.}), radio)
# играем
out = output.pulseaudio(radio)
Описываем функцию send_metadata
которая будет что-то делать с нашими метаданными.
Эта функция будет вызываться ликвидом и в нее будут передаваться метаданные. Внутри мы просто будем сохранять файлик now.json
Файлик будет содержать {"title":"Don't Try So Hard (With James Taylor)", "artist":"Amy Grant"}
Затем, самым простым способом можно запрашивать этот файл с фронта, например каждые 5-10 секунд и отображать что сейчас играет.
Есть варианты посложнее. Например внутри функции send_metadata можно дергать внешний скрипт, передавая ему метаданные. И делать с этими данными все что угодно. Достаточно красивый вариант - отправлять метаданные через websocket, тогда не потребуется бомбардировать свой сервер каждые 5-10 секунд, а отправлять метаданные как только они поменялись.
Некоторые мобильные плееры умеют определять событие изменения метаданных. Более того, сами метаданные будут присутствовать в потоке, и если плеер умеет их читать, то дополнительных приседаний не потребуется. Однако в браузере таких плееров нет, поэтому придется выкручиваться дергая файлик или отправляя данные вебсокетом.
PS. Я намеренно не использовал новую json функциональность liquidsoap чтобы показать все максимально простом способом.