diff options
| author | Robert Honz <exislow+github@gmail.com> | 2025-03-01 21:53:46 +0100 |
|---|---|---|
| committer | Robert Honz <exislow+github@gmail.com> | 2025-03-01 21:53:46 +0100 |
| commit | 0726175503764477e83c16d7e43857c6fe257e71 (patch) | |
| tree | b497073fce3ec20a990508a8386aa49ebe00d816 /tidal_dl_ng/cli.py | |
| parent | 326246cdcc7882e8224f5c30c17fe59b74a47bb3 (diff) | |
| download | tidal-dl-ng-0726175503764477e83c16d7e43857c6fe257e71.tar.gz | |
👷 CLI: Download list is scrolling vertically and overall progress is shown at the bottom. Fixes #374
Diffstat (limited to 'tidal_dl_ng/cli.py')
| -rw-r--r-- | tidal_dl_ng/cli.py | 107 |
1 files changed, 67 insertions, 40 deletions
diff --git a/tidal_dl_ng/cli.py b/tidal_dl_ng/cli.py index f99132e..e951fc5 100644 --- a/tidal_dl_ng/cli.py +++ b/tidal_dl_ng/cli.py @@ -4,9 +4,16 @@ from pathlib import Path from typing import Annotated, Optional import typer +from rich.console import Group from rich.live import Live -from rich.panel import Panel -from rich.progress import BarColumn, Console, Progress, SpinnerColumn, TextColumn +from rich.progress import ( + BarColumn, + Console, + Progress, + SpinnerColumn, + TaskProgressColumn, + TextColumn, +) from rich.table import Table from tidal_dl_ng import __version__ @@ -58,10 +65,20 @@ def _download(ctx: typer.Context, urls: list[str], try_login: bool = True) -> bo # Create initial objects. settings: Settings = Settings() progress: Progress = Progress( - "{task.description}", + TextColumn("[progress.description]{task.description}"), SpinnerColumn(), BarColumn(), - TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), + TaskProgressColumn(), + refresh_per_second=20, + auto_refresh=True, + expand=True, + transient=False, # Prevent progress from disappearing + ) + progress_overall = Progress( + TextColumn("[progress.description]{task.description}"), + SpinnerColumn(), + BarColumn(), + TaskProgressColumn(), refresh_per_second=20, auto_refresh=True, expand=True, @@ -74,59 +91,69 @@ def _download(ctx: typer.Context, urls: list[str], try_login: bool = True) -> bo path_base=settings.data.download_base_path, fn_logger=fn_logger, progress=progress, + progress_overall=progress_overall, ) + progress_table = Table.grid() # Style Progress display. - progress_table.add_row(Panel.fit(progress, title="Download Progress", border_style="green", padding=(2, 2))) + progress_table.add_row(progress) + progress_table.add_row(progress_overall) + + progress_group = Group( + progress_table, + ) urls_pos_last = len(urls) - 1 # Use a single Live display for both progress and table - with Live(progress_table, refresh_per_second=20): - for item in urls: - media_type: MediaType | bool = False - - # Extract media name and id from link. - if "http" in item: - media_type = get_tidal_media_type(item) - item_id = get_tidal_media_id(item) - file_template = get_format_template(media_type, settings) - else: - print(f"It seems like that you have supplied an invalid URL: {item}") + with Live(progress_group, refresh_per_second=20, vertical_overflow="visible"): + try: + for item in urls: + media_type: MediaType | bool = False - continue - - # Download media. - if media_type in [MediaType.TRACK, MediaType.VIDEO]: - download_delay: bool = bool(settings.data.download_delay and urls.index(item) < urls_pos_last) + # Extract media name and id from link. + if "http" in item: + media_type = get_tidal_media_type(item) + item_id = get_tidal_media_id(item) + file_template = get_format_template(media_type, settings) + else: + print(f"It seems like that you have supplied an invalid URL: {item}") - dl.item( - media_id=item_id, media_type=media_type, file_template=file_template, download_delay=download_delay - ) - elif media_type in [MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX, MediaType.ARTIST]: - item_ids: [int] = [] + continue - if media_type == MediaType.ARTIST: - media = instantiate_media(ctx.obj[CTX_TIDAL].session, media_type, item_id) - media_type = MediaType.ALBUM - item_ids = item_ids + all_artist_album_ids(media) - else: - item_ids.append(item_id) + # Download media. + if media_type in [MediaType.TRACK, MediaType.VIDEO]: + download_delay: bool = bool(settings.data.download_delay and urls.index(item) < urls_pos_last) - for item_id in item_ids: - dl.items( + dl.item( media_id=item_id, media_type=media_type, file_template=file_template, - video_download=ctx.obj[CTX_TIDAL].settings.data.video_download, - download_delay=settings.data.download_delay, + download_delay=download_delay, ) + elif media_type in [MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX, MediaType.ARTIST]: + item_ids: [int] = [] + + if media_type == MediaType.ARTIST: + media = instantiate_media(ctx.obj[CTX_TIDAL].session, media_type, item_id) + media_type = MediaType.ALBUM + item_ids = item_ids + all_artist_album_ids(media) + else: + item_ids.append(item_id) - # Clear and stop progress display - progress.refresh() - progress.stop() - print("\nDownload completed!") + for item_id in item_ids: + dl.items( + media_id=item_id, + media_type=media_type, + file_template=file_template, + video_download=ctx.obj[CTX_TIDAL].settings.data.video_download, + download_delay=settings.data.download_delay, + ) + finally: + # Clear and stop progress display + progress.refresh() + progress.stop() return True |
