diff --git a/download_imageset.py b/download_imageset.py index ae646e5..26be541 100755 --- a/download_imageset.py +++ b/download_imageset.py @@ -1,9 +1,8 @@ #!/usr/bin/env -S uv run --script # /// script # requires-python = ">=3.11" -# dependencies = ["httpx", "pillow"] +# dependencies = ["httpx", "pillow", "click"] # /// -import argparse import dataclasses import logging import os @@ -16,6 +15,7 @@ from functools import partial from pathlib import Path from typing import Callable +import click import httpx from PIL import Image @@ -326,11 +326,24 @@ def is_image(f: Path) -> bool: # --------------------------------------------------------------------------- -# Subcommands +# CLI # --------------------------------------------------------------------------- -def cmd_gallery(urls: list[str], name: str | None, cwd: Path | None = None) -> None: +_DEFAULT_CWD = Path("~/Downloads/_temp/_imagesets").expanduser() + + +@click.group() +def cli() -> None: + pass + + +@cli.command("gallery") +@click.argument("urls", nargs=-1, required=True) +@click.option("--name", default=None) +@click.option("--cwd", type=Path, default=None) +def gallery_cmd(urls: tuple[str, ...], name: str | None, cwd: Path | None) -> None: + urls = list(urls) resolved_name = name or _name_from_url(urls[0]) output_dir = (cwd or Path(".")) / resolved_name @@ -346,9 +359,12 @@ def cmd_gallery(urls: list[str], name: str | None, cwd: Path | None = None) -> N _extract_and_process(output_dir) -def cmd_filehost( - urls: list[str], name: str | None, token: str, cwd: Path | None = None -) -> None: +@cli.command("filehost") +@click.argument("urls", nargs=-1, required=True) +@click.option("--name", default=None) +@click.option("--cwd", type=Path, default=_DEFAULT_CWD) +@click.option("--token", default=os.getenv("ALLDEBRID_TOKEN")) +def filehost_cmd(urls: tuple[str, ...], name: str | None, cwd: Path, token: str) -> None: resolved_name = name or _name_from_url(urls[0]) output_dir = (cwd or Path(".")) / resolved_name output_dir.mkdir(parents=True, exist_ok=True) @@ -376,7 +392,26 @@ def cmd_filehost( _extract_and_process(output_dir) -def cmd_process(dirs: list[str]) -> None: +@cli.command("download") +@click.argument("urls", nargs=-1, required=True) +@click.option("--name", default=None) +@click.option("--cwd", type=Path, default=_DEFAULT_CWD) +@click.option("--token", default=os.getenv("ALLDEBRID_TOKEN")) +@click.pass_context +def download_cmd( + ctx: click.Context, urls: tuple[str, ...], name: str | None, cwd: Path, token: str +) -> None: + filehost_urls = [u for u in urls if "rg.to" in u or "rapidgator.net" in u] + gallery_urls = [u for u in urls if u not in set(filehost_urls)] + if filehost_urls: + ctx.invoke(filehost_cmd, urls=tuple(filehost_urls), name=name, cwd=cwd, token=token) + if gallery_urls: + ctx.invoke(gallery_cmd, urls=tuple(gallery_urls), name=name, cwd=cwd) + + +@cli.command("process") +@click.argument("dirs", nargs=-1, required=True) +def process_cmd(dirs: tuple[str, ...]) -> None: for d in dirs: p = Path(d) if not p.exists(): @@ -405,58 +440,5 @@ def cmd_process(dirs: list[str]) -> None: print(f"skipping {p}: already within size limits") -def cmd_download( - urls: list[str], name: str | None, token: str, cwd: Path | None = None -) -> None: - filehost_urls = [u for u in urls if "rg.to" in u or "rapidgator.net" in u] - gallery_urls = [u for u in urls if u not in set(filehost_urls)] - if filehost_urls: - cmd_filehost(filehost_urls, name, token, cwd) - if gallery_urls: - cmd_gallery(gallery_urls, name, cwd) - - -# --------------------------------------------------------------------------- -# CLI -# --------------------------------------------------------------------------- - - -def main() -> None: - print(os.getenv("PATH")) - parser = argparse.ArgumentParser(prog="download_imageset.py") - sub = parser.add_subparsers(dest="command", required=True) - - gallery_p = sub.add_parser("gallery") - gallery_p.add_argument("urls", nargs="+") - gallery_p.add_argument("--name", default=None) - gallery_p.add_argument("--cwd", type=Path, default=None) - - for cmd in ("filehost", "download"): - p = sub.add_parser(cmd) - p.add_argument("urls", nargs="+") - p.add_argument("--name", default=None) - p.add_argument( - "--cwd", - default=Path("~/Downloads/_temp/_imagesets").expanduser(), - type=Path, - ) - p.add_argument("--token", default=os.getenv("ALLDEBRID_TOKEN")) - - proc = sub.add_parser("process") - proc.add_argument("dirs", nargs="+") - - args = parser.parse_args() - - match args.command: - case "gallery": - cmd_gallery(args.urls, args.name, args.cwd) - case "filehost": - cmd_filehost(args.urls, args.name, args.token, cwd=args.cwd) - case "process": - cmd_process(args.dirs) - case "download": - cmd_download(args.urls, args.name, args.token, cwd=args.cwd) - - if __name__ == "__main__": - main() + cli()