#!/usr/bin/env python3 import os import subprocess import time from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler WATCH_DIR = "/data" # Mount your host Books folder here DEBUG = os.getenv("DEBUG", "false").lower() == "true" MERGE_ALL = os.getenv("MERGE_ALL", "true").lower() == "true" class NewBookHandler(FileSystemEventHandler): def __init__(self): super().__init__() self.seen_dirs = set() # Track processed directories def on_created(self, event): if event.is_directory: self.process_new_dir(event.src_path) def on_moved(self, event): if event.is_directory: self.process_new_dir(event.dest_path) def process_new_dir(self, path): # Avoid duplicate processing if path in self.seen_dirs: return self.seen_dirs.add(path) # Short delay to allow files to finish copying time.sleep(2) try: files = os.listdir(path) except FileNotFoundError: return # directory may have been removed m4b_files = [f for f in files if f.lower().endswith(".m4b") and not f.startswith("._")] if not m4b_files: if DEBUG: print(f"⚠️ Skipping {path} (no .m4b files detected)") return # Skip if only 1 file and MERGE_ALL is enabled if MERGE_ALL and len(m4b_files) == 1: if DEBUG: print(f"⏭️ Skipping {path} (only 1 .m4b file, nothing to merge)") return book_name = os.path.basename(path) print(f"📕 New book detected: {book_name} at {path}") print("Contains .m4b files:") for f in m4b_files: print(" ", f) # Run your main.py script try: cmd = ["python3", "main.py", "-da", path] if MERGE_ALL: cmd.append("--all") # pass flag to main.py subprocess.run(cmd, check=True) print(f"✅ Finished processing {book_name}") except subprocess.CalledProcessError as e: print(f"❌ Error processing {book_name}: {e}") if __name__ == "__main__": observer = Observer() event_handler = NewBookHandler() observer.schedule(event_handler, WATCH_DIR, recursive=True) observer.start() print(f"👀 Watching for new book folders in {WATCH_DIR} ...") # --- Startup scan: just print existing folders if DEBUG is enabled --- if DEBUG: for root, dirs, files in os.walk(WATCH_DIR): m4b_files = [f for f in files if f.lower().endswith(".m4b") and not f.startswith("._")] if m4b_files: print(f"📁 Existing book folder detected (startup scan): {root}") for f in m4b_files: print(" ", f) try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join()