Не слишком длиннопост о том, как я делал инструмент для управления саундтреком тусовок, а сделал онлайн-радио.
Откуда такая идея?
У меня постоянная проблема: каждый раз, когда я прихожу на какую-нибудь встречу с друзьями, у нас всего одна колонка и много людей, которые хотят слушать разную музыку. Если упрощать, то можно представить три группы людей:
- Условные девочки, которые хотят слушать Нервы, Кис-Кис и Слот
- Условные мемологи, которые хотят слушать Акима Апачёва, гачи ремиксы и саундтреки из Pizza Tower
- Остальные члены тусовки, которые очень просят первые две группы остановиться и включить что-нибудь нормальное, но получают решительный отпор
Разумеется, наличие всего одной колонки сильно усложняет дело, потому что телефон, который к ней подключён, начинают вырывать из рук друг друга, песни сменяются раз в минуту, ни одна из них не дослушивается до конца, а уютная тусовочка скатывается в срач о том, что все вокруг слушают говно.
Я, как относящийся к третьей группе людей человек, разумеется, страдаю от этого больше всего. Однажды, стоя в душе, я подумал о том, что в таком случае людям надо дать инструмент для управления плейлистами на вечеринках. Тогда саундтрек будет набираться самостоятельно — все смогут послушать песни, которые захотят или наоборот, проголосовать за скип тех песен, которые им не нравятся.
Такое сделано в Spotify, но *что-то случилось* и его теперь нет в России. Возможно, какие-то кулибины тоже догадались сделать подобную хрень в виде бота для дискорда или ещё где-нибудь, но на первой странице гугла её не было — так что я принялся за работу.
TLDR что получилось: веб-страничка с бесконечным стримом музыки с ютуба и бот в телеге, через который можно эту музыку предлагать.
Как это работает?
Инструмент задумывался довольно простым в плане своего устройства:
- Апи, через который можно было бы управлять плейлистом
- Интерфейс управления для пользователей, использующий этот апи
- Какая-то морда для прослушивания добавленной в плейлист музыки
В результате экспериментов оказалось, что в качестве морды проще всего сделать веб-страничку с большой кнопкой «Play», при нажатии на которую через HTML5 элемент <audio> запускался стрим музыки с бекенда на устройство. Это устройство может быть чем угодно — ноут, стационарник, телефон — лишь бы был браузер с обновлениями из последних 7-8 лет.
Из неожиданных, но приятных фич оказалось, что на некоторых устройствах воспроизведение автоматически синхронизируется, например, на айфонах. На одной из встреч с друзьями мы запустили музыку на колонке в центре комнаты и на куче телефонах в руках — эффект очень необычный, как будто музыка повсюду и ты в неё погружён, а не просто фон из колонки.
Сам стрим ведётся через VLC — выяснилось, что он умеет отдавать музыку через HTTP, так что при наличии подвязок к питону (а они, оказывается, есть!), реализовать стриминг оказалось почти тривиально.
Фронтом для пользователей проще всего оказалось сделать бота в телеге. Чтобы добавить песню, надо просто скинуть в чат с ботом ссылку на ютуб — а бот уже сам сделает запрос к бекенду, который сам скачает видео с ютуба и поставит его в очередь.
Кроме очевидного добавления песен в очередь, можно посмотреть, что играет прямо сейчас (почти шазам, только лучше, потому что кроме ссылки и названия бот вернёт ещё и файл с песней!), глянуть, что будет дальше, посмотреть последние десять песен и начать голосование за скип песни. Если треть активных пользователей (тех, кто тыкает на кнопки) проголосует за скип, то песня промотается и включится следующая.
Кроме того, можно анонимно добавить песню в очередь. Я очень не хотел добавлять эту фичу, но моя девушка, которая любит кидать всякий кринж и потом злобно хихикать, настаивала. Плюс я как админ всё равно могу посмотреть в логах, кто это был и забанить его через отдельную ручку.
Опять же, и бот в телеге, и веб страничка — это всего лишь примеры фронтов, так как единственная критическая часть приложения это апи. Остальное можно без проблем выкинуть и написать свои варианты интерфейса — хоть отдельное приложение, хоть свой собственный PWA с чатом, красивым оформлением плейлиста, блекджеком и шлюхами.
Апи довольно простой, всего 9 ручек. Есть всё необходимое для админа — например, возможность банить особо надоедливого юзера.
Отдельно выделяются админские ручки «/start_party» и «/stop_party». Мотивация их добавления простая: на тусовке в какой-то момент все слишком сильно напьются, чтобы добавлять в плейлист музыку, пусть даже через *такой удобный* инструмент, как мой — так что надо сделать какой-то фоллбек, чтобы музыка не выключалась.
Ручка «/start_party» принимает в себя ссылку на плейлист и имя хоста, а потом бекенд дёргает из этого плейлиста рандомные песни, если никто ничего не добавляет.
Обратная ей ручка»/stop_party», соответственно, завершает «тусовку», отправляя всем, кто зарегистрировался историю песен, сыгранных на тусовке и чистит состояние воспроизведения (историю, очередь, юзеров и плейлист тусовки). Исторически сложилось, что эту ручку я не использовал ни разу — потому что когда я про неё вспоминал, у меня либо садился ноутбук, либо все уже давно спали, так что будить всех таким @all’ом было как-то нехорошо.
А что с радио?
Пару раз (с большим успехом!) использовав эту штуку на тусовках, я понял, что таскать с собой ноутбук, на котором всё хостится слишком сложно. То я забуду питалово, то сам ноутбук, то что-то сломается, то ещё что-то. Гораздо проще развернуть приложение на моём домашнем сервере, прокинуть через роутер порты в сеть и предложить подключаться к моему айпишнику.
Ну а раз оно на моём домашнем сервере, то что может быть проще, чем сунуть всё в докер, в докере сделать кронджоб, который будет переключаться между плейлистами раз в сутки и поставить его орать в проброшенный порт на роутере?
По факту, получилось интернет-радио, через которое можно слушать то, что предлагают другие люди или просто свои плейлисты. Я сделал коллекцию из 7×16 плейлистов на ютубе, сунул всё в скрипт и теперь раз в день, в 00:05 пластинка сменяется — и музыка перестаёт надоедать.
Такой сетап позволяет включить в фоне станцию и без задалбывания слушать её во время работы или поездок в универ. Кроме того, поскольку инструменты доступны кому угодно, можно раскидывать ссылку на бота и на веб-морду по эйрдропу в метро или автобусе — иногда незнакомые мне люди добавляют что-то в очередь, очень прикольно.
Как насладиться?
А очень просто. Вот тут можно послушать песенки, которые добавили другие:
А вот тут — добавить что-то самому:
Я понимаю, что первым делом захочется закинуть рикролл, гачи или 10 часов криков лягушки, но не надо, пожалуйста. Дайте другим людям послушать музычку)
Для жалоб и предложений, я сделал чятик в телеге — вряд ли он проживёт долго, штука экспериментальная и скорее всего всем быстро надоест, но вдруг что-то хорошее из этого выйдет:
Кроме того, если у вас есть комп и желание немного потыкаться, можете попробовать завести всё у себя и тоже организовывать своё радио или музыку на тусовках. Заодно поставьте звёздочку на гитхабе:
Инструкцию я прописал в ридми, вроде всё понятно и очевидно, нужен только докер и немного времени на проброс портов у себя на роутере.
Заходите на огонёк!