Расписание эфира: CSV против cron и systemd таймеров

Как управлять переключением между плейлистами по времени без танцев с демонами и костыльных bash-скриптов.

Представьте: утро на вашей радиостанции начинается с легкого джаза, днем играет энергичный рок, вечером — расслабляющий лоу-фай, а ночью — глубокий техно. Это базовая потребность любого уважающего себя радио. Но как это реализовать технически?

В классическом стеке Icecast + Liquidsoap задача кажется простой только на первый взгляд. Вы быстро понимаете, что ни Icecast, ни Liquidsoap не имеют встроенного планировщика. Всё, что у них есть — это возможность запуска разных скриптов в разное время. А это уже задача операционной системы, а не радио-сервера.

Мы пошли другим путем. В нашем решении на Go расписание — это первоклассный гражданин. Оно задается простым CSV-файлом, который можно редактировать прямо из админки. Без cron, без systemd таймеров, без перезапусков процессов. Давайте разберемся, почему это важно.

Классический подход: война с cron и демонами

Если вы когда-либо пытались сделать расписание на Icecast + Liquidsoap, вы знаете этот путь. Liquidsoap сам по себе не умеет переключать плейлисты по времени. Ему можно скормить один плейлист, и он будет играть его бесконечно. Чтобы сменить жанр в 6 утра, вам нужно:

  1. Написать несколько конфигов Liquidsoap: morning.liq для джаза, day.liq для рока, evening.liq для лоу-фая. В каждом — свои пути к плейлистам, свои настройки громкости, свои джинглы.
  2. Настроить systemd-юниты для каждого: Чтобы каждый процесс можно было запускать и останавливать отдельно. Это минимум три .service файла.
  3. Прописать cron-задачи: 0 6 * * * systemctl stop liquidsoap@night && systemctl start liquidsoap@morning 0 19 * * * systemctl stop liquidsoap@morning && systemctl start liquidsoap@evening
  4. Обеспечить бесшовность: Между остановкой одного процесса и запуском другого неизбежно возникает пауза. Слушатели слышат тишину. Чтобы этого избежать, нужно настраивать Liquidsoap на работу с двумя параллельными источниками и кроссфейдом — это уже высший пилотаж.
  5. Мониторить всё это: Если cron-задача не сработала (а такое бывает), радио будет играть ночной плейлист весь день. Вы узнаете об этом только когда слушатели напишут в чат.
«Расписание в классическом стеке — это не "фича", а "инженерный челлендж". Вы тратите время не на подбор музыки, а на написание cron-правил и отладку systemd. А добавление нового временного слота превращается в копирование трех файлов и правку пяти строчек.»

Наш подход: расписание в 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

Каждая строка — это временной слот:

И всё. Сервер сам отслеживает текущее время, сравнивает с расписанием и в нужный момент переключает эфир на соответствующий плейлист.

Редактирование через админку

Да, вы можете править CSV вручную через SSH. Но мы добавили визуальный интерфейс прямо в админку радио.

  • Табличное представление — все слоты расписания в виде удобной таблицы.
  • Добавление слота — выбор времени и маунта через понятные элементы управления.
  • Редактирование — меняйте время или маунт в любой строке.
  • Удаление — убирайте ненужные слоты одним кликом.

После сохранения изменений расписание применяется мгновенно. Без перезапуска сервера, без остановки эфира.

Бесшовное переключение

Самое страшное в смене плейлистов — это пауза. Слушатели не должны слышать "щелчок" или тишину в момент переключения.

Наше решение устроено так:

  • За 30 секунд до смены слота система начинает готовить новый плеер.
  • В момент переключения происходит плавный кроссфейд между текущим треком и первым треком нового плейлиста.
  • Слушатель слышит музыку без разрывов. Единственное, что меняется — стилистика треков.

Это работает для любых слотов. Даже если расписание меняется каждые 15 минут — эфир остается непрерывным.

Почему CSV — это удобно

Вы можете спросить: «Почему CSV, а не JSON, YAML или база данных?» Ответ прост:

Итог: расписание как инструмент, а не головная боль

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

В нашем решении:

Добавить новый слот — 30 секунд в админке. Изменить время начала вечернего эфира — 10 секунд. Сделать специальный плейлист на выходные — пара кликов.

Вы занимаетесь музыкой, а не настройкой демонов. Расписание работает на вас, а не вы на него.

Управляйте эфиром по расписанию

Утренний джаз, дневной рок, вечерний лоу-фай — всё переключается автоматически. Без cron и bash-скриптов.

Попробовать DIY Радио с умным расписанием