# Název: janssenpc_file_watch.py # Verze: 1.2 # Datum: 2026-06-12 # Popis: Démon hlídající složku ##JNJPrenos (watchdog). Při objevení nového souboru # spustí janssenpc_file_send.py, který zajistí přejmenování, upload a přesun do Trash. # # Změna v1.2 (NEDOTAŽENÉ STAHOVÁNÍ Z CHROME): # - Ignoruje dočasné přípony (.crdownload/.tmp/.part) — Chrome stahuje do # *.crdownload a teprve po dokončení přejmenuje na finální jméno. Spouštět # send na dočasný soubor nemá smysl (vyřeší to až událost přejmenování). # - Debounce: shlukne rychlou sérii událostí (vytvoření + přejmenování + zápis) # do JEDNOHO spuštění send. Mezi spuštěními drží DEBOUNCE_SECONDS odstup. # Vlastní kontrolu „dotažení" (stabilní velikost + zámek) dělá až file_send # (funkce is_ready) — watch jen omezuje zbytečná spuštění. import subprocess import sys import threading import time from pathlib import Path from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler SOURCE_DIR = Path(r"C:\Users\vbuzalka\OneDrive - JNJ\##JNJPrenos") SEND_SCRIPT = Path(__file__).parent / "janssenpc_file_send.py" IGNORE_SUFFIXES = {".crdownload", ".tmp", ".part"} # probíhající stahování DEBOUNCE_SECONDS = 5.0 # série událostí v tomto okně spustí send jen jednou def run_send(): subprocess.run([sys.executable, str(SEND_SCRIPT)], check=False) class DebouncedRunner: """Shlukne rychlou sérii událostí do jednoho spuštění send.""" def __init__(self, delay: float): self.delay = delay self._timer = None self._lock = threading.Lock() def trigger(self): with self._lock: if self._timer is not None: self._timer.cancel() self._timer = threading.Timer(self.delay, run_send) self._timer.daemon = True self._timer.start() _runner = DebouncedRunner(DEBOUNCE_SECONDS) def _is_temp(path: str) -> bool: return Path(path).suffix.lower() in IGNORE_SUFFIXES class NewFileHandler(FileSystemEventHandler): def on_created(self, event): if event.is_directory or _is_temp(event.src_path): return _runner.trigger() def on_moved(self, event): if event.is_directory: return # Cíl přejmenování je rozhodující (Chrome: *.crdownload -> finální jméno) dest = getattr(event, "dest_path", "") or event.src_path if _is_temp(dest): return _runner.trigger() if __name__ == "__main__": # Při startu zpracuj soubory, které už tam jsou (kromě dočasných) if any(f for f in SOURCE_DIR.iterdir() if f.is_file() and f.suffix.lower() not in IGNORE_SUFFIXES): run_send() observer = Observer() observer.schedule(NewFileHandler(), str(SOURCE_DIR), recursive=False) observer.start() print(f"Hlídám: {SOURCE_DIR}") try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join()