Представьте: утро на вашей радиостанции начинается с легкого джаза, днем играет энергичный рок, вечером — расслабляющий лоу-фай, а ночью — глубокий техно. Это базовая потребность любого уважающего себя радио. Но как это реализовать технически?
В классическом стеке Icecast + Liquidsoap задача кажется простой только на первый взгляд. Вы быстро понимаете, что ни Icecast, ни Liquidsoap не имеют встроенного планировщика. Всё, что у них есть — это возможность запуска разных скриптов в разное время. А это уже задача операционной системы, а не радио-сервера.
Мы пошли другим путем. В нашем решении на Go расписание — это первоклассный гражданин. Оно задается простым CSV-файлом, который можно редактировать прямо из админки. Без cron, без systemd таймеров, без перезапусков процессов. Давайте разберемся, почему это важно.
Классический подход: война с cron и демонами
Если вы когда-либо пытались сделать расписание на Icecast + Liquidsoap, вы знаете этот путь. Liquidsoap сам по себе не умеет переключать плейлисты по времени. Ему можно скормить один плейлист, и он будет играть его бесконечно. Чтобы сменить жанр в 6 утра, вам нужно:
-
Написать несколько конфигов Liquidsoap:
morning.liqдля джаза,day.liqдля рока,evening.liqдля лоу-фая. В каждом — свои пути к плейлистам, свои настройки громкости, свои джинглы. -
Настроить systemd-юниты для каждого:
Чтобы каждый процесс можно было запускать и останавливать отдельно. Это минимум три
.serviceфайла. -
Прописать cron-задачи:
0 6 * * * systemctl stop liquidsoap@night && systemctl start liquidsoap@morning0 19 * * * systemctl stop liquidsoap@morning && systemctl start liquidsoap@evening - Обеспечить бесшовность: Между остановкой одного процесса и запуском другого неизбежно возникает пауза. Слушатели слышат тишину. Чтобы этого избежать, нужно настраивать Liquidsoap на работу с двумя параллельными источниками и кроссфейдом — это уже высший пилотаж.
- Мониторить всё это: Если cron-задача не сработала (а такое бывает), радио будет играть ночной плейлист весь день. Вы узнаете об этом только когда слушатели напишут в чат.
Наш подход: расписание в CSV — это просто
Мы спроектировали наше решение так, чтобы расписание было встроено в ядро радио. Вам не нужны ни cron, ни systemd-юниты для каждого слота. Всё, что нужно — это один CSV-файл, который описывает, когда и что должно играть.
Формат файла расписания
Файл schedule.csv лежит в папке с данными и выглядит максимально просто:
start;end;mount 00:05;05:40;lofi 06:00;07:50;jazz 19:00;20:10;vecher 20:15;23:59;rock
Каждая строка — это временной слот:
- start — время начала (в формате HH:MM).
- end — время окончания (в формате HH:MM).
- mount — имя маунта (директории с треками), который должен играть в этот промежуток.
И всё. Сервер сам отслеживает текущее время, сравнивает с расписанием и в нужный момент переключает эфир на соответствующий плейлист.
Редактирование через админку
Да, вы можете править CSV вручную через SSH. Но мы добавили визуальный интерфейс прямо в админку радио.
- Табличное представление — все слоты расписания в виде удобной таблицы.
- Добавление слота — выбор времени и маунта через понятные элементы управления.
- Редактирование — меняйте время или маунт в любой строке.
- Удаление — убирайте ненужные слоты одним кликом.
После сохранения изменений расписание применяется мгновенно. Без перезапуска сервера, без остановки эфира.
Бесшовное переключение
Самое страшное в смене плейлистов — это пауза. Слушатели не должны слышать "щелчок" или тишину в момент переключения.
Наше решение устроено так:
- За 30 секунд до смены слота система начинает готовить новый плеер.
- В момент переключения происходит плавный кроссфейд между текущим треком и первым треком нового плейлиста.
- Слушатель слышит музыку без разрывов. Единственное, что меняется — стилистика треков.
Это работает для любых слотов. Даже если расписание меняется каждые 15 минут — эфир остается непрерывным.
Почему CSV — это удобно
Вы можете спросить: «Почему CSV, а не JSON, YAML или база данных?» Ответ прост:
- Человекочитаемость — вы открываете файл и сразу видите расписание. Никаких вложенных структур, скобок, кавычек.
- Редактирование любым инструментом — хотите править в Excel? Открыли CSV, отредактировали, сохранили. Хотите через админку — пожалуйста. Хотите скриптом — awk/sed справятся на ура.
- Контроль версий — положите schedule.csv в Git. Теперь у вас есть история всех изменений расписания за всё время.
- Без базы данных — одно зависимость меньше. Расписание работает даже если у вас нет MySQL или PostgreSQL.
- Простота бэкапов — копируете файл — и всё расписание сохранено.
Итог: расписание как инструмент, а не головная боль
Мы убеждены, что расписание эфира не должно требовать написания скриптов и правки конфигов системного уровня. Это задача контент-менеджера, а не системного администратора.
В нашем решении:
- Расписание хранится в простом CSV-файле.
- Редактируется через визуальную админку.
- Переключение происходит бесшовно, без пауз.
- Не требует cron, systemd таймеров или множества процессов.
Добавить новый слот — 30 секунд в админке. Изменить время начала вечернего эфира — 10 секунд. Сделать специальный плейлист на выходные — пара кликов.
Вы занимаетесь музыкой, а не настройкой демонов. Расписание работает на вас, а не вы на него.