Доброе утро!
Для получения возможности слушать музыку из своей коллекции где угодно, когда-то давно я организовал простое интернет-радио на базе Icecast+IceS. Через некоторое время это было забыто и потеряно. И вот я решил воспроизвести тот опыт. Посмотрим, как это можно сделать.
К решению поставлены следующие требования.
- Сервис должен транслировать музыку в виде потокового аудио, поддерживаемого DeadBeef (опционально -- VLC).
- Сервис должен поддерживать mp3 (99.7% моих файлов).
- Сервис должен работать в 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, получив простое интернет-радио, вещающее музыкальную коллекцию в сеть. Надеюсь, данная заметка принесёт кому-то пользу.
Все упомянутые хостнеймы, порты и пароли выдуманы, любое совпадение является случайным. ; )