From 3e0ebc804bb86a0a5830aad7b8b24be89cb30319 Mon Sep 17 00:00:00 2001 From: RemixDev Date: Fri, 18 Sep 2020 22:17:58 +0200 Subject: [PATCH] Fixed #46 --- deemix/__init__.py | 2 +- deemix/app/downloadjob.py | 188 +++++++++++++++++++------------------- setup.py | 2 +- 3 files changed, 96 insertions(+), 96 deletions(-) diff --git a/deemix/__init__.py b/deemix/__init__.py index d5c7374..2426a7d 100644 --- a/deemix/__init__.py +++ b/deemix/__init__.py @@ -1,3 +1,3 @@ #!/usr/bin/env python3 -__version__ = "1.3.10" +__version__ = "1.3.11" diff --git a/deemix/app/downloadjob.py b/deemix/app/downloadjob.py index 16c625d..74f95a0 100644 --- a/deemix/app/downloadjob.py +++ b/deemix/app/downloadjob.py @@ -122,6 +122,7 @@ class DownloadJob: pool = eventlet.GreenPool(size=self.settings['queueConcurrency']) for pos, track in enumerate(self.queueItem.collection, start=0): tracks[pos] = pool.spawn(self.downloadWrapper, track) + pool.waitall() self.collectionAfterDownload(tracks) if self.interface: if self.queueItem.cancel: @@ -425,117 +426,116 @@ class DownloadJob: if extrasPath: if not self.extrasPath: self.extrasPath = extrasPath - result['extrasPath'] = extrasPath # Data for m3u file result['filename'] = writepath[len(extrasPath):] - # Save playlist cover - if track.playlist: - if not len(self.playlistURLs): - if track.playlist['pic']: - for format in self.settings['localArtworkFormat'].split(","): - if format in ["png","jpg"]: - url = "{}/{}x{}-{}".format( - track.playlist['pic'], - self.settings['localArtworkSize'], self.settings['localArtworkSize'], - 'none-100-0-0.png' if format == "png" else f'000000-{self.settings["jpegImageQuality"]}-0-0.jpg' - ) - self.playlistURLs.append({'url': url, 'ext': format}) - else: - self.playlistURLs.append({'url': track.playlist['picUrl'], 'ext': 'jpg'}) - if not self.playlistPath: - track.playlist['id'] = "pl_" + str(trackAPI_gw['_EXTRA_PLAYLIST']['id']) - track.playlist['genre'] = ["Compilation", ] - track.playlist['bitrate'] = selectedFormat - 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'])}" + # Save playlist cover + if track.playlist: + if not len(self.playlistURLs): + if track.playlist['pic']: + for format in self.settings['localArtworkFormat'].split(","): + if format in ["png","jpg"]: + url = "{}/{}x{}-{}".format( + track.playlist['pic'], + self.settings['localArtworkSize'], self.settings['localArtworkSize'], + 'none-100-0-0.png' if format == "png" else f'000000-{self.settings["jpegImageQuality"]}-0-0.jpg' + ) + self.playlistURLs.append({'url': url, 'ext': format}) + else: + self.playlistURLs.append({'url': track.playlist['picUrl'], 'ext': 'jpg'}) + if not self.playlistPath: + track.playlist['id'] = "pl_" + str(trackAPI_gw['_EXTRA_PLAYLIST']['id']) + track.playlist['genre'] = ["Compilation", ] + track.playlist['bitrate'] = selectedFormat + 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': - logger.info(f"[{track.mainArtist['name']} - {track.title}] Downloading the track") - track.downloadUrl = self.dz.get_track_stream_url(track.id, track.MD5, track.mediaVersion, track.selectedFormat) + if not trackAlreadyDownloaded or self.settings['overwriteFile'] == 'y': + logger.info(f"[{track.mainArtist['name']} - {track.title}] Downloading the track") + track.downloadUrl = self.dz.get_track_stream_url(track.id, track.MD5, track.mediaVersion, track.selectedFormat) - def downloadMusic(track, trackAPI_gw): - try: - with open(writepath, 'wb') as stream: - self.streamTrack(stream, track) - except DownloadCancelled: - if os.path.isfile(writepath): remove(writepath) - raise DownloadCancelled - except (request_exception.HTTPError, DownloadEmpty): - if os.path.isfile(writepath): remove(writepath) - if track.fallbackId != "0": - logger.warn(f"[{track.mainArtist['name']} - {track.title}] Track not available, using fallback id") - newTrack = self.dz.get_track_gw(track.fallbackId) + def downloadMusic(track, trackAPI_gw): + try: + with open(writepath, 'wb') as stream: + self.streamTrack(stream, track) + except DownloadCancelled: + if os.path.isfile(writepath): remove(writepath) + raise DownloadCancelled + except (request_exception.HTTPError, DownloadEmpty): + if os.path.isfile(writepath): remove(writepath) + if track.fallbackId != "0": + logger.warn(f"[{track.mainArtist['name']} - {track.title}] Track not available, using fallback id") + newTrack = self.dz.get_track_gw(track.fallbackId) + track.parseEssentialData(self.dz, newTrack) + return False + elif not track.searched and self.settings['fallbackSearch']: + logger.warn(f"[{track.mainArtist['name']} - {track.title}] Track not available, searching for alternative") + searchedId = self.dz.get_track_from_metadata(track.mainArtist['name'], track.title, track.album['title']) + if searchedId != "0": + newTrack = self.dz.get_track_gw(searchedId) track.parseEssentialData(self.dz, newTrack) + track.searched = True return False - elif not track.searched and self.settings['fallbackSearch']: - logger.warn(f"[{track.mainArtist['name']} - {track.title}] Track not available, searching for alternative") - searchedId = self.dz.get_track_from_metadata(track.mainArtist['name'], track.title, track.album['title']) - if searchedId != "0": - newTrack = self.dz.get_track_gw(searchedId) - track.parseEssentialData(self.dz, newTrack) - track.searched = True - return False - else: - raise DownloadFailed("notAvailableNoAlternative") else: - raise DownloadFailed("notAvailable") - except (request_exception.ConnectionError, request_exception.ChunkedEncodingError) as e: - if os.path.isfile(writepath): remove(writepath) - logger.warn(f"[{track.mainArtist['name']} - {track.title}] Error while downloading the track, trying again in 5s...") - eventlet.sleep(5) - return downloadMusic(track, trackAPI_gw) - except OSError as e: - if e.errno == errno.ENOSPC: - raise DownloadFailed("noSpaceLeft") - else: - if os.path.isfile(writepath): remove(writepath) - logger.exception(f"[{track.mainArtist['name']} - {track.title}] Error while downloading the track, you should report this to the developers: {str(e)}") - raise e - except Exception as e: + raise DownloadFailed("notAvailableNoAlternative") + else: + raise DownloadFailed("notAvailable") + except (request_exception.ConnectionError, request_exception.ChunkedEncodingError) as e: + if os.path.isfile(writepath): remove(writepath) + logger.warn(f"[{track.mainArtist['name']} - {track.title}] Error while downloading the track, trying again in 5s...") + eventlet.sleep(5) + return downloadMusic(track, trackAPI_gw) + except OSError as e: + if e.errno == errno.ENOSPC: + raise DownloadFailed("noSpaceLeft") + else: if os.path.isfile(writepath): remove(writepath) logger.exception(f"[{track.mainArtist['name']} - {track.title}] Error while downloading the track, you should report this to the developers: {str(e)}") raise e - return True - - try: - trackDownloaded = downloadMusic(track, trackAPI_gw) - except DownloadFailed as e: - raise e except Exception as e: + if os.path.isfile(writepath): remove(writepath) + logger.exception(f"[{track.mainArtist['name']} - {track.title}] Error while downloading the track, you should report this to the developers: {str(e)}") raise e + return True - if not trackDownloaded: + try: + trackDownloaded = downloadMusic(track, trackAPI_gw) + except DownloadFailed as e: + raise e + except Exception as e: + raise e + + if not trackDownloaded: + return self.download(trackAPI_gw, track) + else: + logger.info(f"[{track.mainArtist['name']} - {track.title}] Skipping track as it's already downloaded") + self.completeTrackPercentage() + + # Adding tags + if (not trackAlreadyDownloaded or self.settings['overwriteFile'] in ['t', 'y']) and not track.localTrack: + logger.info(f"[{track.mainArtist['name']} - {track.title}] Applying tags to the track") + if track.selectedFormat in [3, 1, 8]: + tagID3(writepath, track, self.settings['tags']) + elif track.selectedFormat == 9: + try: + tagFLAC(writepath, track, self.settings['tags']) + except FLACNoHeaderError: + if os.path.isfile(writepath): remove(writepath) + logger.warn(f"[{track.mainArtist['name']} - {track.title}] Track not available in FLAC, falling back if necessary") + self.removeTrackPercentage() + track.filesizes['FILESIZE_FLAC'] = "0" + track.filesizes['FILESIZE_FLAC_TESTED'] = True return self.download(trackAPI_gw, track) - else: - logger.info(f"[{track.mainArtist['name']} - {track.title}] Skipping track as it's already downloaded") - self.completeTrackPercentage() + if track.searched: + result['searched'] = f"{track.mainArtist['name']} - {track.title}" - # Adding tags - if (not trackAlreadyDownloaded or self.settings['overwriteFile'] in ['t', 'y']) and not track.localTrack: - logger.info(f"[{track.mainArtist['name']} - {track.title}] Applying tags to the track") - if track.selectedFormat in [3, 1, 8]: - tagID3(writepath, track, self.settings['tags']) - elif track.selectedFormat == 9: - try: - tagFLAC(writepath, track, self.settings['tags']) - except FLACNoHeaderError: - if os.path.isfile(writepath): remove(writepath) - logger.warn(f"[{track.mainArtist['name']} - {track.title}] Track not available in FLAC, falling back if necessary") - self.removeTrackPercentage() - track.filesizes['FILESIZE_FLAC'] = "0" - track.filesizes['FILESIZE_FLAC_TESTED'] = True - return self.download(trackAPI_gw, track) - if track.searched: - result['searched'] = f"{track.mainArtist['name']} - {track.title}" - - logger.info(f"[{track.mainArtist['name']} - {track.title}] Track download completed\n{writepath}") - self.queueItem.downloaded += 1 - self.queueItem.files.append(writepath) - if self.interface: - self.interface.send("updateQueue", {'uuid': self.queueItem.uuid, 'downloaded': True, 'downloadPath': writepath}) - return result + logger.info(f"[{track.mainArtist['name']} - {track.title}] Track download completed\n{writepath}") + self.queueItem.downloaded += 1 + self.queueItem.files.append(writepath) + if self.interface: + self.interface.send("updateQueue", {'uuid': self.queueItem.uuid, 'downloaded': True, 'downloadPath': writepath}) + return result def getPreferredBitrate(self, track): if track.localTrack: diff --git a/setup.py b/setup.py index 7ad9971..4d421a4 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ README = (HERE / "README.md").read_text() setup( name="deemix", - version="1.3.10", + version="1.3.11", description="A barebone deezer downloader library", long_description=README, long_description_content_type="text/markdown",