59 lines
2.1 KiB
Python
59 lines
2.1 KiB
Python
|
|
from rich.console import Console
|
|||
|
|
from rich.progress import Progress, SpinnerColumn, TextColumn, BarColumn, TaskProgressColumn, TimeRemainingColumn
|
|||
|
|
from rich.table import Table
|
|||
|
|
from rich.panel import Panel
|
|||
|
|
|
|||
|
|
console = Console()
|
|||
|
|
|
|||
|
|
|
|||
|
|
class ProgressDisplay:
|
|||
|
|
def __init__(self):
|
|||
|
|
self.console = console
|
|||
|
|
|
|||
|
|
def show_banner(self):
|
|||
|
|
banner = """
|
|||
|
|
╔══════════════════════════════════════════╗
|
|||
|
|
║ Douyin Downloader v1.0.0 ║
|
|||
|
|
║ 抖音批量下载工具 ║
|
|||
|
|
╚══════════════════════════════════════════╝
|
|||
|
|
"""
|
|||
|
|
self.console.print(banner, style="bold cyan")
|
|||
|
|
|
|||
|
|
def create_progress(self) -> Progress:
|
|||
|
|
return Progress(
|
|||
|
|
SpinnerColumn(),
|
|||
|
|
TextColumn("[progress.description]{task.description}"),
|
|||
|
|
BarColumn(),
|
|||
|
|
TaskProgressColumn(),
|
|||
|
|
TimeRemainingColumn(),
|
|||
|
|
console=self.console
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
def show_result(self, result):
|
|||
|
|
table = Table(title="Download Summary", show_header=True, header_style="bold magenta")
|
|||
|
|
table.add_column("Metric", style="cyan")
|
|||
|
|
table.add_column("Count", justify="right", style="green")
|
|||
|
|
|
|||
|
|
table.add_row("Total", str(result.total))
|
|||
|
|
table.add_row("Success", str(result.success))
|
|||
|
|
table.add_row("Failed", str(result.failed))
|
|||
|
|
table.add_row("Skipped", str(result.skipped))
|
|||
|
|
|
|||
|
|
if result.total > 0:
|
|||
|
|
success_rate = (result.success / result.total) * 100
|
|||
|
|
table.add_row("Success Rate", f"{success_rate:.1f}%")
|
|||
|
|
|
|||
|
|
self.console.print(table)
|
|||
|
|
|
|||
|
|
def print_info(self, message: str):
|
|||
|
|
self.console.print(f"[blue]ℹ[/blue] {message}")
|
|||
|
|
|
|||
|
|
def print_success(self, message: str):
|
|||
|
|
self.console.print(f"[green]✓[/green] {message}")
|
|||
|
|
|
|||
|
|
def print_warning(self, message: str):
|
|||
|
|
self.console.print(f"[yellow]⚠[/yellow] {message}")
|
|||
|
|
|
|||
|
|
def print_error(self, message: str):
|
|||
|
|
self.console.print(f"[red]✗[/red] {message}")
|