Add Zvuk Music provider (#3090)
authorMikhail Nevskiy <139659391+trudenboy@users.noreply.github.com>
Tue, 10 Feb 2026 07:01:39 +0000 (10:01 +0300)
committerGitHub <noreply@github.com>
Tue, 10 Feb 2026 07:01:39 +0000 (08:01 +0100)
commite2cea742976640a55aaa057299e80adbf4d8238e
tree8064e7a921706f1b3b3f73b7bfa0d186bbd8691c
parentbc8703c5a14a37a25bb56a2558c7c7e0c1f71234
Add Zvuk Music provider (#3090)

* Add zvuk_music provider scaffold (manifest, constants, icons)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add Zvuk Music API client wrapper

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add Zvuk Music model parsers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add ZvukMusicProvider implementation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Update zvuk_music icons to official 2024 logo

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add Zvuk Music provider integration tests

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Replace Zvuk Music integration tests with unit tests

Remove integration tests that required real API tokens and a running MA
server. Add comprehensive unit tests for parsers using mock objects,
covering all parser functions (parse_artist, parse_album, parse_track,
parse_playlist) with various scenarios.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Address PR #3090 review: decorator, duration, allow_seek

- Refactor API error handling into @handle_zvuk_errors(not_found_return=...)
  decorator (api_client.py)
- Add duration from get_track() and allow_seek=True in get_stream_details
  (provider.py)

Co-authored-by: Cursor <cursoragent@cursor.com>
* docs(zvuk): clarify why get_track is needed for duration in get_stream_details

Co-authored-by: Cursor <cursoragent@cursor.com>
---------

Co-authored-by: Михаил Невский <renso@MacBook-Pro-Mihail.local>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Marcel van der Veldt <m.vanderveldt@outlook.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
music_assistant/providers/zvuk_music/__init__.py [new file with mode: 0644]
music_assistant/providers/zvuk_music/api_client.py [new file with mode: 0644]
music_assistant/providers/zvuk_music/constants.py [new file with mode: 0644]
music_assistant/providers/zvuk_music/icon.svg [new file with mode: 0644]
music_assistant/providers/zvuk_music/icon_monochrome.svg [new file with mode: 0644]
music_assistant/providers/zvuk_music/manifest.json [new file with mode: 0644]
music_assistant/providers/zvuk_music/parsers.py [new file with mode: 0644]
music_assistant/providers/zvuk_music/provider.py [new file with mode: 0644]
requirements_all.txt
tests/providers/zvuk_music/__init__.py [new file with mode: 0644]
tests/providers/zvuk_music/test_parsers.py [new file with mode: 0644]