Files
janssen/EmailsImport/janssenpc_file_watch_v1.2.py
T
2026-06-12 15:29:57 +02:00

90 lines
3.1 KiB
Python

# 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()