angle-left

Домашнее радио: Icecast 2 + Ezstream

Доброе утро!

Для получения возможности слушать музыку из своей коллекции где угодно, когда-то давно я организовал простое интернет-радио на базе Icecast+IceS. Через некоторое время это было забыто и потеряно. И вот я решил воспроизвести тот опыт. Посмотрим, как это можно сделать.

К решению поставлены следующие требования.

  1. Сервис должен транслировать музыку в виде потокового аудио, поддерживаемого DeadBeef (опционально -- VLC).
  2. Сервис должен поддерживать mp3 (99.7% моих файлов).
  3. Сервис должен работать в Debian GNU/Linux.

Сервер потокового вещания

Для трансляции музыки необходим сервер потокового вещания. Здесь я вариантов не рассматривал, так как Icecast 2 удовлетворяет поставленным требованиям.

В репозиториях Debian Buster (используется у меня) имеется версия 2.4.4, в Stretch — 2.4.2. Соответственно, установка тривиальна:

# apt-get install icecast2

Далее его необходимо настроить. На просторах интернетов можно найти множество инструкций для связки Icecast+IceS в различных комбинациях их версий, из-за чего сразу разобраться может быть затруднительно. Приведу конфиг на основе своего, работающий на Icecast 2.4.4, с комментариями:

<icecast>
Информация о сервере
    <location>kk's laptop</location>
    <admin>kk@tune-it.ru</admin>
    <hostname>icecast.tune-it.ru</hostname>
    <fileserve>1</fileserve>

Настройки ограничений сервера, всё по-умолчанию
    <limits>
        <clients>100</clients>
        <sources>2</sources>
        <queue-size>524288</queue-size>
        <client-timeout>30</client-timeout>
        <header-timeout>15</header-timeout>
        <source-timeout>10</source-timeout>
        <burst-on-connect>1</burst-on-connect>
        <burst-size>65535</burst-size>
    </limits>

Настройки авторизации
    <authentication>
Пароль для подключения источника потока данных
        <source-password>hackme</source-password>
Пароль для релей-слейва. В данной статье роли не играет
        <relay-password>hackme</relay-password>

Логин/пароль администратора веб-интерфейса
        <admin-user>admin</admin-user>
        <admin-password>hackme</admin-password>
    </authentication>

Имя точки монтирования "по-умолчанию"
    <shoutcast-mount>/stream</shoutcast-mount>

Настройки сервера. Случаем любые соединения на порт 9090
    <listen-socket>
        <port>9090</port>
        <bind-address>0.0.0.0</bind-address>
        <shoutcast-mount>/stream</shoutcast-mount>
    </listen-socket>

Здесь можно прописать любые дополнительные заголовки.
Я оставил то, что предлагалось в конфиге, поставляемом в
Debian
    <http-headers>
        <header name="Access-Control-Allow-Origin" value="*" />
    </http-headers>

Настройка путей. Названия говорят за себя
    <paths>
        <alias source="/" destination="/status.xsl"/>
        <basedir>/</basedir>
        <webroot>/etc/icecast2/web</webroot>
        <adminroot>/etc/icecast2/admin</adminroot>
        <logdir>/var/log/icecast2/</logdir>
        <pidfile>/var/log/icecast2/icecast.pid</pidfile>
    </paths>

Логирование. Уровень от 4 (trace)
    <logging>
        <accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
        <playlistlog>playlist.log</playlistlog>
        <loglevel>3</loglevel>
        <logsize>10000</logsize>
    </logging>

Настройки безопасности. В случае, если сервер запущен от
пользователя root, то появляется возможность сделать
chroot (тут играет роль указанный выше basedir) и смениить
пользователя. Я сразу запускаю сервис от пользователя
icecast2, так что здесь этого не требуется
    <security>
        <chroot>0</chroot>
    </security>
</icecast>

Подробное описание всех настроек может быть найдено в документации, рекомендую ознакомиться. Сохранить это можно а /etc/icecast2/icecast.xml. Не забываем отнять права на чтение для "кого попало".

systemd-сервис создавать необходимости в данном случае нет, маинтейнеры Debian об этом позаботились.

Источник

Вот здесь всё несколько интересней. Выше я упомянул, что использовал ранее IceS. Поставил, настроил, обломался. С выходом его второй версии произошла неприятность -- сломали поддержку mp3. Но она осталась в IceS 0.4, исходники которого можно скачать на сайте. Что я и сделал.

А потом передумал.

Во-первых, мне не удалось собрать его с поддержкой flac. Это те самые 0.3%. Не критично, но заставило меня задуматься -- а хочу ли я переписывать конфиг IceS и использовать неподдерживаемый более софт?

Быстрый apt-cache search доложил о наличии в репозитории ezstream, Устанавливаем, открываем man-страницу. В один проход по ней получилось нечто следующего рода:

<ezstream>
Адрес Icecast
    <url>http://icecast.tune-it.ru:9090/stream</url>
Пароль авторизации источника
    <sourcepassword>hackme</sourcepassword>
Формат передаваемых данных
    <format>MP3</format>
Путь к плейлисту
    <filename>/path/to/playlist.txt</filename>
Флаг того, является плейлист программой. Если "1", то будет
произведён запуск, плейлист должен выдать путь к файлу
для вещания
    <playlist_program>0</playlist_program>
Перемешивать ли песни
    <shuffle>1</shuffle>
Мета-данные о канале
    <svrinfoname>Sex, Dugs, Brutal Metal</svrinfoname>
    <svrinfogenre>Rock</svrinfogenre>
    <svrinfodescription>Something about channel</svrinfodescription>
Настройки перекодирования. Мне не нужны.
    <reencode>
        <enable>0</enable>
    </reencode>
</ezstream>

Я сохранил его в /etc/icecast2/ezstream.xml. Тоже с правами 640 для icecast2:icecast. Для более подробной справки об опциях настроек читайте ezstream(1), там правда хорошо написано. /path/to/playlist.txt содержит (в моём случае) набор путей к mp3-файлам относительно рабочего каталога ezstream. Я его создал с помощью find . -name '*.mp3' и ручной фильтрации.

Запускать можно руками, указав данный конфиг, можно systemd-скриптом, подобного вида:

[Unit]
Description=ezstream
After=network.target

[Service]
Type=simple
PIDFile=/var/spool/ezstream/pid/master.pid
ExecStart=/usr/bin/ezstream -c /etc/icecast2/ezstream.xml
ExecStop=/bin/kill -SIGTERM $MAINPID
WorkingDirectory=/path/to/
User=icecast2
Group=icecast

[Install]
WantedBy=multi-user.target

Слушать музыку

Слушать музыку в плеерах с поддержкой потокового вещания теперь можно добавив поток по адресу http://icecast.tune-it.ru:9090/stream. Лично мной проверено в DeadBeef, VLC, VLC for Android.

Результаты

Сегодня мы настроили и запустили связку Icecast2+Ezstream, получив простое интернет-радио, вещающее музыкальную коллекцию в сеть. Надеюсь, данная заметка принесёт кому-то пользу.

Все упомянутые хостнеймы, порты и пароли выдуманы, любое совпадение является случайным. ; )