# MTS Music — another client Неофициальный клиент для **своего** аккаунта MTS Music: «Моя волна», поиск, избранное, тексты песен, воспроизведение и скачивание в MP3. Есть компактный TUI-плеер и настольное Qt-приложение в стиле телефона. > Только для личного использования с собственной платной подпиской MTS. > Проект не связан с МТС и Яндексом; контент не перераспространяется. Внутри используется тот же путь, что и в веб-клиенте: MTS SSO выдаёт OAuth-токен Яндекс.Музыки, дальше запросы идут на `api.music.yandex.net`. ## Установка ```bash python3 -m venv .venv .venv/bin/pip install -r requirements.txt PLAYWRIGHT_BROWSERS_PATH="$PWD/.playwright" .venv/bin/playwright install chromium ``` Для Qt-приложения дополнительно: ```bash .venv/bin/pip install -r requirements-qt.txt ``` Всё локальное лежит рядом с проектом: - `.venv/` — зависимости - `.playwright/` — браузер Chromium - `.mts-music/` — профиль браузера и `credentials.json` ## Вход ```bash .venv/bin/python mtsmusic.py login ``` Откроется браузер. Нужно вручную войти в MTS и пройти капчу. Токен и cookie сохранятся в `.mts-music/credentials.json` с правами `600`. Повторный вход нужен только когда токен перестанет работать. ## TUI-плеер ```bash .venv/bin/python mtsmusic.py tui ``` Интерфейс в терминале сделан как экран телефона: чёрно-белые элементы и цветная обложка. Обложка по центру, строго под ней по той же ширине — большая кнопка play/pause и по бокам предыдущий/следующий треки, ниже «Текст» и «Избранное». Кнопка «☰» в левом верхнем углу открывает боковое меню: «Моя волна», избранное, история прослушивания, поиск, текст песни, «Настройки» и выход. Мышь работает: кнопки, меню, строки списков и полоса прогресса кликабельны (клик по прогрессу перематывает трек). | Клавиша | Действие | |---------|----------| | `Space` | пауза / продолжить | | `←` / `→` | перемотка на −5 / +5 секунд | | `n` / `p` | следующий / предыдущий трек | | `t` | текст песни | | `l` | добавить / убрать из избранного | | `m` | открыть меню | | `w` | список «Моей волны» | | `f` | избранное | | `h` | история | | `s` | поиск | | `q` | выход | История хранится в `.mts-music/history.json` (последние 100 треков). Плеер — `ffplay` (или `mpv`, если установлен). Пауза реализована через `SIGSTOP`/`SIGCONT`, а перемотка перезапускает поток с нужной секунды, поэтому отдельный демон не нужен. ## Qt-приложение ```bash .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` — выход. «Моя волна» продолжается с последних прослушанных треков (берётся история), а не начинается каждый раз с одного и того же места. ## Настройки Настройки открываются из меню (пункт «Настройки» в TUI и Qt) или из командной строки и хранятся в `.mts-music/settings.json`: ```bash # показать текущие настройки .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` | продолжать «Мою волну» с последних треков | В Qt-приложении на странице настроек дополнительно выбирается устройство вывода звука. Громкость меняется на лету, остальные настройки применяются к новым трекам и при следующем запуске. ## Команды ```bash # кто я и есть ли подписка .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 -n 20 # текст песни: показать, сохранить, или с таймкодами .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 # скачивание .venv/bin/python mtsmusic.py download 12345678 -o track.mp3 # настройки .venv/bin/python mtsmusic.py settings .venv/bin/python mtsmusic.py settings -s volume=60 seek_step=10 ``` Токен можно передать и через переменную окружения: ```bash export MTS_YA_TOKEN='...' ``` ## Если TUI не отображается ```bash # диагностика окружения .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](https://lrclib.net) и помечает источник в выводе. `--no-fallback` отключает это поведение. - Использовать только для личного прослушивания, не перераздавать контент. - Если `api.music.yandex.net` недоступен, проверь IPv6: клиент принудительно ходит по IPv4. ## Лицензия [MIT](LICENSE) © 2026 jads. Проект предоставляется «как есть», без гарантий; используйте на свой страх и риск и только со своим аккаунтом.