YmuseGo и приложение-клиент для Music Player Daemon

Автор: Дмитрий Канн Чтение на 4 мин
Этот пост  на английском

Наконец-то могу рассказать, чем занимался последние три недели.

Провёл я их очень продуктивно: освоил новый перспективный язык программирования Go.

Освоил настолько, что написал на нём приложение-медиаплеер Ymuse или, точнее, клиент для Music Player Daemon.

Go Gopher поднимает бокал за здравие Ymuse.
Go Gopher поднимает бокал за здравие Ymuse.

Music Player Daemon

Сначала о том, что вообще такое Music Player Daemon (MPD).

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

Помимо воспроизведения звука, сервис этот внешне никак себя не проявляет. Чтобы им управлять, требуется специальная программа, которую традиционно называют клиентом, и этих клиентов есть десятки видов под разные платформы — от Windows до Wear OS.

Когда я впервые познакомился с такой концепцией разделения компонентов на невизуальный (воспроизводящий аудио) и визуальный, то был немного озадачен, однако довольно быстро осознал её удобство.

Как работает Music Player Daemon.
Как работает Music Player Daemon.

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

Нередко используется конфигурация, когда MPD крутится на микрокомпьютере типа Raspberry Pi, подключенном к колонкам, а управляют им с компьютера или через мобильное приложение.

Также MPD поддерживает плейлисты (списки воспроизведения) и стандартное стриминговое аудио, благодаря чему становятся доступны тысячи Интернет-радиостанций.

Кстати, в Линуксе есть смысл вместе с MPD сразу поставить пакет mpdris2, который свяжет его со стандартным интерфейсом медиаплеера MPRIS. Тогда демоном можно будет управлять стандартными медиа-клавишами (перемотка, пауза, стоп и т.д.).

Ymuse

Теперь о том, зачем, собственно, понадобился ещё один MPD-клиент.

В своё время я перепробовал несколько существующих клиентов и в итоге остановился на минималистичном Sonata, который практически полностью меня устраивал, за исключением пары моментов:

  • Неудобный вызов часто используемых мной функций через вложенные меню.
  • Неповоротливость с большим плейлистами (на несколько тысяч треков).

Последний пункт был следствием того, что Sonata написана на Python, который, как известно, не славится особой производительностью.

В общем, терпел я, терпел, и в конце концов не выдержал и написал свой клиент, который получил название Ymuse и иконку в виде бокала для мартини, напоминающего букву Y:

Иконка Ymuse.
Иконка Ymuse.

Go Go Go

Для реализации Ymuse я выбрал молодой, но многообещающий язык Go, разрабатываемый Google.

Go — язык со строгой типизацией, который нативно компилируется под огромное количество платформ и архитектур, от Linux до Android и от SPARC до ARM. Это делает его весьма перспективной заменой устаревшему и довольно неуклюжему C++.

Несмотря на то, что ему едва исполнилось 12 лет, рост его популярности в последние годы бьёт рекорды.

Go очень дружественен к программисту, синтаксисом напоминая Python, а также предоставляет поддержку многопоточности «из коробки».

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

Именно наличие двух готовых библиотек — gompd для коммуникации с MPD-демоном и gotk3, позволяющей работать с графическим интерфейсом GTK — сделало возможным создание практически полной функциональной копии Sonata за пару недель (!) работы по вечерам.

Для изучения Go есть отличный официальный курс A Tour of Go, где можно сразу же запускать примеры кода. Также очень порекомендую вот это видео, где за семь часов рассказывается обо всех основных аспектах языка:

<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
  <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/YS4e4q9oBaU?autoplay=0&controls=1&end=0&loop=0&mute=0&start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"
  ></iframe>
</div>

С моим плейлистом на 12K+ треков Ymuse работает визуально быстрее раза в два-три «Сонаты», и это ещё без каких-либо оптимизаций.

Версия Ymuse v0.7

На данный момент выпущена версия программы 0.7, которая выглядит так:

Ymuse v0.7.
Ymuse v0.7.

Пока что доступны бинарные сборки только под 64-битный Linux (.deb, .rpm и .tar.gz). Если будет потребность, добавлю и другие платформы.

Возможности

Список возможностей текущей версии:

  • Подключение к локальному или сетевому серверу MPD, автоматическое восстановление подключения.
  • Отображение очереди воспроизведения, сортировка по любому свойству, перемешивание, удаление треков из очереди.
  • Фильтрация очереди по подстроке.
  • Сохранение очереди в виде плейлиста (существующего или нового).
  • Просмотр и поиск по библиотеке MPD.
  • Просмотр списка плейлистов, удаление и переименование плейлиста.
  • Собственный список потоков (Интернет-радиостанций) с возможностью добавления, удаления и редактирования элементов.
  • Настройка отображаемых столбцов в списке воспроизведения.
  • Настройка отображаемого текста в плеере (используется синтаксис Go template).
  • Переключение режимов MPD (random, repeat и consume).
  • Перемотка трека в произвольное место.

Планы

В планах ещё довольно многое:

  • Автоматизированное тестирование интерфейса.
  • Поддержка мультиязычности. Готово!
  • Сборка в виде snap-пакета. Готово!
  • Загрузка изображения обложки альбома.
  • Просмотр библиотеки не только по файлам (а также по альбомам, исполнителям и т.д.). Готово!
  • Драг-н-дроп в очереди воспроизведения.
  • Больше настроек.
  • Поддержка нескольких соединений с разными MPD.

Некоторые вещи пока не удаётся реализовать из-за несовершенства вышеупомянутых библиотек, но, благодаря тому, что они на GitHub, можно будет прислать свои исправления. ■

Подписаться на обновления блога:

Комментарии

Поделиться: