29 June 2010

Поднимаем очередное интернет-радио

Lumber room
Но не простое, а более-менее автоматизированное.
Делать мы будем круглосуточное радио с периодическими вещаниями диджеев, автоматическим созданием low-потока и записью эфиров.
Не смотря на то, что используемые решения довольно тривиальны, топик призван в первую очередь эти тривиальные решения увидеть.

Для дела этого нам понадобятся лишь mpd и icecast. Я не буду рассматривать их установку и общую настройку, ибо первое тривиально, а для второго поставляются конфиги-примеры.

Будем считать, что вы это уже сделали.


Задача нулевая: подготовка.

Нам понадобится три маунтпоинта в айскасте. Определим их:
<mount>
<mount-name>/mpd.ogg</mount-name>
</mount>
<mount>
<mount-name>/radio_high.ogg</mount-name>
</mount>
<mount>
<mount-name>/radio_low.ogg</mount-name>
</mount>

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

Задача первая: круглосуточное вещание с периодическими эфирами диджеев.

Нам нужно, чтобы слушателям не нужно было переподключаться каждый раз, когда начинается/заканчивается эфир. Сделать это в айскасте очень просто: fallback-mount.
Приведем наш конфиг маунтов в айскасте к такому виду:
<mount>
<mount-name>/mpd.ogg</mount-name>
</mount>
<mount>
<mount-name>/radio_high.ogg</mount-name>
<fallback-mount>/mpd.ogg</fallback-mount>
<fallback-override>1</fallback-override>
</mount>
<mount>
<mount-name>/radio_low.ogg</mount-name>
<fallback-mount>/mpd.ogg</fallback-mount>
<fallback-override>1</fallback-override>
</mount>

С помощью fallback-mount мы указали айскасу отдавать клиентам поток /mpd.ogg при отсутствии вещания на /radio_low.ogg и /radio_high.ogg.
А флаг fallback-override позволяет возвращать клиентов на этот маунт при начале вещания на него.
Очень просто, не так ли?

Все вроде хорошо, но не все диджеи могут позволить себе вещать в два потока, да и не очень это удобно.

Задача вторая: автоматическое создание low-потока.

Для этого мы будем использовать тот же mpd, но напишем для него новый конфиг. Нужно будет изменить как минимум пути до библиотеки, плейлистов и pid-файла, дабы не возникало конфликтов между двумя копиями mpd. Вывод надо будет направить на маунт /radio-low.ogg айскаста. Теперь нам осталось лишь запустить новую копию mpd с этим конфигом и добавить в плейлист адрес high-потока радио. Таким образом мпд, как и любой другой клиент, получает либо вещание с основного мпд, либо эфир диджея, перекодирует и отправляет на low-поток. Problem solved.

Задача последняя: автоматическая запись эфира.

Айскаст поддерживает запись потока в файл. К сожалению, он не умеет сам разделять файлы, и потому при каждом новом эфире старый файл будет перезаписан. К счастью, он умеет выполнять скрипты при старте/окончании вещания.
Записывать нам нужно лишь high-поток, поскольку диджеи вещают только на него.
Слегка исправим конфиг айскаста:
<mount>
<mount-name>/mpd.ogg</mount-name>
</mount>
<mount>
<mount-name>/radio_high.ogg</mount-name>
<fallback-mount>/mpd.ogg</fallback-mount>
<fallback-override>1</fallback-override>
<dump-file>/tmp/radio_high.ogg</dump-file>
<on-disconnect>/path/to/my/script/stend.pl</on-disconnect>
</mount>
<mount>
<mount-name>/radio_low.ogg</mount-name>
<fallback-mount>/mpd.ogg</fallback-mount>
<fallback-override>1</fallback-override>
</mount>

Мы указали, куда записывать поток и какой скрипт выполнять по окончании вещания.
Рекомендую именовать файл для дампа по имени маунт-поинта, потому как скрипту параметром передается именно маунт-поинт.
Осталось только написать этот скрипт:
#!/usr/bin/env perl
use strict;
use warnings;
use DateTime;

my $path="/path/to/my/archive/";
my $mn=$ARGV[0];
$mn=~s|/||;
my $dt=DateTime->now;
my $dmy = $dt->dmy('_');
my $fname=$path.$dmy."_".time()."_".$mn;
`mv /tmp/$mn $fname`;

Все, что делает скрипт — перемещает файл дампа в каталог, заданный в $path, именуя по текущей дате и имени потока.

Вот, собственно, и всё. Ежели сообществу будет интересно, то в следующей статье я расскажу, как сделать уведомление о текущих треках и эфирах с помощью бота в jabber-конференции.
Tags:mpdicecastradiohowto
Hubs: Lumber room
+11
2k 24
Comments 12
Popular right now
Python для анализа данных
December 2, 202019,000 ₽SkillFactory
Профессия Product Manager
December 2, 2020108,500 ₽Нетология
Профессия Data Scientist
December 2, 2020135,000 ₽SkillFactory
Профессия Project Manager
December 2, 202098,000 ₽Нетология
Разработка приложений на Kotlin
December 2, 202020,900 ₽Нетология