16 KiB
MTS Music — another client
Неофициальный клиент для своего аккаунта MTS Music: «Моя волна», поиск, избранное, тексты песен, воспроизведение и скачивание в MP3 с полными ID3-тегами. Есть компактный TUI-плеер и настольное Qt-приложение в стиле телефона.
Только для личного использования с собственной платной подпиской MTS. Проект не связан с МТС и Яндексом; контент не перераспространяется.
Внутри используется тот же путь, что и в веб-клиенте: MTS SSO выдаёт
OAuth-токен Яндекс.Музыки, дальше запросы идут на api.music.yandex.net.
Установка
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
PLAYWRIGHT_BROWSERS_PATH="$PWD/.playwright" .venv/bin/playwright install chromium
Для Qt-приложения дополнительно:
.venv/bin/pip install -r requirements-qt.txt
Всё локальное лежит рядом с проектом:
.venv/— зависимости.playwright/— браузер Chromium.mts-music/— профиль браузера иcredentials.json
Вход
.venv/bin/python mtsmusic.py login
Откроется браузер. Нужно вручную войти в MTS и пройти капчу. Токен и cookie
сохранятся в .mts-music/credentials.json с правами 600.
Повторный вход нужен только когда токен перестанет работать.
TUI-плеер
.venv/bin/python mtsmusic.py tui
Интерфейс в терминале сделан как экран телефона: чёрно-белые элементы и цветная обложка. Обложка по центру, строго под ней по той же ширине — большая кнопка play/pause и по бокам предыдущий/следующий треки, ниже «Текст» и «Избранное». Кнопка «☰» в левом верхнем углу открывает боковое меню: «Моя волна», избранное, история прослушивания, поиск, текст песни, «Скачать трек», «Скачать список», «Настройки» и выход.
Мышь работает: кнопки, меню, строки списков и полоса прогресса кликабельны (клик по прогрессу перематывает трек).
| Клавиша | Действие |
|---|---|
Space |
пауза / продолжить |
← / → |
перемотка на −5 / +5 секунд |
n / p |
следующий / предыдущий трек |
t |
текст песни |
l |
добавить / убрать из избранного |
m |
открыть меню |
w |
список «Моей волны» |
f |
избранное |
h |
история |
s |
поиск |
d |
скачать выделенный трек в списке |
q |
выход |
История хранится в .mts-music/history.json (последние 100 треков).
Плеер — ffplay (или mpv, если установлен). Пауза реализована через
SIGSTOP/SIGCONT, а перемотка перезапускает воспроизведение с нужной
секунды, поэтому отдельный демон не нужен.
Треки не транслируются напрямую: сначала они скачиваются в локальный кэш
.mts-music/cache/ (до 512 МБ, старые файлы удаляются автоматически), а плеер
играет уже готовый MP3. Так надёжнее — сервер Яндекса закрывает соединение,
если клиент читает поток медленнее реального времени, из-за чего трек
обрывался через полминуты и клиент переключался на следующий. Заодно кэш
убирает задержку при повторном прослушивании и делает перемотку мгновенной.
Qt-приложение
.venv/bin/python mtsmusic.py qt
Отдельное окно в стиле телефона: крупная цветная обложка, кнопка play/pause, переключение треков, перемотка, текст песни и избранное. Кнопка «☰» открывает боковую панель с «Моей волной», избранным, историей, поиском, скачиванием и настройками.
Воспроизведение — через QMediaPlayer/FFmpeg из PySide6, поэтому работает
перемотка и системный звук. По полосе прогресса можно кликнуть в любое место —
каретка сразу перейдёт туда (и потянется, если вести мышью). Окно растягивается
вместе с обложкой, списки прокручиваются, двойной клик по строке запускает трек.
Tab переключает фокус по элементам: меню, полоса, предыдущий, play, следующий,
«Текст», «Избранное». Горячие клавиши: Space, ←/→, N/P, L, T, M,
F, H, S, W; Esc закрывает меню/экран, Ctrl+Q — выход.
«Моя волна» продолжается с последних прослушанных треков (берётся история), а не начинается каждый раз с одного и того же места.
Скачивание и метаданные
В меню обоих клиентов пункт «Скачать» открывает выбор: текущий трек, всё
избранное, 20 треков «Моей волны» или результаты поиска; папка выбирается
диалогом в Qt и вводится вручную в TUI, прогресс и число ошибок видны на
экране. Быстрые пункты «Скачать трек»/«Скачать список» (и клавиша d на
экране списка в TUI) сразу кладут в папку download_dir без диалога. В CLI
это команда download с теми же источниками (--likes, --wave, --search).
Файлы кладутся в папку download_dir (~/Music/MTS Music по умолчанию),
имя — Исполнитель - Название.mp3; существующие файлы не перезаписываются,
при совпадении добавляется (2), (3) и т.д. (--force перезаписывает).
В скачанный файл пишется максимум метаданных ID3v2.3 (через mutagen, он в
requirements.txt):
- название, все исполнители (
TPE1), альбом (TALB) и альбомный исполнитель (TPE2); - номер трека и диска (
TRCK/TPOS), год и дата релиза (TYER/TDAT), жанр как в API (TCON), лейбл (TPUB), длительность (TLEN); - обложка 600×600 (
APIC); - текст песни (
USLT) и синхронный текст (SYLT), если он есть: сначала пробуем MTS, затем LRCLIB; - ссылка на трек (
WOAR/COMM), пометкаexplicit(ITUNESADVISORY) и служебные поля с id трека, альбома иrealId(TXXX).
Без mutagen или при --no-tags теги не пишутся, скачивание при этом
работает как обычно.
Управление из системной панели (MPRIS)
При запуске TUI и Qt-приложение регистрируются в сессионном D-Bus как источник
звука (org.mpris.MediaPlayer2.mtsmusic). Поэтому плеер виден системе и им можно
управлять из панели GNOME — например, расширением
media-controls, — а также через
playerctl и другие MPRIS-клиенты.
Что работает из панели:
- play/pause, следующий/предыдущий трек;
- перемотка (слайдер и seek);
- отображение названия, исполнителя, альбома, длительности и цветной обложки;
- громкость.
Для этого нужен dbus-next (он уже в requirements.txt). Без сессионного
D-Bus или без dbus-next приложение просто работает как обычно, без интеграции.
Настройки
Настройки открываются из меню (пункт «Настройки» в TUI и Qt) или из командной
строки и хранятся в .mts-music/settings.json:
# показать текущие настройки
.venv/bin/python mtsmusic.py settings
# изменить: громкость 60%, шаг перемотки 10 секунд
.venv/bin/python mtsmusic.py settings -s volume=60 seek_step=10
| Настройка | По умолчанию | Описание |
|---|---|---|
volume |
80 |
громкость плеера, 0–100 |
seek_step |
5 |
шаг перемотки стрелками, секунды |
autoplay |
false |
начинать воспроизведение сразу при запуске |
start_queue |
wave |
что открыть первым: wave, favorites или history |
wave_from_history |
true |
продолжать «Мою волну» с последних треков |
download_dir |
~/Music/MTS Music |
куда сохранять скачанные MP3 |
В Qt-приложении на странице настроек дополнительно выбирается устройство вывода звука и папка загрузок (кнопка «Выбрать…»). В TUI путь задаётся в настройках пунктом «Папка загрузок». Громкость меняется на лету, остальные настройки применяются к новым трекам и при следующем запуске.
Команды
# кто я и есть ли подписка
.venv/bin/python mtsmusic.py status
# поиск
.venv/bin/python mtsmusic.py search "miyagi" -n 10
# «Моя волна»: 10 треков, ♥ — уже в избранном
.venv/bin/python mtsmusic.py mix -n 10
# сразу слушать подборку (Ctrl-C — остановить)
.venv/bin/python mtsmusic.py mix -n 5 --play
# избранное: добавить / убрать / показать текстом
.venv/bin/python mtsmusic.py like 12345678
.venv/bin/python mtsmusic.py unlike 12345678
.venv/bin/python mtsmusic.py likes # все любимые треки
.venv/bin/python mtsmusic.py likes -n 20 # только первые 20
.venv/bin/python mtsmusic.py likes --ids # только ID, для скриптов
# текст песни: показать, сохранить, или с таймкодами
.venv/bin/python mtsmusic.py lyrics 12345678
.venv/bin/python mtsmusic.py lyrics 12345678 -o track.txt
.venv/bin/python mtsmusic.py lyrics 12345678 --lrc -o track.lrc
# только права MTS, без внешнего источника
.venv/bin/python mtsmusic.py lyrics 12345678 --no-fallback
# прямая ссылка на MP3
.venv/bin/python mtsmusic.py url 12345678
# воспроизведение (нужен mpv или ffplay)
.venv/bin/python mtsmusic.py play 12345678
# скачивание: в папку из download_dir, имя «Исполнитель - Название.mp3»
.venv/bin/python mtsmusic.py download 12345678
# несколько треков или своя папка
.venv/bin/python mtsmusic.py download 12345678 87654321 -d ~/Music/MTS
# как в мобильном приложении: избранное, волна или результаты поиска
.venv/bin/python mtsmusic.py download --likes -d ~/Music/MTS
.venv/bin/python mtsmusic.py download --wave -n 20 -d ~/Music/MTS
.venv/bin/python mtsmusic.py download --search "Кино" -n 10 -d ~/Music/MTS
# один трек с явным именем файла, перезапись существующих
.venv/bin/python mtsmusic.py download 12345678 -o track.mp3
.venv/bin/python mtsmusic.py download --likes -d ~/Music/MTS --force
# то же самое есть в меню TUI и Qt — пункт «Скачать»
# без ID3-тегов (быстрее, без обложки и текста)
.venv/bin/python mtsmusic.py download 12345678 --no-tags
# настройки
.venv/bin/python mtsmusic.py settings
.venv/bin/python mtsmusic.py settings -s volume=60 seek_step=10
Токен можно передать и через переменную окружения:
export MTS_YA_TOKEN='...'
Если TUI не отображается
# диагностика окружения
.venv/bin/python mtsmusic.py tui --check
# без alternate screen (если экран пустой)
.venv/bin/python mtsmusic.py tui --inline
# отключить мышь, если терминал плохо её поддерживает
.venv/bin/python mtsmusic.py tui --inline --no-mouse
TUI нужно запускать в настоящем терминале (stdin/stdout — TTY), а не в панели
вывода IDE. При падении traceback пишется в .mts-music/tui-error.log.
Ограничения
- Логин автоматизирован не полностью: QRATOR-капчу проходит человек.
reference_uriу MTS должен быть на доменеmusic.mts.ru, поэтому локальный callback не используется — токен забирается из браузера.- Без активной подписки
download-infoотдаётpreview(короткий фрагмент). - Тексты песен — отдельная подписка Яндекс Плюс, которой у MTS-аккаунта нет
(
hasPlus: false), поэтому MTS возвращает404даже для треков с текстом.lyricsавтоматически берёт текст из бесплатного LRCLIB и помечает источник в выводе.--no-fallbackотключает это поведение. - Использовать только для личного прослушивания, не перераздавать контент.
- Если
api.music.yandex.netнедоступен, проверь IPv6: клиент принудительно ходит по IPv4. - Кэш треков лежит в
.mts-music/cache/. Его можно удалить в любой момент — при следующем запуске треки скачаются заново. download(и пункт «Скачать» в TUI/Qt) по умолчанию не перезаписывает уже скачанные файлы: повторный запуск докачает только новое. Флаг--forceв CLI включает перезапись.
Лицензия
MIT © 2026 jads. Проект предоставляется «как есть», без гарантий; используйте на свой страх и риск и только со своим аккаунтом.