feat: add phone-style PySide6 desktop player

This commit is contained in:
jads
2026-10-23 21:54:21 +03:00
parent f77f81dead
commit 26a58068cb
4 changed files with 1434 additions and 1 deletions

View File

@@ -1,7 +1,8 @@
# MTS Music CLI # MTS Music CLI
Минимальный клиент для **своего** аккаунта MTS Music: «Моя волна», поиск, Минимальный клиент для **своего** аккаунта MTS Music: «Моя волна», поиск,
избранное, тексты песен, воспроизведение и скачивание в MP3. избранное, тексты песен, воспроизведение и скачивание в MP3. Есть компактный
TUI-плеер и настольное Qt-приложение в стиле телефона.
Внутри используется тот же путь, что и в веб-клиенте: MTS SSO выдаёт Внутри используется тот же путь, что и в веб-клиенте: MTS SSO выдаёт
OAuth-токен Яндекс.Музыки, дальше запросы идут на `api.music.yandex.net`. OAuth-токен Яндекс.Музыки, дальше запросы идут на `api.music.yandex.net`.
@@ -14,6 +15,12 @@ python3 -m venv .venv
PLAYWRIGHT_BROWSERS_PATH="$PWD/.playwright" .venv/bin/playwright install chromium PLAYWRIGHT_BROWSERS_PATH="$PWD/.playwright" .venv/bin/playwright install chromium
``` ```
Для Qt-приложения дополнительно:
```bash
.venv/bin/pip install -r requirements-qt.txt
```
Всё локальное лежит рядом с проектом: Всё локальное лежит рядом с проектом:
- `.venv/` — зависимости - `.venv/` — зависимости
- `.playwright/` — браузер Chromium - `.playwright/` — браузер Chromium
@@ -63,6 +70,22 @@ PLAYWRIGHT_BROWSERS_PATH="$PWD/.playwright" .venv/bin/playwright install chromiu
`SIGSTOP`/`SIGCONT`, а перемотка перезапускает поток с нужной секунды, `SIGSTOP`/`SIGCONT`, а перемотка перезапускает поток с нужной секунды,
поэтому отдельный демон не нужен. поэтому отдельный демон не нужен.
## Qt-приложение
```bash
.venv/bin/python mtsmusic.py qt
```
Отдельное окно в стиле телефона: большая обложка, кнопка play/pause,
переключение треков, перемотка, текст песни и избранное. Кнопка «☰» открывает
боковую панель с «Моей волной», избранным, историей и поиском.
Воспроизведение — через `QMediaPlayer`/FFmpeg из PySide6, поэтому работает
перемотка и системный звук. Окно можно растягивать, списки прокручиваются,
двойной клик по строке запускает трек. Горячие клавиши те же, что в TUI:
`Space`, `←`/`→`, `N`/`P`, `L`, `T`, `M`, `F`, `H`, `S`, `W`; `Esc` закрывает
меню/экран, `Ctrl+Q` — выход.
## Команды ## Команды
```bash ```bash

View File

@@ -830,6 +830,17 @@ def cmd_tui(args: argparse.Namespace) -> None:
die(f"TUI упал: {exc}. Подробности: {log}") die(f"TUI упал: {exc}. Подробности: {log}")
def cmd_qt(args: argparse.Namespace) -> None:
try:
from qt_app import main as qt_main
except ImportError as exc:
die(
"для Qt-приложения нужен PySide6: "
f"{exc}. Установи: pip install -r requirements-qt.txt"
)
raise SystemExit(qt_main())
def print_tui_check() -> None: def print_tui_check() -> None:
import platform import platform
@@ -922,6 +933,9 @@ def build_parser() -> argparse.ArgumentParser:
tui.add_argument("--no-mouse", action="store_true", help="отключить поддержку мыши") tui.add_argument("--no-mouse", action="store_true", help="отключить поддержку мыши")
tui.set_defaults(func=cmd_tui) tui.set_defaults(func=cmd_tui)
qt = sub.add_parser("qt", help="настольное Qt-приложение (PySide6)")
qt.set_defaults(func=cmd_qt)
url = sub.add_parser("url", help="получить прямую ссылку на MP3") url = sub.add_parser("url", help="получить прямую ссылку на MP3")
url.add_argument("track_id") url.add_argument("track_id")
url.set_defaults(func=cmd_url) url.set_defaults(func=cmd_url)

1394
qt_app.py Normal file

File diff suppressed because it is too large Load Diff

2
requirements-qt.txt Normal file
View File

@@ -0,0 +1,2 @@
-r requirements.txt
PySide6>=6.7