mirror of
https://github.com/nathom/streamrip.git
synced 2025-05-17 16:45:13 -04:00
Implement Feature Request #25
This commit is contained in:
parent
8c6bf23ce4
commit
7e14479403
4 changed files with 44 additions and 36 deletions
|
@ -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):
|
||||||
|
|
|
@ -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},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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:
|
|
||||||
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)
|
|
||||||
else:
|
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
|
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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue