From 68a73e1905e86978e53aa9b1228f237fc57cd34e Mon Sep 17 00:00:00 2001 From: nathom Date: Thu, 13 May 2021 17:41:14 -0700 Subject: [PATCH] Fixed MP3 only Album/Track TIDAL downloads; #75 --- streamrip/bases.py | 10 ++++++++-- streamrip/metadata.py | 15 ++++++++++----- streamrip/tracklists.py | 19 ++++++++----------- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/streamrip/bases.py b/streamrip/bases.py index beccdbe..645d556 100644 --- a/streamrip/bases.py +++ b/streamrip/bases.py @@ -104,7 +104,10 @@ class Track: self.cover_url = u def load_meta(self): - """Send a request to the client to get metadata for this Track.""" + """Send a request to the client to get metadata for this Track. + + Usually only called for single tracks and last.fm playlists. + """ assert self.id is not None, "id must be set before loading metadata" self.resp = self.client.get(self.id, media_type="track") @@ -137,7 +140,10 @@ class Track: :param kwargs: """ # args override attributes - self.quality = min(kwargs["quality"], self.client.max_quality) + self.quality = min( + kwargs["quality"], self.client.max_quality, self.meta.quality + ) + self.folder = kwargs["parent_folder"] or self.folder self.file_format = kwargs.get("track_format", TRACK_FORMAT) diff --git a/streamrip/metadata.py b/streamrip/metadata.py index f0809f0..1d3da60 100644 --- a/streamrip/metadata.py +++ b/streamrip/metadata.py @@ -184,11 +184,9 @@ class TrackMetadata: } ) self.streamable = resp.get("allowStreaming", False) - if resp.get("audioQuality"): # for album entries in single tracks - self.quality = TIDAL_Q_MAP[resp["audioQuality"]] - self.bit_depth = 24 if self.get("quality", False) == 3 else 16 - self.sampling_rate = 44100 + if q := resp.get("audioQuality"): # for album entries in single tracks + self._get_tidal_quality(q) elif self.__source == "deezer": self.album = resp.get("title", "Unknown Album") @@ -235,7 +233,7 @@ class TrackMetadata: self.tracknumber = track.get("track_number", 1) self.discnumber = track.get("media_number", 1) - self.artist = safe_get(track, "artist", "name") + self.artist = safe_get(track, "performer", "name") elif self.__source == "tidal": self.title = track["title"].strip() @@ -243,6 +241,7 @@ class TrackMetadata: self.tracknumber = track.get("trackNumber", 1) self.discnumber = track.get("volumeNumber", 1) self.artist = track.get("artist", {}).get("name") + self._get_tidal_quality(track["audioQuality"]) elif self.__source == "deezer": self.title = track["title"].strip() @@ -283,6 +282,12 @@ class TrackMetadata: logger.debug("Work found: %s", work) self.title = f"{work}: {self.title}" + def _get_tidal_quality(self, q: str): + self.quality = TIDAL_Q_MAP[q] + if self.quality >= 2: + self.bit_depth = 24 if self.get("quality") == 3 else 16 + self.sampling_rate = 44100 + @property def album(self) -> str: """Return the album of the track. diff --git a/streamrip/tracklists.py b/streamrip/tracklists.py index 9bf0a44..4519ba6 100644 --- a/streamrip/tracklists.py +++ b/streamrip/tracklists.py @@ -105,7 +105,9 @@ class Album(Tracklist): """ # Generate the folder name self.folder_format = kwargs.get("folder_format", FOLDER_FORMAT) - self.quality = min(kwargs.get("quality", 3), self.client.max_quality) + if not hasattr(self, "quality"): + self.quality = min(kwargs.get("quality", 3), self.client.max_quality) + self.folder = self._get_formatted_folder( kwargs.get("parent_folder", "StreamripDownloads"), self.quality ) @@ -185,7 +187,9 @@ class Album(Tracklist): else: kwargs["parent_folder"] = self.folder - if not track.download(quality=quality, database=database, **kwargs): + if not track.download( + quality=min(self.quality, quality), database=database, **kwargs + ): return False logger.debug("tagging tracks") @@ -216,18 +220,11 @@ class Album(Tracklist): logging.debug(f"Loading {self.tracktotal} tracks to album") for track in _get_tracklist(resp, self.client.source): if track.get("type") == "Music Video": - self.append( - Video.from_album_meta( - track, - self.client, - ) - ) + self.append(Video.from_album_meta(track, self.client)) else: self.append( Track.from_album_meta( - album=self.meta, - track=track, - client=self.client, + album=self.meta, track=track, client=self.client ) )