Я случайно сделал онлайн-радио и очень этим доволен

Не слишком длиннопост о том, как я делал инструмент для управления саундтреком тусовок, а сделал онлайн-радио.

Да, я использовал нейроарт для аватарки бота, чё вы мне сделаете
Да, я использовал нейроарт для аватарки бота, чё вы мне сделаете

Откуда такая идея?

У меня постоянная проблема: каждый раз, когда я прихожу на какую-нибудь встречу с друзьями, у нас всего одна колонка и много людей, которые хотят слушать разную музыку. Если упрощать, то можно представить три группы людей:

  • Условные девочки, которые хотят слушать Нервы, Кис-Кис и Слот
  • Условные мемологи, которые хотят слушать Акима Апачёва, гачи ремиксы и саундтреки из Pizza Tower
  • Остальные члены тусовки, которые очень просят первые две группы остановиться и включить что-нибудь нормальное, но получают решительный отпор

Разумеется, наличие всего одной колонки сильно усложняет дело, потому что телефон, который к ней подключён, начинают вырывать из рук друг друга, песни сменяются раз в минуту, ни одна из них не дослушивается до конца, а уютная тусовочка скатывается в срач о том, что все вокруг слушают говно.

Я, как относящийся к третьей группе людей человек, разумеется, страдаю от этого больше всего. Однажды, стоя в душе, я подумал о том, что в таком случае людям надо дать инструмент для управления плейлистами на вечеринках. Тогда саундтрек будет набираться самостоятельно -- все смогут послушать песни, которые захотят или наоборот, проголосовать за скип тех песен, которые им не нравятся.

Такое сделано в Spotify, но *что-то случилось* и его теперь нет в России. Возможно, какие-то кулибины тоже догадались сделать подобную хрень в виде бота для дискорда или ещё где-нибудь, но на первой странице гугла её не было -- так что я принялся за работу.

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

Как это работает?

Инструмент задумывался довольно простым в плане своего устройства:

  • Апи, через который можно было бы управлять плейлистом
  • Интерфейс управления для пользователей, использующий этот апи
  • Какая-то морда для прослушивания добавленной в плейлист музыки

В результате экспериментов оказалось, что в качестве морды проще всего сделать веб-страничку с большой кнопкой "Play", при нажатии на которую через HTML5 элемент <audio> запускался стрим музыки с бекенда на устройство. Это устройство может быть чем угодно -- ноут, стационарник, телефон -- лишь бы был браузер с обновлениями из последних 7-8 лет.

Веб-морда для того, кто подключён к колонке
Веб-морда для того, кто подключён к колонке

Из неожиданных, но приятных фич оказалось, что на некоторых устройствах воспроизведение автоматически синхронизируется, например, на айфонах. На одной из встреч с друзьями мы запустили музыку на колонке в центре комнаты и на куче телефонах в руках -- эффект очень необычный, как будто музыка повсюду и ты в неё погружён, а не просто фон из колонки.

Сам стрим ведётся через VLC -- выяснилось, что он умеет отдавать музыку через HTTP, так что при наличии подвязок к питону (а они, оказывается, есть!), реализовать стриминг оказалось почти тривиально.

Фронтом для пользователей проще всего оказалось сделать бота в телеге. Чтобы добавить песню, надо просто скинуть в чат с ботом ссылку на ютуб -- а бот уже сам сделает запрос к бекенду, который сам скачает видео с ютуба и поставит его в очередь.

Интерфейс бота в телеге
Интерфейс бота в телеге

Кроме очевидного добавления песен в очередь, можно посмотреть, что играет прямо сейчас (почти шазам, только лучше, потому что кроме ссылки и названия бот вернёт ещё и файл с песней!), глянуть, что будет дальше, посмотреть последние десять песен и начать голосование за скип песни. Если треть активных пользователей (тех, кто тыкает на кнопки) проголосует за скип, то песня промотается и включится следующая.

Кроме того, можно анонимно добавить песню в очередь. Я очень не хотел добавлять эту фичу, но моя девушка, которая любит кидать всякий кринж и потом злобно хихикать, настаивала. Плюс я как админ всё равно могу посмотреть в логах, кто это был и забанить его через отдельную ручку.

Опять же, и бот в телеге, и веб страничка -- это всего лишь примеры фронтов, так как единственная критическая часть приложения это апи. Остальное можно без проблем выкинуть и написать свои варианты интерфейса -- хоть отдельное приложение, хоть свой собственный PWA с чатом, красивым оформлением плейлиста, блекджеком и шлюхами.

Апи довольно простой, всего 9 ручек. Есть всё необходимое для админа -- например, возможность банить особо надоедливого юзера.

Фастапишная морда<br />
Фастапишная морда

Отдельно выделяются админские ручки "/start_party" и "/stop_party". Мотивация их добавления простая: на тусовке в какой-то момент все слишком сильно напьются, чтобы добавлять в плейлист музыку, пусть даже через *такой удобный* инструмент, как мой -- так что надо сделать какой-то фоллбек, чтобы музыка не выключалась.

Ручка "/start_party" принимает в себя ссылку на плейлист и имя хоста, а потом бекенд дёргает из этого плейлиста рандомные песни, если никто ничего не добавляет.

Обратная ей ручка"/stop_party", соответственно, завершает "тусовку", отправляя всем, кто зарегистрировался историю песен, сыгранных на тусовке и чистит состояние воспроизведения (историю, очередь, юзеров и плейлист тусовки). Исторически сложилось, что эту ручку я не использовал ни разу -- потому что когда я про неё вспоминал, у меня либо садился ноутбук, либо все уже давно спали, так что будить всех таким @all'ом было как-то нехорошо.

А что с радио?

Пару раз (с большим успехом!) использовав эту штуку на тусовках, я понял, что таскать с собой ноутбук, на котором всё хостится слишком сложно. То я забуду питалово, то сам ноутбук, то что-то сломается, то ещё что-то. Гораздо проще развернуть приложение на моём домашнем сервере, прокинуть через роутер порты в сеть и предложить подключаться к моему айпишнику.

Слушаю включённые кем-то другим Руки вверх -- Сказки перед парой в универе

Ну а раз оно на моём домашнем сервере, то что может быть проще, чем сунуть всё в докер, в докере сделать кронджоб, который будет переключаться между плейлистами раз в сутки и поставить его орать в проброшенный порт на роутере?

По факту, получилось интернет-радио, через которое можно слушать то, что предлагают другие люди или просто свои плейлисты. Я сделал коллекцию из 7x16 плейлистов на ютубе, сунул всё в скрипт и теперь раз в день, в 00:05 пластинка сменяется -- и музыка перестаёт надоедать.

Такой сетап позволяет включить в фоне станцию и без задалбывания слушать её во время работы или поездок в универ. Кроме того, поскольку инструменты доступны кому угодно, можно раскидывать ссылку на бота и на веб-морду по эйрдропу в метро или автобусе -- иногда незнакомые мне люди добавляют что-то в очередь, очень прикольно.

Как насладиться?

А очень просто. Вот тут можно послушать песенки, которые добавили другие:

А вот тут -- добавить что-то самому:

Я понимаю, что первым делом захочется закинуть рикролл, гачи или 10 часов криков лягушки, но не надо, пожалуйста. Дайте другим людям послушать музычку)

Для жалоб и предложений, я сделал чятик в телеге -- вряд ли он проживёт долго, штука экспериментальная и скорее всего всем быстро надоест, но вдруг что-то хорошее из этого выйдет:

Кроме того, если у вас есть комп и желание немного потыкаться, можете попробовать завести всё у себя и тоже организовывать своё радио или музыку на тусовках. Заодно поставьте звёздочку на гитхабе:

Инструкцию я прописал в ридми, вроде всё понятно и очевидно, нужен только докер и немного времени на проброс портов у себя на роутере.

Заходите на огонёк!

3636
12 комментариев

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

6
Ответить

Как-то очень давно на AzuraCast поднял. Вертится-крутится. Кушать не просит.
Грубо говоря готовая cms со всеми вытекающими для радива.
radio.crunchnplay.ru
Посмотри, может интересно будет. Можно развернуть в Докере.

1
Ответить

О, прикольно, примерно то, что надо от радио.

Но я, как уже написал, целился в другое немного, плюс, у меня на работе кодинговых тасок было очень мало, а кодить хотелось. Вот я и нашёл себе отдушину)

Ответить

Открыл, там какой-то ужасный гитарный рок запил из 70-ых, я уж думал что все кто это слушал уже давно перегной.

1
Ответить

Ну это Оззи так то…

Но вообще я просто накидал че было рядом чтобы в фоне было. Кидай свое в бота — заиграет современное.

Ответить

👍👍👍

Ответить