This commit is contained in:
2026-05-27 12:55:06 +02:00
parent 6ef637677e
commit be49fe55f6
+45 -19
View File
@@ -14,6 +14,21 @@ Použití:
python collect_and_import.py --limit 500 # jen prvních N (pro test) 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 --dry-run # jen spočítá, nic nezpracuje
python collect_and_import.py --batch-size 200 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 import argparse
@@ -62,15 +77,10 @@ DB_CONFIG = {
"dbname": os.getenv("DB_NAME", "fotky_buzalkovi"), "dbname": os.getenv("DB_NAME", "fotky_buzalkovi"),
} }
# Překlad: Linux NFS cesta (jak je uložena v DB) → Windows UNC # Kanonický prefix cest uložených v DB (vždy nativní Tower1 Linux cesta)
# Záznamy v DB mohou mít různé Linux prefixy podle toho, odkud byl scan spuštěn. DB_PATH_PREFIX = "/mnt/user/ZalohaVsechObrazku"
PATH_MAPPINGS = [ # Odpovídající Windows UNC přístup k Tower1 share
("/mnt/remotes/TOWER1.LAN_ZalohaVsechObrazku", "//Tower1/ZalohaVsechObrazku"), WINDOWS_UNC_PREFIX = r"\\Tower1\ZalohaVsechObrazku"
("/mnt/user/ZalohaVsechObrazku", "//Tower1/ZalohaVsechObrazku"),
]
# Zpětná kompatibilita
LINUX_PREFIX = PATH_MAPPINGS[0][0]
WINDOWS_UNC = PATH_MAPPINGS[0][1]
SUPPORTED_EXTENSIONS = {".jpg", ".jpeg", ".png", ".heic", ".tiff", ".tif", ".webp", ".bmp"} 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: def db_path_to_local(db_path: str) -> Path:
"""Převede Linux NFS cestu na Windows UNC podle tabulky PATH_MAPPINGS.""" """
for linux_prefix, windows_unc in PATH_MAPPINGS: Převede cestu z DB na lokálně přístupnou cestu podle platformy.
if linux_path.startswith(linux_prefix):
rel = linux_path[len(linux_prefix):] # začíná / Windows: /mnt/user/ZalohaVsechObrazku/... → \\Tower1\\ZalohaVsechObrazku\\...
return Path(windows_unc + rel) Tower1: cesta je již nativní, vrátí beze změny.
return Path(linux_path) """
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 # GPS
@@ -622,10 +642,10 @@ def process_one(zaloha_id: int, linux_path: str) -> tuple[Optional[tuple], str]:
if ext not in SUPPORTED_EXTENSIONS: if ext not in SUPPORTED_EXTENSIONS:
return None, f"nepodporovana pripona: {ext}" return None, f"nepodporovana pripona: {ext}"
win_path = linux_to_windows(linux_path) local_path = db_path_to_local(linux_path)
try: try:
rec = collect_photo(win_path) rec = collect_photo(local_path)
except Exception as e: except Exception as e:
return None, str(e) return None, str(e)
@@ -645,6 +665,12 @@ def process_one(zaloha_id: int, linux_path: str) -> tuple[Optional[tuple], str]:
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
def main(): 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( parser = argparse.ArgumentParser(
description="collect_and_import.py — Sběr metadat ze zálohy a import do DB" description="collect_and_import.py — Sběr metadat ze zálohy a import do DB"
) )