summaryrefslogtreecommitdiff
path: root/tidal_dl_ng/cli.py
diff options
context:
space:
mode:
authorRobert Honz <exislow+github@gmail.com>2025-03-01 21:53:46 +0100
committerRobert Honz <exislow+github@gmail.com>2025-03-01 21:53:46 +0100
commit0726175503764477e83c16d7e43857c6fe257e71 (patch)
treeb497073fce3ec20a990508a8386aa49ebe00d816 /tidal_dl_ng/cli.py
parent326246cdcc7882e8224f5c30c17fe59b74a47bb3 (diff)
downloadtidal-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.py107
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