Cleaned up afterDownload functions
This commit is contained in:
parent
560fc70052
commit
a3e9cdeca1
|
@ -49,83 +49,6 @@ errorMessages = {
|
||||||
'notAvailable': "Track not available on deezer's servers!",
|
'notAvailable': "Track not available on deezer's servers!",
|
||||||
'notAvailableNoAlternative': "Track not available on deezer's servers and no alternative found!"
|
'notAvailableNoAlternative': "Track not available on deezer's servers and no alternative found!"
|
||||||
}
|
}
|
||||||
|
|
||||||
def after_download(tracks, settings, queueItem):
|
|
||||||
extrasPath = None
|
|
||||||
playlist = [None] * len(tracks)
|
|
||||||
playlistCover = None
|
|
||||||
playlistURLs = []
|
|
||||||
errors = ""
|
|
||||||
searched = ""
|
|
||||||
for index in range(len(tracks)):
|
|
||||||
result = tracks[index].result()
|
|
||||||
if 'cancel' in result:
|
|
||||||
return None
|
|
||||||
if 'error' in result:
|
|
||||||
if not 'data' in result['error']:
|
|
||||||
result['error']['data'] = {'id': 0, 'title': 'Unknown', 'artist': 'Unknown'}
|
|
||||||
errors += f"{result['error']['data']['id']} | {result['error']['data']['artist']} - {result['error']['data']['title']} | {result['error']['message']}\r\n"
|
|
||||||
if 'searched' in result:
|
|
||||||
searched += result['searched'] + "\r\n"
|
|
||||||
if not extrasPath and 'extrasPath' in result:
|
|
||||||
extrasPath = result['extrasPath']
|
|
||||||
if not playlistCover and 'playlistCover' in result:
|
|
||||||
playlistCover = result['playlistCover']
|
|
||||||
playlistURLs = result['playlistURLs']
|
|
||||||
if settings['saveArtwork'] and 'albumPath' in result:
|
|
||||||
for image in result['albumURLs']:
|
|
||||||
downloadImage(image['url'], f"{result['albumPath']}.{image['ext']}", settings['overwriteFile'])
|
|
||||||
if settings['saveArtworkArtist'] and 'artistPath' in result:
|
|
||||||
for image in result['artistURLs']:
|
|
||||||
downloadImage(image['url'], f"{result['artistPath']}.{image['ext']}", settings['overwriteFile'])
|
|
||||||
if 'playlistPosition' in result:
|
|
||||||
playlist[index] = result['playlistPosition']
|
|
||||||
else:
|
|
||||||
playlist[index] = ""
|
|
||||||
if not extrasPath:
|
|
||||||
extrasPath = settings['downloadLocation']
|
|
||||||
if settings['logErrors'] and errors != "":
|
|
||||||
with open(os.path.join(extrasPath, 'errors.txt'), 'wb') as f:
|
|
||||||
f.write(errors.encode('utf-8'))
|
|
||||||
if settings['saveArtwork'] and playlistCover and not settings['tags']['savePlaylistAsCompilation']:
|
|
||||||
for image in playlistURLs:
|
|
||||||
downloadImage(image['url'], os.path.join(extrasPath, playlistCover)+f".{image['ext']}", settings['overwriteFile'])
|
|
||||||
if settings['logSearched'] and searched != "":
|
|
||||||
with open(os.path.join(extrasPath, 'searched.txt'), 'wb') as f:
|
|
||||||
f.write(searched.encode('utf-8'))
|
|
||||||
if settings['createM3U8File']:
|
|
||||||
filename = settingsRegexPlaylistFile(settings['playlistFilenameTemplate'], queueItem, settings) or "playlist"
|
|
||||||
with open(os.path.join(extrasPath, filename+'.m3u8'), 'wb') as f:
|
|
||||||
for line in playlist:
|
|
||||||
f.write((line + "\n").encode('utf-8'))
|
|
||||||
if settings['executeCommand'] != "":
|
|
||||||
execute(settings['executeCommand'].replace("%folder%", extrasPath))
|
|
||||||
return extrasPath
|
|
||||||
|
|
||||||
|
|
||||||
def after_download_single(track, settings):
|
|
||||||
if 'cancel' in track:
|
|
||||||
return None
|
|
||||||
if 'extrasPath' not in track:
|
|
||||||
track['extrasPath'] = settings['downloadLocation']
|
|
||||||
if settings['saveArtwork'] and 'albumPath' in track:
|
|
||||||
for image in track['albumURLs']:
|
|
||||||
downloadImage(image['url'], f"{track['albumPath']}.{image['ext']}", settings['overwriteFile'])
|
|
||||||
if settings['saveArtworkArtist'] and 'artistPath' in track:
|
|
||||||
for image in track['artistURLs']:
|
|
||||||
downloadImage(image['url'], f"{track['artistPath']}.{image['ext']}", settings['overwriteFile'])
|
|
||||||
if settings['logSearched'] and 'searched' in track:
|
|
||||||
with open(os.path.join(track['extrasPath'], 'searched.txt'), 'wb+') as f:
|
|
||||||
orig = f.read().decode('utf-8')
|
|
||||||
if not track['searched'] in orig:
|
|
||||||
if orig != "":
|
|
||||||
orig += "\r\n"
|
|
||||||
orig += track['searched'] + "\r\n"
|
|
||||||
f.write(orig.encode('utf-8'))
|
|
||||||
if settings['executeCommand'] != "":
|
|
||||||
execute(settings['executeCommand'].replace("%folder%", track['extrasPath']).replace("%filename%", track['playlistPosition']))
|
|
||||||
return track['extrasPath']
|
|
||||||
|
|
||||||
def downloadImage(url, path, overwrite="n"):
|
def downloadImage(url, path, overwrite="n"):
|
||||||
if not os.path.isfile(path) or overwrite in ['y', 't', 'b']:
|
if not os.path.isfile(path) or overwrite in ['y', 't', 'b']:
|
||||||
try:
|
try:
|
||||||
|
@ -177,25 +100,102 @@ class DownloadJob:
|
||||||
self.downloadPercentage = 0
|
self.downloadPercentage = 0
|
||||||
self.lastPercentage = 0
|
self.lastPercentage = 0
|
||||||
self.extrasPath = self.settings['downloadLocation']
|
self.extrasPath = self.settings['downloadLocation']
|
||||||
|
self.playlistPath = None
|
||||||
|
self.playlistURLs = []
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
if isinstance(self.queueItem, QISingle):
|
if isinstance(self.queueItem, QISingle):
|
||||||
result = self.downloadWrapper(self.queueItem.single)
|
result = self.downloadWrapper(self.queueItem.single)
|
||||||
if result:
|
if result:
|
||||||
download_path = after_download_single(result, self.settings)
|
singleAfterDownload(result)
|
||||||
elif isinstance(self.queueItem, QICollection):
|
elif isinstance(self.queueItem, QICollection):
|
||||||
playlist = [None] * len(self.queueItem.collection)
|
tracks = [None] * len(self.queueItem.collection)
|
||||||
with ThreadPoolExecutor(self.settings['queueConcurrency']) as executor:
|
with ThreadPoolExecutor(self.settings['queueConcurrency']) as executor:
|
||||||
for pos, track in enumerate(self.queueItem.collection, start=0):
|
for pos, track in enumerate(self.queueItem.collection, start=0):
|
||||||
playlist[pos] = executor.submit(self.downloadWrapper, track)
|
tracks[pos] = executor.submit(self.downloadWrapper, track)
|
||||||
download_path = after_download(playlist, self.settings, self.queueItem)
|
download_path = collectionAfterDownload(tracks)
|
||||||
if self.interface:
|
if self.interface:
|
||||||
if self.queueItem.cancel:
|
if self.queueItem.cancel:
|
||||||
self.interface.send('currentItemCancelled', self.queueItem.uuid)
|
self.interface.send('currentItemCancelled', self.queueItem.uuid)
|
||||||
self.interface.send("removedFromQueue", self.queueItem.uuid)
|
self.interface.send("removedFromQueue", self.queueItem.uuid)
|
||||||
else:
|
else:
|
||||||
self.interface.send("finishDownload", self.queueItem.uuid)
|
self.interface.send("finishDownload", self.queueItem.uuid)
|
||||||
return download_path
|
return self.extrasPath
|
||||||
|
|
||||||
|
def singleAfterDownload(self, result):
|
||||||
|
# Save Album Cover
|
||||||
|
if self.settings['saveArtwork'] and 'albumPath' in result:
|
||||||
|
for image in result['albumURLs']:
|
||||||
|
downloadImage(image['url'], f"{result['albumPath']}.{image['ext']}", self.settings['overwriteFile'])
|
||||||
|
# Save Artist Artwork
|
||||||
|
if self.settings['saveArtworkArtist'] and 'artistPath' in result:
|
||||||
|
for image in result['artistURLs']:
|
||||||
|
downloadImage(image['url'], f"{result['artistPath']}.{image['ext']}", self.settings['overwriteFile'])
|
||||||
|
# Create searched logfile
|
||||||
|
if self.settings['logSearched'] and 'searched' in result:
|
||||||
|
with open(os.path.join(self.extrasPath, 'searched.txt'), 'wb+') as f:
|
||||||
|
orig = f.read().decode('utf-8')
|
||||||
|
if not result['searched'] in orig:
|
||||||
|
if orig != "":
|
||||||
|
orig += "\r\n"
|
||||||
|
orig += result['searched'] + "\r\n"
|
||||||
|
f.write(orig.encode('utf-8'))
|
||||||
|
# Execute command after download
|
||||||
|
if self.settings['executeCommand'] != "":
|
||||||
|
execute(self.settings['executeCommand'].replace("%folder%", self.extrasPath).replace("%filename%", result['filename']))
|
||||||
|
|
||||||
|
def collectionAfterDownload(self, tracks):
|
||||||
|
playlist = [None] * len(tracks)
|
||||||
|
errors = ""
|
||||||
|
searched = ""
|
||||||
|
|
||||||
|
for index in range(len(tracks)):
|
||||||
|
result = tracks[index].result()
|
||||||
|
# Check if queue is cancelled
|
||||||
|
if not result:
|
||||||
|
return None
|
||||||
|
# Log errors to file
|
||||||
|
if 'error' in result:
|
||||||
|
if not 'data' in result['error']:
|
||||||
|
result['error']['data'] = {'id': 0, 'title': 'Unknown', 'artist': 'Unknown'}
|
||||||
|
errors += f"{result['error']['data']['id']} | {result['error']['data']['artist']} - {result['error']['data']['title']} | {result['error']['message']}\r\n"
|
||||||
|
# Log searched to file
|
||||||
|
if 'searched' in result:
|
||||||
|
searched += result['searched'] + "\r\n"
|
||||||
|
# Save Album Cover
|
||||||
|
if self.settings['saveArtwork'] and 'albumPath' in result:
|
||||||
|
for image in result['albumURLs']:
|
||||||
|
downloadImage(image['url'], f"{result['albumPath']}.{image['ext']}", self.settings['overwriteFile'])
|
||||||
|
# Save Artist Artwork
|
||||||
|
if self.settings['saveArtworkArtist'] and 'artistPath' in result:
|
||||||
|
for image in result['artistURLs']:
|
||||||
|
downloadImage(image['url'], f"{result['artistPath']}.{image['ext']}", self.settings['overwriteFile'])
|
||||||
|
# Save filename for playlist file
|
||||||
|
playlist[index] = ""
|
||||||
|
if 'filename' in result:
|
||||||
|
playlist[index] = result['filename']
|
||||||
|
|
||||||
|
# Create errors logfile
|
||||||
|
if self.settings['logErrors'] and errors != "":
|
||||||
|
with open(os.path.join(self.extrasPath, 'errors.txt'), 'wb') as f:
|
||||||
|
f.write(errors.encode('utf-8'))
|
||||||
|
# Create searched logfile
|
||||||
|
if self.settings['logSearched'] and searched != "":
|
||||||
|
with open(os.path.join(self.extrasPath, 'searched.txt'), 'wb') as f:
|
||||||
|
f.write(searched.encode('utf-8'))
|
||||||
|
# Save Playlist Artwork
|
||||||
|
if self.settings['saveArtwork'] and self.playlistPath and not self.settings['tags']['savePlaylistAsCompilation']:
|
||||||
|
for image in self.playlistURLs:
|
||||||
|
downloadImage(image['url'], os.path.join(self.extrasPath, self.playlistPath)+f".{image['ext']}", self.settings['overwriteFile'])
|
||||||
|
# Create M3U8 File
|
||||||
|
if self.settings['createM3U8File']:
|
||||||
|
filename = settingsRegexPlaylistFile(self.settings['playlistFilenameTemplate'], queueItem, self.settings) or "playlist"
|
||||||
|
with open(os.path.join(self.extrasPath, filename+'.m3u8'), 'wb') as f:
|
||||||
|
for line in playlist:
|
||||||
|
f.write((line + "\n").encode('utf-8'))
|
||||||
|
# Execute command after download
|
||||||
|
if self.settings['executeCommand'] != "":
|
||||||
|
execute(self.settings['executeCommand'].replace("%folder%", self.extrasPath))
|
||||||
|
|
||||||
def download(self, trackAPI_gw, track=None):
|
def download(self, trackAPI_gw, track=None):
|
||||||
result = {}
|
result = {}
|
||||||
|
@ -389,27 +389,28 @@ class DownloadJob:
|
||||||
result['extrasPath'] = extrasPath
|
result['extrasPath'] = extrasPath
|
||||||
|
|
||||||
# Data for m3u file
|
# Data for m3u file
|
||||||
result['playlistPosition'] = writepath[len(extrasPath):]
|
result['filename'] = writepath[len(extrasPath):]
|
||||||
|
|
||||||
# Save playlist cover
|
# Save playlist cover
|
||||||
if track.playlist:
|
if track.playlist:
|
||||||
result['playlistURLs'] = []
|
if not len(self.playlistURLs):
|
||||||
if 'dzcdn.net' in track.playlist['picUrl']:
|
if 'dzcdn.net' in track.playlist['picUrl']:
|
||||||
for format in self.settings['localArtworkFormat'].split(","):
|
for format in self.settings['localArtworkFormat'].split(","):
|
||||||
if format in ["png","jpg"]:
|
if format in ["png","jpg"]:
|
||||||
url = track.playlist['picUrl'].replace(
|
url = track.playlist['picUrl'].replace(
|
||||||
f"{self.settings['embeddedArtworkSize']}x{self.settings['embeddedArtworkSize']}",
|
f"{self.settings['embeddedArtworkSize']}x{self.settings['embeddedArtworkSize']}",
|
||||||
f"{self.settings['localArtworkSize']}x{self.settings['localArtworkSize']}")
|
f"{self.settings['localArtworkSize']}x{self.settings['localArtworkSize']}")
|
||||||
if format == "png":
|
if format == "png":
|
||||||
url = url[:url.find("000000-")]+"none-100-0-0.png"
|
url = url[:url.find("000000-")]+"none-100-0-0.png"
|
||||||
result['playlistURLs'].append({'url': url, 'ext': format})
|
self.playlistURLs.append({'url': url, 'ext': format})
|
||||||
else:
|
else:
|
||||||
result['playlistURLs'].append({'url': track.playlist['picUrl'], 'ext': 'jpg'})
|
self.playlistURLs.append({'url': track.playlist['picUrl'], 'ext': 'jpg'})
|
||||||
track.playlist['id'] = "pl_" + str(trackAPI_gw['_EXTRA_PLAYLIST']['id'])
|
if not self.playlistPath:
|
||||||
track.playlist['genre'] = ["Compilation", ]
|
track.playlist['id'] = "pl_" + str(trackAPI_gw['_EXTRA_PLAYLIST']['id'])
|
||||||
track.playlist['bitrate'] = selectedFormat
|
track.playlist['genre'] = ["Compilation", ]
|
||||||
track.playlist['dateString'] = formatDate(track.playlist['date'], self.settings['dateFormat'])
|
track.playlist['bitrate'] = selectedFormat
|
||||||
result['playlistCover'] = f"{settingsRegexAlbum(self.settings['coverImageTemplate'], track.playlist, self.settings, trackAPI_gw['_EXTRA_PLAYLIST'])}"
|
track.playlist['dateString'] = formatDate(track.playlist['date'], self.settings['dateFormat'])
|
||||||
|
self.playlistPath = f"{settingsRegexAlbum(self.settings['coverImageTemplate'], track.playlist, self.settings, trackAPI_gw['_EXTRA_PLAYLIST'])}"
|
||||||
|
|
||||||
if not trackAlreadyDownloaded or self.settings['overwriteFile'] == 'y':
|
if not trackAlreadyDownloaded or self.settings['overwriteFile'] == 'y':
|
||||||
logger.info(f"[{track.mainArtist['name']} - {track.title}] Downloading the track")
|
logger.info(f"[{track.mainArtist['name']} - {track.title}] Downloading the track")
|
||||||
|
@ -422,7 +423,7 @@ class DownloadJob:
|
||||||
except DownloadCancelled:
|
except DownloadCancelled:
|
||||||
remove(writepath)
|
remove(writepath)
|
||||||
raise DownloadCancelled
|
raise DownloadCancelled
|
||||||
except HTTPError:
|
except HTTPError, DownloadEmpty:
|
||||||
remove(writepath)
|
remove(writepath)
|
||||||
if track.fallbackId != "0":
|
if track.fallbackId != "0":
|
||||||
logger.warn(f"[{track.mainArtist['name']} - {track.title}] Track not available, using fallback id")
|
logger.warn(f"[{track.mainArtist['name']} - {track.title}] Track not available, using fallback id")
|
||||||
|
@ -539,6 +540,8 @@ class DownloadJob:
|
||||||
request.raise_for_status()
|
request.raise_for_status()
|
||||||
blowfish_key = str.encode(self.dz._get_blowfish_key(str(track.id)))
|
blowfish_key = str.encode(self.dz._get_blowfish_key(str(track.id)))
|
||||||
complete = int(request.headers["Content-Length"])
|
complete = int(request.headers["Content-Length"])
|
||||||
|
if complete == 0:
|
||||||
|
raise DownloadEmpty
|
||||||
chunkLength = 0
|
chunkLength = 0
|
||||||
percentage = 0
|
percentage = 0
|
||||||
i = 0
|
i = 0
|
||||||
|
@ -629,3 +632,6 @@ class DownloadFailed(DownloadError):
|
||||||
|
|
||||||
class DownloadCancelled(DownloadError):
|
class DownloadCancelled(DownloadError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
class DownloadEmpty(DownloadError):
|
||||||
|
pass
|
||||||
|
|
|
@ -133,12 +133,6 @@ class Settings:
|
||||||
for i in range(len(logslist)-5):
|
for i in range(len(logslist)-5):
|
||||||
remove(path.join(logspath, logslist[i]))
|
remove(path.join(logspath, logslist[i]))
|
||||||
|
|
||||||
def getSettings(self):
|
|
||||||
return self.settings
|
|
||||||
|
|
||||||
def getDefaultSettings(self):
|
|
||||||
return self.defaultSettings
|
|
||||||
|
|
||||||
# Saves the settings
|
# Saves the settings
|
||||||
def saveSettings(self, newSettings=None):
|
def saveSettings(self, newSettings=None):
|
||||||
if newSettings:
|
if newSettings:
|
||||||
|
|
Loading…
Reference in New Issue