From 7ec60078dbb1f7b5334bb3a4f80be300c1cd969e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Kucharczyk?= Date: Sat, 6 Dec 2025 21:13:37 +0100 Subject: [PATCH] transcode.py: add --filter --- transcode.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/transcode.py b/transcode.py index 0acca04..a1b1383 100644 --- a/transcode.py +++ b/transcode.py @@ -357,7 +357,7 @@ def transcode_file(input_file, output_file=None, skip_av1=True, replace_mode=Fal ) return - # 2. Check if file is ready (simple size stability check) + # 2. Check if file is ready if not input_path.exists(): logging.warning(f"File vanished during checks: {input_path}") return @@ -386,7 +386,7 @@ def transcode_file(input_file, output_file=None, skip_av1=True, replace_mode=Fal logging.warning(f"File vanished during checks: {input_path}") return - # 3. Check Codec (Optional Skip) + # 3. Check Codec if skip_av1: codec = get_video_codec(input_path) if codec == "av1": @@ -582,10 +582,13 @@ def transcode_file(input_file, output_file=None, skip_av1=True, replace_mode=Fal class NewFileHandler(FileSystemEventHandler): - def __init__(self, output_dir=None, skip_av1=True, replace_mode=False): + def __init__( + self, output_dir=None, skip_av1=True, replace_mode=False, filter_pattern="*" + ): self.output_dir = Path(output_dir) if output_dir else None self.skip_av1 = skip_av1 self.replace_mode = replace_mode + self.filter_pattern = filter_pattern def on_created(self, event): if event.is_directory: @@ -604,7 +607,11 @@ class NewFileHandler(FileSystemEventHandler): return input_path = Path(file_path_str) - # Filter for video extensions + + # Check filter first + if not input_path.match(self.filter_pattern): + return + if input_path.suffix.lower() not in VIDEO_EXTENSIONS: logging.debug(f"Ignored non-video file: {input_path}") return @@ -628,7 +635,7 @@ def process_recursive_directory(input_path, args, skip_av1): # We collect files first to avoid modifying directory while iterating if possible, # though rglob is a generator. We check STOP_REQUESTED inside loop. - for video_file in input_path.rglob("*"): + for video_file in input_path.rglob(args.filter): if STOP_REQUESTED: logging.info("Stopping recursive scan due to signal.") break @@ -683,6 +690,12 @@ def main(): action="store_true", help="Recursively scan directories for input files", ) + parser.add_argument( + "--filter", + type=str, + default="*", + help="Glob pattern to filter input files (e.g. '*.avi'). Defaults to '*' (all).", + ) # Set defaults from config default_watch = config.get("watch") or False @@ -731,7 +744,7 @@ def main(): else: # Process directory non-recursively (all files in this directory only) logging.info(f"Processing directory non-recursively: {input_path}") - for video_file in input_path.iterdir(): + for video_file in input_path.glob(args.filter): if STOP_REQUESTED: break if ( @@ -805,7 +818,10 @@ def main(): logging.info("Outputting in-place (replacing originals).") event_handler = NewFileHandler( - output_dir_path, skip_av1=skip_av1, replace_mode=args.replace + output_dir_path, + skip_av1=skip_av1, + replace_mode=args.replace, + filter_pattern=args.filter, ) observer = Observer() observer.schedule(event_handler, str(watch_dir), recursive=args.recursive)