diff --git a/twitch.py b/twitch.py index 28056373..d13d7668 100644 --- a/twitch.py +++ b/twitch.py @@ -1353,6 +1353,8 @@ async def gql_request( ) -> JsonType | list[JsonType]: gql_logger.debug(f"GQL Request: {ops}") backoff = ExponentialBackoff(maximum=60) + # Use a flag to retry the request a single time, if a "service error" is encountered + service_error_retry: bool = True for delay in backoff: async with self._qgl_limiter: auth_state = await self.get_auth() @@ -1371,21 +1373,29 @@ async def gql_request( response_list = [response_json] force_retry: bool = False for response_json in response_list: - # GQL errors handling + # GQL error handling if "errors" in response_json: for error_dict in response_json["errors"]: - if ( - "message" in error_dict - and error_dict["message"] in ( - # "server error", - # "service error", - "service unavailable", - "service timeout", - "context deadline exceeded", - ) - ): - force_retry = True - break + if "message" in error_dict: + if error_dict["message"] == "service error" and service_error_retry: + logger.error( + "Retrying a \"service error\" for " + f"{response_json['extensions']['operationName']}" + ) + service_error_retry = False + delay = 5 # overwrite delay + force_retry = True + break + elif ( + error_dict["message"] in ( + # "server error", + "service unavailable", + "service timeout", + "context deadline exceeded", + ) + ): + force_retry = True + break else: raise GQLException(response_json['errors']) # Other error handling