Newer
Older
thu-learn-downloader-optimized / thu_learn_downloader / main.py
import logging
from pathlib import Path
from typing import Annotated

import typer
from typer import Option, Typer

from .client.client import Language
from .client.learn import Learn
from .common.logging import LogLevel
from .download.downloader import Downloader
from .download.selector import Selector
from .login import auto as login

app: Typer = Typer(name="tld")


@app.command()
def main(
    username: Annotated[str, Option("-u", "--username")] = "",
    password: Annotated[str, Option("-p", "--password")] = "",
    *,
    prefix: Annotated[Path, Option(file_okay=False, writable=True)] = Path.home()  # noqa: B008
    / "thu-learn",
    semesters: Annotated[list[str], Option("-s", "--semester")] = [  # noqa: B006
        "2023-2024-1"
    ],
    courses: Annotated[list[str], Option("-c", "--course")] = [],  # noqa: B006
    document: Annotated[bool, Option()] = True,
    homework: Annotated[bool, Option()] = True,
    jobs: Annotated[int, Option("-j", "--jobs")] = 8,
    language: Annotated[Language, Option("-l", "--language")] = Language.ENGLISH,
    log_level: Annotated[LogLevel, Option(envvar="LOG_LEVEL")] = LogLevel.INFO,
) -> None:
    logging.getLogger().setLevel(log_level)
    username = username or login.username() or typer.prompt(text="Username")
    password = (
        password or login.password() or typer.prompt(text="Password", hide_input=True)
    )
    learn: Learn = Learn(language=language)
    learn.login(username=username, password=password)
    with Downloader(
        prefix=prefix,
        selector=Selector(
            semesters=semesters,
            courses=courses,
            document=document,
            homework=homework,
        ),
        jobs=jobs,
    ) as downloader:
        downloader.sync_semesters(semesters=learn.semesters)


if __name__ == "__main__":
    app()