Pi-Sonos v2.0 или эволюция интернет-радио на Raspberry Pi
Как известно, нет предела совершенству. Даже для самодельной портативной акустики, чья аудитория пользователей включает только одного человека. Весьма требовательного и местами маниакально упорного человека. После выхода первого поста про Pi-Sonos прошло почти 5 месяцев. За это время софт внутри этой акустики успел дважды кардинально поменяться. Поводом для изменений послужили как полезные советы хабравчан, так и собственный UX.
Pi-Sonos — это самодельная компактная акустика, на создание которой меня вдохновила Sonos Play 1. Задача этой акустики, прежде всего, была в том, чтобы воспроизводить музыку из интернет-радиостанций. При ее создании я поставил во главу угла минимализм и удобство: воткнул в розетку, а дальше в любом месте дома управляй музыкой со смартфона/компа/планшета.
Несмотря на то, что статья затрагивает тему разработки ПО, кода в ней нет, потому что цель статьи описать идею и функционал, а не процесс его реализации. Если тема кода будет интересна хабравчанам, я постараюсь осилить отдельную статью с описанием процесса разработки.
Изначально софтовой начинкой акустики был OSMC, но мудрые люди в комментариях обратили внимание на то, что Kodi (aka OSMC) — слишком жирно в качестве «мозгов» для интернет-радио станции. Слишком он умный и большой, только для аудио-проектов лучше подойдет Volumio. Собственно, все так и оказалось. Volumio легче, заточен под веб-интерфейс и имеет более продвинутый и удобный в разработке API. Также отпала необходимость в торчащем сзади кабеле HDMI, поскольку Volumio полностью настраивается в любом браузере.
Однако, и у Volumio обнаружилась пара важных недостатков, подвигнувших меня на дальнейшее исследование. Это, во-первых, время загрузки, и во-вторых, отсутствие автовоспроизведения. После изучения официальной документации (из которой можно понять, что Volumio — это надстройка над mpd (Music Player Daemon)), я решил, что пришло время написать на js собственную обертку под названием RPi-Radio, которая решала бы эти проблемы. Серверная ее часть работает на Node.js, а клиентская часть (GUI), использующая React.js, была готова еще со времен использования OSMC, ее нужно было только немного подправить. Так это выглядит на экране смартфона в настоящее время:
Ниже приведена табличка, наглядно показывающая недостатки и преимущества каждого из фреймворков.
Критерий | OSMC | Volumio | RPi-Radio |
---|---|---|---|
Время загрузки | 35 сек | 45 сек | 20 сек |
Автовоспроизведение при запуске | нет* | нет* | да |
Кол-во тапов из главного экрана «родного» GUI на смартфоне для выбора радиостанции из списка Favorite** | 5+1 скролл | 4 | 1 |
Необходимость в мониторе, клавиатуре и мыши*** | да | нет | нет |
Веб-управление | частичное | полное | частичное |
Редактирование списка станций | так себе | норм | так себе |
Удобство первоначальной настройки | так себе | отлично | средненько |
Интеграция с моим GUI для управления со смартфона | с костылями | с костылями | из коробки |
Удобство ежедневного использования | ☆ | ☆☆ | ☆☆☆ |
* на самом деле да, но надо делать костыль и подсовывать его автозагрузку Raspbian; в случае с OSMC костыль пишется на python, а в случае с Volumio — на js или bash. Но в обоих случаях оно все равно работает не так, как бы хотелось.
** для OSMC и Volumio это очень важные параметры, ведь все эти тапы-скроллы необходимо делать каждый раз при включении колонки. Для RPi-Radio этот параметр хоть и минимален, но все равно не так важен, поскольку колонка начинает играть сама при включении.
*** имеется ввиду физическое подключение монитора, клавиатуры и мыши к самой Raspberry Pi, т.е. те случаи, когда нет возможности обойтись встроенным веб-интерфейсом или подключением по ssh.
Автовоспроизведение присутствует в mpd из коробки, мне не пришлось ничего делать для его активации — удобно! В Volumio, хотя он и является оберткой mpd, эту функцию придушили ради красивого звука приветствия. Как я уже писал, можно сделать скрипт и положить его в автозагрузку. Аналогичная ситуация и у OSMC.
У OSMC большая часть взаимодействия с пользователем происходит через монитор: есть красивый интерфейс, возможность смотреть видео, картинки, читать новости и смотреть погоду — много всего, чего моя колонка никогда в жизни делать не будет.
А вот веб-управление у OSMC очень ограниченно, и удаленно даже нельзя настроить список любимых станций в плагине Radio — только через монитор. У Volumio — наоборот, все только через веб-интерфейс. Редактировать список станций удобнее всего в браузере на десктопе/лэптопе, но можно и на смартфоне при желании. У RPi-Radio через веб-интерфейс можно только выбирать станцию и регулировать звук. Список станций, да и вообще все остальное надо делать через консоль по ssh. Со списком станций сложнее всего: если у OSMC и Volumio есть свои обширные библиотеки интернет-радиостанций, то в RPi-Radio мне пришлось забивать адреса своих любимых станций вручную в формате JSON. Неудобно, но всего один (или несколько) раз в жизни.
С первоначальной настройкой хуже всего у OSMC. Сначала надо подключить к «малине» монитор и настроить плагин Radio, потом надо еще через консоль или по ssh настроить вывод звука на внешний ЦАП IQAudio (тот, что у платы Suptronics X400). У RPi-Radio настройка ЦАП такая же, но хотя бы все остальное делается тоже по ssh. Лидер в этой номинации, безусловно, Volumio — для вывода звука через внешний ЦАП надо просто в меню настроек выбрать соответствующий пункт из выпадающего списка. Сравнение есть даже на официальном сайте Suptronics (http://www.suptronics.com/xseries/x400.html)
GUI в RPi-Radio представляет собой простенькую веб-страничку, реализованную на React.js. Серверная часть, отвечающая за взаимодействие между клиентским GUI и mpd, работает на Node.js и представляет собой простенький HTTP- и WebSocket- сервер на базе связки Socket.io
+ http
+ express
. Она запускается на Raspbian в качестве сервиса при включении системы сразу после старта сервиса mpd и для управления mpd использует модуль mpc-js
. Клиентский GUI доступен любому браузеру в моей домашней сети просто по ip или hostname «малинки». Идеально.
Исходники RPi-Radio опубликованы на Github. В том же репозитории, в соответствующих бранчах, можно найти обе адаптации GUI для работы с OSMC и Volumio.
Результат моих экзерсисов, RPi-Radio, выходит за рамки простого дополнения к какой-то колонке, существующей в единственном экземпляре. Это в своем роде готовое решение, которое превращает в интернет-радиоприемник не только Raspberry Pi, но и любое устройство с аудио-выходом, доступом в Интернет и возможностью запуска mpd и Node.js. Основным достоинством такой системы является отсутствие всего лишнего. Собственно, как это сделано и в Sonos, в том идеале, который я стремлюсь достичь.