From ac02f7902a5f8d4db39e6a35f00e8159ebccf081 Mon Sep 17 00:00:00 2001 From: nathom Date: Fri, 9 Apr 2021 20:04:32 -0700 Subject: [PATCH] Add option to set album tag to playlist name --- streamrip/config.py | 3 +++ streamrip/core.py | 4 +++- streamrip/downloader.py | 27 ++++++++++++++++++++++++--- streamrip/metadata.py | 2 ++ streamrip/utils.py | 6 ++---- 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/streamrip/config.py b/streamrip/config.py index 7b47104..d035ef4 100644 --- a/streamrip/config.py +++ b/streamrip/config.py @@ -80,6 +80,9 @@ class Config: "keep_embedded_cover": False, "keep_downloaded_cover": True, }, + "metadata": { + "set_playlist_to_album": False, + }, "path_format": {"folder": FOLDER_FORMAT, "track": TRACK_FORMAT}, "check_for_updates": True, "lastfm": {"source": "qobuz"}, diff --git a/streamrip/core.py b/streamrip/core.py index 3888bc3..ed8fad7 100644 --- a/streamrip/core.py +++ b/streamrip/core.py @@ -2,7 +2,6 @@ import logging import os import re import sys -import time from getpass import getpass from hashlib import md5 from string import Formatter @@ -163,6 +162,9 @@ class MusicDL(list): "embed_cover": self.config.session["artwork"]["embed"], "embed_cover_size": self.config.session["artwork"]["embed_size"], "download_cover_size": self.config.session["artwork"]["download_size"], + "set_playlist_to_album": self.config.session["metadata"][ + "set_playlist_to_album" + ], } logger.debug("Arguments from config: %s", arguments) for item in self: diff --git a/streamrip/downloader.py b/streamrip/downloader.py index e3d6ad6..ee96feb 100644 --- a/streamrip/downloader.py +++ b/streamrip/downloader.py @@ -848,7 +848,10 @@ class Album(Tracklist): "bit_depth": 16, "sampling_rate": 44100, "tracktotal": resp.get("track_total") or resp.get("nb_tracks"), - "disctotal": max(track["disk_number"] for track in resp["tracks"]), + "disctotal": max( + track.get("disk_number") for track in resp.get("tracks", [{}]) + ) + or 1, "explicit": bool(resp.get("explicit_content_lyrics")), } @@ -1088,7 +1091,8 @@ class Playlist(Tracklist): :type new_tracknumbers: bool :param kwargs: """ - self.meta = self.client.get(id=self.id, media_type="playlist") + self.meta = self.client.get(self.id, media_type="playlist") + logger.debug(pformat(self.meta)) self._load_tracks(**kwargs) self.loaded = True @@ -1100,6 +1104,9 @@ class Playlist(Tracklist): """ if self.client.source == "qobuz": self.name = self.meta["name"] + self.image = self.meta["images"] + self.creator = safe_get(self.meta, "owner", "name", default="Qobuz") + tracklist = self.meta["tracks"]["items"] def gen_cover(track): @@ -1110,10 +1117,13 @@ class Playlist(Tracklist): elif self.client.source == "tidal": self.name = self.meta["title"] + self.image = tidal_cover_url(self.meta["image"], 640) + self.creator = safe_get(self.meta, "creator", "name", default="TIDAL") + tracklist = self.meta["tracks"] def gen_cover(track): - cover_url = tidal_cover_url(track["album"]["cover"], 320) + cover_url = tidal_cover_url(track["album"]["cover"], 640) return cover_url def meta_args(track): @@ -1124,6 +1134,9 @@ class Playlist(Tracklist): elif self.client.source == "deezer": self.name = self.meta["title"] + self.image = self.meta["picture_big"] + self.creator = safe_get(self.meta, "creator", "name", default="Deezer") + tracklist = self.meta["tracks"] def gen_cover(track): @@ -1131,6 +1144,8 @@ class Playlist(Tracklist): elif self.client.source == "soundcloud": self.name = self.meta["title"] + self.image = self.meta.get("artwork_url").replace("large", "t500x500") + self.creator = self.meta["user"]["username"] tracklist = self.meta["tracks"] def gen_cover(track): @@ -1185,10 +1200,16 @@ class Playlist(Tracklist): logger.debug(f"Parent folder {folder}") self.download_message() + set_playlist_to_album = kwargs.get("set_playlist_to_album", False) for i, track in enumerate(self): + if self.client.source == "soundcloud": track.load_meta() + if set_playlist_to_album and hasattr(self, "image"): + track["album"] = self.name + track["albumartist"] = self.creator + if kwargs.get("new_tracknumbers", True): track.meta["tracknumber"] = str(i + 1) diff --git a/streamrip/metadata.py b/streamrip/metadata.py index 427efbb..9009514 100644 --- a/streamrip/metadata.py +++ b/streamrip/metadata.py @@ -40,6 +40,7 @@ class TrackMetadata: * tracknumber * discnumber * tracktotal + * disctotal """ @@ -67,6 +68,7 @@ class TrackMetadata: self.cover = None self.tracknumber = None self.discnumber = None + self.disctotal = None # not included in tags self.explicit = False diff --git a/streamrip/utils.py b/streamrip/utils.py index 56a187c..062cdad 100644 --- a/streamrip/utils.py +++ b/streamrip/utils.py @@ -1,8 +1,6 @@ import base64 import logging -import logging.handlers as handlers import os -import time from string import Formatter from typing import Hashable, Optional, Union @@ -112,8 +110,8 @@ def tqdm_download(url: str, filepath: str, params: dict = None): r = requests.get(url, allow_redirects=True, stream=True, params=params) total = int(r.headers.get("content-length", 0)) logger.debug(f"File size = {total}") - if total < 1000 and not url.endswith("jpg"): - raise NonStreamable + if total < 1000 and not url.endswith("jpg") and not url.endswith("png"): + raise NonStreamable(url) try: with open(filepath, "wb") as file, tqdm(