deezer-python-gql 0.17.2__tar.gz → 0.19.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. {deezer_python_gql-0.17.2/deezer_python_gql.egg-info → deezer_python_gql-0.19.0}/PKG-INFO +49 -26
  2. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/README.md +47 -24
  3. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/__init__.py +103 -0
  4. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/add_audiobook_to_favorite.py +1 -3
  5. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/add_podcast_to_favorite.py +1 -3
  6. deezer_python_gql-0.19.0/deezer_python_gql/generated/ban_artist_from_recommendation.py +26 -0
  7. deezer_python_gql-0.19.0/deezer_python_gql/generated/ban_track_from_recommendation.py +26 -0
  8. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/bookmark_podcast_episode.py +2 -2
  9. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/client.py +607 -74
  10. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/enums.py +10 -0
  11. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/fragments.py +20 -4
  12. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_artist.py +14 -0
  13. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_audiobook.py +1 -0
  14. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_audiobook_chapter.py +2 -2
  15. deezer_python_gql-0.19.0/deezer_python_gql/generated/get_banned_artists.py +51 -0
  16. deezer_python_gql-0.19.0/deezer_python_gql/generated/get_banned_tracks.py +51 -0
  17. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_favorite_albums.py +2 -2
  18. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_favorite_artists.py +2 -2
  19. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_favorite_audiobooks.py +2 -2
  20. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_favorite_playlists.py +2 -2
  21. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_favorite_podcasts.py +2 -2
  22. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_favorite_tracks.py +2 -2
  23. deezer_python_gql-0.19.0/deezer_python_gql/generated/get_flow_tuner.py +25 -0
  24. deezer_python_gql-0.19.0/deezer_python_gql/generated/get_infinite_track_mix.py +24 -0
  25. deezer_python_gql-0.19.0/deezer_python_gql/generated/get_latest_podcast_episodes.py +27 -0
  26. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_made_for_me.py +1 -0
  27. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_music_together_group.py +4 -4
  28. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_music_together_groups.py +4 -4
  29. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_playlist.py +1 -0
  30. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_podcast_episode_bookmarks.py +2 -2
  31. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_smart_tracklist.py +1 -0
  32. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_track.py +7 -3
  33. deezer_python_gql-0.19.0/deezer_python_gql/generated/get_tracks_by_ids.py +22 -0
  34. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/mark_as_played_podcast_episode.py +2 -2
  35. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/music_together_create_group.py +2 -2
  36. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/search.py +2 -2
  37. deezer_python_gql-0.19.0/deezer_python_gql/generated/set_flow_discovery_tuner.py +20 -0
  38. deezer_python_gql-0.19.0/deezer_python_gql/generated/unban_artist_from_recommendation.py +26 -0
  39. deezer_python_gql-0.19.0/deezer_python_gql/generated/unban_track_from_recommendation.py +26 -0
  40. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0/deezer_python_gql.egg-info}/PKG-INFO +49 -26
  41. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql.egg-info/SOURCES.txt +11 -0
  42. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql.egg-info/requires.txt +1 -1
  43. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/pyproject.toml +5 -2
  44. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/tests/test_client.py +168 -1
  45. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/LICENSE +0 -0
  46. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/MANIFEST.in +0 -0
  47. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/__init__.py +0 -0
  48. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/base_client.py +0 -0
  49. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/add_album_to_favorite.py +0 -0
  50. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/add_artist_to_favorite.py +0 -0
  51. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/add_playlist_to_favorite.py +0 -0
  52. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/add_track_to_favorite.py +0 -0
  53. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/add_tracks_to_playlist.py +0 -0
  54. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/base_client.py +0 -0
  55. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/base_model.py +0 -0
  56. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/create_playlist.py +0 -0
  57. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/delete_playlist.py +0 -0
  58. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_album.py +0 -0
  59. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_artist_mix.py +0 -0
  60. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_charts.py +0 -0
  61. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_flow.py +0 -0
  62. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_flow_batch.py +0 -0
  63. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_flow_config_tracks.py +0 -0
  64. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_flow_configs.py +0 -0
  65. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_livestream.py +0 -0
  66. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_me.py +0 -0
  67. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_music_together_affinity.py +0 -0
  68. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_personal_tracks.py +0 -0
  69. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_podcast.py +0 -0
  70. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_podcast_episode.py +0 -0
  71. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_podcast_episodes_by_ids.py +0 -0
  72. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_recently_played.py +0 -0
  73. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_recommendations.py +0 -0
  74. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_similar_artists.py +0 -0
  75. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_similar_tracks.py +0 -0
  76. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_track_mix.py +0 -0
  77. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_user_charts.py +0 -0
  78. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/get_user_playlists.py +0 -0
  79. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/input_types.py +0 -0
  80. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/mark_as_not_played_podcast_episode.py +0 -0
  81. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/music_together_generate_group_name.py +0 -0
  82. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/music_together_join_group.py +0 -0
  83. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/music_together_leave_group.py +0 -0
  84. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/music_together_refresh_suggested_tracklist.py +0 -0
  85. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/music_together_update_group_settings.py +0 -0
  86. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/remove_album_from_favorite.py +0 -0
  87. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/remove_artist_from_favorite.py +0 -0
  88. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/remove_audiobook_from_favorite.py +0 -0
  89. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/remove_playlist_from_favorite.py +0 -0
  90. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/remove_podcast_from_favorite.py +0 -0
  91. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/remove_track_from_favorite.py +0 -0
  92. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/remove_tracks_from_playlist.py +0 -0
  93. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/search_flows.py +0 -0
  94. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/unbookmark_podcast_episode.py +0 -0
  95. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/generated/update_playlist.py +0 -0
  96. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql/py.typed +0 -0
  97. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql.egg-info/dependency_links.txt +0 -0
  98. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql.egg-info/not-zip-safe +0 -0
  99. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/deezer_python_gql.egg-info/top_level.txt +0 -0
  100. {deezer_python_gql-0.17.2 → deezer_python_gql-0.19.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deezer-python-gql
3
- Version: 0.17.2
3
+ Version: 0.19.0
4
4
  Summary: Async typed Python client for Deezer's Pipe GraphQL API.
5
5
  Author-email: Julian Daberkow <jdaberkow@users.noreply.github.com>
6
6
  License: Apache-2.0
@@ -22,7 +22,7 @@ Requires-Dist: pre-commit-hooks==6.0.0; extra == "test"
22
22
  Requires-Dist: pytest==9.1.1; extra == "test"
23
23
  Requires-Dist: pytest-asyncio==1.4.0; extra == "test"
24
24
  Requires-Dist: pytest-cov==7.1.0; extra == "test"
25
- Requires-Dist: ruff==0.16.5; extra == "test"
25
+ Requires-Dist: ruff==0.16.8; extra == "test"
26
26
  Provides-Extra: dev
27
27
  Requires-Dist: ariadne-codegen[subscriptions]; extra == "dev"
28
28
  Dynamic: license-file
@@ -84,18 +84,18 @@ asyncio.run(main())
84
84
 
85
85
  ### Content Retrieval
86
86
 
87
- | Method | Description |
88
- | --------------------------------------------- | --------------------------------------------------------------- |
89
- | `get_me()` | Current authenticated user |
90
- | `get_track(track_id)` | Full track details — ISRC, media tokens, lyrics, contributors |
91
- | `get_album(album_id)` | Album with cover, label, paginated tracks, fallback |
92
- | `get_artist(artist_id)` | Artist with bio, top tracks, albums (ordered by release date) |
93
- | `get_playlist(playlist_id)` | Playlist with owner, picture, paginated tracks |
94
- | `get_livestream(livestream_id)` | Livestream (radio station) with streaming URLs and codec info |
95
- | `get_podcast(podcast_id)` | Podcast with paginated episodes and rights info |
96
- | `get_podcast_episode(podcast_episode_id)` | Single episode with media URL, codec, and parent podcast ref |
97
- | `get_audiobook(audiobook_id)` | Audiobook with paginated chapters, contributors, and fallback |
98
- | `get_audiobook_chapter(audiobook_chapter_id)` | Chapter with media token, estimated sizes, and streaming rights |
87
+ | Method | Description |
88
+ | --------------------------------------------- | ----------------------------------------------------------------------------------------- |
89
+ | `get_me()` | Current authenticated user |
90
+ | `get_track(track_id)` | Full track details — ISRC, gain, ban state, media tokens, lyrics, contributors |
91
+ | `get_album(album_id)` | Album with cover, label, paginated tracks, fallback |
92
+ | `get_artist(artist_id)` | Artist with bio, social links, hero picture, top tracks, albums (ordered by release date) |
93
+ | `get_playlist(playlist_id)` | Playlist with owner, picture, paginated tracks |
94
+ | `get_livestream(livestream_id)` | Livestream (radio station) with streaming URLs and codec info |
95
+ | `get_podcast(podcast_id)` | Podcast with paginated episodes and rights info |
96
+ | `get_podcast_episode(podcast_episode_id)` | Single episode with media URL, codec, and parent podcast ref |
97
+ | `get_audiobook(audiobook_id)` | Audiobook with UPC, paginated chapters, contributors, and fallback |
98
+ | `get_audiobook_chapter(audiobook_chapter_id)` | Chapter with media token, estimated sizes, and streaming rights |
99
99
 
100
100
  ### Search & Discovery
101
101
 
@@ -106,12 +106,14 @@ asyncio.run(main())
106
106
  | `get_similar_tracks(track_id, nb)` | Recommended tracks based on a given track |
107
107
  | `get_artist_mix(artist_ids, limit)` | Track mix blended from given artists |
108
108
  | `get_track_mix(track_ids, limit)` | Track mix blended around given tracks |
109
+ | `get_infinite_track_mix(track_ids, limit, ...)` | Track IDs for an endless mix, input tracks left out (at least 40, cost ~10000) |
110
+ | `get_tracks_by_ids(ids)` | Several tracks in one request, unknown IDs come back as `None` |
109
111
  | `get_flow()` | User's default Flow with tracks |
110
112
  | `get_flow_batch()` | 4 batches of Flow tracks in one request (via GraphQL aliases) |
111
113
  | `get_flow_configs(moods_first, genres_first)` | Mood & genre flow config lists for discovery |
112
114
  | `get_flow_config_tracks(flow_config_id)` | Tracks for a specific mood/genre flow config |
113
115
  | `get_made_for_me(first)` | "Made For You" SmartTracklist & Flow items |
114
- | `get_smart_tracklist(smart_tracklist_id, first)` | Smart tracklist with paginated tracks |
116
+ | `get_smart_tracklist(smart_tracklist_id, first)` | Smart tracklist with expiry and paginated tracks |
115
117
  | `get_charts(country_code, ...)` | Country charts — tracks, albums, artists, playlists |
116
118
  | `get_recommendations(playlists_first, ...)` | Personalized recommendations across categories |
117
119
  | `get_recently_played(first)` | Recently played mixed content (albums, playlists, artists...) |
@@ -119,17 +121,21 @@ asyncio.run(main())
119
121
 
120
122
  ### Library & Favorites
121
123
 
122
- | Method | Description |
123
- | --------------------------------------------- | ----------------------------------------------------------- |
124
- | `get_favorite_artists(first, after)` | Paginated favorite artists |
125
- | `get_favorite_albums(first, after)` | Paginated favorite albums |
126
- | `get_favorite_tracks(first, after)` | Paginated favorite tracks |
127
- | `get_favorite_playlists(first, after)` | Paginated favorite playlists |
128
- | `get_favorite_podcasts(first, after)` | Paginated favorite podcasts |
129
- | `get_favorite_audiobooks()` | Favorite audiobook IDs with dates (via deprecated endpoint) |
130
- | `get_podcast_episode_bookmarks(first, after)` | Bookmarked podcast episodes with playback position |
131
- | `get_user_playlists(first, after)` | User's own playlists (not just favorites) |
132
- | `get_personal_tracks(first, after)` | User's uploaded/personal tracks (restricted access) |
124
+ | Method | Description |
125
+ | --------------------------------------------- | --------------------------------------------------------------- |
126
+ | `get_favorite_artists(first, after)` | Paginated favorite artists |
127
+ | `get_favorite_albums(first, after)` | Paginated favorite albums |
128
+ | `get_favorite_tracks(first, after)` | Paginated favorite tracks |
129
+ | `get_favorite_playlists(first, after)` | Paginated favorite playlists |
130
+ | `get_favorite_podcasts(first, after)` | Paginated favorite podcasts |
131
+ | `get_favorite_audiobooks()` | Favorite audiobook IDs with dates (via deprecated endpoint) |
132
+ | `get_podcast_episode_bookmarks(first, after)` | Bookmarked podcast episodes with playback position |
133
+ | `get_user_playlists(first, after)` | User's own playlists (not just favorites) |
134
+ | `get_personal_tracks(first, after)` | User's uploaded/personal tracks (restricted access) |
135
+ | `get_latest_podcast_episodes()` | Latest episodes of favorite podcasts (IDs + dates, cost ~15000) |
136
+ | `get_banned_tracks(first, after)` | Tracks banned from recommendations, with ban date |
137
+ | `get_banned_artists(first, after)` | Artists banned from recommendations, with ban date |
138
+ | `get_flow_tuner()` | Flow tuner: `DEFAULT` or `DISCOVERY` |
133
139
 
134
140
  ### Music Together (Collaborative Playlists)
135
141
 
@@ -158,6 +164,23 @@ asyncio.run(main())
158
164
  | `add_audiobook_to_favorite(audiobook_id)` | Add audiobook to favorites (deprecated but functional) |
159
165
  | `remove_audiobook_from_favorite(audiobook_id)` | Remove audiobook from favorites (deprecated but functional) |
160
166
 
167
+ ### Recommendation Bans
168
+
169
+ Keep a track or artist out of the user's recommendations (Flow, mixes).
170
+
171
+ | Method | Description |
172
+ | --------------------------------------------- | -------------------------------------- |
173
+ | `ban_track_from_recommendation(track_id)` | Keep track out of recommendations |
174
+ | `unban_track_from_recommendation(track_id)` | Allow track back into recommendations |
175
+ | `ban_artist_from_recommendation(artist_id)` | Keep artist out of recommendations |
176
+ | `unban_artist_from_recommendation(artist_id)` | Allow artist back into recommendations |
177
+
178
+ ### Flow
179
+
180
+ | Method | Description |
181
+ | ------------------------------------------- | --------------------------------------------- |
182
+ | `set_flow_discovery_tuner(discovery_tuner)` | Switch Flow between `DEFAULT` and `DISCOVERY` |
183
+
161
184
  ### Playlist Management
162
185
 
163
186
  | Method | Description |
@@ -55,18 +55,18 @@ asyncio.run(main())
55
55
 
56
56
  ### Content Retrieval
57
57
 
58
- | Method | Description |
59
- | --------------------------------------------- | --------------------------------------------------------------- |
60
- | `get_me()` | Current authenticated user |
61
- | `get_track(track_id)` | Full track details — ISRC, media tokens, lyrics, contributors |
62
- | `get_album(album_id)` | Album with cover, label, paginated tracks, fallback |
63
- | `get_artist(artist_id)` | Artist with bio, top tracks, albums (ordered by release date) |
64
- | `get_playlist(playlist_id)` | Playlist with owner, picture, paginated tracks |
65
- | `get_livestream(livestream_id)` | Livestream (radio station) with streaming URLs and codec info |
66
- | `get_podcast(podcast_id)` | Podcast with paginated episodes and rights info |
67
- | `get_podcast_episode(podcast_episode_id)` | Single episode with media URL, codec, and parent podcast ref |
68
- | `get_audiobook(audiobook_id)` | Audiobook with paginated chapters, contributors, and fallback |
69
- | `get_audiobook_chapter(audiobook_chapter_id)` | Chapter with media token, estimated sizes, and streaming rights |
58
+ | Method | Description |
59
+ | --------------------------------------------- | ----------------------------------------------------------------------------------------- |
60
+ | `get_me()` | Current authenticated user |
61
+ | `get_track(track_id)` | Full track details — ISRC, gain, ban state, media tokens, lyrics, contributors |
62
+ | `get_album(album_id)` | Album with cover, label, paginated tracks, fallback |
63
+ | `get_artist(artist_id)` | Artist with bio, social links, hero picture, top tracks, albums (ordered by release date) |
64
+ | `get_playlist(playlist_id)` | Playlist with owner, picture, paginated tracks |
65
+ | `get_livestream(livestream_id)` | Livestream (radio station) with streaming URLs and codec info |
66
+ | `get_podcast(podcast_id)` | Podcast with paginated episodes and rights info |
67
+ | `get_podcast_episode(podcast_episode_id)` | Single episode with media URL, codec, and parent podcast ref |
68
+ | `get_audiobook(audiobook_id)` | Audiobook with UPC, paginated chapters, contributors, and fallback |
69
+ | `get_audiobook_chapter(audiobook_chapter_id)` | Chapter with media token, estimated sizes, and streaming rights |
70
70
 
71
71
  ### Search & Discovery
72
72
 
@@ -77,12 +77,14 @@ asyncio.run(main())
77
77
  | `get_similar_tracks(track_id, nb)` | Recommended tracks based on a given track |
78
78
  | `get_artist_mix(artist_ids, limit)` | Track mix blended from given artists |
79
79
  | `get_track_mix(track_ids, limit)` | Track mix blended around given tracks |
80
+ | `get_infinite_track_mix(track_ids, limit, ...)` | Track IDs for an endless mix, input tracks left out (at least 40, cost ~10000) |
81
+ | `get_tracks_by_ids(ids)` | Several tracks in one request, unknown IDs come back as `None` |
80
82
  | `get_flow()` | User's default Flow with tracks |
81
83
  | `get_flow_batch()` | 4 batches of Flow tracks in one request (via GraphQL aliases) |
82
84
  | `get_flow_configs(moods_first, genres_first)` | Mood & genre flow config lists for discovery |
83
85
  | `get_flow_config_tracks(flow_config_id)` | Tracks for a specific mood/genre flow config |
84
86
  | `get_made_for_me(first)` | "Made For You" SmartTracklist & Flow items |
85
- | `get_smart_tracklist(smart_tracklist_id, first)` | Smart tracklist with paginated tracks |
87
+ | `get_smart_tracklist(smart_tracklist_id, first)` | Smart tracklist with expiry and paginated tracks |
86
88
  | `get_charts(country_code, ...)` | Country charts — tracks, albums, artists, playlists |
87
89
  | `get_recommendations(playlists_first, ...)` | Personalized recommendations across categories |
88
90
  | `get_recently_played(first)` | Recently played mixed content (albums, playlists, artists...) |
@@ -90,17 +92,21 @@ asyncio.run(main())
90
92
 
91
93
  ### Library & Favorites
92
94
 
93
- | Method | Description |
94
- | --------------------------------------------- | ----------------------------------------------------------- |
95
- | `get_favorite_artists(first, after)` | Paginated favorite artists |
96
- | `get_favorite_albums(first, after)` | Paginated favorite albums |
97
- | `get_favorite_tracks(first, after)` | Paginated favorite tracks |
98
- | `get_favorite_playlists(first, after)` | Paginated favorite playlists |
99
- | `get_favorite_podcasts(first, after)` | Paginated favorite podcasts |
100
- | `get_favorite_audiobooks()` | Favorite audiobook IDs with dates (via deprecated endpoint) |
101
- | `get_podcast_episode_bookmarks(first, after)` | Bookmarked podcast episodes with playback position |
102
- | `get_user_playlists(first, after)` | User's own playlists (not just favorites) |
103
- | `get_personal_tracks(first, after)` | User's uploaded/personal tracks (restricted access) |
95
+ | Method | Description |
96
+ | --------------------------------------------- | --------------------------------------------------------------- |
97
+ | `get_favorite_artists(first, after)` | Paginated favorite artists |
98
+ | `get_favorite_albums(first, after)` | Paginated favorite albums |
99
+ | `get_favorite_tracks(first, after)` | Paginated favorite tracks |
100
+ | `get_favorite_playlists(first, after)` | Paginated favorite playlists |
101
+ | `get_favorite_podcasts(first, after)` | Paginated favorite podcasts |
102
+ | `get_favorite_audiobooks()` | Favorite audiobook IDs with dates (via deprecated endpoint) |
103
+ | `get_podcast_episode_bookmarks(first, after)` | Bookmarked podcast episodes with playback position |
104
+ | `get_user_playlists(first, after)` | User's own playlists (not just favorites) |
105
+ | `get_personal_tracks(first, after)` | User's uploaded/personal tracks (restricted access) |
106
+ | `get_latest_podcast_episodes()` | Latest episodes of favorite podcasts (IDs + dates, cost ~15000) |
107
+ | `get_banned_tracks(first, after)` | Tracks banned from recommendations, with ban date |
108
+ | `get_banned_artists(first, after)` | Artists banned from recommendations, with ban date |
109
+ | `get_flow_tuner()` | Flow tuner: `DEFAULT` or `DISCOVERY` |
104
110
 
105
111
  ### Music Together (Collaborative Playlists)
106
112
 
@@ -129,6 +135,23 @@ asyncio.run(main())
129
135
  | `add_audiobook_to_favorite(audiobook_id)` | Add audiobook to favorites (deprecated but functional) |
130
136
  | `remove_audiobook_from_favorite(audiobook_id)` | Remove audiobook from favorites (deprecated but functional) |
131
137
 
138
+ ### Recommendation Bans
139
+
140
+ Keep a track or artist out of the user's recommendations (Flow, mixes).
141
+
142
+ | Method | Description |
143
+ | --------------------------------------------- | -------------------------------------- |
144
+ | `ban_track_from_recommendation(track_id)` | Keep track out of recommendations |
145
+ | `unban_track_from_recommendation(track_id)` | Allow track back into recommendations |
146
+ | `ban_artist_from_recommendation(artist_id)` | Keep artist out of recommendations |
147
+ | `unban_artist_from_recommendation(artist_id)` | Allow artist back into recommendations |
148
+
149
+ ### Flow
150
+
151
+ | Method | Description |
152
+ | ------------------------------------------- | --------------------------------------------- |
153
+ | `set_flow_discovery_tuner(discovery_tuner)` | Switch Flow between `DEFAULT` and `DISCOVERY` |
154
+
132
155
  ### Playlist Management
133
156
 
134
157
  | Method | Description |
@@ -34,6 +34,16 @@ from .add_tracks_to_playlist import (
34
34
  AddTracksToPlaylistAddTracksToPlaylistPlaylistAddTracksError,
35
35
  AddTracksToPlaylistAddTracksToPlaylistPlaylistAddTracksOutput,
36
36
  )
37
+ from .ban_artist_from_recommendation import (
38
+ BanArtistFromRecommendation,
39
+ BanArtistFromRecommendationBanArtistFromRecommendation,
40
+ BanArtistFromRecommendationBanArtistFromRecommendationArtist,
41
+ )
42
+ from .ban_track_from_recommendation import (
43
+ BanTrackFromRecommendation,
44
+ BanTrackFromRecommendationBanTrackFromRecommendation,
45
+ BanTrackFromRecommendationBanTrackFromRecommendationTrack,
46
+ )
37
47
  from .base_client import DeezerBaseClient
38
48
  from .base_model import BaseModel, Upload
39
49
  from .bookmark_podcast_episode import (
@@ -51,6 +61,8 @@ from .delete_playlist import DeletePlaylist, DeletePlaylistDeletePlaylist
51
61
  from .enums import (
52
62
  AlbumType,
53
63
  AudiobookContributorRoles,
64
+ DiscoveryTuner,
65
+ DiscoveryTunerInput,
54
66
  MusicTogetherRefreshSuggestedTracklistMoodInput,
55
67
  MusicTogetherSuggestedTracklistMoodInput,
56
68
  PodcastEpisodeOrder,
@@ -63,6 +75,7 @@ from .fragments import (
63
75
  AlbumFieldsContributorsEdges,
64
76
  AlbumFieldsContributorsEdgesNodeArtist,
65
77
  AlbumFieldsCover,
78
+ AlbumFieldsSubtypes,
66
79
  ArtistFields,
67
80
  ArtistFieldsBio,
68
81
  ArtistFieldsPicture,
@@ -116,6 +129,8 @@ from .get_artist import (
116
129
  GetArtistArtistAlbumsEdges,
117
130
  GetArtistArtistAlbumsEdgesNode,
118
131
  GetArtistArtistAlbumsPageInfo,
132
+ GetArtistArtistHeroPicture,
133
+ GetArtistArtistSocial,
119
134
  GetArtistArtistTopTracks,
120
135
  GetArtistArtistTopTracksEdges,
121
136
  GetArtistArtistTopTracksEdgesNode,
@@ -151,6 +166,24 @@ from .get_audiobook_chapter import (
151
166
  GetAudiobookChapterAudiobookChapterMediaRightsSub,
152
167
  GetAudiobookChapterAudiobookChapterMediaToken,
153
168
  )
169
+ from .get_banned_artists import (
170
+ GetBannedArtists,
171
+ GetBannedArtistsMe,
172
+ GetBannedArtistsMeBannedFromRecommendation,
173
+ GetBannedArtistsMeBannedFromRecommendationArtists,
174
+ GetBannedArtistsMeBannedFromRecommendationArtistsEdges,
175
+ GetBannedArtistsMeBannedFromRecommendationArtistsEdgesNode,
176
+ GetBannedArtistsMeBannedFromRecommendationArtistsPageInfo,
177
+ )
178
+ from .get_banned_tracks import (
179
+ GetBannedTracks,
180
+ GetBannedTracksMe,
181
+ GetBannedTracksMeBannedFromRecommendation,
182
+ GetBannedTracksMeBannedFromRecommendationTracks,
183
+ GetBannedTracksMeBannedFromRecommendationTracksEdges,
184
+ GetBannedTracksMeBannedFromRecommendationTracksEdgesNode,
185
+ GetBannedTracksMeBannedFromRecommendationTracksPageInfo,
186
+ )
154
187
  from .get_charts import (
155
188
  GetCharts,
156
189
  GetChartsCharts,
@@ -270,6 +303,17 @@ from .get_flow_configs import (
270
303
  GetFlowConfigsMeFlowConfigsMoodsEdgesNodeVisualsHardwareSquareIcon,
271
304
  GetFlowConfigsMeFlowConfigsMoodsPageInfo,
272
305
  )
306
+ from .get_flow_tuner import GetFlowTuner, GetFlowTunerMe, GetFlowTunerMeFlowTuner
307
+ from .get_infinite_track_mix import (
308
+ GetInfiniteTrackMix,
309
+ GetInfiniteTrackMixRawInfiniteTrackMix,
310
+ GetInfiniteTrackMixRawInfiniteTrackMixTracks,
311
+ )
312
+ from .get_latest_podcast_episodes import (
313
+ GetLatestPodcastEpisodes,
314
+ GetLatestPodcastEpisodesMe,
315
+ GetLatestPodcastEpisodesMeRawLatestPodcastEpisodes,
316
+ )
273
317
  from .get_livestream import GetLivestream, GetLivestreamLivestream
274
318
  from .get_made_for_me import (
275
319
  GetMadeForMe,
@@ -472,6 +516,7 @@ from .get_track_mix import (
472
516
  GetTrackMixTrackMixTracks,
473
517
  GetTrackMixTrackMixTracksTrack,
474
518
  )
519
+ from .get_tracks_by_ids import GetTracksByIds, GetTracksByIdsTracksByIds
475
520
  from .get_user_charts import (
476
521
  GetUserCharts,
477
522
  GetUserChartsMe,
@@ -631,6 +676,20 @@ from .search_flows import (
631
676
  SearchFlowsSearchResultsFlowConfigsEdgesNodeVisualsHardwareSquareIcon,
632
677
  SearchFlowsSearchResultsFlowConfigsPageInfo,
633
678
  )
679
+ from .set_flow_discovery_tuner import (
680
+ SetFlowDiscoveryTuner,
681
+ SetFlowDiscoveryTunerSetFlowDiscoveryTuner,
682
+ )
683
+ from .unban_artist_from_recommendation import (
684
+ UnbanArtistFromRecommendation,
685
+ UnbanArtistFromRecommendationUnbanArtistFromRecommendation,
686
+ UnbanArtistFromRecommendationUnbanArtistFromRecommendationArtist,
687
+ )
688
+ from .unban_track_from_recommendation import (
689
+ UnbanTrackFromRecommendation,
690
+ UnbanTrackFromRecommendationUnbanTrackFromRecommendation,
691
+ UnbanTrackFromRecommendationUnbanTrackFromRecommendationTrack,
692
+ )
634
693
  from .unbookmark_podcast_episode import (
635
694
  UnbookmarkPodcastEpisode,
636
695
  UnbookmarkPodcastEpisodeUnbookmarkPodcastEpisode,
@@ -668,6 +727,7 @@ __all__ = [
668
727
  "AlbumFieldsContributorsEdges",
669
728
  "AlbumFieldsContributorsEdgesNodeArtist",
670
729
  "AlbumFieldsCover",
730
+ "AlbumFieldsSubtypes",
671
731
  "AlbumType",
672
732
  "ArtistFields",
673
733
  "ArtistFieldsBio",
@@ -680,6 +740,12 @@ __all__ = [
680
740
  "AudiobookFieldsContributorsEdges",
681
741
  "AudiobookFieldsContributorsEdgesNodeArtist",
682
742
  "AudiobookFieldsCover",
743
+ "BanArtistFromRecommendation",
744
+ "BanArtistFromRecommendationBanArtistFromRecommendation",
745
+ "BanArtistFromRecommendationBanArtistFromRecommendationArtist",
746
+ "BanTrackFromRecommendation",
747
+ "BanTrackFromRecommendationBanTrackFromRecommendation",
748
+ "BanTrackFromRecommendationBanTrackFromRecommendationTrack",
683
749
  "BaseModel",
684
750
  "BookmarkPodcastEpisode",
685
751
  "BookmarkPodcastEpisodeBookmarkPodcastEpisode",
@@ -691,6 +757,8 @@ __all__ = [
691
757
  "DeezerGQLClient",
692
758
  "DeletePlaylist",
693
759
  "DeletePlaylistDeletePlaylist",
760
+ "DiscoveryTuner",
761
+ "DiscoveryTunerInput",
694
762
  "GetAlbum",
695
763
  "GetAlbumAlbum",
696
764
  "GetAlbumAlbumFallback",
@@ -706,6 +774,8 @@ __all__ = [
706
774
  "GetArtistArtistAlbumsEdges",
707
775
  "GetArtistArtistAlbumsEdgesNode",
708
776
  "GetArtistArtistAlbumsPageInfo",
777
+ "GetArtistArtistHeroPicture",
778
+ "GetArtistArtistSocial",
709
779
  "GetArtistArtistTopTracks",
710
780
  "GetArtistArtistTopTracksEdges",
711
781
  "GetArtistArtistTopTracksEdgesNode",
@@ -734,6 +804,20 @@ __all__ = [
734
804
  "GetAudiobookChapterAudiobookChapterMediaRightsAds",
735
805
  "GetAudiobookChapterAudiobookChapterMediaRightsSub",
736
806
  "GetAudiobookChapterAudiobookChapterMediaToken",
807
+ "GetBannedArtists",
808
+ "GetBannedArtistsMe",
809
+ "GetBannedArtistsMeBannedFromRecommendation",
810
+ "GetBannedArtistsMeBannedFromRecommendationArtists",
811
+ "GetBannedArtistsMeBannedFromRecommendationArtistsEdges",
812
+ "GetBannedArtistsMeBannedFromRecommendationArtistsEdgesNode",
813
+ "GetBannedArtistsMeBannedFromRecommendationArtistsPageInfo",
814
+ "GetBannedTracks",
815
+ "GetBannedTracksMe",
816
+ "GetBannedTracksMeBannedFromRecommendation",
817
+ "GetBannedTracksMeBannedFromRecommendationTracks",
818
+ "GetBannedTracksMeBannedFromRecommendationTracksEdges",
819
+ "GetBannedTracksMeBannedFromRecommendationTracksEdgesNode",
820
+ "GetBannedTracksMeBannedFromRecommendationTracksPageInfo",
737
821
  "GetCharts",
738
822
  "GetChartsCharts",
739
823
  "GetChartsChartsCountry",
@@ -831,6 +915,15 @@ __all__ = [
831
915
  "GetFlowMeFlowCover",
832
916
  "GetFlowMeFlowTracks",
833
917
  "GetFlowMeFlowTracksTrack",
918
+ "GetFlowTuner",
919
+ "GetFlowTunerMe",
920
+ "GetFlowTunerMeFlowTuner",
921
+ "GetInfiniteTrackMix",
922
+ "GetInfiniteTrackMixRawInfiniteTrackMix",
923
+ "GetInfiniteTrackMixRawInfiniteTrackMixTracks",
924
+ "GetLatestPodcastEpisodes",
925
+ "GetLatestPodcastEpisodesMe",
926
+ "GetLatestPodcastEpisodesMeRawLatestPodcastEpisodes",
834
927
  "GetLivestream",
835
928
  "GetLivestreamLivestream",
836
929
  "GetMadeForMe",
@@ -1001,6 +1094,8 @@ __all__ = [
1001
1094
  "GetTrackTrackMediaRightsAds",
1002
1095
  "GetTrackTrackMediaRightsSub",
1003
1096
  "GetTrackTrackMediaToken",
1097
+ "GetTracksByIds",
1098
+ "GetTracksByIdsTracksByIds",
1004
1099
  "GetUserCharts",
1005
1100
  "GetUserChartsMe",
1006
1101
  "GetUserChartsMeCharts",
@@ -1140,6 +1235,8 @@ __all__ = [
1140
1235
  "SearchSearchResultsTracksEdgesNodeMediaRights",
1141
1236
  "SearchSearchResultsTracksEdgesNodeMediaRightsSub",
1142
1237
  "SearchSearchResultsTracksPageInfo",
1238
+ "SetFlowDiscoveryTuner",
1239
+ "SetFlowDiscoveryTunerSetFlowDiscoveryTuner",
1143
1240
  "TrackContributorRoles",
1144
1241
  "TrackFields",
1145
1242
  "TrackFieldsAlbum",
@@ -1151,6 +1248,12 @@ __all__ = [
1151
1248
  "TrackFieldsMedia",
1152
1249
  "TrackFieldsMediaRights",
1153
1250
  "TrackFieldsMediaRightsSub",
1251
+ "UnbanArtistFromRecommendation",
1252
+ "UnbanArtistFromRecommendationUnbanArtistFromRecommendation",
1253
+ "UnbanArtistFromRecommendationUnbanArtistFromRecommendationArtist",
1254
+ "UnbanTrackFromRecommendation",
1255
+ "UnbanTrackFromRecommendationUnbanTrackFromRecommendation",
1256
+ "UnbanTrackFromRecommendationUnbanTrackFromRecommendationTrack",
1154
1257
  "UnbookmarkPodcastEpisode",
1155
1258
  "UnbookmarkPodcastEpisodeUnbookmarkPodcastEpisode",
1156
1259
  "UnbookmarkPodcastEpisodeUnbookmarkPodcastEpisodeEpisode",
@@ -1,8 +1,6 @@
1
1
  # Generated by ariadne-codegen
2
2
  # Source: queries
3
3
 
4
- from typing import Any
5
-
6
4
  from pydantic import Field
7
5
 
8
6
  from .base_model import BaseModel
@@ -16,7 +14,7 @@ class AddAudiobookToFavorite(BaseModel):
16
14
 
17
15
  class AddAudiobookToFavoriteAddAudiobookToFavorite(BaseModel):
18
16
  id: str
19
- favorited_at: Any = Field(alias="favoritedAt")
17
+ favorited_at: str = Field(alias="favoritedAt")
20
18
 
21
19
 
22
20
  AddAudiobookToFavorite.model_rebuild()
@@ -1,8 +1,6 @@
1
1
  # Generated by ariadne-codegen
2
2
  # Source: queries
3
3
 
4
- from typing import Any
5
-
6
4
  from pydantic import Field
7
5
 
8
6
  from .base_model import BaseModel
@@ -16,7 +14,7 @@ class AddPodcastToFavorite(BaseModel):
16
14
 
17
15
  class AddPodcastToFavoriteAddPodcastToFavorite(BaseModel):
18
16
  podcast: "AddPodcastToFavoriteAddPodcastToFavoritePodcast"
19
- favorited_at: Any = Field(alias="favoritedAt")
17
+ favorited_at: str = Field(alias="favoritedAt")
20
18
 
21
19
 
22
20
  class AddPodcastToFavoriteAddPodcastToFavoritePodcast(BaseModel):
@@ -0,0 +1,26 @@
1
+ # Generated by ariadne-codegen
2
+ # Source: queries
3
+
4
+ from pydantic import Field
5
+
6
+ from .base_model import BaseModel
7
+
8
+
9
+ class BanArtistFromRecommendation(BaseModel):
10
+ ban_artist_from_recommendation: "BanArtistFromRecommendationBanArtistFromRecommendation" = Field(
11
+ alias="banArtistFromRecommendation"
12
+ )
13
+
14
+
15
+ class BanArtistFromRecommendationBanArtistFromRecommendation(BaseModel):
16
+ status: bool
17
+ artist: "BanArtistFromRecommendationBanArtistFromRecommendationArtist"
18
+
19
+
20
+ class BanArtistFromRecommendationBanArtistFromRecommendationArtist(BaseModel):
21
+ id: str
22
+ name: str
23
+
24
+
25
+ BanArtistFromRecommendation.model_rebuild()
26
+ BanArtistFromRecommendationBanArtistFromRecommendation.model_rebuild()
@@ -0,0 +1,26 @@
1
+ # Generated by ariadne-codegen
2
+ # Source: queries
3
+
4
+ from pydantic import Field
5
+
6
+ from .base_model import BaseModel
7
+
8
+
9
+ class BanTrackFromRecommendation(BaseModel):
10
+ ban_track_from_recommendation: "BanTrackFromRecommendationBanTrackFromRecommendation" = Field(
11
+ alias="banTrackFromRecommendation"
12
+ )
13
+
14
+
15
+ class BanTrackFromRecommendationBanTrackFromRecommendation(BaseModel):
16
+ status: bool
17
+ track: "BanTrackFromRecommendationBanTrackFromRecommendationTrack"
18
+
19
+
20
+ class BanTrackFromRecommendationBanTrackFromRecommendationTrack(BaseModel):
21
+ id: str
22
+ title: str
23
+
24
+
25
+ BanTrackFromRecommendation.model_rebuild()
26
+ BanTrackFromRecommendationBanTrackFromRecommendation.model_rebuild()
@@ -1,7 +1,7 @@
1
1
  # Generated by ariadne-codegen
2
2
  # Source: queries
3
3
 
4
- from typing import Any, Optional
4
+ from typing import Optional
5
5
 
6
6
  from pydantic import Field
7
7
 
@@ -22,7 +22,7 @@ class BookmarkPodcastEpisodeBookmarkPodcastEpisode(BaseModel):
22
22
  class BookmarkPodcastEpisodeBookmarkPodcastEpisodeBookmark(BaseModel):
23
23
  position: int
24
24
  is_played: bool = Field(alias="isPlayed")
25
- bookmarked_at: Any = Field(alias="bookmarkedAt")
25
+ bookmarked_at: str = Field(alias="bookmarkedAt")
26
26
 
27
27
 
28
28
  BookmarkPodcastEpisode.model_rebuild()