Moved errors in dedicated file
This commit is contained in:
parent
0b8647845c
commit
834de5a09c
|
@ -10,6 +10,7 @@ from deemix.utils.crypto import _md5, _ecbCrypt, _ecbDecrypt, generateBlowfishKe
|
||||||
|
|
||||||
from deemix.utils import USER_AGENT_HEADER
|
from deemix.utils import USER_AGENT_HEADER
|
||||||
from deemix.types.DownloadObjects import Single
|
from deemix.types.DownloadObjects import Single
|
||||||
|
from deemix.errors import DownloadCanceled, DownloadEmpty
|
||||||
|
|
||||||
logger = logging.getLogger('deemix')
|
logger = logging.getLogger('deemix')
|
||||||
|
|
||||||
|
@ -101,9 +102,3 @@ def streamTrack(outputStream, track, start=0, downloadObject=None, listener=None
|
||||||
except (RequestsConnectionError, ReadTimeout, ChunkedEncodingError):
|
except (RequestsConnectionError, ReadTimeout, ChunkedEncodingError):
|
||||||
sleep(2)
|
sleep(2)
|
||||||
streamTrack(outputStream, track, start, downloadObject, listener)
|
streamTrack(outputStream, track, start, downloadObject, listener)
|
||||||
|
|
||||||
class DownloadCanceled(Exception):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class DownloadEmpty(Exception):
|
|
||||||
pass
|
|
||||||
|
|
|
@ -18,14 +18,16 @@ from urllib3.exceptions import SSLError as u3SSLError
|
||||||
from mutagen.flac import FLACNoHeaderError, error as FLACError
|
from mutagen.flac import FLACNoHeaderError, error as FLACError
|
||||||
|
|
||||||
from deezer import TrackFormats
|
from deezer import TrackFormats
|
||||||
|
from deezer.errors import WrongLicense
|
||||||
from deemix.types.DownloadObjects import Single, Collection
|
from deemix.types.DownloadObjects import Single, Collection
|
||||||
from deemix.types.Track import Track, AlbumDoesntExists, MD5NotFound
|
from deemix.types.Track import Track
|
||||||
from deemix.types.Picture import StaticPicture
|
from deemix.types.Picture import StaticPicture
|
||||||
from deemix.utils import USER_AGENT_HEADER
|
from deemix.utils import USER_AGENT_HEADER
|
||||||
from deemix.utils.pathtemplates import generatePath, generateAlbumName, generateArtistName, generateDownloadObjectName
|
from deemix.utils.pathtemplates import generatePath, generateAlbumName, generateArtistName, generateDownloadObjectName
|
||||||
from deemix.tagger import tagID3, tagFLAC
|
from deemix.tagger import tagID3, tagFLAC
|
||||||
from deemix.decryption import generateCryptedStreamURL, streamTrack, DownloadCanceled
|
from deemix.decryption import generateCryptedStreamURL, streamTrack
|
||||||
from deemix.settings import OverwriteOption
|
from deemix.settings import OverwriteOption
|
||||||
|
from deemix.errors import DownloadFailed, MD5NotFound, DownloadCanceled, PreferredBitrateNotFound, TrackNot360, AlbumDoesntExists, DownloadError, ErrorMessages
|
||||||
|
|
||||||
logger = logging.getLogger('deemix')
|
logger = logging.getLogger('deemix')
|
||||||
|
|
||||||
|
@ -416,7 +418,7 @@ class Downloader:
|
||||||
|
|
||||||
def downloadWrapper(self, extraData, track=None):
|
def downloadWrapper(self, extraData, track=None):
|
||||||
trackAPI_gw = extraData['trackAPI_gw']
|
trackAPI_gw = extraData['trackAPI_gw']
|
||||||
if ('_EXTRA_TRACK' in trackAPI_gw):
|
if '_EXTRA_TRACK' in trackAPI_gw:
|
||||||
extraData['trackAPI'] = trackAPI_gw['_EXTRA_TRACK'].copy()
|
extraData['trackAPI'] = trackAPI_gw['_EXTRA_TRACK'].copy()
|
||||||
del extraData['trackAPI_gw']['_EXTRA_TRACK']
|
del extraData['trackAPI_gw']['_EXTRA_TRACK']
|
||||||
del trackAPI_gw['_EXTRA_TRACK']
|
del trackAPI_gw['_EXTRA_TRACK']
|
||||||
|
@ -459,7 +461,7 @@ class Downloader:
|
||||||
})
|
})
|
||||||
return self.downloadWrapper(extraData, track)
|
return self.downloadWrapper(extraData, track)
|
||||||
error.errid += "NoAlternative"
|
error.errid += "NoAlternative"
|
||||||
error.message = errorMessages[error.errid]
|
error.message = ErrorMessages[error.errid]
|
||||||
result = {'error': {
|
result = {'error': {
|
||||||
'message': error.message,
|
'message': error.message,
|
||||||
'errid': error.errid,
|
'errid': error.errid,
|
||||||
|
@ -570,37 +572,3 @@ class Downloader:
|
||||||
# Execute command after download
|
# Execute command after download
|
||||||
if self.settings['executeCommand'] != "":
|
if self.settings['executeCommand'] != "":
|
||||||
execute(self.settings['executeCommand'].replace("%folder%", quote(str(self.extrasPath))))
|
execute(self.settings['executeCommand'].replace("%folder%", quote(str(self.extrasPath))))
|
||||||
|
|
||||||
class DownloadError(Exception):
|
|
||||||
"""Base class for exceptions in this module."""
|
|
||||||
|
|
||||||
errorMessages = {
|
|
||||||
'notOnDeezer': "Track not available on Deezer!",
|
|
||||||
'notEncoded': "Track not yet encoded!",
|
|
||||||
'notEncodedNoAlternative': "Track not yet encoded and no alternative found!",
|
|
||||||
'wrongBitrate': "Track not found at desired bitrate.",
|
|
||||||
'wrongBitrateNoAlternative': "Track not found at desired bitrate and no alternative found!",
|
|
||||||
'wrongLicense': "Your account can't stream the track at the desired bitrate",
|
|
||||||
'no360RA': "Track is not available in Reality Audio 360.",
|
|
||||||
'notAvailable': "Track not available on deezer's servers!",
|
|
||||||
'notAvailableNoAlternative': "Track not available on deezer's servers and no alternative found!",
|
|
||||||
'noSpaceLeft': "No space left on target drive, clean up some space for the tracks",
|
|
||||||
'albumDoesntExists': "Track's album does not exsist, failed to gather info"
|
|
||||||
}
|
|
||||||
|
|
||||||
class DownloadFailed(DownloadError):
|
|
||||||
def __init__(self, errid, track=None):
|
|
||||||
super().__init__()
|
|
||||||
self.errid = errid
|
|
||||||
self.message = errorMessages[self.errid]
|
|
||||||
self.track = track
|
|
||||||
|
|
||||||
class PreferredBitrateNotFound(DownloadError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class TrackNot360(DownloadError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class WrongLicense(DownloadError):
|
|
||||||
def __init__(self, format):
|
|
||||||
self.message = f"Your account doesn't have the license to stream {format}"
|
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
class DeemixError(Exception):
|
||||||
|
"""Base exception for this module"""
|
||||||
|
|
||||||
|
class GenerationError(DeemixError):
|
||||||
|
"""Generation related errors"""
|
||||||
|
def __init__(self, link, message, errid=None):
|
||||||
|
super().__init__()
|
||||||
|
self.link = link
|
||||||
|
self.message = message
|
||||||
|
self.errid = errid
|
||||||
|
|
||||||
|
def toDict(self):
|
||||||
|
return {
|
||||||
|
'link': self.link,
|
||||||
|
'error': self.message,
|
||||||
|
'errid': self.errid
|
||||||
|
}
|
||||||
|
|
||||||
|
class ISRCnotOnDeezer(GenerationError):
|
||||||
|
def __init__(self, link):
|
||||||
|
super().__init__(link, "Track ISRC is not available on deezer", "ISRCnotOnDeezer")
|
||||||
|
|
||||||
|
class NotYourPrivatePlaylist(GenerationError):
|
||||||
|
def __init__(self, link):
|
||||||
|
super().__init__(link, "You can't download others private playlists.", "notYourPrivatePlaylist")
|
||||||
|
|
||||||
|
class TrackNotOnDeezer(GenerationError):
|
||||||
|
def __init__(self, link):
|
||||||
|
super().__init__(link, "Track not found on deezer!", "trackNotOnDeezer")
|
||||||
|
|
||||||
|
class AlbumNotOnDeezer(GenerationError):
|
||||||
|
def __init__(self, link):
|
||||||
|
super().__init__(link, "Album not found on deezer!", "albumNotOnDeezer")
|
||||||
|
|
||||||
|
class InvalidID(GenerationError):
|
||||||
|
def __init__(self, link):
|
||||||
|
super().__init__(link, "Link ID is invalid!", "invalidID")
|
||||||
|
|
||||||
|
class LinkNotSupported(GenerationError):
|
||||||
|
def __init__(self, link):
|
||||||
|
super().__init__(link, "Link is not supported.", "unsupportedURL")
|
||||||
|
|
||||||
|
class LinkNotRecognized(GenerationError):
|
||||||
|
def __init__(self, link):
|
||||||
|
super().__init__(link, "Link is not recognized.", "invalidURL")
|
||||||
|
|
||||||
|
class DownloadError(DeemixError):
|
||||||
|
"""Download related errors"""
|
||||||
|
|
||||||
|
ErrorMessages = {
|
||||||
|
'notOnDeezer': "Track not available on Deezer!",
|
||||||
|
'notEncoded': "Track not yet encoded!",
|
||||||
|
'notEncodedNoAlternative': "Track not yet encoded and no alternative found!",
|
||||||
|
'wrongBitrate': "Track not found at desired bitrate.",
|
||||||
|
'wrongBitrateNoAlternative': "Track not found at desired bitrate and no alternative found!",
|
||||||
|
'wrongLicense': "Your account can't stream the track at the desired bitrate",
|
||||||
|
'no360RA': "Track is not available in Reality Audio 360.",
|
||||||
|
'notAvailable': "Track not available on deezer's servers!",
|
||||||
|
'notAvailableNoAlternative': "Track not available on deezer's servers and no alternative found!",
|
||||||
|
'noSpaceLeft': "No space left on target drive, clean up some space for the tracks",
|
||||||
|
'albumDoesntExists': "Track's album does not exsist, failed to gather info"
|
||||||
|
}
|
||||||
|
|
||||||
|
class DownloadFailed(DownloadError):
|
||||||
|
def __init__(self, errid, track=None):
|
||||||
|
super().__init__()
|
||||||
|
self.errid = errid
|
||||||
|
self.message = ErrorMessages[self.errid]
|
||||||
|
self.track = track
|
||||||
|
|
||||||
|
class PreferredBitrateNotFound(DownloadError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TrackNot360(DownloadError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DownloadCanceled(DownloadError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class DownloadEmpty(DownloadError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class TrackError(DeemixError):
|
||||||
|
"""Track generation related errors"""
|
||||||
|
|
||||||
|
class AlbumDoesntExists(TrackError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class MD5NotFound(TrackError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class NoDataToParse(TrackError):
|
||||||
|
pass
|
|
@ -1,10 +1,12 @@
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from deemix.types.DownloadObjects import Single, Collection
|
from deezer.gw import LyricsStatus
|
||||||
from deezer.gw import GWAPIError, LyricsStatus
|
from deezer.errors import GWAPIError, APIError
|
||||||
from deezer.api import APIError
|
|
||||||
from deezer.utils import map_user_playlist
|
from deezer.utils import map_user_playlist
|
||||||
|
|
||||||
|
from deemix.types.DownloadObjects import Single, Collection
|
||||||
|
from deemix.errors import GenerationError, ISRCnotOnDeezer, InvalidID, NotYourPrivatePlaylist
|
||||||
|
|
||||||
logger = logging.getLogger('deemix')
|
logger = logging.getLogger('deemix')
|
||||||
|
|
||||||
def generateTrackItem(dz, link_id, bitrate, trackAPI=None, albumAPI=None):
|
def generateTrackItem(dz, link_id, bitrate, trackAPI=None, albumAPI=None):
|
||||||
|
@ -263,45 +265,3 @@ def generateArtistTopItem(dz, link_id, bitrate):
|
||||||
|
|
||||||
artistTopTracksAPI_gw = dz.gw.get_artist_toptracks(link_id)
|
artistTopTracksAPI_gw = dz.gw.get_artist_toptracks(link_id)
|
||||||
return generatePlaylistItem(dz, playlistAPI['id'], bitrate, playlistAPI=playlistAPI, playlistTracksAPI=artistTopTracksAPI_gw)
|
return generatePlaylistItem(dz, playlistAPI['id'], bitrate, playlistAPI=playlistAPI, playlistTracksAPI=artistTopTracksAPI_gw)
|
||||||
|
|
||||||
class GenerationError(Exception):
|
|
||||||
def __init__(self, link, message, errid=None):
|
|
||||||
super().__init__()
|
|
||||||
self.link = link
|
|
||||||
self.message = message
|
|
||||||
self.errid = errid
|
|
||||||
|
|
||||||
def toDict(self):
|
|
||||||
return {
|
|
||||||
'link': self.link,
|
|
||||||
'error': self.message,
|
|
||||||
'errid': self.errid
|
|
||||||
}
|
|
||||||
|
|
||||||
class ISRCnotOnDeezer(GenerationError):
|
|
||||||
def __init__(self, link):
|
|
||||||
super().__init__(link, "Track ISRC is not available on deezer", "ISRCnotOnDeezer")
|
|
||||||
|
|
||||||
class NotYourPrivatePlaylist(GenerationError):
|
|
||||||
def __init__(self, link):
|
|
||||||
super().__init__(link, "You can't download others private playlists.", "notYourPrivatePlaylist")
|
|
||||||
|
|
||||||
class TrackNotOnDeezer(GenerationError):
|
|
||||||
def __init__(self, link):
|
|
||||||
super().__init__(link, "Track not found on deezer!", "trackNotOnDeezer")
|
|
||||||
|
|
||||||
class AlbumNotOnDeezer(GenerationError):
|
|
||||||
def __init__(self, link):
|
|
||||||
super().__init__(link, "Album not found on deezer!", "albumNotOnDeezer")
|
|
||||||
|
|
||||||
class InvalidID(GenerationError):
|
|
||||||
def __init__(self, link):
|
|
||||||
super().__init__(link, "Link ID is invalid!", "invalidID")
|
|
||||||
|
|
||||||
class LinkNotSupported(GenerationError):
|
|
||||||
def __init__(self, link):
|
|
||||||
super().__init__(link, "Link is not supported.", "unsupportedURL")
|
|
||||||
|
|
||||||
class LinkNotRecognized(GenerationError):
|
|
||||||
def __init__(self, link):
|
|
||||||
super().__init__(link, "Link is not recognized.", "invalidURL")
|
|
||||||
|
|
|
@ -2,8 +2,8 @@ from time import sleep
|
||||||
import re
|
import re
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from deezer.gw import GWAPIError
|
from deezer.errors import APIError, GWAPIError
|
||||||
from deezer.api import APIError
|
from deemix.errors import TrackError, NoDataToParse, AlbumDoesntExists
|
||||||
|
|
||||||
from deemix.utils import removeFeatures, andCommaConcat, removeDuplicateArtists, generateReplayGainString, changeCase
|
from deemix.utils import removeFeatures, andCommaConcat, removeDuplicateArtists, generateReplayGainString, changeCase
|
||||||
|
|
||||||
|
@ -335,15 +335,3 @@ class Track:
|
||||||
self.artistsString = separator.join(self.artist['Main'])
|
self.artistsString = separator.join(self.artist['Main'])
|
||||||
else:
|
else:
|
||||||
self.artistsString = separator.join(self.artists)
|
self.artistsString = separator.join(self.artists)
|
||||||
|
|
||||||
class TrackError(Exception):
|
|
||||||
"""Base class for exceptions in this module."""
|
|
||||||
|
|
||||||
class AlbumDoesntExists(TrackError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class MD5NotFound(TrackError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class NoDataToParse(TrackError):
|
|
||||||
pass
|
|
||||||
|
|
2
setup.py
2
setup.py
|
@ -23,7 +23,7 @@ setup(
|
||||||
python_requires='>=3.7',
|
python_requires='>=3.7',
|
||||||
packages=find_packages(exclude=("tests",)),
|
packages=find_packages(exclude=("tests",)),
|
||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
install_requires=["click", "pycryptodomex", "mutagen", "requests", "spotipy>=2.11.0", "deezer-py>=1.0.3"],
|
install_requires=["click", "pycryptodomex", "mutagen", "requests", "spotipy>=2.11.0", "deezer-py>=1.1.0"],
|
||||||
entry_points={
|
entry_points={
|
||||||
"console_scripts": [
|
"console_scripts": [
|
||||||
"deemix=deemix.__main__:download",
|
"deemix=deemix.__main__:download",
|
||||||
|
|
Loading…
Reference in New Issue