Add KION Music (MTS Music) provider (#3100)
authorMikhail Nevskiy <139659391+trudenboy@users.noreply.github.com>
Tue, 10 Feb 2026 13:42:45 +0000 (16:42 +0300)
committerGitHub <noreply@github.com>
Tue, 10 Feb 2026 13:42:45 +0000 (14:42 +0100)
commit8982adf88d7fadd40e6f81d5dd42224b3eb63bae
treefcc88d0f0bf385571d54ae4b9bb7cedd251c5eb1
parent4d88a6fbf7e6026f41df41573ee15faf081ff8a8
Add KION Music (MTS Music) provider (#3100)

* feat(kion_music): add KION Music (MTS Music) provider

Add a new music provider for KION Music (music.mts.ru), the MTS telecom
music streaming service. The provider adapts the Yandex Music API client
(yandex-music library) to work with KION's API endpoint at
music.mts.ru/ya_api.

Features:
- Search (tracks, albums, artists, playlists)
- Library access (liked artists, albums, tracks; user playlists)
- Add/remove library items (like/unlike)
- Streaming with quality selection (High 320kbps / Lossless FLAC)
- Lossless streaming via get-file-info API with flac-mp4 codec support
- Playlist track loading with pagination fix and batch fetching
- Retry on NetworkError to handle transient failures

The provider reuses the same yandex-music==2.2.0 dependency already
present for the Yandex Music provider — no new dependencies required.

Co-authored-by: Cursor <cursoragent@cursor.com>
* chore(kion_music): update documentation URL in manifest

Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(kion_music): fix missing album cover art in library

- In parse_track(), use parse_album() instead of ItemMapping so albums
  get full metadata (including cover_uri) when tracks are synced
- In get_liked_albums(), fetch full album details via client.albums()
  in batches of 50 (likes endpoint returns minimal data without cover_uri)
- Remove unused noqa in provider.py (ruff)

Co-authored-by: Cursor <cursoragent@cursor.com>
* Address PR #3100 review: fix base_url, performance, redundant condition, docstrings; add tests

- Pass KION_BASE_URL to ClientAsync in connect() so API calls go to music.mts.ru
- Use set(batch) for O(1) lookups in get_liked_albums() fallback path
- Remove redundant `track_count > 0` check already guaranteed by outer condition
- Replace "Yandex Music" with "KION Music" in docstrings/comments
- Add full test suite: 5 api_client unit tests, 18 parser tests, 11 integration tests

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------

Co-authored-by: Михаил Невский <renso@MacBook-Pro-Mihail.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
22 files changed:
music_assistant/providers/kion_music/__init__.py [new file with mode: 0644]
music_assistant/providers/kion_music/api_client.py [new file with mode: 0644]
music_assistant/providers/kion_music/constants.py [new file with mode: 0644]
music_assistant/providers/kion_music/icon.svg [new file with mode: 0644]
music_assistant/providers/kion_music/icon_monochrome.svg [new file with mode: 0644]
music_assistant/providers/kion_music/manifest.json [new file with mode: 0644]
music_assistant/providers/kion_music/parsers.py [new file with mode: 0644]
music_assistant/providers/kion_music/provider.py [new file with mode: 0644]
music_assistant/providers/kion_music/streaming.py [new file with mode: 0644]
tests/providers/kion_music/__init__.py [new file with mode: 0644]
tests/providers/kion_music/__snapshots__/test_parsers.ambr [new file with mode: 0644]
tests/providers/kion_music/conftest.py [new file with mode: 0644]
tests/providers/kion_music/fixtures/albums/minimal.json [new file with mode: 0644]
tests/providers/kion_music/fixtures/artists/minimal.json [new file with mode: 0644]
tests/providers/kion_music/fixtures/artists/with_cover.json [new file with mode: 0644]
tests/providers/kion_music/fixtures/playlists/minimal.json [new file with mode: 0644]
tests/providers/kion_music/fixtures/playlists/other_user.json [new file with mode: 0644]
tests/providers/kion_music/fixtures/tracks/minimal.json [new file with mode: 0644]
tests/providers/kion_music/fixtures/tracks/with_artist_and_album.json [new file with mode: 0644]
tests/providers/kion_music/test_api_client.py [new file with mode: 0644]
tests/providers/kion_music/test_integration.py [new file with mode: 0644]
tests/providers/kion_music/test_parsers.py [new file with mode: 0644]