From 7e144794035a462ad36b3206b3bd9e076ff8247c Mon Sep 17 00:00:00 2001 From: nathom Date: Tue, 6 Apr 2021 16:46:47 -0700 Subject: [PATCH] Implement Feature Request #25 --- streamrip/cli.py | 8 +++++-- streamrip/config.py | 13 +++++------ streamrip/core.py | 7 +++--- streamrip/downloader.py | 52 ++++++++++++++++++++++------------------- 4 files changed, 44 insertions(+), 36 deletions(-) diff --git a/streamrip/cli.py b/streamrip/cli.py index 404fcc5..59a29a7 100644 --- a/streamrip/cli.py +++ b/streamrip/cli.py @@ -21,7 +21,9 @@ if not os.path.isdir(CACHE_DIR): @click.group(invoke_without_command=True) @click.option("-c", "--convert", metavar="CODEC", help="alac, mp3, flac, or ogg") -@click.option("-u", "--urls", metavar="URLS", help="Url from Qobuz, Tidal, SoundCloud, or Deezer") +@click.option( + "-u", "--urls", metavar="URLS", help="Url from Qobuz, Tidal, SoundCloud, or Deezer" +) @click.option( "-q", "--quality", @@ -113,7 +115,9 @@ def filter_discography(ctx, **kwargs): @cli.command() @click.option("-t", "--type", default="album", help="album, playlist, track, or artist") -@click.option("-s", "--source", default="qobuz", help="qobuz, tidal, soundcloud, or deezer") +@click.option( + "-s", "--source", default="qobuz", help="qobuz, tidal, soundcloud, or deezer" +) @click.argument("QUERY", nargs=-1) @click.pass_context def search(ctx, **kwargs): diff --git a/streamrip/config.py b/streamrip/config.py index 4915aa4..f28a938 100644 --- a/streamrip/config.py +++ b/streamrip/config.py @@ -37,7 +37,7 @@ class Config: defaults = { "qobuz": { - "quality": 2, + "quality": 3, "email": None, "password": None, "app_id": "", # Avoid NoneType error @@ -73,13 +73,12 @@ class Config: "non_remaster": False, }, "downloads": {"folder": DOWNLOADS_DIR}, - "metadata": { - "embed_cover": True, - "large_cover": True, - "default_comment": None, - "remove_extra_tags": False, + "artwork": { + "embed": True, + "embed_size": "large", + "download_size": "original", + "keep_image": True, }, - "keep_cover": True, "path_format": {"folder": FOLDER_FORMAT, "track": TRACK_FORMAT}, } diff --git a/streamrip/core.py b/streamrip/core.py index 5c7a372..617b75a 100644 --- a/streamrip/core.py +++ b/streamrip/core.py @@ -145,11 +145,12 @@ class MusicDL(list): arguments = { "database": self.db, "parent_folder": self.config.session["downloads"]["folder"], - "keep_cover": self.config.session["keep_cover"], - "large_cover": self.config.session["metadata"]["large_cover"], "folder_format": self.config.session["path_format"]["folder"], "track_format": self.config.session["path_format"]["track"], - "embed_cover": self.config.session["metadata"]["embed_cover"], + "keep_cover": self.config.session["artwork"]["keep_image"], + "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"], } logger.debug("Arguments from config: %s", arguments) for item in self: diff --git a/streamrip/downloader.py b/streamrip/downloader.py index 10d88fb..16716d7 100644 --- a/streamrip/downloader.py +++ b/streamrip/downloader.py @@ -1,9 +1,9 @@ import logging -import sys import os import re import shutil import subprocess +import sys from pprint import pformat, pprint from tempfile import gettempdir from typing import Any, Callable, Optional, Tuple, Union @@ -619,7 +619,7 @@ class Tracklist(list): size_ = os.path.getsize(cover_path) if size_ > FLAC_MAX_BLOCKSIZE: raise TooLargeCoverArt( - "Not suitable for Picture embed: {size_ * 10 ** 6}MB" + f"Not suitable for Picture embed: {size_ / 10 ** 6} MB" ) elif cover is None: raise InvalidQuality(f"Quality {quality} not allowed") @@ -742,6 +742,8 @@ class Album(Tracklist): else: sampling_rate = None + resp["image"]["original"] = resp["image"]["large"].replace("600", "org") + return { "id": resp.get("id"), "title": resp.get("title"), @@ -877,27 +879,29 @@ class Album(Tracklist): self.download_message() + downloaded_cover_size = kwargs.get("download_cover_size", "original") + embed_cover_size = kwargs.get("embed_cover_size", "large") if os.path.isfile(cover_path): logger.debug("Cover already downloaded: %s. Skipping", cover_path) else: click.secho("Downloading cover art", fg="magenta") - if kwargs.get("large_cover", True): - cover_url = self.cover_urls.get("large") - if self.client.source == "qobuz": - tqdm_download(cover_url.replace("600", "org"), cover_path) - else: - tqdm_download(cover_url, cover_path) - - if os.path.getsize(cover_path) > FLAC_MAX_BLOCKSIZE: # 16.7 MB - click.secho( - "Large cover is too large to embed, embedding small cover instead.", - fg="yellow", - ) - large_cover_path = cover_path.replace(".jpg", "_large") + ".jpg" - shutil.move(cover_path, large_cover_path) - tqdm_download(self.cover_urls["small"], cover_path) + if downloaded_cover_size in self.cover_urls: + tqdm_download(self.cover_urls[downloaded_cover_size], cover_path) else: - tqdm_download(self.cover_urls["small"], cover_path) + logger.debug( + f"Cover size {downloaded_cover_size} not available, defaulting to large" + ) + tqdm_download(self.cover_urls["large"], cover_path) + + if ( + downloaded_cover_size != embed_cover_size + or os.path.size(cover_path) > FLAC_MAX_BLOCKSIZE + ): + dl_cover_path = cover_path.replace( + ".jpg", f"_{downloaded_cover_size}.jpg" + ) + shutil.move(cover_path, dl_cover_path) + tqdm_download(self.cover_urls[embed_cover_size], cover_path) embed_cover = kwargs.get("embed_cover", True) # embed by default if self.client.source != "deezer" and embed_cover: @@ -943,13 +947,13 @@ class Album(Tracklist): def _get_formatted_folder(self, parent_folder: str, quality: int) -> str: if quality >= 2: - self.container = 'FLAC' + self.container = "FLAC" else: self.bit_depth = self.sampling_rate = None - if self.client.source == 'tidal': - self.container = 'AAC' + if self.client.source == "tidal": + self.container = "AAC" else: - self.container = 'MP3' + self.container = "MP3" formatted_folder = clean_format(self.folder_format, self._get_formatter()) @@ -1274,9 +1278,9 @@ class Artist(Tracklist): logger.debug(f"Length of tracklist {len(self)}") logger.debug(f"Filters: {filters}") - if 'repeats' in filters: + if "repeats" in filters: final = self._remove_repeats(bit_depth=max, sampling_rate=min) - filters = tuple(f for f in filters if f != 'repeats') + filters = tuple(f for f in filters if f != "repeats") else: final = self