import logging import time from pathlib import Path from image_utils import convert_image VAULT_ROOT = Path(__file__).resolve().parent.parent FOLDERS = { "photos": 2000, "memes": 1000, } QUALITY = 85 POLL_INTERVAL = 2 SOURCE_EXTS = {".png", ".jpg", ".jpeg"} STABLE_CHECK_DELAY = 0.5 LOG_PATH = Path(__file__).resolve().parent / "photo_watcher.log" logging.basicConfig( filename=str(LOG_PATH), level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s", ) def is_stable(path: Path) -> bool: try: size1 = path.stat().st_size time.sleep(STABLE_CHECK_DELAY) size2 = path.stat().st_size return size1 == size2 except FileNotFoundError: return False def process_file(path: Path, max_width: int) -> None: if not is_stable(path): return try: output = convert_image(path, max_width, QUALITY) logging.info("processed %s -> %s", path.name, output.name) except Exception as e: logging.error("failed %s: %s", path.name, e) def scan_and_process() -> None: for folder_name, max_width in FOLDERS.items(): folder = VAULT_ROOT / folder_name if not folder.exists(): continue for entry in folder.iterdir(): if entry.is_file() and entry.suffix.lower() in SOURCE_EXTS: process_file(entry, max_width) def main() -> None: logging.info("photo_watcher started") try: while True: scan_and_process() time.sleep(POLL_INTERVAL) except KeyboardInterrupt: logging.info("photo_watcher stopped") if __name__ == "__main__": main()