feat: download tracks with full ID3 metadata

- Add downloads.py: "Artist - Title.mp3" naming, no-overwrite dedupe,
  configurable download_dir, progress and per-item callbacks.
- Save maximum metadata via tags.py (ID3v2.3, mutagen): artists, album
  and album artist, track/disc, year/date, raw genre, label, duration,
  explicit flag, cover 600x600, plain and synced lyrics (MTS then
  LRCLIB), track URLs and Yandex/MTS ids.
- TUI/Qt: download current track and queue from the menu, "d" key in
  lists, folder picker in settings; CLI download gains -d/--dir and
  --no-tags.
- Add mutagen to requirements and document download/metadata in README.
- Fix MPRIS update_metadata crashing without dbus-next.
This commit is contained in:
jads
2026-10-25 20:06:59 +03:00
parent e71f5623a7
commit de9bf80d11
9 changed files with 754 additions and 37 deletions

View File

@@ -1,8 +1,9 @@
# MTS Music — another client
Неофициальный клиент для **своего** аккаунта MTS Music: «Моя волна», поиск,
избранное, тексты песен, воспроизведение и скачивание в MP3. Есть компактный
TUI-плеер и настольное Qt-приложение в стиле телефона.
избранное, тексты песен, воспроизведение и скачивание в MP3 с полными
ID3-тегами. Есть компактный TUI-плеер и настольное Qt-приложение в стиле
телефона.
> Только для личного использования с собственной платной подпиской MTS.
> Проект не связан с МТС и Яндексом; контент не перераспространяется.
@@ -50,7 +51,7 @@ PLAYWRIGHT_BROWSERS_PATH="$PWD/.playwright" .venv/bin/playwright install chromiu
большая кнопка play/pause и по бокам предыдущий/следующий треки, ниже
«Текст» и «Избранное». Кнопка «☰» в левом верхнем углу открывает боковое
меню: «Моя волна», избранное, история прослушивания, поиск, текст песни,
«Настройки» и выход.
«Скачать трек», «Скачать список», «Настройки» и выход.
Мышь работает: кнопки, меню, строки списков и полоса прогресса кликабельны
(клик по прогрессу перематывает трек).
@@ -67,6 +68,7 @@ PLAYWRIGHT_BROWSERS_PATH="$PWD/.playwright" .venv/bin/playwright install chromiu
| `f` | избранное |
| `h` | история |
| `s` | поиск |
| `d` | скачать выделенный трек в списке |
| `q` | выход |
История хранится в `.mts-music/history.json` (последние 100 треков).
@@ -82,7 +84,8 @@ PLAYWRIGHT_BROWSERS_PATH="$PWD/.playwright" .venv/bin/playwright install chromiu
Отдельное окно в стиле телефона: крупная цветная обложка, кнопка play/pause,
переключение треков, перемотка, текст песни и избранное. Кнопка «☰» открывает
боковую панель с «Моей волной», избранным, историей, поиском и настройками.
боковую панель с «Моей волной», избранным, историей, поиском, скачиванием
и настройками.
Воспроизведение — через `QMediaPlayer`/FFmpeg из PySide6, поэтому работает
перемотка и системный звук. По полосе прогресса можно кликнуть в любое место —
@@ -96,6 +99,30 @@ PLAYWRIGHT_BROWSERS_PATH="$PWD/.playwright" .venv/bin/playwright install chromiu
«Моя волна» продолжается с последних прослушанных треков (берётся история), а не
начинается каждый раз с одного и того же места.
## Скачивание и метаданные
Скачать трек можно из меню (TUI: «Скачать трек»/«Скачать список»; Qt: те же
пункты в боковой панели), клавишей `d` на экране списка в TUI или командой
`download`. Файлы кладутся в папку `download_dir` (`~/Music/MTS Music` по
умолчанию), имя — `Исполнитель - Название.mp3`; существующие файлы не
перезаписываются, при совпадении добавляется ` (2)`, ` (3)` и т.д.
В скачанный файл пишется максимум метаданных ID3v2.3 (через `mutagen`, он в
`requirements.txt`):
- название, все исполнители (`TPE1`), альбом (`TALB`) и альбомный исполнитель
(`TPE2`);
- номер трека и диска (`TRCK`/`TPOS`), год и дата релиза (`TYER`/`TDAT`),
жанр как в API (`TCON`), лейбл (`TPUB`), длительность (`TLEN`);
- обложка 600×600 (`APIC`);
- текст песни (`USLT`) и синхронный текст (`SYLT`), если он есть: сначала
пробуем MTS, затем [LRCLIB](https://lrclib.net);
- ссылка на трек (`WOAR`/`COMM`), пометка `explicit` (`ITUNESADVISORY`) и
служебные поля с id трека, альбома и `realId` (`TXXX`).
Без `mutagen` или при `--no-tags` теги не пишутся, скачивание при этом
работает как обычно.
## Управление из системной панели (MPRIS)
При запуске TUI и Qt-приложение регистрируются в сессионном D-Bus как источник
@@ -134,10 +161,12 @@ D-Bus или без `dbus-next` приложение просто работае
| `autoplay` | `false` | начинать воспроизведение сразу при запуске |
| `start_queue` | `wave` | что открыть первым: `wave`, `favorites` или `history` |
| `wave_from_history` | `true` | продолжать «Мою волну» с последних треков |
| `download_dir` | `~/Music/MTS Music` | куда сохранять скачанные MP3 |
В Qt-приложении на странице настроек дополнительно выбирается устройство вывода
звука. Громкость меняется на лету, остальные настройки применяются к новым
трекам и при следующем запуске.
звука и папка загрузок (кнопка «Выбрать…»). В TUI путь задаётся в настройках
пунктом «Папка загрузок». Громкость меняется на лету, остальные настройки
применяются к новым трекам и при следующем запуске.
## Команды
@@ -173,9 +202,16 @@ D-Bus или без `dbus-next` приложение просто работае
# воспроизведение (нужен 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 -d ~/Music
.venv/bin/python mtsmusic.py download 12345678 -o track.mp3
# без 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