[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
66 lines
2.0 KiB
Python
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", "???")) |