w22
This commit is contained in:
@@ -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"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user