From 453de116d8d589556d7085d16e34a2230efe513b Mon Sep 17 00:00:00 2001 From: Refinement Systems Date: Sun, 13 Sep 2026 18:02:41 +0200 Subject: [PATCH] fixes --- src/dltb/args.py | 10 ++++++++++ src/dltb/continuous.py | 4 ++-- src/dltb/iterate.py | 4 ++-- src/dltb/klein.py | 4 ++-- src/dltb/oneshot.py | 4 ++-- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/dltb/args.py b/src/dltb/args.py index 310f967..70998b4 100644 --- a/src/dltb/args.py +++ b/src/dltb/args.py @@ -14,6 +14,16 @@ import argparse from .models import MODELS, model_key +def non_empty_path(value: str) -> str: + """argparse type for the tools' --input: reject empty/whitespace-only + paths at parse time. An empty --input (e.g. an unset shell variable) + would otherwise surface only after the pipeline has loaded, as a cryptic + imageio/PIL error about an unnamed file.""" + if not value.strip(): + raise argparse.ArgumentTypeError("must be a non-empty path") + return value + + def add_model_args(p: argparse.ArgumentParser) -> None: """--model over the full table (required).""" p.add_argument("--model", required=True, type=model_key, choices=sorted(MODELS), diff --git a/src/dltb/continuous.py b/src/dltb/continuous.py index e007f22..aa709d7 100644 --- a/src/dltb/continuous.py +++ b/src/dltb/continuous.py @@ -69,7 +69,7 @@ from __future__ import annotations import argparse from pathlib import Path -from .args import add_common_args +from .args import add_common_args, non_empty_path from .imaging import (PassSettings, make_generator, make_reprojector, prepare_frame, run_pass) from .models import MODELS, check_requirements, load_pipeline, resolve_geometry @@ -93,7 +93,7 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace: description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter ) add_common_args(p) - p.add_argument("--input", required=True, + p.add_argument("--input", required=True, type=non_empty_path, help="Input video (mp4/mov/mkv/webm/avi)") p.add_argument("--mode", choices=["anchored", "stateful"], default="stateful", help="Loop topology (see module docstring). anchored = " diff --git a/src/dltb/iterate.py b/src/dltb/iterate.py index 1c829a7..a4129b1 100644 --- a/src/dltb/iterate.py +++ b/src/dltb/iterate.py @@ -45,7 +45,7 @@ from __future__ import annotations import argparse from pathlib import Path -from .args import add_common_args +from .args import add_common_args, non_empty_path from .imaging import PassSettings, make_generator, prepare_frame, run_pass from .models import MODELS, check_requirements, load_pipeline, resolve_geometry from .output import assemble_timelapse, run_dir @@ -56,7 +56,7 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace: description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter ) add_common_args(p) - p.add_argument("--input", required=True, + p.add_argument("--input", required=True, type=non_empty_path, help="Path to the input image (png/jpg/...)") p.add_argument("--iterations", type=int, default=200, help="Number of passes through the model") diff --git a/src/dltb/klein.py b/src/dltb/klein.py index 99987b4..b4e5d0a 100644 --- a/src/dltb/klein.py +++ b/src/dltb/klein.py @@ -69,7 +69,7 @@ from __future__ import annotations import argparse -from .args import add_geometry_args, add_output_args, add_pass_args +from .args import add_geometry_args, add_output_args, add_pass_args, non_empty_path from .continuous import _parse_tail_modes, run as run_continuous from .models import model_key @@ -112,7 +112,7 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace: add_pass_args(p) add_geometry_args(p) add_output_args(p) - p.add_argument("--input", required=True, + p.add_argument("--input", required=True, type=non_empty_path, help="Input video (mp4/mov/mkv/webm/avi)") p.add_argument("--mode", choices=["anchored", "stateful"], default="stateful", help="Loop topology (see module docstring). anchored = " diff --git a/src/dltb/oneshot.py b/src/dltb/oneshot.py index bd01125..a545ce5 100644 --- a/src/dltb/oneshot.py +++ b/src/dltb/oneshot.py @@ -35,7 +35,7 @@ from __future__ import annotations import argparse from pathlib import Path -from .args import add_common_args +from .args import add_common_args, non_empty_path from .imaging import PassSettings, make_generator, prepare_frame, run_pass from .models import MODELS, check_requirements, load_pipeline, resolve_geometry from .output import run_dir @@ -46,7 +46,7 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace: description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter ) add_common_args(p) - p.add_argument("--input", required=True, + p.add_argument("--input", required=True, type=non_empty_path, help="Path to the input image (png/jpg/...)") return p.parse_args(argv) -- 2.51.2