Создаем интернет-радио на Liquidsoap (Часть II)

В первой части статьи мы вкратце распланировали, что хотим получить от своей будущей интернет-радиостанции. Теперь настал момент перенести все это на язык liquidsoap.

СОЗДАНИЕ

Подразумевается, что вы используете операционную систему Ubuntu LTS 14.04 и liquidsoap установленный из дистрибутива ОС.

Как и полагается всем linux/unix программам, конфигурационный файл (правда правильнее сказать, что это текст программы вашей станции) должен храниться в директории /etc/liquidsoap, и если туда заглянуть, то можно будет увидеть демонстрационный файл radio.liq.example. Этот пример дает поверхностное понимание, но к сожалению, нам он совсем не подходит.

И так, мы создаем свой файл под названием myinetradio.liq, и начинаем постепенно его заполнять. Прежде всего, мы будем комментировать блоки, что бы потом самим же не забыть, а что мы тут такое «наворотили»:

#My Inet Radio config
#Log dir and parametrs
set("log.file.path","/var/log/liquidsoap/myinetradio.log")
set("log.stdout", true)

Помимо названия, что это сие, мы указываем путь и параметры журналирования работы станции, а далее, устанавливаем кодировку для тэгов в музыкальных файлах. Может даже придется в некоторых из них провести перекодирование, иначе кракозябр не избежать.

#Set tag encoding
set("tag.encodings",["UTF-8"])

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

# Use the telnet server for requests
set("server.telnet", true)

# Live Settings
set("harbor.bind_addr","0.0.0.0")

ИСТОЧНИКИ

После описания минимальных необходимых параметров, мы переходим к описанию источников, т.е. листы воспроизведения, точка входа прямого эфира и его повтора:

#Rewrite tags

def live_tag(j)
   rewrite_metadata([("title","Прямой эфир")], update=false, strip=true, j)
end

def live_rep_tag(j)
   rewrite_metadata([("title","Повтор прямого эфира")], update=false, strip=true, j)
end

def my_rec_tag(j)
   rewrite_metadata([("title","Моя передача")], update=false, strip=true, j)
end

def utro_tag(j)
   rewrite_metadata([("title","Доброе утро")], update=false, strip=true, j)
end

def den_tag(j)
   rewrite_metadata([("title","Дневная музыка")], update=false, strip=true, j)
end

def vecher_tag(j)
   rewrite_metadata([("title","Приятный вечер")], update=false, strip=true, j)
end

def noch_tag(j)
   rewrite_metadata([("title","Ночной полет")], update=false, strip=true, j)
end

def jin_tag(j)
   rewrite_metadata([("title","Мое интернет-радио")], update=false, strip=true, j)
end

#Live input
live = audio_to_stereo(live_tag(input.harbor(id="LIVE", port=8010, password="mystationpassword", "live")))
liveover = audio_to_stereo(input.harbor(port=8010, password="mystationpassword2", "liveover"))

#Talking clock
clock00 = audio_to_stereo(playlist("/home/radio/audio/clock/00/"))
clock12 = audio_to_stereo(playlist("/home/radio/audio/clock/12/"))

#Records play
live_rep = audio_to_stereo(live_rep_tag(request.queue(id="LIVE_REP", timeout=120.)))
my_rec_program = audio_to_stereo(my_rec_tag(request.queue(id="MY_REC_PROGRAM", timeout=120.)))

#Music playlists
utro = audio_to_stereo(utro_tag(playlist("/home/radio/audio/utro/")))
den = audio_to_stereo(den_tag(playlist("/home/radio/audio/denplaylist.m3u")))
vecher = audio_to_stereo(vecher_tag(request.dynamic(id="VECHER_PLAY",{request.create("bar:foo", indicators=get_process_lines("/usr/bin/php /home/radio/scripts/playvecher.php"))})))
noch = audio_to_stereo(noch_tag(playlist("/home/radio/audio/noch/")))

#Jingle playlist
jin = audio_to_stereo(jin_tag(playlist("/home/radio/audio/jingle/")))

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

В блоке #Rewrite tags мы создаем функции для изменения метаданных потока. Они будут востребованы в том случае, если вы не захотите отображать данные из файлов или программа для прямого вещания не транслирует такие данные.

В разделе #Live input мы описываем или создаем точки монтирования (входа) для вашего приложения, которое вам позволяет организовать прямое вещание. Обратим внимание на ее содержание:

live — это имя переменной, потока или объекта, называйте это как хотите. Далее следует набор функций и передача параметров. audio_to_stereo — ох, при переходе с версий ниже 1.0, незнание этой функции попортило много крови. Ее основная задача, переконвертация входящего аудио в стерео. Затем следует имя функции, которая изменяет метаданные, и следом идет функция создания точки входа. Точка входа создается на порту 8010, имя точки (mountpoint) live и пароль mystationpassword. Но как известно, для входа необходим еще login, который по традиции icecast имеет всегда имя по умолчанию source (если конечно вы не захотите сами его изменить).

Следующая точка liveover. Она нам необходима для организации системы оповещения слушателей или для воспроизведения анонсов. Так как, этот поток будет идти поверх уже идущей программы, нам нет необходимости переписывать метаданные.

Блок #Talking clock. Этот блок источников для организации говорящих часов и содержит два плейлиста: для полудня и для полуночи. Вначале идет имя, затем преобразование аудиопотока и функция playlist, которая содержит путь к директории, где хранятся уже заготовленные записи.

В одних из первых строчек, мы указывали, что нашей радиостанцией можно будет дистанционно управлять через протокол telnet. Так вот в блоке #Records play мы указываем чем именно можно будет управлять. Точнее, мы создаем две очереди, содержимое которых мы будем наполнять дистанционно. Нам это необходимо для организации трансляции заранее записанных передач и для воспроизведения записи прямого эфира.

#Music playlists — самый интересный блок в текущей статье. В этом разделе мы создаем 4 потока (очереди, объекта, переменных) с источниками плейлистами. В 3 случаях используется функция playlist, которая на вход может принимать практически все, что угодно. Пути к директории, пути к файлам плейлостов, rss фиды и даже гиперссылки. Главное, что бы все это содержало пути, либо к аудиофалйу, либо к аудиопотоку. Это почти, что «набор для полета фантазии», но с неприятными ограничениями. В частности, плейлисты подгружаются в момент запуска liquidsoap. Из директории попадают только несколько первых десятков файлов…

А вот в случае с потоком vecher уже совсем иная картинка. В этом варианте используется метод вызова внешнего скрипта, задача которого вернуть вашей станции, либо путь, либо ссылку на аудиофайл. Какими алгоритмами и методами вы будете это достигать, только ваше личное дело, и это самый настоящий «набор полета фантазии» без ограничений.

А в качестве домашнего задания, вы можете самостоятельно для себя расписать или рассказать, что содержится в блоке #Jingle playlist

На этом пока все. В следующий раз мы с вами будет соединять, объединять и выстраивать входные потоки. А пока мы готовим следующую статью, вы можете подготовить необходимые аудиоматериалы, составить плейлисты и даже попытаться написать простенький внешний скрипт.

Продолжение следует…

Создаем интернет-радио на Liquidsoap (Часть II): 2 комментария

Обсуждение закрыто.