Register a session D-Bus MPRIS service (org.mpris.MediaPlayer2.mtsmusic) in both the TUI and Qt apps, so the player shows up as a media source: play/pause, next/previous, seek, metadata (title/artist/album/length/art) and volume can be controlled from the GNOME media-controls extension, playerctl and other MPRIS clients. Integration is optional and degrades to a no-op without dbus-next or a session bus.
224 lines
11 KiB
Markdown
224 lines
11 KiB
Markdown
# 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` — выход.
|
||
|
||
«Моя волна» продолжается с последних прослушанных треков (берётся история), а не
|
||
начинается каждый раз с одного и того же места.
|
||
|
||
## Управление из системной панели (MPRIS)
|
||
|
||
При запуске TUI и Qt-приложение регистрируются в сессионном D-Bus как источник
|
||
звука (`org.mpris.MediaPlayer2.mtsmusic`). Поэтому плеер виден системе и им можно
|
||
управлять из панели GNOME — например, расширением
|
||
[media-controls](https://github.com/sakithb/media-controls), — а также через
|
||
`playerctl` и другие MPRIS-клиенты.
|
||
|
||
Что работает из панели:
|
||
|
||
- play/pause, следующий/предыдущий трек;
|
||
- перемотка (слайдер и seek);
|
||
- отображение названия, исполнителя, альбома, длительности и цветной обложки;
|
||
- громкость.
|
||
|
||
Для этого нужен `dbus-next` (он уже в `requirements.txt`). Без сессионного
|
||
D-Bus или без `dbus-next` приложение просто работает как обычно, без интеграции.
|
||
|
||
## Настройки
|
||
|
||
Настройки открываются из меню (пункт «Настройки» в 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. Проект предоставляется «как есть», без гарантий;
|
||
используйте на свой страх и риск и только со своим аккаунтом.
|