Pi-Sonos v2.0 или эволюция интернет-радио на Raspberry Pi

Как известно, нет предела совершенству. Даже для самодельной портативной акустики, чья аудитория пользователей включает только одного человека. Весьма требовательного и местами маниакально упорного человека. После выхода первого поста про Pi-Sonos прошло почти 5 месяцев. За это время софт внутри этой акустики успел дважды кардинально поменяться. Поводом для изменений послужили как полезные советы хабравчан, так и собственный UX.
Немного истории для тех, кому лень читать или кто уже забыл первую статью

Pi-Sonos – это самодельная компактная акустика, на создание которой меня вдохновила Sonos Play 1. Задача этой акустики, прежде всего, была в том, чтобы воспроизводить музыку из интернет-радиостанций. При ее создании я поставил во главу угла минимализм и удобство: воткнул в розетку, а дальше в любом месте дома управляй музыкой со смартфона/компа/планшета.

О чем эта статьяПрежде всего, об упорстве и любознательности на пути к идеалу. Под катом, username, не будет ни решения какой-то глобальной проблемы, ни описания новой уникальной технологии. В статье, всего лишь, излагается сравнение популярных медиа-центров для Raspberry Pi, раскрываются их достоинства и недостатки, а также мое персональное видение оптимального фреймворка для интернет-радиоприемника. По сути, прорабатывая собственный софт для колонки, я всего лишь частично повторил путь создателей Volumio, просто реализовав с нуля всего одну из его функций (читай: “изобрел очередной велосипед”).
Несмотря на то, что статья затрагивает тему разработки ПО, кода в ней нет, потому что цель статьи описать идею и функционал, а не процесс его реализации. Если тема кода будет интересна хабравчанам, я постараюсь осилить отдельную статью с описанием процесса разработки.

Изначально софтовой начинкой акустики был OSMC, но мудрые люди в комментариях обратили внимание на то, что Kodi (aka OSMC) – слишком жирно в качестве «мозгов» для интернет-радио станции. Слишком он умный и большой, только для аудио-проектов лучше подойдет Volumio. Собственно, все так и оказалось. Volumio легче, заточен под веб-интерфейс и имеет более продвинутый и удобный в разработке API. Также отпала необходимость в торчащем сзади кабеле HDMI, поскольку Volumio полностью настраивается в любом браузере.

Однако, и у Volumio обнаружилась пара важных недостатков, подвигнувших меня на дальнейшее исследование. Это, во-первых, время загрузки, и во-вторых, отсутствие автовоспроизведения. После изучения официальной документации (из которой можно понять, что Volumio — это надстройка над mpd (Music Player Daemon)), я решил, что пришло время написать на js собственную обертку под названием RPi-Radio, которая решала бы эти проблемы. Серверная ее часть работает на Node.js, а клиентская часть (GUI), использующая React.js, была готова еще со времен использования OSMC, ее нужно было только немного подправить. Так это выглядит на экране смартфона в настоящее время:


Ниже приведена табличка, наглядно показывающая недостатки и преимущества каждого из фреймворков.
КритерийOSMCVolumioRPi-RadioВремя загрузки35 сек45 сек 20 сек Автовоспроизведение при запускенет* нет* да Кол-во тапов из главного экрана «родного» GUI на смартфоне для выбора радиостанции из списка Favorite**5+1 скролл 4 1 Необходимость в мониторе, клавиатуре и мыши***да нет нет Веб-управлениечастичноеполноечастичноеРедактирование списка станцийтак себенормтак себеУдобство первоначальной настройкитак себеотличносредненькоИнтеграция с моим GUI для управления со смартфонас костылямис костылямииз коробкиУдобство ежедневного использования☆☆☆☆☆☆* на самом деле да, но надо делать костыль и подсовывать его автозагрузку Raspbian; в случае с OSMC костыль пишется на python, а в случае с Volumio — на js или bash. Но в обоих случаях оно все равно работает не так, как бы хотелось.
** для OSMC и Volumio это очень важные параметры, ведь все эти тапы-скроллы необходимо делать каждый раз при включении колонки. Для RPi-Radio этот параметр хоть и минимален, но все равно не так важен, поскольку колонка начинает играть сама при включении.
*** имеется ввиду физическое подключение монитора, клавиатуры и мыши к самой Raspberry Pi, т.е. те случаи, когда нет возможности обойтись встроенным веб-интерфейсом или подключением по ssh.Под этим спойлером спрятано подробное пояснение каждого из пунктов сравнения.Время загрузки 20 секунд – это, по моему мнению, минимум, который можно достичь, не погружаясь в дебри оптимизации Raspbian под этот проект. Именно столько времени требуется «малинке», чтобы загрузить ОС и запустить сервис mpd. Вероятно, этот результат может быть улучшен, если заменить microSDHC на microSDXC с большей скоростью чтения/записи (проверю при возможности). Удивительно, но Volumio, притворяющийся легким и шустрым, грузится дольше монстра-комбайна OSMC. 45 секунд ожидания находятся за порогом комфортной эксплуатации, и это было основной причиной ухода от Volumio.

Автовоспроизведение присутствует в 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, в том идеале, который я стремлюсь достичь.