ооо "яндекс" к проекту отношения не имеет.
- фронтенд: vue 3 (composition api, script setup), typescript, quasar, pinia, vue router, vite
- бэкенд: rust, tauri 2, reqwest, serde, tokio
- вход по готовому oauth-токену яндекса
- вход через встроенное окно авторизации с перехватом токена из редиректа
- токен хранится локально и подставляется в заголовки запросов на стороне rust
- выход из аккаунта с очисткой токена и локальных кешей
- очередь воспроизведения с перемешиванием и тремя режимами повтора
- кроссфейд с настраиваемой длительностью
- подрезание тишины в конце трека
- регулировка скорости воспроизведения
- восстановление очереди, текущего трека и позиции после перезапуска
- отдельный переключатель автозапуска восстановленного трека
- отдельная страница персональной радиостанции "моя волна"
- лайк, дизлайк и переход к следующему треку прямо из волны
- обратная связь уходит в яндекс, поток подстраивается под оценки
- если для трека есть незацензуренная версия в базе fckcensordata, играет она
- включено по умолчанию, отключается в настройках, раздел "поведение"
- когда обход выключен, список не загружается и подмена не применяется ни при воспроизведении, ни при предзагрузке
- метка отключается отдельно от самой подмены
- свой список замен и приоритет собственных правил над базой
- артисты сверяются с базой slopless
- метка в списках треков, в плеере и на странице артиста
- опциональный автодизлайк и пропуск таких треков
- лайки треков, альбомов и артистов, дизлайки треков
- плейлисты: создание, переименование, удаление, добавление и удаление треков
- скрытие плейлистов: спрятанные плейлисты не показываются на главной и прячутся под кат на странице плейлистов
- поиск по собственной библиотеке без запросов в сеть
- страницы альбома, артиста и плейлиста с запуском всего списка
- экспорт плейлистов и лайков в txt или csv и импорт обратно по названиям
- три источника текста: lrclib, genius и яндекс
- режим "авто" берёт сначала lrclib, затем genius, яндекс подключается вручную
- синхронизированный текст с подсветкой строки и автопрокруткой
- переход по клику на строку, обычный текст если синхронизации нет
- переключение источника для отдельного трека прямо в панели
- разборы строчек, авторы и продюсеры с genius.com
- отдельные страницы артиста и списка песен genius
- нужен бесплатный client access token, хранится только на этом компьютере
- многополосный эквалайзер с пресетами и ручной настройкой
- аудио-визуализатор с полосами частот в полноэкранном плеере
- отдельное компактное окно мини-плеера поверх других окон
- редактор макета плеера и мини-плеера: состав и расположение кнопок
- живой предпросмотр и сброс к исходному виду
- возврат к основному окну одним кликом
- сохранение треков в выбранную папку
- если трек уже скачан, воспроизводится локальный файл, а не поток
- это же работает для предзагружаемого следующего трека
один участник ведёт (хост), остальные повторяют его трек, паузу и позицию. всё находится в настройках, раздел "слушать вместе". есть два варианта связи: через сервер и через локалку. переключатель типа связи там же, вверху раздела. менять его можно только пока вы не в комнате.
участники обмениваются кодом из шести слов.
- настройки → "слушать вместе", тип связи - "сервер"
- в поле "сервер" уже подставлен общий сервер по умолчанию -
mashiro.onecorporation.cfd, можно оставить как есть - хост жмёт "создать комнату" и получает код вида
olive canyon spirit velvet ladder onion - код пересылается друзьям, они вставляют его в "войти по коду" и жмут "войти"
- выйти можно кнопкой "выйти" там же
подробности:
- адрес сервера запоминается, в поле можно вписать свой домен.
- ключ-аккаунт создаётся автоматически и хранится на устройстве; в блоке "дополнительное" его можно посмотреть, ввести старый или сбросить
сервер можно поднять у себя - исходники и инструкция лежат в отдельном репозитории: elytrya/mashiro-together. после запуска просто впишите свой адрес вместо дефолтного - все участники должны указать один и тот же сервер.
комната поднимается прямо в клиенте хоста, остальные подключаются к его ip. подходит для одной квартиры/офиса или любого vpn с общей подсетью.
- настройки → "слушать вместе", тип связи - "локалка"
- хост выбирает порт (по умолчанию 7331) и жмёт "создать" в блоке "своя комната"
- появляется "адрес для друзей" вида
26.13.4.7:7331- его можно скрыть глазом или скопировать одним кликом - остальные вставляют этот адрес в "подключиться к комнате"
- хост закрывает комнату кнопкой "закрыть", гость - "отключиться"
подробности:
- подходят radmin vpn, hamachi, zerotier, tailscale, netbird и любой другой туннель, где участники видят ip друг друга; адрес берётся из окна самой программы, порт тот же
- через голый интернет без vpn нужен проброс порта на роутере и разрешение в фаерволле - если лень, берите вариант с сервером
- один участник ведёт, остальные повторяют трек, паузу, перемотку и очередь
- общая загрузка: пока у кого-то трек ещё грузится, воспроизведение ждёт всех и запускается одновременно
- хост может передать комнату другому участнику: тот поднимает её у себя, а остальные, включая старого хоста, переподключаются автоматически
- список участников с отметками кто ведёт и у кого идёт загрузка
- имя в комнате задаётся там же в настройках
- плавающая плашка "хостите / слушаете" поверх окна; её можно перетаскивать или совсем выключить в настройках, комната при этом продолжает работать
- журнал комнаты в настройках плюс лог-файл рядом с данными приложения
- по сети идут только команды: трек и позиция, звук каждый грузит из своего аккаунта, так что подписка нужна каждому своя
- discord rich presence с обложкой, названием и таймингом
- иконка в системном трее с меню управления
- сворачивание в трей вместо закрытия
- глобальные горячие клавиши, работают когда окно не в фокусе
- таймер сна с остановкой воспроизведения
- статистика прослушиваний с топами артистов и треков
- светлая и тёмная темы, настраиваемый акцентный цвет
- полупрозрачные панели с регулируемой силой размытия
- отключаемые анимации и тонкие полосы прокрутки
- переключатели обложек в боковой панели и в плеере
- настраиваемые размеры интерфейса, плотность списков и форма обложек
разделы: оформление, интерфейс, плеер, мини-плеер, поведение, плейлисты, слушать вместе, горячие клавиши, текст песни, 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
- формат локальных настроек может меняться без миграций
- MarshalX/yandex-music-api - описание неофициального апи
- vyfor/yandex-music-rs - схемы ответов апи для rust-части
- Hazzz895/FckCensor - логика подмены зацензуренных треков
- Hazzz895/FckCensorData - база ссылок на незацензуренные версии
- alexeyfv/slopless - база артистов с ai-музыкой
- lrclib - открытая база текстов песен
проект написан в образовательных целях, чтобы разобраться с tauri, vue и с тем, как устроено неофициальное апи яндекс музыки. это не продукт и не замена официальному клиенту.
- используется неофициальное апи. оно не документировано и может измениться в любой момент
- нужен свой аккаунт с активной подпиской. клиент не обходит платный доступ
- использование неофициального клиента может нарушать условия сервиса, вплоть до блокировки аккаунта
gpl-3.0.
















