deezer-python-gql 0.12.0__tar.gz → 0.13.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 (88) hide show
  1. {deezer_python_gql-0.12.0/deezer_python_gql.egg-info → deezer_python_gql-0.13.0}/PKG-INFO +1 -1
  2. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/base_client.py +27 -7
  3. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0/deezer_python_gql.egg-info}/PKG-INFO +1 -1
  4. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/pyproject.toml +1 -1
  5. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/LICENSE +0 -0
  6. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/MANIFEST.in +0 -0
  7. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/README.md +0 -0
  8. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/__init__.py +0 -0
  9. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/__init__.py +0 -0
  10. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/add_album_to_favorite.py +0 -0
  11. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/add_artist_to_favorite.py +0 -0
  12. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/add_audiobook_to_favorite.py +0 -0
  13. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/add_playlist_to_favorite.py +0 -0
  14. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/add_podcast_to_favorite.py +0 -0
  15. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/add_track_to_favorite.py +0 -0
  16. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/add_tracks_to_playlist.py +0 -0
  17. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/base_client.py +0 -0
  18. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/base_model.py +0 -0
  19. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/bookmark_podcast_episode.py +0 -0
  20. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/client.py +0 -0
  21. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/create_playlist.py +0 -0
  22. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/delete_playlist.py +0 -0
  23. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/enums.py +0 -0
  24. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/fragments.py +0 -0
  25. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_album.py +0 -0
  26. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_artist.py +0 -0
  27. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_artist_mix.py +0 -0
  28. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_audiobook.py +0 -0
  29. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_audiobook_chapter.py +0 -0
  30. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_charts.py +0 -0
  31. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_favorite_albums.py +0 -0
  32. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_favorite_artists.py +0 -0
  33. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_favorite_audiobooks.py +0 -0
  34. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_favorite_playlists.py +0 -0
  35. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_favorite_podcasts.py +0 -0
  36. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_favorite_tracks.py +0 -0
  37. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_flow.py +0 -0
  38. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_flow_batch.py +0 -0
  39. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_flow_config_tracks.py +0 -0
  40. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_flow_configs.py +0 -0
  41. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_livestream.py +0 -0
  42. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_made_for_me.py +0 -0
  43. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_me.py +0 -0
  44. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_music_together_affinity.py +0 -0
  45. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_music_together_group.py +0 -0
  46. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_music_together_groups.py +0 -0
  47. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_personal_tracks.py +0 -0
  48. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_playlist.py +0 -0
  49. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_podcast.py +0 -0
  50. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_podcast_episode.py +0 -0
  51. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_podcast_episode_bookmarks.py +0 -0
  52. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_podcast_episodes_by_ids.py +0 -0
  53. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_recently_played.py +0 -0
  54. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_recommendations.py +0 -0
  55. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_similar_tracks.py +0 -0
  56. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_smart_tracklist.py +0 -0
  57. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_track.py +0 -0
  58. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_track_mix.py +0 -0
  59. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_user_charts.py +0 -0
  60. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/get_user_playlists.py +0 -0
  61. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/input_types.py +0 -0
  62. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/mark_as_not_played_podcast_episode.py +0 -0
  63. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/mark_as_played_podcast_episode.py +0 -0
  64. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/music_together_create_group.py +0 -0
  65. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/music_together_generate_group_name.py +0 -0
  66. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/music_together_join_group.py +0 -0
  67. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/music_together_leave_group.py +0 -0
  68. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/music_together_refresh_suggested_tracklist.py +0 -0
  69. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/music_together_update_group_settings.py +0 -0
  70. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/remove_album_from_favorite.py +0 -0
  71. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/remove_artist_from_favorite.py +0 -0
  72. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/remove_audiobook_from_favorite.py +0 -0
  73. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/remove_playlist_from_favorite.py +0 -0
  74. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/remove_podcast_from_favorite.py +0 -0
  75. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/remove_track_from_favorite.py +0 -0
  76. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/remove_tracks_from_playlist.py +0 -0
  77. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/search.py +0 -0
  78. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/search_flows.py +0 -0
  79. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/unbookmark_podcast_episode.py +0 -0
  80. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/generated/update_playlist.py +0 -0
  81. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql/py.typed +0 -0
  82. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql.egg-info/SOURCES.txt +0 -0
  83. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql.egg-info/dependency_links.txt +0 -0
  84. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql.egg-info/not-zip-safe +0 -0
  85. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql.egg-info/requires.txt +0 -0
  86. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/deezer_python_gql.egg-info/top_level.txt +0 -0
  87. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/setup.cfg +0 -0
  88. {deezer_python_gql-0.12.0 → deezer_python_gql-0.13.0}/tests/test_client.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deezer-python-gql
3
- Version: 0.12.0
3
+ Version: 0.13.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
@@ -47,16 +47,24 @@ class GraphQLClientGraphQLError(GraphQLClientError):
47
47
  class GraphQLClientGraphQLMultiError(GraphQLClientError):
48
48
  """Raised when the GraphQL response contains errors."""
49
49
 
50
- def __init__(self, errors: list[GraphQLClientGraphQLError], data: Any = None) -> None:
50
+ def __init__(
51
+ self,
52
+ errors: list[GraphQLClientGraphQLError],
53
+ data: Any = None,
54
+ operation_name: str | None = None,
55
+ ) -> None:
51
56
  self.errors = errors
52
57
  self.data = data
53
- super().__init__(str(errors))
58
+ self.operation_name = operation_name
59
+ msg = f"{operation_name}: {errors}" if operation_name else str(errors)
60
+ super().__init__(msg)
54
61
 
55
62
  @classmethod
56
63
  def from_errors_dicts(
57
64
  cls,
58
65
  errors_dicts: list[dict[str, Any]],
59
66
  data: Any = None,
67
+ operation_name: str | None = None,
60
68
  ) -> GraphQLClientGraphQLMultiError:
61
69
  """Create from raw error dicts in a GraphQL response."""
62
70
  errors = [
@@ -67,7 +75,7 @@ class GraphQLClientGraphQLMultiError(GraphQLClientError):
67
75
  )
68
76
  for e in errors_dicts
69
77
  ]
70
- return cls(errors=errors, data=data)
78
+ return cls(errors=errors, data=data, operation_name=operation_name)
71
79
 
72
80
 
73
81
  class DeezerBaseClient:
@@ -101,6 +109,8 @@ class DeezerBaseClient:
101
109
  self._owns_http_client = http_client is None
102
110
  self._jwt: str | None = None
103
111
  self._jwt_expires_at: float = 0
112
+ self._last_operation_name: str | None = None
113
+ self._last_variables: dict[str, Any] | None = None
104
114
 
105
115
  def _get_http_client(self) -> httpx.AsyncClient:
106
116
  """Return the HTTP client, creating an internal one if needed."""
@@ -144,6 +154,8 @@ class DeezerBaseClient:
144
154
  :param kwargs: Additional keyword arguments passed to httpx.
145
155
  """
146
156
  logger.debug("GQL execute: %s (variables=%s)", operation_name or "<unnamed>", variables)
157
+ self._last_operation_name = operation_name
158
+ self._last_variables = variables
147
159
  jwt = await self._ensure_jwt()
148
160
 
149
161
  headers: dict[str, str] = kwargs.pop("headers", None) or {}
@@ -202,17 +214,24 @@ class DeezerBaseClient:
202
214
  errors = response_json.get("errors")
203
215
 
204
216
  if errors:
217
+ op = self._last_operation_name or "<unknown>"
218
+ variables = self._last_variables
205
219
  if data:
206
220
  # Partial success — some items failed (e.g. deleted albums in favorites).
207
221
  # Log the errors but return the valid data.
222
+ error_details = [
223
+ f"{e.get('message', 'Unknown error')} (path={e.get('path')})" for e in errors
224
+ ]
208
225
  logger.warning(
209
- "GraphQL response contained %d error(s): %s",
226
+ "GraphQL response for %s (variables=%s) contained %d error(s): %s",
227
+ op,
228
+ variables,
210
229
  len(errors),
211
- [e.get("message", "Unknown error") for e in errors],
230
+ error_details,
212
231
  )
213
232
  else:
214
233
  raise GraphQLClientGraphQLMultiError.from_errors_dicts(
215
- errors_dicts=errors, data=data
234
+ errors_dicts=errors, data=data, operation_name=op
216
235
  )
217
236
 
218
237
  # The Deezer API omits __typename for single-member union types
@@ -304,7 +323,8 @@ class DeezerBaseClient:
304
323
  ]
305
324
  query = "{ " + " ".join(parts) + " }"
306
325
 
307
- resp = await self.execute(query)
326
+ resp = await self.execute(query, operation_name="CheckAudiobookIds")
327
+ self._last_variables = {"album_ids": album_ids}
308
328
  data = self.get_data(resp)
309
329
 
310
330
  audiobook_ids: set[str] = set()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deezer-python-gql
3
- Version: 0.12.0
3
+ Version: 0.13.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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "deezer-python-gql"
3
- version = "0.12.0"
3
+ version = "0.13.0"
4
4
  description = "Async typed Python client for Deezer's Pipe GraphQL API."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"