Implement Feature Request #25

This commit is contained in:
nathom 2021-04-06 16:46:47 -07:00
parent 8c6bf23ce4
commit 7e14479403
4 changed files with 44 additions and 36 deletions

View file

@ -21,7 +21,9 @@ if not os.path.isdir(CACHE_DIR):
@click.group(invoke_without_command=True) @click.group(invoke_without_command=True)
@click.option("-c", "--convert", metavar="CODEC", help="alac, mp3, flac, or ogg") @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( @click.option(
"-q", "-q",
"--quality", "--quality",
@ -113,7 +115,9 @@ def filter_discography(ctx, **kwargs):
@cli.command() @cli.command()
@click.option("-t", "--type", default="album", help="album, playlist, track, or artist") @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.argument("QUERY", nargs=-1)
@click.pass_context @click.pass_context
def search(ctx, **kwargs): def search(ctx, **kwargs):

View file

@ -37,7 +37,7 @@ class Config:
defaults = { defaults = {
"qobuz": { "qobuz": {
"quality": 2, "quality": 3,
"email": None, "email": None,
"password": None, "password": None,
"app_id": "", # Avoid NoneType error "app_id": "", # Avoid NoneType error
@ -73,13 +73,12 @@ class Config:
"non_remaster": False, "non_remaster": False,
}, },
"downloads": {"folder": DOWNLOADS_DIR}, "downloads": {"folder": DOWNLOADS_DIR},
"metadata": { "artwork": {
"embed_cover": True, "embed": True,
"large_cover": True, "embed_size": "large",
"default_comment": None, "download_size": "original",
"remove_extra_tags": False, "keep_image": True,
}, },
"keep_cover": True,
"path_format": {"folder": FOLDER_FORMAT, "track": TRACK_FORMAT}, "path_format": {"folder": FOLDER_FORMAT, "track": TRACK_FORMAT},
} }

View file

@ -145,11 +145,12 @@ class MusicDL(list):
arguments = { arguments = {
"database": self.db, "database": self.db,
"parent_folder": self.config.session["downloads"]["folder"], "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"], "folder_format": self.config.session["path_format"]["folder"],
"track_format": self.config.session["path_format"]["track"], "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) logger.debug("Arguments from config: %s", arguments)
for item in self: for item in self:

View file

@ -1,9 +1,9 @@
import logging import logging
import sys
import os import os
import re import re
import shutil import shutil
import subprocess import subprocess
import sys
from pprint import pformat, pprint from pprint import pformat, pprint
from tempfile import gettempdir from tempfile import gettempdir
from typing import Any, Callable, Optional, Tuple, Union from typing import Any, Callable, Optional, Tuple, Union
@ -619,7 +619,7 @@ class Tracklist(list):
size_ = os.path.getsize(cover_path) size_ = os.path.getsize(cover_path)
if size_ > FLAC_MAX_BLOCKSIZE: if size_ > FLAC_MAX_BLOCKSIZE:
raise TooLargeCoverArt( 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: elif cover is None:
raise InvalidQuality(f"Quality {quality} not allowed") raise InvalidQuality(f"Quality {quality} not allowed")
@ -742,6 +742,8 @@ class Album(Tracklist):
else: else:
sampling_rate = None sampling_rate = None
resp["image"]["original"] = resp["image"]["large"].replace("600", "org")
return { return {
"id": resp.get("id"), "id": resp.get("id"),
"title": resp.get("title"), "title": resp.get("title"),
@ -877,27 +879,29 @@ class Album(Tracklist):
self.download_message() 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): if os.path.isfile(cover_path):
logger.debug("Cover already downloaded: %s. Skipping", cover_path) logger.debug("Cover already downloaded: %s. Skipping", cover_path)
else: else:
click.secho("Downloading cover art", fg="magenta") click.secho("Downloading cover art", fg="magenta")
if kwargs.get("large_cover", True): if downloaded_cover_size in self.cover_urls:
cover_url = self.cover_urls.get("large") tqdm_download(self.cover_urls[downloaded_cover_size], cover_path)
if self.client.source == "qobuz":
tqdm_download(cover_url.replace("600", "org"), cover_path)
else: else:
tqdm_download(cover_url, cover_path) logger.debug(
f"Cover size {downloaded_cover_size} not available, defaulting to large"
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" tqdm_download(self.cover_urls["large"], cover_path)
shutil.move(cover_path, large_cover_path)
tqdm_download(self.cover_urls["small"], cover_path) if (
else: downloaded_cover_size != embed_cover_size
tqdm_download(self.cover_urls["small"], cover_path) 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 embed_cover = kwargs.get("embed_cover", True) # embed by default
if self.client.source != "deezer" and embed_cover: 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: def _get_formatted_folder(self, parent_folder: str, quality: int) -> str:
if quality >= 2: if quality >= 2:
self.container = 'FLAC' self.container = "FLAC"
else: else:
self.bit_depth = self.sampling_rate = None self.bit_depth = self.sampling_rate = None
if self.client.source == 'tidal': if self.client.source == "tidal":
self.container = 'AAC' self.container = "AAC"
else: else:
self.container = 'MP3' self.container = "MP3"
formatted_folder = clean_format(self.folder_format, self._get_formatter()) 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"Length of tracklist {len(self)}")
logger.debug(f"Filters: {filters}") logger.debug(f"Filters: {filters}")
if 'repeats' in filters: if "repeats" in filters:
final = self._remove_repeats(bit_depth=max, sampling_rate=min) 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: else:
final = self final = self