This commit is contained in:
nathom 2021-04-09 11:17:48 -07:00
parent 3e506db3cb
commit 43730127fa
3 changed files with 32 additions and 14 deletions

View file

@ -61,7 +61,7 @@ def cli(ctx, **kwargs):
from packaging import version from packaging import version
r = requests.get("https://pypi.org/pypi/streamrip/json").json() 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): if version.parse(metadata.version("streamrip")) < version.parse(newest):
click.secho( click.secho(
"A new version of streamrip is available! " "A new version of streamrip is available! "
@ -69,7 +69,7 @@ def cli(ctx, **kwargs):
fg="yellow", fg="yellow",
) )
else: else:
click.secho("streamrip is up-to-date!", fg='green') click.secho("streamrip is up-to-date!", fg="green")
if kwargs["no_db"]: if kwargs["no_db"]:
config.session["database"]["enabled"] = False config.session["database"]["enabled"] = False

View file

@ -124,7 +124,7 @@ class Track:
) # meta dict -> TrackMetadata object ) # meta dict -> TrackMetadata object
try: try:
if self.client.source == "qobuz": 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": elif self.client.source == "tidal":
self.cover_url = tidal_cover_url(self.resp["album"]["cover"], 320) self.cover_url = tidal_cover_url(self.resp["album"]["cover"], 320)
elif self.client.source == "deezer": elif self.client.source == "deezer":
@ -486,7 +486,10 @@ class Track:
@property @property
def title(self): def title(self):
if hasattr(self, "meta"): if hasattr(self, "meta"):
return self.meta.title _title = self.meta.title
if self.meta.explicit:
_title = f"{_title} (Explicit)"
return _title
else: else:
raise Exception("Track must be loaded before accessing title") raise Exception("Track must be loaded before accessing title")
@ -557,7 +560,7 @@ class Tracklist(list):
IndexError 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 isinstance(key, str):
if hasattr(self, key): if hasattr(self, key):
return getattr(self, key) return getattr(self, key)
@ -764,8 +767,11 @@ class Album(Tracklist):
"tracktotal": resp.get("tracks_count"), "tracktotal": resp.get("tracks_count"),
"description": resp.get("description"), "description": resp.get("description"),
"disctotal": max( "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": elif client.source == "tidal":
return { return {
@ -787,6 +793,7 @@ class Album(Tracklist):
else 41000, else 41000,
"tracktotal": resp.get("numberOfTracks"), "tracktotal": resp.get("numberOfTracks"),
"disctotal": resp.get("numberOfVolumes"), "disctotal": resp.get("numberOfVolumes"),
"explicit": resp.get("explicit", False),
} }
elif client.source == "deezer": elif client.source == "deezer":
if resp.get("release_date", False): if resp.get("release_date", False):
@ -814,6 +821,7 @@ class Album(Tracklist):
"sampling_rate": 44100, "sampling_rate": 44100,
"tracktotal": resp.get("track_total") or resp.get("nb_tracks"), "tracktotal": resp.get("track_total") or resp.get("nb_tracks"),
"disctotal": max(track["disk_number"] for track in resp["tracks"]), "disctotal": max(track["disk_number"] for track in resp["tracks"]),
"explicit": bool(resp.get("explicit_content_lyrics")),
} }
raise InvalidSourceError(client.source) raise InvalidSourceError(client.source)
@ -845,6 +853,9 @@ class Album(Tracklist):
if self.version.lower() not in album_title.lower(): if self.version.lower() not in album_title.lower():
album_title = f"{album_title} ({self.version})" album_title = f"{album_title} ({self.version})"
if self.get("explicit", False):
album_title = f"{album_title} (Explicit)"
return album_title return album_title
@title.setter @title.setter
@ -945,14 +956,12 @@ class Album(Tracklist):
def _get_formatter(self) -> dict: def _get_formatter(self) -> dict:
fmt = dict() fmt = dict()
for key in ALBUM_KEYS: for key in ALBUM_KEYS:
if hasattr(self, key): # default to None
fmt[key] = getattr(self, key) fmt[key] = self.get(key)
else:
fmt[key] = None
if fmt.get("sampling_rate", False): if fmt.get("sampling_rate", False):
fmt["sampling_rate"] /= 1000 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: if fmt["sampling_rate"] % 1 == 0.0:
fmt["sampling_rate"] = int(fmt["sampling_rate"]) fmt["sampling_rate"] = int(fmt["sampling_rate"])

View file

@ -14,6 +14,7 @@ from .constants import (
TRACK_KEYS, TRACK_KEYS,
) )
from .exceptions import InvalidContainerError from .exceptions import InvalidContainerError
from .utils import safe_get
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -69,7 +70,10 @@ class TrackMetadata:
self.tracknumber = None self.tracknumber = None
self.discnumber = 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: if track is None and album is None:
logger.debug("No params passed, returning") logger.debug("No params passed, returning")
@ -93,12 +97,13 @@ class TrackMetadata:
self.genre = resp.get("genres_list", []) self.genre = resp.get("genres_list", [])
self.date = resp.get("release_date_original") or resp.get("release_date") self.date = resp.get("release_date_original") or resp.get("release_date")
self.copyright = resp.get("copyright") 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.label = resp.get("label")
self.description = resp.get("description") self.description = resp.get("description")
self.disctotal = max( self.disctotal = max(
track.get("media_number", 1) for track in resp["tracks"]["items"] track.get("media_number", 1) for track in resp["tracks"]["items"]
) )
self.explicit = resp.get("parental_warning", False)
if isinstance(self.label, dict): if isinstance(self.label, dict):
self.label = self.label.get("name") self.label = self.label.get("name")
@ -112,6 +117,7 @@ class TrackMetadata:
self.albumartist = resp.get("artist", {}).get("name") self.albumartist = resp.get("artist", {}).get("name")
self.disctotal = resp.get("numberOfVolumes") self.disctotal = resp.get("numberOfVolumes")
self.isrc = resp.get("isrc") self.isrc = resp.get("isrc")
self.explicit = resp.get("explicit", False)
# label not returned by API # label not returned by API
elif self.__source == "deezer": elif self.__source == "deezer":
@ -121,6 +127,9 @@ class TrackMetadata:
self.date = resp.get("release_date") self.date = resp.get("release_date")
self.albumartist = resp.get("artist", {}).get("name") self.albumartist = resp.get("artist", {}).get("name")
self.label = resp.get("label") self.label = resp.get("label")
# either 0 or 1
self.explicit = bool(resp.get("parental_warning"))
elif self.__source == "soundcloud": elif self.__source == "soundcloud":
raise NotImplementedError raise NotImplementedError
else: else: