Наконец-то могу рассказать, чем занимался последние три недели.
Провёл я их очень продуктивно: освоил новый перспективный язык программирования Go.
Освоил настолько, что написал на нём приложение-медиаплеер Ymuse или, точнее, клиент для Music Player Daemon.
Music Player Daemon
Сначала о том, что вообще такое Music Player Daemon (MPD).
Он представляет собой сервис (на айтишном жаргоне демон), который работает в фоновом режиме в недрах компьютера и способен воспроизводить музыку или стриминговое Интернет-аудио (Интернет-радио).
Помимо воспроизведения звука, сервис этот внешне никак себя не проявляет. Чтобы им управлять, требуется специальная программа, которую традиционно называют клиентом, и этих клиентов есть десятки видов под разные платформы — от Windows до Wear OS.
Когда я впервые познакомился с такой концепцией разделения компонентов на невизуальный (воспроизводящий аудио) и визуальный, то был немного озадачен, однако довольно быстро осознал её удобство.
MPD берёт на себя управление музыкальной библиотекой (сканирование и индексирование аудиофайлов) и проигрывание файлов, а программу-клиента можно подобрать по вкусу. В такой архитектуре клиентов у MPD-демона может быть сколько угодно, причём они вообще могут располагаться на другом компьютере или даже мобильном телефоне — подключение к нему осуществляется по сетевому протоколу.
Нередко используется конфигурация, когда MPD крутится на микрокомпьютере типа Raspberry Pi, подключенном к колонкам, а управляют им с компьютера или через мобильное приложение.
Также MPD поддерживает плейлисты (списки воспроизведения) и стандартное стриминговое аудио, благодаря чему становятся доступны тысячи Интернет-радиостанций.
Кстати, в Линуксе есть смысл вместе с MPD сразу поставить пакет mpdris2
, который свяжет его со стандартным интерфейсом медиаплеера MPRIS. Тогда демоном можно будет управлять стандартными медиа-клавишами (перемотка, пауза, стоп и т.д.).
Ymuse
Теперь о том, зачем, собственно, понадобился ещё один MPD-клиент.
В своё время я перепробовал несколько существующих клиентов и в итоге остановился на минималистичном Sonata, который практически полностью меня устраивал, за исключением пары моментов:
- Неудобный вызов часто используемых мной функций через вложенные меню.
- Неповоротливость с большим плейлистами (на несколько тысяч треков).
Последний пункт был следствием того, что Sonata написана на Python, который, как известно, не славится особой производительностью.
В общем, терпел я, терпел, и в конце концов не выдержал и написал свой клиент, который получил название Ymuse и иконку в виде бокала для мартини, напоминающего букву Y
:
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, которая выглядит так:
Пока что доступны бинарные сборки только под 64-битный Linux (.deb
, .rpm
и .tar.gz
). Если будет потребность, добавлю и другие платформы.
Возможности
Список возможностей текущей версии:
- Подключение к локальному или сетевому серверу MPD, автоматическое восстановление подключения.
- Отображение очереди воспроизведения, сортировка по любому свойству, перемешивание, удаление треков из очереди.
- Фильтрация очереди по подстроке.
- Сохранение очереди в виде плейлиста (существующего или нового).
- Просмотр и поиск по библиотеке MPD.
- Просмотр списка плейлистов, удаление и переименование плейлиста.
- Собственный список потоков (Интернет-радиостанций) с возможностью добавления, удаления и редактирования элементов.
- Настройка отображаемых столбцов в списке воспроизведения.
- Настройка отображаемого текста в плеере (используется синтаксис Go template).
- Переключение режимов MPD (random, repeat и consume).
- Перемотка трека в произвольное место.
Планы
В планах ещё довольно многое:
- Автоматизированное тестирование интерфейса.
Поддержка мультиязычности.Готово!Сборка в виде snap-пакета.Готово!- Загрузка изображения обложки альбома.
Просмотр библиотеки не только по файлам (а также по альбомам, исполнителям и т.д.).Готово!- Драг-н-дроп в очереди воспроизведения.
- Больше настроек.
- Поддержка нескольких соединений с разными MPD.
Некоторые вещи пока не удаётся реализовать из-за несовершенства вышеупомянутых библиотек, но, благодаря тому, что они на GitHub, можно будет прислать свои исправления. ■
Комментарии