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.
Files changed (88) hide show
  1. {deezer_python_gql-0.13.0/deezer_python_gql.egg-info → deezer_python_gql-0.13.1}/PKG-INFO +1 -1
  2. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/base_client.py +27 -7
  3. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1/deezer_python_gql.egg-info}/PKG-INFO +1 -1
  4. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/pyproject.toml +1 -1
  5. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/LICENSE +0 -0
  6. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/MANIFEST.in +0 -0
  7. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/README.md +0 -0
  8. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/__init__.py +0 -0
  9. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/base_client.py +0 -0
  10. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/__init__.py +0 -0
  11. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_album_to_favorite.py +0 -0
  12. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_artist_to_favorite.py +0 -0
  13. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_audiobook_to_favorite.py +0 -0
  14. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_playlist_to_favorite.py +0 -0
  15. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_podcast_to_favorite.py +0 -0
  16. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_track_to_favorite.py +0 -0
  17. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/add_tracks_to_playlist.py +0 -0
  18. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/base_model.py +0 -0
  19. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/bookmark_podcast_episode.py +0 -0
  20. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/client.py +0 -0
  21. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/create_playlist.py +0 -0
  22. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/delete_playlist.py +0 -0
  23. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/enums.py +0 -0
  24. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/fragments.py +0 -0
  25. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_album.py +0 -0
  26. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_artist.py +0 -0
  27. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_artist_mix.py +0 -0
  28. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_audiobook.py +0 -0
  29. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_audiobook_chapter.py +0 -0
  30. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_charts.py +0 -0
  31. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_favorite_albums.py +0 -0
  32. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_favorite_artists.py +0 -0
  33. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_favorite_audiobooks.py +0 -0
  34. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_favorite_playlists.py +0 -0
  35. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_favorite_podcasts.py +0 -0
  36. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_favorite_tracks.py +0 -0
  37. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_flow.py +0 -0
  38. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_flow_batch.py +0 -0
  39. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_flow_config_tracks.py +0 -0
  40. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_flow_configs.py +0 -0
  41. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_livestream.py +0 -0
  42. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_made_for_me.py +0 -0
  43. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_me.py +0 -0
  44. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_music_together_affinity.py +0 -0
  45. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_music_together_group.py +0 -0
  46. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_music_together_groups.py +0 -0
  47. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_personal_tracks.py +0 -0
  48. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_playlist.py +0 -0
  49. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_podcast.py +0 -0
  50. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_podcast_episode.py +0 -0
  51. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_podcast_episode_bookmarks.py +0 -0
  52. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_podcast_episodes_by_ids.py +0 -0
  53. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_recently_played.py +0 -0
  54. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_recommendations.py +0 -0
  55. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_similar_tracks.py +0 -0
  56. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_smart_tracklist.py +0 -0
  57. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_track.py +0 -0
  58. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_track_mix.py +0 -0
  59. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_user_charts.py +0 -0
  60. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/get_user_playlists.py +0 -0
  61. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/input_types.py +0 -0
  62. {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
  63. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/mark_as_played_podcast_episode.py +0 -0
  64. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/music_together_create_group.py +0 -0
  65. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/music_together_generate_group_name.py +0 -0
  66. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/music_together_join_group.py +0 -0
  67. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/music_together_leave_group.py +0 -0
  68. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/music_together_refresh_suggested_tracklist.py +0 -0
  69. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/music_together_update_group_settings.py +0 -0
  70. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_album_from_favorite.py +0 -0
  71. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_artist_from_favorite.py +0 -0
  72. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_audiobook_from_favorite.py +0 -0
  73. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_playlist_from_favorite.py +0 -0
  74. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_podcast_from_favorite.py +0 -0
  75. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_track_from_favorite.py +0 -0
  76. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/remove_tracks_from_playlist.py +0 -0
  77. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/search.py +0 -0
  78. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/search_flows.py +0 -0
  79. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/unbookmark_podcast_episode.py +0 -0
  80. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/generated/update_playlist.py +0 -0
  81. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql/py.typed +0 -0
  82. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/SOURCES.txt +0 -0
  83. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/dependency_links.txt +0 -0
  84. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/not-zip-safe +0 -0
  85. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/requires.txt +0 -0
  86. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/deezer_python_gql.egg-info/top_level.txt +0 -0
  87. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/setup.cfg +0 -0
  88. {deezer_python_gql-0.13.0 → deezer_python_gql-0.13.1}/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.13.0
3
+ Version: 0.13.1
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
@@ -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__(self, errors: list[GraphQLClientGraphQLError], data: Any = None) -> None:
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
- super().__init__(str(errors))
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
- [e.get("message", "Unknown error") for e in errors],
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()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deezer-python-gql
3
- Version: 0.13.0
3
+ Version: 0.13.1
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.13.0"
3
+ version = "0.13.1"
4
4
  description = "Async typed Python client for Deezer's Pipe GraphQL API."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"