#!/usr/bin/env python3 import os import sys import subprocess import re import shutil import tempfile from pathlib import Path from typing import Optional, Dict, Set def check_dependencies() -> bool: """Check if required commands are available.""" for cmd in ['file', 'avifenc']: if not shutil.which(cmd): print(f"Error: {cmd} command not found") return False return True def convert_file(filepath: Path, output_path: Path, quality: int = 60) -> bool: """Convert file to AVIF using avifenc""" try: subprocess.run(['avifenc', '-q', str(quality), str(filepath), str(output_path)], check=True) return True except subprocess.CalledProcessError as e: print(f"Error converting {filepath} to AVIF: {e}") return False def delete_file(filepath: Path) -> bool: """Delete file""" try: filepath.unlink() return True except OSError as e: print(f"Error deleting {filepath}: {e}") return False def process_directory(directory: Path): """Process a single directory.""" print(f"Processing directory: {directory}") # Get all image files in directory image_files = sorted( path for path in directory.iterdir() if path.is_file() and path.suffix.lower() in {'.jpg', '.jpeg', '.png'} ) for filepath in image_files: print(f"Processing: {filepath.name}") # Convert to avif if convert_file(filepath, filepath.with_suffix('.avif')): print(f"Converted {filepath.name} to AVIF") if delete_file(filepath): print(f"Deleted {filepath.name}") else: print(f"Failed to delete {filepath.name}") else: print(f"Failed to convert {filepath.name} to AVIF") print(f"Done! Processed {len(image_files)} files in {directory}") def main(): if not check_dependencies(): sys.exit(1) # Get directories to process if len(sys.argv) == 1: directories = [Path('.')] else: recursive = sys.argv[1] in {'-r', '--recursive'} start_idx = 2 if recursive else 1 if recursive: directories = [] for dir_arg in sys.argv[start_idx:]: path = Path(dir_arg) if path.is_dir(): directories.extend(p for p in path.rglob('.') if p.is_dir()) else: directories = [Path(dir_arg) for dir_arg in sys.argv[start_idx:] if Path(dir_arg).is_dir()] # Process each directory for directory in directories: try: process_directory(directory) except Exception as e: print(f"Error processing directory {directory}: {e}") if __name__ == "__main__": main()