deezer-python-gql 0.13.0__tar.gz → 0.13.1__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.
- {deezer_python_gql-0.13.0/deezer_python_gql.egg-info → deezer_python_gql-0.13.1}/PKG-INFO +1 -1
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/base_client.py +27 -7
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1/deezer_python_gql.egg-info}/PKG-INFO +1 -1
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/pyproject.toml +1 -1
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/LICENSE +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/MANIFEST.in +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/README.md +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/__init__.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/base_client.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/__init__.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_album_to_favorite.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_artist_to_favorite.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_audiobook_to_favorite.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_playlist_to_favorite.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_podcast_to_favorite.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_track_to_favorite.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_tracks_to_playlist.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/base_model.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/bookmark_podcast_episode.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/client.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/create_playlist.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/delete_playlist.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/enums.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/fragments.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_album.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_artist.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_artist_mix.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_audiobook.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_audiobook_chapter.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_charts.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_favorite_albums.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_favorite_artists.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_favorite_audiobooks.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_favorite_playlists.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_favorite_podcasts.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_favorite_tracks.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_flow.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_flow_batch.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_flow_config_tracks.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_flow_configs.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_livestream.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_made_for_me.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_me.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_music_together_affinity.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_music_together_group.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_music_together_groups.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_personal_tracks.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_playlist.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_podcast.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_podcast_episode.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_podcast_episode_bookmarks.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_podcast_episodes_by_ids.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_recently_played.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_recommendations.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_similar_tracks.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_smart_tracklist.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_track.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_track_mix.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_user_charts.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_user_playlists.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/input_types.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/mark_as_not_played_podcast_episode.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/mark_as_played_podcast_episode.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/music_together_create_group.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/music_together_generate_group_name.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/music_together_join_group.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/music_together_leave_group.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/music_together_refresh_suggested_tracklist.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/music_together_update_group_settings.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_album_from_favorite.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_artist_from_favorite.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_audiobook_from_favorite.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_playlist_from_favorite.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_podcast_from_favorite.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_track_from_favorite.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_tracks_from_playlist.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/search.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/search_flows.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/unbookmark_podcast_episode.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/update_playlist.py +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/py.typed +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/SOURCES.txt +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/dependency_links.txt +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/not-zip-safe +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/requires.txt +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/top_level.txt +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/setup.cfg +0 -0
- {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/tests/test_client.py +0 -0
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/base_client.py
RENAMED
|
@@ -49,16 +49,24 @@ class GraphQLClientGraphQLError(GraphQLClientError):
|
|
|
49
49
|
class GraphQLClientGraphQLMultiError(GraphQLClientError):
|
|
50
50
|
"""Raised when the GraphQL response contains errors."""
|
|
51
51
|
|
|
52
|
-
def __init__(
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
errors: list[GraphQLClientGraphQLError],
|
|
55
|
+
data: Any = None,
|
|
56
|
+
operation_name: str | None = None,
|
|
57
|
+
) -> None:
|
|
53
58
|
self.errors = errors
|
|
54
59
|
self.data = data
|
|
55
|
-
|
|
60
|
+
self.operation_name = operation_name
|
|
61
|
+
msg = f"{operation_name}: {errors}" if operation_name else str(errors)
|
|
62
|
+
super().__init__(msg)
|
|
56
63
|
|
|
57
64
|
@classmethod
|
|
58
65
|
def from_errors_dicts(
|
|
59
66
|
cls,
|
|
60
67
|
errors_dicts: list[dict[str, Any]],
|
|
61
68
|
data: Any = None,
|
|
69
|
+
operation_name: str | None = None,
|
|
62
70
|
) -> GraphQLClientGraphQLMultiError:
|
|
63
71
|
"""Create from raw error dicts in a GraphQL response."""
|
|
64
72
|
errors = [
|
|
@@ -69,7 +77,7 @@ class GraphQLClientGraphQLMultiError(GraphQLClientError):
|
|
|
69
77
|
)
|
|
70
78
|
for e in errors_dicts
|
|
71
79
|
]
|
|
72
|
-
return cls(errors=errors, data=data)
|
|
80
|
+
return cls(errors=errors, data=data, operation_name=operation_name)
|
|
73
81
|
|
|
74
82
|
|
|
75
83
|
class DeezerBaseClient:
|
|
@@ -103,6 +111,8 @@ class DeezerBaseClient:
|
|
|
103
111
|
self._owns_http_client = http_client is None
|
|
104
112
|
self._jwt: str | None = None
|
|
105
113
|
self._jwt_expires_at: float = 0
|
|
114
|
+
self._last_operation_name: str | None = None
|
|
115
|
+
self._last_variables: dict[str, Any] | None = None
|
|
106
116
|
|
|
107
117
|
def _get_http_client(self) -> httpx.AsyncClient:
|
|
108
118
|
"""Return the HTTP client, creating an internal one if needed."""
|
|
@@ -146,6 +156,8 @@ class DeezerBaseClient:
|
|
|
146
156
|
:param kwargs: Additional keyword arguments passed to httpx.
|
|
147
157
|
"""
|
|
148
158
|
logger.debug("GQL execute: %s (variables=%s)", operation_name or "<unnamed>", variables)
|
|
159
|
+
self._last_operation_name = operation_name
|
|
160
|
+
self._last_variables = variables
|
|
149
161
|
jwt = await self._ensure_jwt()
|
|
150
162
|
|
|
151
163
|
headers: dict[str, str] = kwargs.pop("headers", None) or {}
|
|
@@ -204,17 +216,24 @@ class DeezerBaseClient:
|
|
|
204
216
|
errors = response_json.get("errors")
|
|
205
217
|
|
|
206
218
|
if errors:
|
|
219
|
+
op = self._last_operation_name or "<unknown>"
|
|
220
|
+
variables = self._last_variables
|
|
207
221
|
if data:
|
|
208
222
|
# Partial success — some items failed (e.g. deleted albums in favorites).
|
|
209
223
|
# Log the errors but return the valid data.
|
|
224
|
+
error_details = [
|
|
225
|
+
f"{e.get('message', 'Unknown error')} (path={e.get('path')})" for e in errors
|
|
226
|
+
]
|
|
210
227
|
logger.warning(
|
|
211
|
-
"GraphQL response contained %d error(s): %s",
|
|
228
|
+
"GraphQL response for %s (variables=%s) contained %d error(s): %s",
|
|
229
|
+
op,
|
|
230
|
+
variables,
|
|
212
231
|
len(errors),
|
|
213
|
-
|
|
232
|
+
error_details,
|
|
214
233
|
)
|
|
215
234
|
else:
|
|
216
235
|
raise GraphQLClientGraphQLMultiError.from_errors_dicts(
|
|
217
|
-
errors_dicts=errors, data=data
|
|
236
|
+
errors_dicts=errors, data=data, operation_name=op
|
|
218
237
|
)
|
|
219
238
|
|
|
220
239
|
# The Deezer API omits __typename for single-member union types
|
|
@@ -306,7 +325,8 @@ class DeezerBaseClient:
|
|
|
306
325
|
]
|
|
307
326
|
query = "{ " + " ".join(parts) + " }"
|
|
308
327
|
|
|
309
|
-
resp = await self.execute(query)
|
|
328
|
+
resp = await self.execute(query, operation_name="CheckAudiobookIds")
|
|
329
|
+
self._last_variables = {"album_ids": album_ids}
|
|
310
330
|
data = self.get_data(resp)
|
|
311
331
|
|
|
312
332
|
audiobook_ids: set[str] = set()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/base_model.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/create_playlist.py
RENAMED
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/delete_playlist.py
RENAMED
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/fragments.py
RENAMED
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_album.py
RENAMED
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_artist.py
RENAMED
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_artist_mix.py
RENAMED
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_audiobook.py
RENAMED
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_charts.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_flow.py
RENAMED
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_flow_batch.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_livestream.py
RENAMED
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_made_for_me.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_playlist.py
RENAMED
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_podcast.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_track.py
RENAMED
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_track_mix.py
RENAMED
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_user_charts.py
RENAMED
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/input_types.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/search_flows.py
RENAMED
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/update_playlist.py
RENAMED
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/not-zip-safe
RENAMED
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/requires.txt
RENAMED
|
File without changes
|
{deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|