Only import echo, secho, and style from click

This commit is contained in:
nathom 2021-07-30 11:19:19 -07:00
parent 328879584d
commit 54f4ab99af
6 changed files with 71 additions and 71 deletions

View file

@ -68,7 +68,7 @@ def cli(ctx, **kwargs):
logger.debug("Starting debug log") logger.debug("Starting debug log")
if ctx.invoked_subcommand is None and not ctx.params["urls"]: if ctx.invoked_subcommand is None and not ctx.params["urls"]:
click.echo(cli.get_help(ctx)) echo(cli.get_help(ctx))
if ctx.invoked_subcommand not in { if ctx.invoked_subcommand not in {
None, None,
@ -90,13 +90,13 @@ def cli(ctx, **kwargs):
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__ != newest: if __version__ != newest:
click.secho( secho(
"A new version of streamrip is available! " "A new version of streamrip is available! "
"Run `pip3 install streamrip --upgrade` to update.", "Run `pip3 install streamrip --upgrade` to update.",
fg="yellow", fg="yellow",
) )
else: else:
click.secho("streamrip is up-to-date!", fg="green") 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
@ -108,7 +108,7 @@ def cli(ctx, **kwargs):
if kwargs["quality"] is not None: if kwargs["quality"] is not None:
quality = int(kwargs["quality"]) quality = int(kwargs["quality"])
if quality not in range(5): if quality not in range(5):
click.secho("Invalid quality", fg="red") secho("Invalid quality", fg="red")
return return
config.session["qobuz"]["quality"] = quality config.session["qobuz"]["quality"] = quality
@ -126,7 +126,7 @@ def cli(ctx, **kwargs):
logger.debug(f"Handling {kwargs['text']}") logger.debug(f"Handling {kwargs['text']}")
core.handle_txt(kwargs["text"]) core.handle_txt(kwargs["text"])
else: else:
click.secho(f"Text file {kwargs['text']} does not exist.") secho(f"Text file {kwargs['text']} does not exist.")
if ctx.invoked_subcommand is None: if ctx.invoked_subcommand is None:
core.download() core.download()
@ -206,7 +206,7 @@ def search(ctx, **kwargs):
if core.interactive_search(query, kwargs["source"], kwargs["type"]): if core.interactive_search(query, kwargs["source"], kwargs["type"]):
core.download() core.download()
else: else:
click.secho("No items chosen, exiting.", fg="bright_red") secho("No items chosen, exiting.", fg="bright_red")
@cli.command() @cli.command()
@ -333,10 +333,10 @@ def config(ctx, **kwargs):
config.update() config.update()
if kwargs["path"]: if kwargs["path"]:
click.echo(CONFIG_PATH) echo(CONFIG_PATH)
if kwargs["open"]: if kwargs["open"]:
click.secho(f"Opening {CONFIG_PATH}", fg="green") secho(f"Opening {CONFIG_PATH}", fg="green")
click.launch(CONFIG_PATH) click.launch(CONFIG_PATH)
if kwargs["open_vim"]: if kwargs["open_vim"]:
@ -347,41 +347,41 @@ def config(ctx, **kwargs):
if kwargs["directory"]: if kwargs["directory"]:
config_dir = os.path.dirname(CONFIG_PATH) config_dir = os.path.dirname(CONFIG_PATH)
click.secho(f"Opening {config_dir}", fg="green") secho(f"Opening {config_dir}", fg="green")
click.launch(config_dir) click.launch(config_dir)
if kwargs["qobuz"]: if kwargs["qobuz"]:
config.file["qobuz"]["email"] = input(click.style("Qobuz email: ", fg="blue")) config.file["qobuz"]["email"] = input(style("Qobuz email: ", fg="blue"))
click.secho("Qobuz password (will not show on screen):", fg="blue") secho("Qobuz password (will not show on screen):", fg="blue")
config.file["qobuz"]["password"] = md5( config.file["qobuz"]["password"] = md5(
getpass(prompt="").encode("utf-8") getpass(prompt="").encode("utf-8")
).hexdigest() ).hexdigest()
config.save() config.save()
click.secho("Qobuz credentials hashed and saved to config.", fg="green") secho("Qobuz credentials hashed and saved to config.", fg="green")
if kwargs["tidal"]: if kwargs["tidal"]:
client = TidalClient() client = TidalClient()
client.login() client.login()
config.file["tidal"].update(client.get_tokens()) config.file["tidal"].update(client.get_tokens())
config.save() config.save()
click.secho("Credentials saved to config.", fg="green") secho("Credentials saved to config.", fg="green")
if kwargs["deezer"]: if kwargs["deezer"]:
click.secho( secho(
"If you're not sure how to find the ARL cookie, see the instructions at ", "If you're not sure how to find the ARL cookie, see the instructions at ",
italic=True, italic=True,
nl=False, nl=False,
dim=True, dim=True,
) )
click.secho( secho(
"https://github.com/nathom/streamrip/wiki/Finding-your-Deezer-ARL-Cookie", "https://github.com/nathom/streamrip/wiki/Finding-your-Deezer-ARL-Cookie",
underline=True, underline=True,
italic=True, italic=True,
fg="blue", fg="blue",
) )
config.file["deezer"]["arl"] = input(click.style("ARL: ", fg="green")) config.file["deezer"]["arl"] = input(style("ARL: ", fg="green"))
config.save() config.save()
@ -481,7 +481,7 @@ def convert(ctx, **kwargs):
elif os.path.isfile(kwargs["path"]): elif os.path.isfile(kwargs["path"]):
codec_map[codec](filename=kwargs["path"], **converter_args).convert() codec_map[codec](filename=kwargs["path"], **converter_args).convert()
else: else:
click.secho(f"File {kwargs['path']} does not exist.", fg="red") secho(f"File {kwargs['path']} does not exist.", fg="red")
@cli.command() @cli.command()
@ -503,7 +503,7 @@ def repair(ctx, **kwargs):
def none_chosen(): def none_chosen():
"""Print message if nothing was chosen.""" """Print message if nothing was chosen."""
click.secho("No items chosen, exiting.", fg="bright_red") secho("No items chosen, exiting.", fg="bright_red")
def main(): def main():

View file

@ -56,7 +56,7 @@ class Config:
if os.path.isfile(self._path): if os.path.isfile(self._path):
self.load() self.load()
if self.file["misc"]["version"] != self.defaults["misc"]["version"]: if self.file["misc"]["version"] != self.defaults["misc"]["version"]:
click.secho( secho(
"Updating config file to new version. Some settings may be lost.", "Updating config file to new version. Some settings may be lost.",
fg="yellow", fg="yellow",
) )

View file

@ -162,8 +162,8 @@ class RipCore(list):
if not parsed and len(self) == 0: if not parsed and len(self) == 0:
if "last.fm" in url: if "last.fm" in url:
message = ( message = (
f"For last.fm urls, use the {click.style('lastfm', fg='yellow')} " f"For last.fm urls, use the {style('lastfm', fg='yellow')} "
f"command. See {click.style('rip lastfm --help', fg='yellow')}." f"command. See {style('rip lastfm --help', fg='yellow')}."
) )
else: else:
message = f"Cannot find urls in text: {url}" message = f"Cannot find urls in text: {url}"
@ -175,7 +175,7 @@ class RipCore(list):
logger.info( logger.info(
f"ID {item_id} already downloaded, use --no-db to override." f"ID {item_id} already downloaded, use --no-db to override."
) )
click.secho( secho(
f"ID {item_id} already downloaded, use --no-db to override.", f"ID {item_id} already downloaded, use --no-db to override.",
fg="magenta", fg="magenta",
) )
@ -248,7 +248,7 @@ class RipCore(list):
max_items = float("inf") max_items = float("inf")
if self.failed_db.is_dummy: if self.failed_db.is_dummy:
click.secho( secho(
"Failed downloads database must be enabled in the config file " "Failed downloads database must be enabled in the config file "
"to repair!", "to repair!",
fg="red", fg="red",
@ -304,7 +304,7 @@ class RipCore(list):
item.load_meta(**arguments) item.load_meta(**arguments)
except NonStreamable: except NonStreamable:
self.failed_db.add((item.client.source, item.type, item.id)) self.failed_db.add((item.client.source, item.type, item.id))
click.secho(f"{item!s} is not available, skipping.", fg="red") secho(f"{item!s} is not available, skipping.", fg="red")
continue continue
try: try:
@ -321,7 +321,7 @@ class RipCore(list):
self.failed_db.add(failed_item_info) self.failed_db.add(failed_item_info)
continue continue
except ItemExists as e: except ItemExists as e:
click.secho(f'"{e!s}" already exists. Skipping.', fg="yellow") secho(f'"{e!s}" already exists. Skipping.', fg="yellow")
continue continue
if hasattr(item, "id"): if hasattr(item, "id"):
@ -366,13 +366,13 @@ class RipCore(list):
creds = self.config.creds(client.source) creds = self.config.creds(client.source)
if client.source == "deezer" and creds["arl"] == "": if client.source == "deezer" and creds["arl"] == "":
if self.config.session["deezer"]["deezloader_warnings"]: if self.config.session["deezer"]["deezloader_warnings"]:
click.secho( secho(
"Falling back to Deezloader (max 320kbps MP3). If you have a subscription, run ", "Falling back to Deezloader (max 320kbps MP3). If you have a subscription, run ",
nl=False, nl=False,
fg="yellow", fg="yellow",
) )
click.secho("rip config --deezer ", nl=False, bold=True) secho("rip config --deezer ", nl=False, bold=True)
click.secho("to download FLAC files.\n\n", fg="yellow") secho("to download FLAC files.\n\n", fg="yellow")
raise DeezloaderFallback raise DeezloaderFallback
while True: while True:
@ -380,7 +380,7 @@ class RipCore(list):
client.login(**creds) client.login(**creds)
break break
except AuthenticationError: except AuthenticationError:
click.secho("Invalid credentials, try again.", fg="yellow") secho("Invalid credentials, try again.", fg="yellow")
self.prompt_creds(client.source) self.prompt_creds(client.source)
creds = self.config.creds(client.source) creds = self.config.creds(client.source)
except MissingCredentials: except MissingCredentials:
@ -419,7 +419,7 @@ class RipCore(list):
interpreter_urls = QOBUZ_INTERPRETER_URL_REGEX.findall(url) interpreter_urls = QOBUZ_INTERPRETER_URL_REGEX.findall(url)
if interpreter_urls: if interpreter_urls:
click.secho( secho(
"Extracting IDs from Qobuz interpreter urls. Use urls " "Extracting IDs from Qobuz interpreter urls. Use urls "
"that include the artist ID for faster preprocessing.", "that include the artist ID for faster preprocessing.",
fg="yellow", fg="yellow",
@ -432,7 +432,7 @@ class RipCore(list):
dynamic_urls = DEEZER_DYNAMIC_LINK_REGEX.findall(url) dynamic_urls = DEEZER_DYNAMIC_LINK_REGEX.findall(url)
if dynamic_urls: if dynamic_urls:
click.secho( secho(
"Extracting IDs from Deezer dynamic link. Use urls " "Extracting IDs from Deezer dynamic link. Use urls "
"of the form https://www.deezer.com/{country}/{type}/{id} for " "of the form https://www.deezer.com/{country}/{type}/{id} for "
"faster processing.", "faster processing.",
@ -524,7 +524,7 @@ class RipCore(list):
return True return True
for purl in lastfm_urls: for purl in lastfm_urls:
click.secho(f"Fetching playlist at {purl}", fg="blue") secho(f"Fetching playlist at {purl}", fg="blue")
title, queries = self.get_lastfm_playlist(purl) title, queries = self.get_lastfm_playlist(purl)
pl = Playlist(client=self.get_client(lastfm_source), name=title) pl = Playlist(client=self.get_client(lastfm_source), name=title)
@ -550,7 +550,7 @@ class RipCore(list):
pl.loaded = True pl.loaded = True
if tracks_not_found > 0: if tracks_not_found > 0:
click.secho(f"{tracks_not_found} tracks not found.", fg="yellow") secho(f"{tracks_not_found} tracks not found.", fg="yellow")
self.append(pl) self.append(pl)
def handle_txt(self, filepath: Union[str, os.PathLike]): def handle_txt(self, filepath: Union[str, os.PathLike]):
@ -815,9 +815,9 @@ class RipCore(list):
:type source: str :type source: str
""" """
if source == "qobuz": if source == "qobuz":
click.secho("Enter Qobuz email:", fg="green") secho("Enter Qobuz email:", fg="green")
self.config.file[source]["email"] = input() self.config.file[source]["email"] = input()
click.secho( secho(
"Enter Qobuz password (will not show on screen):", "Enter Qobuz password (will not show on screen):",
fg="green", fg="green",
) )
@ -826,27 +826,27 @@ class RipCore(list):
).hexdigest() ).hexdigest()
self.config.save() self.config.save()
click.secho( secho(
f'Credentials saved to config file at "{self.config._path}"', f'Credentials saved to config file at "{self.config._path}"',
fg="green", fg="green",
) )
elif source == "deezer": elif source == "deezer":
click.secho( secho(
"If you're not sure how to find the ARL cookie, see the instructions at ", "If you're not sure how to find the ARL cookie, see the instructions at ",
italic=True, italic=True,
nl=False, nl=False,
dim=True, dim=True,
) )
click.secho( secho(
"https://github.com/nathom/streamrip/wiki/Finding-your-Deezer-ARL-Cookie", "https://github.com/nathom/streamrip/wiki/Finding-your-Deezer-ARL-Cookie",
underline=True, underline=True,
italic=True, italic=True,
fg="blue", fg="blue",
) )
self.config.file["deezer"]["arl"] = input(click.style("ARL: ", fg="green")) self.config.file["deezer"]["arl"] = input(style("ARL: ", fg="green"))
self.config.save() self.config.save()
click.secho( secho(
f'Credentials saved to config file at "{self.config._path}"', f'Credentials saved to config file at "{self.config._path}"',
fg="green", fg="green",
) )
@ -854,19 +854,19 @@ class RipCore(list):
raise Exception raise Exception
def _config_updating_message(self): def _config_updating_message(self):
click.secho( secho(
"Updating config file... Some settings may be lost. Please run the " "Updating config file... Some settings may be lost. Please run the "
"command again.", "command again.",
fg="magenta", fg="magenta",
) )
def _config_corrupted_message(self, err: Exception): def _config_corrupted_message(self, err: Exception):
click.secho( secho(
"There was a problem with your config file. This happens " "There was a problem with your config file. This happens "
"sometimes after updates. Run ", "sometimes after updates. Run ",
nl=False, nl=False,
fg="red", fg="red",
) )
click.secho("rip config --reset ", fg="yellow", nl=False) secho("rip config --reset ", fg="yellow", nl=False)
click.secho("to reset it. You will need to log in again.", fg="red") secho("to reset it. You will need to log in again.", fg="red")
click.secho(str(err), fg="red") secho(str(err), fg="red")

View file

@ -119,7 +119,7 @@ class QobuzClient(Client):
:type pwd: str :type pwd: str
:param kwargs: app_id: str, secrets: list, return_secrets: bool :param kwargs: app_id: str, secrets: list, return_secrets: bool
""" """
click.secho(f"Logging into {self.source}", fg="green") secho(f"Logging into {self.source}", fg="green")
email: str = kwargs["email"] email: str = kwargs["email"]
pwd: str = kwargs["pwd"] pwd: str = kwargs["pwd"]
if not email or not pwd: if not email or not pwd:
@ -130,7 +130,7 @@ class QobuzClient(Client):
return return
if (kwargs.get("app_id") or kwargs.get("secrets")) in (None, [], ""): if (kwargs.get("app_id") or kwargs.get("secrets")) in (None, [], ""):
click.secho("Fetching tokens — this may take a few seconds.", fg="magenta") secho("Fetching tokens — this may take a few seconds.", fg="magenta")
logger.info("Fetching tokens from Qobuz") logger.info("Fetching tokens from Qobuz")
spoofer = Spoofer() spoofer = Spoofer()
kwargs["app_id"] = spoofer.get_app_id() kwargs["app_id"] = spoofer.get_app_id()
@ -766,7 +766,7 @@ class TidalClient(Client):
self._login_new_user() self._login_new_user()
self.logged_in = True self.logged_in = True
click.secho("Logged into Tidal", fg="green") secho("Logged into Tidal", fg="green")
def get(self, item_id, media_type): def get(self, item_id, media_type):
"""Public method that internally calls _api_get. """Public method that internally calls _api_get.
@ -850,7 +850,7 @@ class TidalClient(Client):
""" """
login_link = f"https://{self._get_device_code()}" login_link = f"https://{self._get_device_code()}"
click.secho( secho(
f"Go to {login_link} to log into Tidal within 5 minutes.", f"Go to {login_link} to log into Tidal within 5 minutes.",
fg="blue", fg="blue",
) )

View file

@ -272,7 +272,7 @@ class Track(Media):
:type progress_bar: bool :type progress_bar: bool
""" """
if not self.part_of_tracklist: if not self.part_of_tracklist:
click.secho(f"Downloading {self!s}\n", bold=True) secho(f"Downloading {self!s}\n", bold=True)
self._prepare_download( self._prepare_download(
quality=quality, quality=quality,
@ -295,7 +295,7 @@ class Track(Media):
if self.client.source == "qobuz": if self.client.source == "qobuz":
if not self.__validate_qobuz_dl_info(dl_info): if not self.__validate_qobuz_dl_info(dl_info):
# click.secho("Track is not available for download", fg="red") # secho("Track is not available for download", fg="red")
raise NonStreamable("Track is not available for download") raise NonStreamable("Track is not available for download")
self.sampling_rate = dl_info.get("sampling_rate") self.sampling_rate = dl_info.get("sampling_rate")
@ -314,7 +314,7 @@ class Track(Media):
words[0] + " " + " ".join(map(str.lower, words[1:])) + "." words[0] + " " + " ".join(map(str.lower, words[1:])) + "."
) )
click.secho(f"Panic: {e} dl_info = {dl_info}", fg="red") secho(f"Panic: {e} dl_info = {dl_info}", fg="red")
raise NonStreamable raise NonStreamable
_quick_download(download_url, self.path, desc=self._progress_desc) _quick_download(download_url, self.path, desc=self._progress_desc)
@ -470,7 +470,7 @@ class Track(Media):
"""Download the cover art, if cover_url is given.""" """Download the cover art, if cover_url is given."""
self.cover_path = os.path.join(gettempdir(), f"cover{hash(self.cover_url)}.jpg") self.cover_path = os.path.join(gettempdir(), f"cover{hash(self.cover_url)}.jpg")
logger.debug(f"Downloading cover from {self.cover_url}") logger.debug(f"Downloading cover from {self.cover_url}")
# click.secho(f"\nDownloading cover art for {self!s}", fg="blue") # secho(f"\nDownloading cover art for {self!s}", fg="blue")
if not os.path.exists(self.cover_path): if not os.path.exists(self.cover_path):
_cover_download(self.cover_url, self.cover_path) _cover_download(self.cover_url, self.cover_path)
@ -670,7 +670,7 @@ class Track(Media):
""" """
if not self.downloaded: if not self.downloaded:
logger.debug("Track not downloaded, skipping conversion") logger.debug("Track not downloaded, skipping conversion")
click.secho("Track not downloaded, skipping conversion", fg="magenta") secho("Track not downloaded, skipping conversion", fg="magenta")
return return
CONV_CLASS = { CONV_CLASS = {
@ -687,7 +687,7 @@ class Track(Media):
try: try:
self.container = codec.upper() self.container = codec.upper()
except AttributeError: except AttributeError:
click.secho("Error: No audio codec chosen to convert to.", fg="red") secho("Error: No audio codec chosen to convert to.", fg="red")
raise click.Abort raise click.Abort
if not hasattr(self, "final_path"): if not hasattr(self, "final_path"):
@ -695,7 +695,7 @@ class Track(Media):
if not os.path.isfile(self.path): if not os.path.isfile(self.path):
logger.info("File %s does not exist. Skipping conversion.", self.path) logger.info("File %s does not exist. Skipping conversion.", self.path)
click.secho(f"{self!s} does not exist. Skipping conversion.", fg="red") secho(f"{self!s} does not exist. Skipping conversion.", fg="red")
return return
assert ( assert (
@ -707,7 +707,7 @@ class Track(Media):
sampling_rate=kwargs.get("sampling_rate"), sampling_rate=kwargs.get("sampling_rate"),
remove_source=kwargs.get("remove_source", True), remove_source=kwargs.get("remove_source", True),
) )
# click.secho(f"Converting {self!s}", fg="blue") # secho(f"Converting {self!s}", fg="blue")
engine.convert() engine.convert()
self.path = engine.final_fn self.path = engine.final_fn
self.final_path = self.final_path.replace( self.final_path = self.final_path.replace(
@ -814,7 +814,7 @@ class Video(Media):
:param kwargs: :param kwargs:
""" """
click.secho( secho(
f"Downloading {self.title} (Video). This may take a while.", f"Downloading {self.title} (Video). This may take a while.",
fg="blue", fg="blue",
) )
@ -949,7 +949,7 @@ class YoutubeVideo(Media):
:type youtube_video_downloads_folder: str :type youtube_video_downloads_folder: str
:param kwargs: :param kwargs:
""" """
click.secho(f"Downloading url {self.id}", fg="blue") secho(f"Downloading url {self.id}", fg="blue")
filename_formatter = "%(track_number)s.%(track)s.%(container)s" filename_formatter = "%(track_number)s.%(track)s.%(container)s"
filename = os.path.join(parent_folder, filename_formatter) filename = os.path.join(parent_folder, filename_formatter)
@ -969,7 +969,7 @@ class YoutubeVideo(Media):
) )
if download_youtube_videos: if download_youtube_videos:
click.secho("Downloading video stream", fg="blue") secho("Downloading video stream", fg="blue")
pv = subprocess.Popen( pv = subprocess.Popen(
[ [
"youtube-dl", "youtube-dl",
@ -1114,11 +1114,11 @@ class Tracklist(list):
if self.client.source != "soundcloud": if self.client.source != "soundcloud":
# soundcloud only gets metadata after `target` is called # soundcloud only gets metadata after `target` is called
# message will be printed in `target` # message will be printed in `target`
click.secho(f'\nDownloading "{item!s}"', bold=True, fg="green") secho(f'\nDownloading "{item!s}"', bold=True, fg="green")
try: try:
target(item, **kwargs) target(item, **kwargs)
except ItemExists: except ItemExists:
click.secho(f"{item!s} exists. Skipping.", fg="yellow") secho(f"{item!s} exists. Skipping.", fg="yellow")
except NonStreamable as e: except NonStreamable as e:
e.print(item) e.print(item)
failed_downloads.append((item.client.source, item.type, item.id)) failed_downloads.append((item.client.source, item.type, item.id))
@ -1264,7 +1264,7 @@ class Tracklist(list):
:rtype: str :rtype: str
""" """
click.secho( secho(
f"\n\nDownloading {self.title} ({self.__class__.__name__})\n", f"\n\nDownloading {self.title} ({self.__class__.__name__})\n",
fg="magenta", fg="magenta",
bold=True, bold=True,
@ -1422,7 +1422,7 @@ class Album(Tracklist, Media):
self.download_message() self.download_message()
# choose optimal cover size and download it # choose optimal cover size and download it
click.secho("Downloading cover art", bold=True) secho("Downloading cover art", bold=True)
cover_path = os.path.join(gettempdir(), f"cover_{hash(self)}.jpg") cover_path = os.path.join(gettempdir(), f"cover_{hash(self)}.jpg")
embed_cover_size = kwargs.get("embed_cover_size", "large") embed_cover_size = kwargs.get("embed_cover_size", "large")
@ -1446,7 +1446,7 @@ class Album(Tracklist, Media):
cover_size = os.path.getsize(cover_path) cover_size = os.path.getsize(cover_path)
if cover_size > FLAC_MAX_BLOCKSIZE: # 16.77 MB if cover_size > FLAC_MAX_BLOCKSIZE: # 16.77 MB
click.secho( secho(
"Downgrading embedded cover size, too large ({cover_size}).", "Downgrading embedded cover size, too large ({cover_size}).",
fg="bright_yellow", fg="bright_yellow",
) )
@ -1473,7 +1473,7 @@ class Album(Tracklist, Media):
and kwargs.get("download_booklets", True) and kwargs.get("download_booklets", True)
and not any(f.endswith(".pdf") for f in os.listdir(self.folder)) and not any(f.endswith(".pdf") for f in os.listdir(self.folder))
): ):
click.secho("\nDownloading booklets", bold=True) secho("\nDownloading booklets", bold=True)
for item in self.booklets: for item in self.booklets:
Booklet(item).download(parent_folder=self.folder) Booklet(item).download(parent_folder=self.folder)
@ -1783,7 +1783,7 @@ class Playlist(Tracklist, Media):
kwargs["parent_folder"] = self.folder kwargs["parent_folder"] = self.folder
if self.client.source == "soundcloud": if self.client.source == "soundcloud":
item.load_meta() item.load_meta()
click.secho(f"Downloading {item!s}", fg="blue") secho(f"Downloading {item!s}", fg="blue")
if playlist_to_album := kwargs.get("set_playlist_to_album", False): if playlist_to_album := kwargs.get("set_playlist_to_album", False):
item.meta.album = self.name item.meta.album = self.name

View file

@ -345,13 +345,13 @@ def decrypt_mqa_file(in_path, out_path, encryption_key):
from Crypto.Cipher import AES from Crypto.Cipher import AES
from Crypto.Util import Counter from Crypto.Util import Counter
except (ImportError, ModuleNotFoundError): except (ImportError, ModuleNotFoundError):
click.secho( secho(
"To download this item in MQA, you need to run ", "To download this item in MQA, you need to run ",
fg="yellow", fg="yellow",
nl=False, nl=False,
) )
click.secho("pip3 install pycryptodome --upgrade", fg="blue", nl=False) secho("pip3 install pycryptodome --upgrade", fg="blue", nl=False)
click.secho(".") secho(".")
raise click.Abort raise click.Abort
# Do not change this # Do not change this
@ -431,7 +431,7 @@ def decho(message, fg=None):
:param fg: ANSI color with which to display the message on the :param fg: ANSI color with which to display the message on the
screen screen
""" """
click.secho(message, fg=fg) secho(message, fg=fg)
logger.debug(message) logger.debug(message)