diff --git a/trakt/core.py b/trakt/core.py index dd3f8931..6dcaa04a 100644 --- a/trakt/core.py +++ b/trakt/core.py @@ -5,6 +5,7 @@ import json import logging import os +from json import JSONDecodeError from urllib.parse import urljoin import requests @@ -15,6 +16,7 @@ from requests_oauthlib import OAuth2Session from datetime import datetime, timedelta, timezone from trakt import errors +from trakt.errors import BadResponseException __author__ = 'Jon Nappi' __all__ = ['Airs', 'Alias', 'Comment', 'Genre', 'get', 'delete', 'post', 'put', @@ -529,7 +531,12 @@ def _handle_request(self, method, url, data=None): raise self.error_map[response.status_code](response) elif response.status_code == 204: # HTTP no content return None - json_data = json.loads(response.content.decode('UTF-8', 'ignore')) + + try: + json_data = json.loads(response.content.decode('UTF-8', 'ignore')) + except JSONDecodeError as e: + raise BadResponseException(response, f"Unable to parse JSON: {e}") + return json_data def get(self, f): diff --git a/trakt/errors.py b/trakt/errors.py index 8a54cd48..30e01694 100644 --- a/trakt/errors.py +++ b/trakt/errors.py @@ -6,7 +6,13 @@ __author__ = 'Jon Nappi' __all__ = [ + # Base Exception 'TraktException', + + # Errors for use by PyTrakt + 'BadResponseException', + + # Exceptions by HTTP status code 'BadRequestException', 'OAuthException', 'ForbiddenException', @@ -32,6 +38,16 @@ def __str__(self): return self.message +class BadResponseException(TraktException): + """TraktException type to be raised when json could not be decoded""" + http_code = -1 + message = "Bad Response - Response could not be parsed" + + def __init__(self, response=None, details=None): + super().__init__(response) + self.details = details + + class BadRequestException(TraktException): """TraktException type to be raised when a 400 return code is received""" http_code = 400