z230
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# 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()
|
||||
Reference in New Issue
Block a user