From be49fe55f6f81280bc1e6230ab40df0a27c115c3 Mon Sep 17 00:00:00 2001 From: vlado Date: Wed, 27 May 2026 12:55:06 +0200 Subject: [PATCH] w22 --- 30 SběrDat/collect_and_import.py | 64 ++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/30 SběrDat/collect_and_import.py b/30 SběrDat/collect_and_import.py index dff5a0a..2378285 100644 --- a/30 SběrDat/collect_and_import.py +++ b/30 SběrDat/collect_and_import.py @@ -14,6 +14,21 @@ Použití: python collect_and_import.py --limit 500 # jen prvních N (pro test) python collect_and_import.py --dry-run # jen spočítá, nic nezpracuje python collect_and_import.py --batch-size 200 + +Předpoklad pro překlad cest: + V DB jsou cesty vždy uloženy jako nativní Tower1 Linux cesta: + /mnt/user/ZalohaVsechObrazku/... + + Skript může běžet na dvou platformách: + + Windows (libovolný hostname): + Tower1 je dostupný jako \\Tower1\\ZalohaVsechObrazku\\... + → /mnt/user/ZalohaVsechObrazku → \\Tower1\\ZalohaVsechObrazku, / → \\ + + Tower1 (Linux, hostname = Tower1): + Cesta z DB je již nativní, žádný překlad není potřeba. + + Skript nikdy neběží na tower (prvním Unraid serveru). """ import argparse @@ -62,15 +77,10 @@ DB_CONFIG = { "dbname": os.getenv("DB_NAME", "fotky_buzalkovi"), } -# Překlad: Linux NFS cesta (jak je uložena v DB) → Windows UNC -# Záznamy v DB mohou mít různé Linux prefixy podle toho, odkud byl scan spuštěn. -PATH_MAPPINGS = [ - ("/mnt/remotes/TOWER1.LAN_ZalohaVsechObrazku", "//Tower1/ZalohaVsechObrazku"), - ("/mnt/user/ZalohaVsechObrazku", "//Tower1/ZalohaVsechObrazku"), -] -# Zpětná kompatibilita -LINUX_PREFIX = PATH_MAPPINGS[0][0] -WINDOWS_UNC = PATH_MAPPINGS[0][1] +# Kanonický prefix cest uložených v DB (vždy nativní Tower1 Linux cesta) +DB_PATH_PREFIX = "/mnt/user/ZalohaVsechObrazku" +# Odpovídající Windows UNC přístup k Tower1 share +WINDOWS_UNC_PREFIX = r"\\Tower1\ZalohaVsechObrazku" SUPPORTED_EXTENSIONS = {".jpg", ".jpeg", ".png", ".heic", ".tiff", ".tif", ".webp", ".bmp"} @@ -95,16 +105,26 @@ MIME_MAP = { } # --------------------------------------------------------------------------- -# Překlad cesty: Linux NFS → Windows UNC +# Překlad cesty: DB (nativní Tower1 Linux) → lokální přístupová cesta # --------------------------------------------------------------------------- -def linux_to_windows(linux_path: str) -> Path: - """Převede Linux NFS cestu na Windows UNC podle tabulky PATH_MAPPINGS.""" - for linux_prefix, windows_unc in PATH_MAPPINGS: - if linux_path.startswith(linux_prefix): - rel = linux_path[len(linux_prefix):] # začíná / - return Path(windows_unc + rel) - return Path(linux_path) +def db_path_to_local(db_path: str) -> Path: + """ + Převede cestu z DB na lokálně přístupnou cestu podle platformy. + + Windows: /mnt/user/ZalohaVsechObrazku/... → \\Tower1\\ZalohaVsechObrazku\\... + Tower1: cesta je již nativní, vrátí beze změny. + """ + if os.name == "nt": + # Windows — přeložíme na UNC a vyměníme lomítka + if db_path.startswith(DB_PATH_PREFIX): + rel = db_path[len(DB_PATH_PREFIX):] # začíná / + return Path(WINDOWS_UNC_PREFIX + rel.replace("/", "\\")) + # Neznámý prefix — vrátíme jak je a necháme selhat při otevření + return Path(db_path) + else: + # Tower1 (Linux) — cesta v DB je již nativní + return Path(db_path) # --------------------------------------------------------------------------- # GPS @@ -622,10 +642,10 @@ def process_one(zaloha_id: int, linux_path: str) -> tuple[Optional[tuple], str]: if ext not in SUPPORTED_EXTENSIONS: return None, f"nepodporovana pripona: {ext}" - win_path = linux_to_windows(linux_path) + local_path = db_path_to_local(linux_path) try: - rec = collect_photo(win_path) + rec = collect_photo(local_path) except Exception as e: return None, str(e) @@ -645,6 +665,12 @@ def process_one(zaloha_id: int, linux_path: str) -> tuple[Optional[tuple], str]: # --------------------------------------------------------------------------- def main(): + import socket + hostname = socket.gethostname().lower() + if hostname == "tower": + print("[ERROR] Tento skript nesmí běžet na 'tower'. Spusť ho na Tower1 nebo Windows.") + sys.exit(1) + parser = argparse.ArgumentParser( description="collect_and_import.py — Sběr metadat ze zálohy a import do DB" )