Newer
Older
thu-learn-downloader-optimized / thu_learn_downloader / __main__.py
@liblaf liblaf on 26 Sep 2023 2 KB fix: fix parse error of time
import sys
from pathlib import Path
from typing import Annotated

import typer
from rich.console import Group
from rich.live import Live
from rich.panel import Panel
from rich.progress import (
    BarColumn,
    MofNCompleteColumn,
    Progress,
    TextColumn,
    TimeElapsedColumn,
)

from . import sync
from .config import Config
from .constants import MAX_ACTIVE_TASKS, SUCCESS_PREFIX
from .downloader import Downloader
from .helper import Helper

app = typer.Typer(name="tld")


@app.command(name="tld")
def main(
    *,
    username: Annotated[str, typer.Option("-u", "--username")] = "liqin20",
    password: Annotated[
        str, typer.Option("-p", "--password", prompt=True, hide_input=True)
    ],
    semester: Annotated[list[str], typer.Option("-s", "--semester")] = ["2023-2024-1"],
    course: Annotated[list[str], typer.Option("-c", "--course")] = [],
    prefix: Annotated[Path, typer.Option("--prefix")] = Path.home()
    / "Desktop"
    / "thu-learn",
    size_limit: Annotated[int, typer.Option("--size-limit")] = sys.maxsize,
) -> None:
    config = Config(
        username=username,
        password=password,
        semesters=semester,
        courses=course,
        prefix=prefix,
        size_limit=size_limit,
    )
    helper = Helper()
    downloader = Downloader()
    overall_progress = Progress(
        TextColumn("{task.description}", style="bold bright_blue"),
        BarColumn(),
        MofNCompleteColumn(),
        TimeElapsedColumn(),
    )
    semesters_task_id = overall_progress.add_task(description="Semesters")
    courses_task_id = overall_progress.add_task(description="Courses")
    progress_group = Group(
        Panel(downloader.progress, height=MAX_ACTIVE_TASKS + 2),
        Panel(overall_progress),
    )

    with Live(progress_group) as live:
        with downloader.pool:
            helper.login(username=username, password=password)
            live.console.log(
                SUCCESS_PREFIX,
                f"Login as {username} SUCCESS",
                style="bold bright_green",
            )
            sync.sync_all(
                helper=helper,
                downloader=downloader,
                config=config,
                console=live.console,
                overall_progress=overall_progress,
                semesters_task_id=semesters_task_id,
                courses_task_id=courses_task_id,
            )


if __name__ == "__main__":
    app()