From 43730127fae4640922ddf35341d075ddbf53d0f1 Mon Sep 17 00:00:00 2001 From: nathom Date: Fri, 9 Apr 2021 11:17:48 -0700 Subject: [PATCH] Fix #39 --- streamrip/cli.py | 4 ++-- streamrip/downloader.py | 29 +++++++++++++++++++---------- streamrip/metadata.py | 13 +++++++++++-- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/streamrip/cli.py b/streamrip/cli.py index b5f2974..1d92948 100644 --- a/streamrip/cli.py +++ b/streamrip/cli.py @@ -61,7 +61,7 @@ def cli(ctx, **kwargs): from packaging import version r = requests.get("https://pypi.org/pypi/streamrip/json").json() - newest = r['info']['version'] + newest = r["info"]["version"] if version.parse(metadata.version("streamrip")) < version.parse(newest): click.secho( "A new version of streamrip is available! " @@ -69,7 +69,7 @@ def cli(ctx, **kwargs): fg="yellow", ) else: - click.secho("streamrip is up-to-date!", fg='green') + click.secho("streamrip is up-to-date!", fg="green") if kwargs["no_db"]: config.session["database"]["enabled"] = False diff --git a/streamrip/downloader.py b/streamrip/downloader.py index 55b3a0d..89abe4d 100644 --- a/streamrip/downloader.py +++ b/streamrip/downloader.py @@ -124,7 +124,7 @@ class Track: ) # meta dict -> TrackMetadata object try: if self.client.source == "qobuz": - self.cover_url = self.resp["album"]["image"]["small"] + self.cover_url = self.resp["album"]["image"]["large"] elif self.client.source == "tidal": self.cover_url = tidal_cover_url(self.resp["album"]["cover"], 320) elif self.client.source == "deezer": @@ -486,7 +486,10 @@ class Track: @property def title(self): if hasattr(self, "meta"): - return self.meta.title + _title = self.meta.title + if self.meta.explicit: + _title = f"{_title} (Explicit)" + return _title else: raise Exception("Track must be loaded before accessing title") @@ -557,7 +560,7 @@ class Tracklist(list): IndexError """ - def get(self, key: Union[str, int], default: Optional[Any]): + def get(self, key: Union[str, int], default=None): if isinstance(key, str): if hasattr(self, key): return getattr(self, key) @@ -764,8 +767,11 @@ class Album(Tracklist): "tracktotal": resp.get("tracks_count"), "description": resp.get("description"), "disctotal": max( - track.get("media_number", 1) for track in resp["tracks"]["items"] - ), + track.get("media_number", 1) + for track in safe_get(resp, "tracks", "items", default=[{}]) + ) + or 1, + "explicit": resp.get("parental_warning", False), } elif client.source == "tidal": return { @@ -787,6 +793,7 @@ class Album(Tracklist): else 41000, "tracktotal": resp.get("numberOfTracks"), "disctotal": resp.get("numberOfVolumes"), + "explicit": resp.get("explicit", False), } elif client.source == "deezer": if resp.get("release_date", False): @@ -814,6 +821,7 @@ class Album(Tracklist): "sampling_rate": 44100, "tracktotal": resp.get("track_total") or resp.get("nb_tracks"), "disctotal": max(track["disk_number"] for track in resp["tracks"]), + "explicit": bool(resp.get("explicit_content_lyrics")), } raise InvalidSourceError(client.source) @@ -845,6 +853,9 @@ class Album(Tracklist): if self.version.lower() not in album_title.lower(): album_title = f"{album_title} ({self.version})" + if self.get("explicit", False): + album_title = f"{album_title} (Explicit)" + return album_title @title.setter @@ -945,14 +956,12 @@ class Album(Tracklist): def _get_formatter(self) -> dict: fmt = dict() for key in ALBUM_KEYS: - if hasattr(self, key): - fmt[key] = getattr(self, key) - else: - fmt[key] = None + # default to None + fmt[key] = self.get(key) if fmt.get("sampling_rate", False): fmt["sampling_rate"] /= 1000 - # 48.0kHz -> 48kHz, 44.1kHz -> 44.1kHz + # change 48.0kHz -> 48kHz, 44.1kHz -> 44.1kHz if fmt["sampling_rate"] % 1 == 0.0: fmt["sampling_rate"] = int(fmt["sampling_rate"]) diff --git a/streamrip/metadata.py b/streamrip/metadata.py index ee23d9f..a205e92 100644 --- a/streamrip/metadata.py +++ b/streamrip/metadata.py @@ -14,6 +14,7 @@ from .constants import ( TRACK_KEYS, ) from .exceptions import InvalidContainerError +from .utils import safe_get logger = logging.getLogger(__name__) @@ -69,7 +70,10 @@ class TrackMetadata: self.tracknumber = None self.discnumber = None - self.__source = source # not included in tags + # not included in tags + self.explicit = False + + self.__source = source if track is None and album is None: logger.debug("No params passed, returning") @@ -93,12 +97,13 @@ class TrackMetadata: self.genre = resp.get("genres_list", []) self.date = resp.get("release_date_original") or resp.get("release_date") self.copyright = resp.get("copyright") - self.albumartist = resp.get("artist", {}).get("name") + self.albumartist = safe_get(resp, "artist", "name") self.label = resp.get("label") self.description = resp.get("description") self.disctotal = max( track.get("media_number", 1) for track in resp["tracks"]["items"] ) + self.explicit = resp.get("parental_warning", False) if isinstance(self.label, dict): self.label = self.label.get("name") @@ -112,6 +117,7 @@ class TrackMetadata: self.albumartist = resp.get("artist", {}).get("name") self.disctotal = resp.get("numberOfVolumes") self.isrc = resp.get("isrc") + self.explicit = resp.get("explicit", False) # label not returned by API elif self.__source == "deezer": @@ -121,6 +127,9 @@ class TrackMetadata: self.date = resp.get("release_date") self.albumartist = resp.get("artist", {}).get("name") self.label = resp.get("label") + # either 0 or 1 + self.explicit = bool(resp.get("parental_warning")) + elif self.__source == "soundcloud": raise NotImplementedError else: