Управление эфиром через лайки: почему Liquidsoap здесь бессилен

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

Представьте ситуацию: в эфире играет трек, который явно «залетел». Слушатели в чате пишут восторженные комментарии, нажимают кнопку «❤️» в плеере. Было бы логично, если бы этот трек заиграл чаще, верно? Или наоборот — трек вызывает отторжение, и аудитория дружно ставит дизлайк. Может, стоит убрать его из ротации на пару дней?

В современном радио такой сценарий кажется очевидным. Но когда вы работаете с классическим стеком Icecast + Liquidsoap + ices2, вы быстро понимаете: эфир — это улица с односторонним движением. Поток идет от источника к слушателю, но не наоборот.

Многие задают вопрос: «А можно ли сделать, чтобы лайки влиять на ротацию? Наверное, Liquidsoap умеет?» Ответ короткий: нет, не умеет. Давайте разберемся, почему классические инструменты бессильны перед этой задачей и как мы реализовали эту логику в нашем DIY Радио.

Почему Liquidsoap не спасет: архитектурный потолок

Liquidsoap — это мощнейший инструмент для создания аудиопотоков. Он умеет микшировать, транскодировать, вставлять джинглы, работать с кроссфейдом. Но есть одно «но».

  1. Liquidsoap — это «слепой» процесс: Он читает плейлист из файла или базы данных, но не имеет встроенного механизма получения обратной связи из внешнего мира в реальном времени. Конечно, вы можете написать скрипт, который будет модифицировать файл playlist.txt на лету, но Liquidsoap об этом не узнает, пока вы не отправите команду liquidsoap 'reload(playlist)'. Это уже не «реалтайм», это «костыль».
  2. Нет HTTP-сервера внутри: Чтобы принимать лайки с сайта, вам нужен веб-эндпоинт. Liquidsoap — это просто аудиопроцессор, а не веб-сервер. Придется поднимать отдельное приложение (Node.js, Python, PHP), которое будет:
    • Принимать POST-запросы с лайками от плеера.
    • Складывать их в базу данных или Redis.
    • Периодически дергать Liquidsoap через его telnet-интерфейс, чтобы обновить веса треков.

    Это три дополнительных компонента, которые нужно поддерживать, мониторить и дебажить.

  3. Ротация через «веса» — это боль: Liquidsoap поддерживает weighted playlist, где у каждого трека есть числовой вес. Чем выше вес, тем чаще он играет. Теоретически, вы можете менять эти веса через telnet. Но представьте, что нужно сделать это для библиотеки из 1000 треков, синхронизировать с голосованиями сотен слушателей и при этом не сломать текущий эфир. Это задача уровня «написать свой менеджер очереди», а не «настроить радио за вечер».
«Классический стек не просто не умеет управляться лайками — он архитектурно сопротивляется этому. Icecast отдает аудио, Liquidsoap его формирует, а обратная связь остается где-то снаружи, в лучшем случае — в логах веб-сервера. Чтобы соединить эти миры, вам придется стать инженером по интеграции, а не радиоведущим.»

Как это работает у нас: эфир, который слышит аудиторию

В нашем DIY Радио функционал управления эфиром через лайки — это не «надстройка», а часть ядра. Мы изначально проектировали систему так, чтобы плеер на сайте и серверный движок были связаны двусторонней связью.

Вот как выглядит полный цикл:

  1. Слушатель нажимает кнопку в плеере: На сайте установлен наш фирменный плеер. Когда пользователь ставит лайк или дизлайк текущему треку, плеер отправляет AJAX-запрос на встроенный API нашего DIY Радио.
  2. DIY Радио принимает и анализирует: Мы получаем данные: {"track_id": "song_123", "action": "like", "mount": "/rock"}. Внутри системы работает механизм накопления голосов. Мы не дергаем очередь после каждого клика (это было бы нестабильно), а накапливаем статистику в памяти с использованием счетчиков с временным окном.
  3. Автоматическое изменение ротации: У каждого трека в базе есть поле rotation_weight (базовый вес ротации). Когда количество лайков для трека превышает пороговое значение (например, 2 лайка за последние 10 минут), система автоматически увеличивает вес этого трека. И наоборот: дизлайки уменьшают вес.
  4. Плеер получает команду на следующий цикл: Плеер (через WebSocket или при следующем запросе метаданных) узнает, что трек «залайкан» сообществом. Это создает эффект живого взаимодействия: слушатели видят, что их голос влияет на эфир.

Простая логика, мощный результат

Мы не стали усложнять. Алгоритм ротации работает по прозрачным правилам:

  • 2 лайка → +1 к весу ротации (трек будет играть чаще).
  • 6 лайков → +3 к весу, трек помечается как «хит».
  • 3 дизлайка → трек уходит в «тихий список» (играет не чаще 1 раза в сутки).

Все пороги настраиваются в конфиге. Хотите, чтобы трек улетал в топ после одного лайка? Пожалуйста. Хотите более консервативную ротацию — меняйте параметры.

Никаких внешних зависимостей

В отличие от связки «Liquidsoap + Redis + Python-скрипты + cron», у нас всё работает внутри одного процесса.

  • Встроенный HTTP API — принимает лайки напрямую.
  • Встроенный менеджер очереди — динамически пересчитывает веса.
  • Единый конфиг — все правила ротации в одном файле.
  • Журналирование — видно, какой трек и когда получил лайки, как изменилась ротация.

Реальный сценарий: почему это меняет правила игры

Представьте, что вы вещаете радио для узкой аудитории — например, фанатов инди-рока. К вам приходит новый слушатель, ставит лайк на треке неизвестной группы. Через 15 минут этот трек играет снова, потому что алгоритм заметил интерес. Слушатель чувствует: «меня здесь слышат».

В классическом Icecast+Liquidsoap для этого нужно было бы:

Срок реализации: от недели до месяца, в зависимости от квалификации.

В нашем решении эта функциональность включается одной строкой в конфиге:

[radio]
enable_voting = true
like_threshold = 2
dislike_threshold = 3
weight_increment = 1

Всё. Остальное берет на себя Go-приложение. Плеер на сайте уже умеет отправлять лайки — он идет в комплекте.

Итог: от одностороннего вещания к диалогу

Liquidsoap — это гениальный инструмент для своей эпохи. Он решает задачи микширования и транскодинга лучше многих коммерческих аналогов. Но его архитектура заточена под сценарий «взял плейлист → отдал поток». В мире, где радио конкурирует с плейлистами Яндекс.Музыки и алгоритмами, обратная связь со слушателями становится не «плюшкой», а необходимостью.

Мы встроили эту логику прямо в ядро нашего плеера и сервера. Теперь:

И главное: вам не нужно быть инженером по распределенным системам, чтобы это запустить. Достаточно установить наше решение и включить пару галочек в настройках. Остальное сделает DIY Радио.

Сделайте эфир живым

Позвольте вашим слушателям влиять на ротацию. Радио, которое слышит аудиторию, всегда побеждает.

Попробовать радио с умной ротацией