← all projects

yandex-music-client

неофициальный десктоп клиент яндекс музыки на tauri и vue: эквалайзер, обход цензуры, discord rich presence, загрузка треков и совместное прослушивание

github
mashiro

mashiro

неофициальный десктоп-клиент яндекс музыки на tauri 2 и vue 3

версия статус лицензия платформы

tauri vue typescript rust

последний коммит звёзды issues

скриншот mashiro

ооо "яндекс" к проекту отношения не имеет.

стек

  • фронтенд: vue 3 (composition api, script setup), typescript, quasar, pinia, vue router, vite
  • бэкенд: rust, tauri 2, reqwest, serde, tokio

возможности

авторизация

  • вход по готовому oauth-токену яндекса
  • вход через встроенное окно авторизации с перехватом токена из редиректа
  • токен хранится локально и подставляется в заголовки запросов на стороне rust
  • выход из аккаунта с очисткой токена и локальных кешей

воспроизведение

  • очередь воспроизведения с перемешиванием и тремя режимами повтора
  • кроссфейд с настраиваемой длительностью
  • подрезание тишины в конце трека
  • регулировка скорости воспроизведения
  • восстановление очереди, текущего трека и позиции после перезапуска
  • отдельный переключатель автозапуска восстановленного трека

моя волна

  • отдельная страница персональной радиостанции "моя волна"
  • лайк, дизлайк и переход к следующему треку прямо из волны
  • обратная связь уходит в яндекс, поток подстраивается под оценки

обход цензуры

  • если для трека есть незацензуренная версия в базе fckcensordata, играет она
  • включено по умолчанию, отключается в настройках, раздел "поведение"
  • когда обход выключен, список не загружается и подмена не применяется ни при воспроизведении, ни при предзагрузке
  • метка отключается отдельно от самой подмены
  • свой список замен и приоритет собственных правил над базой

метка ai-музыки

  • артисты сверяются с базой slopless
  • метка в списках треков, в плеере и на странице артиста
  • опциональный автодизлайк и пропуск таких треков

библиотека

  • лайки треков, альбомов и артистов, дизлайки треков
  • плейлисты: создание, переименование, удаление, добавление и удаление треков
  • скрытие плейлистов: спрятанные плейлисты не показываются на главной и прячутся под кат на странице плейлистов
  • поиск по собственной библиотеке без запросов в сеть
  • страницы альбома, артиста и плейлиста с запуском всего списка
  • экспорт плейлистов и лайков в txt или csv и импорт обратно по названиям

текст песни

  • три источника текста: lrclib, genius и яндекс
  • режим "авто" берёт сначала lrclib, затем genius, яндекс подключается вручную
  • синхронизированный текст с подсветкой строки и автопрокруткой
  • переход по клику на строку, обычный текст если синхронизации нет
  • переключение источника для отдельного трека прямо в панели

genius

  • разборы строчек, авторы и продюсеры с genius.com
  • отдельные страницы артиста и списка песен genius
  • нужен бесплатный client access token, хранится только на этом компьютере

эквалайзер и визуализатор

  • многополосный эквалайзер с пресетами и ручной настройкой
  • аудио-визуализатор с полосами частот в полноэкранном плеере

мини-плеер и редактор макета

  • отдельное компактное окно мини-плеера поверх других окон
  • редактор макета плеера и мини-плеера: состав и расположение кнопок
  • живой предпросмотр и сброс к исходному виду
  • возврат к основному окну одним кликом

загрузки

  • сохранение треков в выбранную папку
  • если трек уже скачан, воспроизводится локальный файл, а не поток
  • это же работает для предзагружаемого следующего трека

слушать вместе

один участник ведёт (хост), остальные повторяют его трек, паузу и позицию. всё находится в настройках, раздел "слушать вместе". есть два варианта связи: через сервер и через локалку. переключатель типа связи там же, вверху раздела. менять его можно только пока вы не в комнате.

вариант 1: через сервер (простой)

участники обмениваются кодом из шести слов.

  1. настройки → "слушать вместе", тип связи - "сервер"
  2. в поле "сервер" уже подставлен общий сервер по умолчанию - mashiro.onecorporation.cfd, можно оставить как есть
  3. хост жмёт "создать комнату" и получает код вида olive canyon spirit velvet ladder onion
  4. код пересылается друзьям, они вставляют его в "войти по коду" и жмут "войти"
  5. выйти можно кнопкой "выйти" там же

подробности:

  • адрес сервера запоминается, в поле можно вписать свой домен.
  • ключ-аккаунт создаётся автоматически и хранится на устройстве; в блоке "дополнительное" его можно посмотреть, ввести старый или сбросить

сервер можно поднять у себя - исходники и инструкция лежат в отдельном репозитории: elytrya/mashiro-together. после запуска просто впишите свой адрес вместо дефолтного - все участники должны указать один и тот же сервер.

вариант 2: через локалку

комната поднимается прямо в клиенте хоста, остальные подключаются к его ip. подходит для одной квартиры/офиса или любого vpn с общей подсетью.

  1. настройки → "слушать вместе", тип связи - "локалка"
  2. хост выбирает порт (по умолчанию 7331) и жмёт "создать" в блоке "своя комната"
  3. появляется "адрес для друзей" вида 26.13.4.7:7331 - его можно скрыть глазом или скопировать одним кликом
  4. остальные вставляют этот адрес в "подключиться к комнате"
  5. хост закрывает комнату кнопкой "закрыть", гость - "отключиться"

подробности:

  • подходят radmin vpn, hamachi, zerotier, tailscale, netbird и любой другой туннель, где участники видят ip друг друга; адрес берётся из окна самой программы, порт тот же
  • через голый интернет без vpn нужен проброс порта на роутере и разрешение в фаерволле - если лень, берите вариант с сервером

что работает в любом из вариантов

  • один участник ведёт, остальные повторяют трек, паузу, перемотку и очередь
  • общая загрузка: пока у кого-то трек ещё грузится, воспроизведение ждёт всех и запускается одновременно
  • хост может передать комнату другому участнику: тот поднимает её у себя, а остальные, включая старого хоста, переподключаются автоматически
  • список участников с отметками кто ведёт и у кого идёт загрузка
  • имя в комнате задаётся там же в настройках
  • плавающая плашка "хостите / слушаете" поверх окна; её можно перетаскивать или совсем выключить в настройках, комната при этом продолжает работать
  • журнал комнаты в настройках плюс лог-файл рядом с данными приложения
  • по сети идут только команды: трек и позиция, звук каждый грузит из своего аккаунта, так что подписка нужна каждому своя

интеграции и системные функции

  • discord rich presence с обложкой, названием и таймингом
  • иконка в системном трее с меню управления
  • сворачивание в трей вместо закрытия
  • глобальные горячие клавиши, работают когда окно не в фокусе
  • таймер сна с остановкой воспроизведения
  • статистика прослушиваний с топами артистов и треков

оформление

  • светлая и тёмная темы, настраиваемый акцентный цвет
  • полупрозрачные панели с регулируемой силой размытия
  • отключаемые анимации и тонкие полосы прокрутки
  • переключатели обложек в боковой панели и в плеере
  • настраиваемые размеры интерфейса, плотность списков и форма обложек
mashiro mashiro
mashiro mashiro
ещё 12 скриншотов
mashiro mashiro
mashiro mashiro
mashiro mashiro
mashiro mashiro
mashiro mashiro
mashiro mashiro

настройки

разделы: оформление, интерфейс, плеер, мини-плеер, поведение, плейлисты, слушать вместе, горячие клавиши, текст песни, genius, эквалайзер, загрузки, discord, кеш, о проекте.

раздел "поведение" разбит на группы, у каждого переключателя есть описание того, что именно он меняет:

группа что внутри
визуальные эффекты размытие панелей, сила размытия, анимации, тонкие скроллбары
обложки и миниатюры обложки плейлистов в боковой панели, обложка трека в плеере
окно и запуск сворачивание в трей, восстановление очереди, автозапуск
воспроизведение подрезание тишины в конце трека
фильтры контента обход цензуры, метка о подмене, автодизлайк ai-треков

сборка

требуется node 18 или новее, npm, rust stable и системные зависимости tauri 2 для вашей ос (на windows - visual studio build tools и webview2, на linux - webkit2gtk).

режим разработки:

cd desktop
npm install
npm run tauri dev

сборка релиза:

cd desktop
npm run tauri build

готовые файлы окажутся в desktop/src-tauri/target/release/bundle.

структура проекта

desktop/
  index.html
  quasar.config.js
  public/icons/         фавиконки всех размеров
  src/
    api/                клиент tauri-команд и типы ответов
    boot/               инициализация авторизации и нативных вызовов
    components/         компоненты интерфейса
      player/           редакторы макета плеера и мини-плеера
      settings/         переключатели, слайдеры и разделы настроек
      together/         карточки комнаты и список участников
    composables/        визуализатор частот
    css/                стили по страницам и компонентам
    lib/                цензура, ai-метки, источники текста, кеш картинок, диалоги
    pages/              главная, волна, поиск, артист, альбом, плейлист, genius, статистика, настройки
    router/             маршруты приложения
    stores/             pinia: плеер, библиотека, интерфейс, genius, статистика, таймер сна, комната
  src-tauri/
    icons/              иконки приложения
    src/
      commands/         команды, доступные из фронтенда
      genius/           апи genius: поиск, артист, песня, тексты
      together/         совместное прослушивание: комната, хост, гость, протокол
      yandex/           апи: каталог, библиотека, радио, воспроизведение, тексты
      lrclib.rs         тексты из lrclib
      presence.rs       discord rich presence
      tray.rs           иконка в трее
      hotkeys.rs        глобальные горячие клавиши
      files.rs          загрузки и поиск локальных файлов
      mini.rs           окно мини-плеера
      oauth.rs          окно авторизации

архитектура

весь сетевой обмен с апи идёт через rust: фронтенд вызывает tauri-команды, rust ходит в апи, разбирает ответы и преобразует их в dto для интерфейса. токен не покидает rust-часть при запросах.

состояние интерфейса живёт в pinia: плеер (очередь, предзагрузка, сессия, presence), библиотека, настройки интерфейса, genius, статистика, таймер сна, комната совместного прослушивания.

совместное прослушивание работает на своём tcp-сервере внутри клиента: хост рассылает участникам трек, паузу и позицию строками json, гости применяют их к своему плееру. внешних зависимостей у этой части нет.

хранение данных

ключ что хранится
mashiro.token oauth-токен
mashiro.session данные текущей сессии
mashiro.settings, mashiro.interface настройки приложения и интерфейса
mashiro.equalizer пресеты и полосы эквалайзера
mashiro.genius токен и настройки genius
mashiro.stats, mashiro.artistStats статистика прослушиваний
mashiro.hiddenPlaylists спис��к скрытых плейлистов
mashiro.together.nick имя в комнате совместного прослушивания
mashiro.censor.map кеш списка незацензуренных версий
mashiro.censor.custom, mashiro.censor.prefer свои замены и приоритет правил
mashiro.artistAvatars кеш аватарок артистов
mashiro.imgcache.* кеш внешних картинок

все кеши чистятся из настроек, раздел "кеш".

внешние источники данных

  • fckcensordata: список треков с незацензуренными версиями
  • slopless: список артистов с музыкой, сгенерированной нейросетями
  • lrclib: синхронизированные и обычные тексты песен
  • genius: разборы строчек, авторы и продюсеры

если источник недоступен, клиент продолжает работать без соответствующей функции.

известные ограничения

  • используется неофициальное апи, любое его изменение может сломать часть функций
  • без подписки полное воспроизведение недоступно
  • базы цензуры и ai-меток пополняются сообществом и не полны
  • для genius нужен свой client access token
  • формат локальных настроек может меняться без миграций

благодарности

дисклеймер

проект написан в образовательных целях, чтобы разобраться с tauri, vue и с тем, как устроено неофициальное апи яндекс музыки. это не продукт и не замена официальному клиенту.

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

лицензия

gpl-3.0.