Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
e7223a9
feat: replace deezer-python-async with deezer-python-gql
jdaberkow Mar 28, 2026
f632025
feat: add browse() with Made For You, Explore, Recently Played folders
jdaberkow Mar 28, 2026
8b571b1
feat: enrich Deezer provider with metadata fields and favorites
jdaberkow Mar 28, 2026
9b4daad
chore: bump deezer-python-gql requirement to >=0.5.0
jdaberkow Mar 28, 2026
06050da
refactor: type all parse methods with fragment base classes
jdaberkow Mar 28, 2026
e5bd270
refactor: clean up provider code quality issues
jdaberkow Mar 29, 2026
c2e073f
refactor: remove redundant _get_hot_tracks method
jdaberkow Mar 29, 2026
af88b9b
refactor: consolidate duplicate code in Deezer provider
jdaberkow Mar 29, 2026
555b74b
refactor: collapse MOOD_FLOW/GENRE_FLOW/FLOW_CONFIG prefixes into sin…
jdaberkow Mar 29, 2026
a2034a3
refactor: reduce duplication with shared helpers
jdaberkow Mar 29, 2026
e155798
feat: audiobook browse/search, episode caching, breadcrumb fixes, bum…
jdaberkow Mar 30, 2026
96bf842
refactor: self-managed GQL client pool + per-episode caching
jdaberkow Mar 31, 2026
b447847
chore: bump deezer-python-gql to >=0.8.0
jdaberkow Mar 31, 2026
35de7fc
chore: pin deezer-python-gql to 0.8.2
jdaberkow Mar 31, 2026
de0aa1a
fix: remove dead get_similar_track_ids, fix similar tracks attribute …
jdaberkow Apr 3, 2026
80e468b
fix: resolve mypy errors and improve type safety in Deezer provider
jdaberkow Apr 3, 2026
0be347d
fix: address review findings for GQL provider rewrite
jdaberkow Apr 4, 2026
a1a743f
fix: reuse paginated get_audiobook() in library sync
jdaberkow Apr 4, 2026
030ab37
fix: remove LIBRARY_RADIOS — Deezer has no provider-side radio library
jdaberkow Apr 4, 2026
2ce21a4
feat: add browse folders for playlists and rework recommendations
jdaberkow Apr 4, 2026
43aa9a4
Merge branch 'dev' into feature/deezer-gql-replacement
jdaberkow May 7, 2026
6d638cc
feat: add is_dynamic for Deezer virtual playlists and share URL parsing
jdaberkow May 7, 2026
488db31
feat: bump deezer-python-gql to 0.10.0, handle SmartTracklist in rece…
jdaberkow May 7, 2026
68915b4
feat: add personal songs (user uploads) support via GW API
jdaberkow May 7, 2026
a697afd
refactor: split deezer provider into modular files
jdaberkow May 7, 2026
876926b
fix: use MP3_MISC format for personal track streaming
jdaberkow May 7, 2026
431b91e
fix: stringify SNG_ID for Blowfish key derivation
jdaberkow May 7, 2026
2f17529
feat(deezer): support personal (user-uploaded) tracks in library
jdaberkow May 8, 2026
503c9bb
feat(deezer): return full Album objects from parse_track for track_al…
jdaberkow May 8, 2026
2649848
fix(deezer): audiobook support and album artist display
jdaberkow May 8, 2026
64f05e6
fix(deezer): fix KeyError in on_streamed for audiobooks and add per-c…
jdaberkow May 8, 2026
43e04bf
fix(deezer): resolve all mypy errors in deezer provider
jdaberkow May 8, 2026
b20e733
Merge remote-tracking branch 'origin/dev' into feature/deezer-gql-rep…
jdaberkow May 8, 2026
4dfd579
refactor: centralize virtual playlist metadata in registry
jdaberkow May 8, 2026
2936a8f
refactor(deezer): deduplicate parsers, extract shared helpers, narrow…
jdaberkow May 8, 2026
7cd53e0
fix(deezer): match ProviderMapping defaults in helper (available=True…
jdaberkow May 8, 2026
66444af
fix: convert recommendation items to ItemMapping to preserve is_dynamic
jdaberkow May 8, 2026
30f11e6
fix: shaker playlist bugs, pagination, and dependency update
jdaberkow May 8, 2026
7be9868
feat: slim search query support and tolerant parsers
jdaberkow May 10, 2026
3c7c889
chore: bump deezer-python-gql to 0.13.0
jdaberkow May 10, 2026
b98f9d1
chore: bump deezer-python-gql to 0.13.1
jdaberkow May 10, 2026
b24cacb
chore: bump deezer-python-gql to 0.13.2
jdaberkow May 11, 2026
ea07c01
Merge remote-tracking branch 'origin/dev' into feature/deezer-gql-rep…
jdaberkow May 11, 2026
72ffb8f
fix: cap search limit to 25 per type for Deezer complexity budget
jdaberkow May 11, 2026
c5f037c
Bump deezer-python-gql to 0.13.3
jdaberkow May 11, 2026
ad69d24
Bump deezer-python-gql to 0.13.4
jdaberkow May 11, 2026
1aa7ca8
Merge remote-tracking branch 'origin/dev' into feature/deezer-gql-rep…
jdaberkow May 17, 2026
67cd60f
feat: add similar artists support and search complexity retry
jdaberkow May 17, 2026
59daad1
Fix incomplete URL substring sanitization in Deezer share URL parsing
jdaberkow May 17, 2026
f547675
Fix podcast episode cache deserialization
jdaberkow May 17, 2026
54b2da2
fix: import GraphQLClientGraphQLMultiError from generated module
jdaberkow May 17, 2026
7f66857
fix: use canonical exception import from deezer-python-gql 0.14.1
jdaberkow May 18, 2026
8d5cb67
Merge remote-tracking branch 'origin/dev' into feature/deezer-gql-rep…
jdaberkow May 24, 2026
2035d30
Merge remote-tracking branch 'origin/dev' into feature/deezer-gql-rep…
jdaberkow May 24, 2026
f8881b8
feat(deezer): add allow_expired_cache for stale-while-revalidate
jdaberkow May 24, 2026
b3e53a7
feat: use shared aiohttp session for deezer-python-gql
jdaberkow May 24, 2026
9394611
Merge branch 'dev' into feature/deezer-gql-replacement
jdaberkow May 24, 2026
efcc4f6
Merge branch 'dev' into feature/deezer-gql-replacement
jdaberkow May 24, 2026
d4ae880
Merge branch 'dev' into feature/deezer-gql-replacement
jdaberkow May 24, 2026
5873064
fix: single-pass album/audiobook detection in get_library_albums
jdaberkow May 24, 2026
74bf6ef
chore: remove PR_REVIEW_STATUS.md from repository
jdaberkow May 24, 2026
ecddbc5
fix: resolve mypy no-any-return in get_flow_config_image
jdaberkow May 24, 2026
4f9c838
fix: eliminate double-fetch of audiobook chapters
jdaberkow May 24, 2026
767d45a
refactor: extract bookmark pagination to shared helper in helpers.py
jdaberkow May 24, 2026
c699619
refactor: reduce podcast episode cache TTL from 24h to 1h
jdaberkow May 24, 2026
9f01abd
Merge branch 'dev' into feature/deezer-gql-replacement
jdaberkow May 24, 2026
8657eba
refactor: cache personal songs with @use_cache and paginate fully
jdaberkow May 25, 2026
71bf948
Merge branch 'feature/deezer-gql-replacement' of github.com-jdaberkow…
jdaberkow May 25, 2026
9cb9c45
refactor(deezer): add Protocol types to _iter_paged pagination helper
jdaberkow May 25, 2026
e4b1551
fix(deezer): wrap handle_async_init in try/except for clean LoginFailed
jdaberkow May 25, 2026
157fc62
refactor(deezer): replace object types with Protocol and typed parame…
jdaberkow May 25, 2026
fd47741
refactor(deezer): extract browse folder names to constants
jdaberkow May 25, 2026
bd28211
refactor: various PR review related fixes
jdaberkow May 25, 2026
a54f5c2
chore: remove PR review status file
jdaberkow May 25, 2026
0796248
Merge branch 'dev' into feature/deezer-gql-replacement
jdaberkow May 25, 2026
e57e5d3
fix: harden Deezer ID validation and fix personal songs pagination
jdaberkow May 25, 2026
a44ed28
Merge branch 'feature/deezer-gql-replacement' of github.com-jdaberkow…
jdaberkow May 25, 2026
faa1d68
feat(deezer): mark unavailable tracks and preserve album year
jdaberkow May 25, 2026
98eb844
Merge branch 'dev' into feature/deezer-gql-replacement
jdaberkow May 26, 2026
455c37d
refactor(deezer): address final review comments
jdaberkow May 26, 2026
d2fd607
Revert too frequent allow_expired_cache usage
jdaberkow May 28, 2026
7675952
Merge remote-tracking branch 'origin/dev' into feature/deezer-gql-rep…
jdaberkow May 28, 2026
9be07c3
Merge branch 'dev' into feature/deezer-gql-replacement
jdaberkow May 29, 2026
4042282
Merge branch 'dev' into feature/deezer-gql-replacement
jdaberkow May 29, 2026
4cf7bfe
Merge branch 'dev' into feature/deezer-gql-replacement
jdaberkow May 30, 2026
62904c2
fix: remove ItemMapping workaround now that models 1.1.127 fixes Unio…
jdaberkow May 30, 2026
da06aa2
Merge branch 'dev' into feature/deezer-gql-replacement
jdaberkow May 31, 2026
d1d83eb
chore: Introduce more constants for the deezer provider
jdaberkow May 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion music_assistant/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ def load_genre_mapping() -> list[dict[str, Any]]:
"player_queues",
)
VERBOSE_LOG_LEVEL: Final[int] = 5
PROVIDERS_WITH_SHAREABLE_URLS = ("spotify", "qobuz", "apple_music")
PROVIDERS_WITH_SHAREABLE_URLS = ("spotify", "qobuz", "apple_music", "deezer")


####### REUSABLE CONFIG ENTRIES #######
Expand Down
27 changes: 27 additions & 0 deletions music_assistant/helpers/uri.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,33 @@ async def parse_uri(uri: str, validate_id: bool = False) -> tuple[MediaType, str
raise KeyError
else:
raise KeyError
elif uri.startswith(("https://www.deezer.com/", "https://deezer.com/")):
# Deezer share URL
# https://www.deezer.com/track/123456
# https://www.deezer.com/en/track/123456 (with locale)
# https://deezer.com/album/789
_deezer_type_map = {
"track": MediaType.TRACK,
"album": MediaType.ALBUM,
"artist": MediaType.ARTIST,
"playlist": MediaType.PLAYLIST,
"show": MediaType.PODCAST,
"episode": MediaType.PODCAST_EPISODE,
}
parts = uri.rstrip("/").split("?")[0].split("/")
# Find the type segment by checking against the known map
deezer_type = None
deezer_id = None
for i, part in enumerate(parts):
if part in _deezer_type_map and i + 1 < len(parts):
deezer_type = part
deezer_id = parts[i + 1]
break
if deezer_type is None or not deezer_id or not deezer_id.isdigit():
raise KeyError
provider_instance_id_or_domain = "deezer"
media_type = _deezer_type_map[deezer_type]
item_id = deezer_id
elif uri.startswith(("http://", "https://", "rtsp://", "rtmp://")):
# Translate a plain URL to the builtin provider
provider_instance_id_or_domain = "builtin"
Expand Down
386 changes: 386 additions & 0 deletions music_assistant/providers/deezer/PR_REVIEW_STATUS.md

Large diffs are not rendered by default.

Loading
Loading