90 lines
3.1 KiB
Python
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()
|