Яндекс Музыка без Яндекса или сказ о том как я попробовал написать свой плеер для Яндекс музыки
Пролог: а не написать ли мне плеер?
Знаете это чувство, когда сидишь вечером, слушаешь музыку в веб-плеере, и вдруг что-то внутри шепчет: «А не написать ли мне свой клиент?» Обычно этот голос легко заглушить чаем и здравым смыслом. Но иногда — не получается.
Веб-плеер тормозит. Системные медиа-кнопки не работают. Окно живёт своей жизнью. А в голове уже крутится: «Да я же на C++ когда-то учился и умею. Ну, почти. С Qt разберусь. QML — это же просто декларативный JSON с амбициями. Что там сложного?»
И тут вспоминаешь главное: официальный клиент Яндекс Музыки есть только под Windows (ну, вроде как). А у меня — не Windows. И не у всех Windows. И это, пожалуй, лучшая мотивация, которая бывает.
Вот так и рождаются проекты вроде YaMusic — независимый десктопный клиент Яндекс Музыки на C++, Qt 6 и QML. macOS, Linux и Windows. Нативный код. Без Electron. И да, я до сих пор не уверен, было ли это хорошей идеей.
Глава первая: зачем вообще?
Резонный вопрос. Веб-версия есть. Официальный клиент есть ну только под Windows (лично не трогал, ничего сказать не могу). Зачем городить своё?
Причины, по которым люди берутся за такое, просты:
Официальный клиент есть только под Windows. А если у тебя macOS или Linux — извини, слушай в браузере. Это не дело.
Хочу нативное приложение. Не вкладку в браузере, которая жрёт память, как не в себя. Нативное окно, которое живёт отдельно и умеет в системные медиа-кнопки.
Зуд в пятой точке. Самая честная причина. «А слабо?» — и вот ты уже читаешь документацию к Qt Multimedia в три часа ночи.
Любопытство. Как устроен API Яндекс Музыки? Что за протокол Ynison? Почему история прослушиваний ведёт себя странно?
В моём случае — всё вместе. И немного самонадеянности.
Глава вторая: стек, или почему C++ и Qt
Первое решение, которое нужно принять, — на чём писать. Варианты:
Electron. Быстро, но это 400 МБ оперативки ради кнопки Play. И ты не программист, а сборщик веб-приложений.
Tauri. Стильно, модно, молодёжно, Rust. Но зависимость от системного вебвью — лотерея.
Python + PyQt. Проще, но распространять — боль. И производительность — как повезёт.
C++ + Qt 6 + QML. Нативно, быстро, кросс-платформенно. И если ты когда-то учил C++, то почему бы и нет?
Я выбрал последнее. И не жалею. Почти.
Qt 6 даёт всё: QMediaPlayer для воспроизведения, QML для интерфейса, CMake для сборки. QML — это декларативный язык, который выглядит как JSON, но с логикой. Интерфейс описывается в .qml-файлах, логика — в C++. Разделение чистое: QML рисует, C++ думает.
Глава третья: что получилось
Изначально я хотел простую вещь: поиск, «Моя волна» и пару личных плейлистов. Всё. Точка. Никаких амбиций на полноценный клиент.
Но стоило показать первую рабочую версию знакомым — и они подкинули идей. «А можно лайкать треки прямо из очереди?», «А почему нет плеера?», «А тёмную тему можно?» — и понеслось.
А дальше в дело вступил аппетит. Он, как известно, приходит во время еды. Сначала добавился поиск — и оказалось, что без страниц альбомов и исполнителей он бесполезен. Потом «Моя волна» — и стало понятно, что нужны рекомендации и недавно прослушанные. Потом плейлисты — и вот уже лайки, библиотека, чарты, жанры, новые релизы. Список фич рос быстрее, чем я успевал их реализовывать.
Вот что в итоге умеет YaMusic:
Авторизация
OAuth с сохранением токена между запусками. Получил ссылку в приложении, открыл в браузере, авторизовался, скопировал ссылку обратно — и всё. Токен сохраняется, живёшь дальше.
Контент
Поиск, «Моя волна», персональные рекомендации, плейлисты (свои и чужие), лайки, недавно прослушанные, альбомы, исполнители. Чарты России и мира (как по мне, одно и то же — не знаю, нужно ли кому это), жанры, новые релизы. Страницы альбомов, плейлистов, исполнителей и жанров.
Плеер
Единая очередь, автопереход на похожий контент. Подсветка текущего трека. Mini Player, Expanded Now Playing, перемотка, громкость. Dynamic Player Accent — интерфейс подстраивается под доминирующий цвет обложки трека. Тёмная и светлая темы. Решил использовать Catppuccin (а поцчему Ви спгашиваете?).
Тексты песен
С синхронизированной подсветкой строк. Лично я таких песен так и не нашёл, но API утверждает, что они есть. Чтошш, поверим на слово.
Системные медиа-кнопки
MPRIS (Linux), SMTC (Windows), MPRemoteCommandCenter (macOS). Управлять плеером можно с клавиатуры или из системного трея, не открывая окно.
Адаптивный интерфейс
Верхняя навигация, контекстная панель — какая-никакая. Всё ездит, всё подстраивается.
Глава четвёртая: Ynison, или как я узнал, что история прослушиваний — не для меня
А теперь самое интересное. И самое обидное.
YaMusic подключается к Яндекс Музыке по протоколу Ynison — долгоживущее WebSocket-соединение. Приложение регистрирует устройство-плеер, транслирует «сейчас играет» и состояние очереди, отправляет heartbeat прогресса и события завершения треков. Раздел «Недавно прослушанные» читается через /music-history.
Звучит здорово, да? Вот только есть нюанс.
Сервер Яндекса записывает треки в вашу историю только для сессий, инициированных официальными клиентами. Ни /play-audio, ни /plays, ни /queues, ни Ynison-статусы от неофициального клиента сервер в историю не засчитывает. События принимаются (200/ok), но не записываются.
Это как разговор с автоответчиком: ты говоришь, он кивает, но никто ничего не записывает.
То есть вы слушаете музыку, всё работает, треки играют, очередь едет. Но на этом всё — раздел «Недавно прослушанные» обновляется через веб-страницу, ну или через официальное приложение (возможно, передаёт ещё какие-то параметры). Обидно? Да. Так что пока оставлю реализацию на потом.
Глава пятая: сборка и установка
Готовые пакеты содержат Qt runtime — отдельная установка Qt не требуется. Пакеты собираются автоматически в GitHub Actions при пуше тега v*. Текущая версия v0.11.2
Для сборки из исходников нужны C++17, Qt 6 (Base, Quick, Multimedia), CMake и Ninja.
Ubuntu:
sudo apt install build-essential cmake ninja-build qt6-base-dev qt6-declarative-dev qt6-multimedia-dev
Arch Linux:
sudo pacman -S --needed base-devel cmake ninja qt6-base qt6-declarative qt6-multimedia
На остальные дистрибутивы, думаю, сами разберётесь — спросите у ИИ.
Дальше стандартно:
git clone https://github.com/andfriden/YaMusic.git
cd YaMusic
cmake -S . -B build
cmake --build build --parallel
Запуск:
Linux: ./build/appYaMusic
macOS: ./build/appYaMusic.app/Contents/MacOS/appYaMusic
Windows: .\build\Debug\appYaMusic.exe (сборка с --config Debug)
Эпилог: стоило ли оно того?
Хороший вопрос. Давайте честно.
Что получилось
Нативный десктопный клиент на C++ и Qt, который работает на трёх платформах — включая те, где официального клиента нет вообще.
Полноценный плеер с очередью, лайками, плейлистами, текстами песен и системными медиа-кнопками.
Симпатичный внешний вид и Dynamic Player Accent.
Что не получилось
История прослушиваний не синхронизируется с официальным приложением.
Рекомендации Яндекса не узнают о том, что вы слушали в YaMusic.
Приходится мириться с тем, что ты — неофициальный клиент, и сервер об этом помнит.
Стоило ли оно того?
Да. Потому что такие проекты — это не просто «альтернативный клиент». Это способ понять, как устроены современные API, WebSocket-протоколы и десктопная разработка. Это возможность увидеть, как один человек собирает полноценное приложение на C++ и Qt, не используя Electron и не жертвуя производительностью.
И да, это всё ещё C++. Смирись. Зато с Catppuccin.
















