diff --git a/src/pylast/__init__.py b/src/pylast/__init__.py index 47de6cb..e8828db 100644 --- a/src/pylast/__init__.py +++ b/src/pylast/__init__.py @@ -39,6 +39,7 @@ except ImportError: # Python 3.7 and lower import importlib_metadata # type: ignore +from .exceptions import MalformedResponseError, NetworkError, PyLastError, WSError from .utils import ( _collect_nodes, _number, @@ -58,6 +59,11 @@ __email__ = "amr.hassan@gmail.com" __version__ = importlib_metadata.version(__name__) __all__ = [ + # Exceptions + MalformedResponseError, + NetworkError, + PyLastError, + WSError, # Utils cleanup_nodes, md5, @@ -1399,81 +1405,6 @@ class _Taggable(_BaseObject): return seq -class PyLastError(Exception): - """Generic exception raised by PyLast""" - - pass - - -class WSError(PyLastError): - """Exception related to the Network web service""" - - def __init__(self, network, status, details) -> None: - self.status = status - self.details = details - self.network = network - - @_string_output - def __str__(self) -> str: - return self.details - - def get_id(self): - """Returns the exception ID, from one of the following: - STATUS_INVALID_SERVICE = 2 - STATUS_INVALID_METHOD = 3 - STATUS_AUTH_FAILED = 4 - STATUS_INVALID_FORMAT = 5 - STATUS_INVALID_PARAMS = 6 - STATUS_INVALID_RESOURCE = 7 - STATUS_OPERATION_FAILED = 8 - STATUS_INVALID_SK = 9 - STATUS_INVALID_API_KEY = 10 - STATUS_OFFLINE = 11 - STATUS_SUBSCRIBERS_ONLY = 12 - STATUS_TOKEN_UNAUTHORIZED = 14 - STATUS_TOKEN_EXPIRED = 15 - STATUS_TEMPORARILY_UNAVAILABLE = 16 - STATUS_LOGIN_REQUIRED = 17 - STATUS_TRIAL_EXPIRED = 18 - STATUS_NOT_ENOUGH_CONTENT = 20 - STATUS_NOT_ENOUGH_MEMBERS = 21 - STATUS_NOT_ENOUGH_FANS = 22 - STATUS_NOT_ENOUGH_NEIGHBOURS = 23 - STATUS_NO_PEAK_RADIO = 24 - STATUS_RADIO_NOT_FOUND = 25 - STATUS_API_KEY_SUSPENDED = 26 - STATUS_DEPRECATED = 27 - STATUS_RATE_LIMIT_EXCEEDED = 29 - """ - - return self.status - - -class MalformedResponseError(PyLastError): - """Exception conveying a malformed response from the music network.""" - - def __init__(self, network, underlying_error) -> None: - self.network = network - self.underlying_error = underlying_error - - def __str__(self) -> str: - return ( - f"Malformed response from {self.network.name}. " - f"Underlying error: {self.underlying_error}" - ) - - -class NetworkError(PyLastError): - """Exception conveying a problem in sending a request to Last.fm""" - - def __init__(self, network, underlying_error) -> None: - self.network = network - self.underlying_error = underlying_error - - def __str__(self) -> str: - return f"NetworkError: {self.underlying_error}" - - class _Opus(_Taggable): """An album or track.""" diff --git a/src/pylast/exceptions.py b/src/pylast/exceptions.py new file mode 100644 index 0000000..4fb0942 --- /dev/null +++ b/src/pylast/exceptions.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +from .utils import _string_output + + +class PyLastError(Exception): + """Generic exception raised by PyLast""" + + pass + + +class WSError(PyLastError): + """Exception related to the Network web service""" + + def __init__(self, network, status, details) -> None: + self.status = status + self.details = details + self.network = network + + @_string_output + def __str__(self) -> str: + return self.details + + def get_id(self): + """Returns the exception ID, from one of the following: + STATUS_INVALID_SERVICE = 2 + STATUS_INVALID_METHOD = 3 + STATUS_AUTH_FAILED = 4 + STATUS_INVALID_FORMAT = 5 + STATUS_INVALID_PARAMS = 6 + STATUS_INVALID_RESOURCE = 7 + STATUS_OPERATION_FAILED = 8 + STATUS_INVALID_SK = 9 + STATUS_INVALID_API_KEY = 10 + STATUS_OFFLINE = 11 + STATUS_SUBSCRIBERS_ONLY = 12 + STATUS_TOKEN_UNAUTHORIZED = 14 + STATUS_TOKEN_EXPIRED = 15 + STATUS_TEMPORARILY_UNAVAILABLE = 16 + STATUS_LOGIN_REQUIRED = 17 + STATUS_TRIAL_EXPIRED = 18 + STATUS_NOT_ENOUGH_CONTENT = 20 + STATUS_NOT_ENOUGH_MEMBERS = 21 + STATUS_NOT_ENOUGH_FANS = 22 + STATUS_NOT_ENOUGH_NEIGHBOURS = 23 + STATUS_NO_PEAK_RADIO = 24 + STATUS_RADIO_NOT_FOUND = 25 + STATUS_API_KEY_SUSPENDED = 26 + STATUS_DEPRECATED = 27 + STATUS_RATE_LIMIT_EXCEEDED = 29 + """ + + return self.status + + +class MalformedResponseError(PyLastError): + """Exception conveying a malformed response from the music network.""" + + def __init__(self, network, underlying_error) -> None: + self.network = network + self.underlying_error = underlying_error + + def __str__(self) -> str: + return ( + f"Malformed response from {self.network.name}. " + f"Underlying error: {self.underlying_error}" + ) + + +class NetworkError(PyLastError): + """Exception conveying a problem in sending a request to Last.fm""" + + def __init__(self, network, underlying_error) -> None: + self.network = network + self.underlying_error = underlying_error + + def __str__(self) -> str: + return f"NetworkError: {self.underlying_error}"