Files
Victor Giers 0961bbccbf auto-git:
[add] scripts/.DS_Store
 [add] scripts/README.md
 [add] scripts/extract_texture_filename_from_3ds.py
 [add] scripts/generate_3d_glb.py
 [add] scripts/generate_json.py
 [add] scripts/image_from_json.py
 [add] scripts/naming.py
 [add] scripts/openai_image_gen.py
 [add] scripts/remesh_bake_batch.py
 [add] server/public/assets/images/.DS_Store
 [add] server/public/assets/models/spirits/.DS_Store
 [change] server/public/assets/.DS_Store
 [change] server/public/assets/models/.DS_Store
2025-12-04 08:39:04 +01:00

66 lines
2.0 KiB
Python

import os
import json
import re
from difflib import get_close_matches
# ---- Konfiguration ----
image_dir = "webp"
json_path = "spirit_list.json"
output_path = "spirit_list_with_images.json"
image_url_prefix = "/assets/images/spirits/" # Deine URL
# --- Hilfsfunktion: Normalisiere Namen (um sie vergleichbar zu machen) ---
def norm(s):
s = s.lower()
s = re.sub(r'[^a-z0-9]+', '', s) # Alles außer Buchstaben/Zahlen raus
return s
# ---- Bilddateien einlesen & normalisieren ----
image_files = [f for f in os.listdir(image_dir) if f.lower().endswith('.webp')]
norm2file = {norm(os.path.splitext(f)[0]): f for f in image_files}
# ---- JSON einlesen ----
with open(json_path, "r", encoding="utf-8") as f:
spirits = json.load(f)
matched = 0
notfound = []
for entry in spirits:
# Nimm zuerst Model URL, ansonsten Name
base = None
if "Model URL" in entry and entry["Model URL"]:
base = os.path.splitext(os.path.basename(entry["Model URL"]))[0]
if not base and "Name" in entry:
base = entry["Name"]
if not base:
notfound.append(entry)
continue
base_norm = norm(base)
# Direktes Mapping versuchen
if base_norm in norm2file:
entry["Image URL"] = image_url_prefix + norm2file[base_norm]
matched += 1
continue
# Fuzzy-Match, falls nicht gefunden
candidates = get_close_matches(base_norm, norm2file.keys(), n=1, cutoff=0.7)
if candidates:
file_name = norm2file[candidates[0]]
entry["Image URL"] = image_url_prefix + file_name
print(f"Fuzzy: {base}{file_name}")
matched += 1
else:
print(f"Kein Bild gefunden für: {base}")
notfound.append(entry)
# --- Neue JSON schreiben ---
with open(output_path, "w", encoding="utf-8") as f:
json.dump(spirits, f, indent=2, ensure_ascii=False)
print(f"{matched} von {len(spirits)} Einträgen mit Bild gematcht.")
print(f"Nicht gefunden: {len(notfound)}")
if notfound:
for entry in notfound:
print(" -", entry.get("Name", "???"))