Skip to content

tglagcs/MiniYaMu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🎵 MiniYaMu

License: MIT Platform: Windows Python 3.14+ Unofficial API

Мини-плеер «Моей волны» Яндекс.Музыки, живущий в системном трее Windows.

Меню в трее
Меню в системном трее — всё управление в два клика
Окно плеера
Окно плеера: перемотка, громкость, скорость
(Ctrl+Shift+Alt+X)
Настройка хоткеев
Глобальные хоткеи — настраиваются под себя
Сравнение потребления памяти
Браузер с вкладкой Яндекс.Музыки — ~1 ГБ ОЗУ, MiniYaMu — ~226 МБ

Зачем это

Включаешь свою волну и сворачиваешь — без вкладки браузера, без полноразмерного окна Яндекс.Музыки на панели задач. Play/Pause, лайк/дизлайк, громкость и следующий трек — всё из иконки в трее.

Note

Это неофициальный клиент, использующий обратно-инженерный API Яндекс.Музыки через библиотеку yandex-music. Проект не аффилирован с Яндексом.

Возможности

  • Моя волна (user:onyourwave) — с полноценным фидбеком ротору (radioStarted, trackStarted, skip, trackFinished), как у настоящего клиента.

  • Максимальное качество звука — треки запрашиваются в lossless (FLAC), если он есть у трека и позволяет подписка; иначе — лучший доступный mp3/aac. С понижением качества до mp3 192 кбит/с, если основной запрос не удался.

  • Управление из трея — Play/Pause, следующий/предыдущий трек, лайк, дизлайк, выход. «Предыдущий» ходит по локальной истории прослушанного, не трогая ротор — можно свободно вернуться назад и снова уйти вперёд без лишних запросов к Яндексу. Повторное нажатие «Нравится» снимает лайк (дизлайк для этого не годится — он скипает трек и учит Яндекс его не рекомендовать). Дизлайк тоже отменяем: трек после «Не нравится» скипается, но если вернуться к нему по истории (⏮), пункт меню превратится в «↩ Убрать дизлайк». Все действия сразу подтверждаются мини-плашкой снизу экрана (❤/💔/👎/↩/⏭/⏮) — переключение трека занимает пару секунд на загрузку, и без мгновенного отклика легко подумать, что нажатие не сработало.

  • Окно плеера (Ctrl+Shift+Alt+X или «🎛 Плеер» в трее) — всё в одном: текущий трек, перемотка (мм:сс), громкость и скорость воспроизведения. Хоткей работает как переключатель — открыть/закрыть. Громкость и скорость сохраняются в config.json и восстанавливаются при следующем запуске.

  • Скорость воспроизведения — от 0.5x до 2.0x. Питч меняется вместе со скоростью (как на старой кассете/пластинке при смене скорости), а не сохраняется независимо — так и звучит естественнее, и не нужен тяжёлый time-stretch.

  • Громкость колесом мыши — зажми Ctrl+Shift+Alt и крути колесо где угодно (иконки трея Windows не отдают прокрутку сторонним приложениям, поэтому это глобальный хоткей, а не наведение на иконку) — ±5% за щелчок. Вместо тоста — мини-плашка снизу экрана с процентом и полоской, обновляется вживую и сама гаснет через паузу.

  • Хоткеи с клавиатуры — глобальные, работают из любого окна:

    • Ctrl+Shift+Alt+Q — предыдущий трек
    • Ctrl+Shift+Alt+E — следующий трек
    • Ctrl+Shift+Alt+W — пауза / продолжить
    • Ctrl+Shift+Alt+X — открыть/закрыть окно плеера
    • Ctrl+Shift+Alt+D — ускорить на 5%
    • Ctrl+Shift+Alt+A — замедлить на 5%
    • Ctrl+Shift+Alt+S — сбросить скорость до 1.0x

    Настраиваются под себя через пункт «⌨ Хоткеи» в трее — там же кнопка записи новой комбинации; сохраняются в config.json и подхватываются сразу без перезапуска. Громкость колесом мыши (см. выше) туда не входит — это отдельный механизм (глобальный хук мыши, а не клавиатуры), поэтому комбинация Ctrl+Shift+Alt+колесо для неё фиксированная.

  • Тёмная тема — окно авторизации, окна плеера и хоткеев, всплывающее меню трея. Скруглённые кнопки и слайдеры со сглаживанием (рендер через Pillow — сам tkinter такого не умеет).

  • Уведомления — всплывающий тост с исполнителем и названием при смене трека.

  • Авторизация без паролей — официальный OAuth Device Flow Яндекса: код на экране, подтверждение на ya.ru/device, токен сохраняется автоматически.

Авторизация и данные

При первом запуске main.py сам откроет диалог с кодом устройства и браузер на странице Яндекса — пароль нигде вводить не нужно, только подтверждение входа в уже открытой сессии аккаунта. Полученный токен сохраняется в config.json и переиспользуется при следующих запусках; если он "протухнет", авторизация запустится заново автоматически.

Списки лайкнутых/дизлайкнутых треков кэшируются в likes_cache.json рядом с конфигом: при запуске они доступны мгновенно из файла, а с сервером сверяется только номер ревизии — полный список не перекачивается, пока в нём что-то не изменится (например, лайк с другого устройства).

Important

config.json содержит токен вашего аккаунта Яндекса — по чувствительности это как пароль. Файл уже в .gitignore, но проверьте перед тем, как публиковать форк.

Технологии

  • Python 3.14
  • yandex-music — неофициальная библиотека для API Яндекс.Музыки (авторизация, ротор, треки).
  • pystray + Pillow — иконка и меню в трее.
  • pygame-ce — воспроизведение аудио прямо из памяти, без временных файлов.
  • tkinter — окна авторизации, громкости, перемотки, скорости и хоткеев.
  • pycryptodome — расшифровка AES-CTR потоков из get-file-info (эндпоинт, которым мобильные и десктоп-клиенты запрашивают lossless).
  • PyAV — единая точка декодирования: любой контейнер/кодек (mp3, flac, flac-mp4 — FLAC, упакованный во фрагментированный MP4 для адаптивной раздачи, обычный формат lossless в роторе) декодируется в сырой PCM и играется через pygame.mixer.Sound/Channel, а не потоково через mixer.music — это и даёт перемотку с произвольной позиции, и скорость воспроизведения (ресемплинг с "враньём" про частоту даёт естественный питч, едущий вместе со скоростью).
  • ctypes + WH_MOUSE_LL / WH_KEYBOARD_LL — глобальные низкоуровневые хуки мыши и клавиатуры для хоткеев громкости и управления плеером. Без сторонних зависимостей, только user32.dll.

Установка и запуск

pip install -r requirements.txt
python main.py

Либо запустите run.bat — он стартует плеер через pythonw (без окна консоли) и сразу закрывается сам, оставляя работать только иконку в трее.

Portable exe

Готовый MiniYaMu.exe (~56 МБ, самодостаточный, Python не нужен) лежит в Releases — собирается автоматически GitHub Actions на каждый тег v*. Либо соберите сами:

pip install pyinstaller
pyinstaller --noconfirm --onefile --noconsole --name MiniYaMu --icon icon.ico main.py

Готовый файл появится в dist\MiniYaMu.exe — можно закинуть куда угодно и запускать. В отличие от запуска из исходников, exe хранит config.json (токен, громкость, хоткеи) и likes_cache.json в %APPDATA%\MiniYaMu — рядом с exe писать нельзя (он может лежать в защищённой от записи папке).

Warning

yandex-music работает поверх неофициального, обратно-инженерного API — Яндекс может в любой момент поменять бэкенд и что-то сломать без предупреждения (так уже случалось с форматом фидбека ротору). Используйте на свой страх и риск.

Лицензия

MIT © 2026 tglagcs

About

🎶 Мини-плеер «Моей волны» Яндекс.Музыки в системном трее Windows.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages