1e51ef7def
- Konzept/, didaktik_geografie/, didaktik_simulation/, v2-modules/, v2-platform/ - 12 code-workspace-Files - STATUS-*.md - viele M/D/R-Änderungen an bereits getrackten Files - .gitignore verstärkt: **/.humaninput/, **/secret_keys.txt Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
93 lines
2.5 KiB
Bash
93 lines
2.5 KiB
Bash
#!/usr/bin/env bash
|
|
# Stadt-Symbolbilder fuer Busfahrt — liest cities.json, generiert via DALL-E.
|
|
#
|
|
# Aufruf:
|
|
# set -a; source App/.env.local; set +a
|
|
# App/sims/busfahrt/scripts/generate-city-images.sh # alles fehlende
|
|
# App/sims/busfahrt/scripts/generate-city-images.sh tokio rom # gezielt
|
|
#
|
|
# Ueberschreiben: FORCE=1 ./generate-city-images.sh tokio
|
|
set -e
|
|
: "${OPENAI_API_KEY:?OPENAI_API_KEY env var nicht gesetzt}"
|
|
|
|
cd "$(dirname "$0")/.."
|
|
mkdir -p assets/cities
|
|
IMG_DIR="$(pwd)/assets/cities"
|
|
|
|
# Hole Liste id|prompt fuer alle Staedte mit imagePrompt (relativer Pfad)
|
|
mapfile -t ALL_LINES < <(python -c "
|
|
import json
|
|
with open('assets/data/cities.json', encoding='utf-8') as f:
|
|
cities = json.load(f)
|
|
for c in cities:
|
|
if c.get('imagePrompt'):
|
|
print(c['id'] + '|||' + c['imagePrompt'])
|
|
")
|
|
|
|
# Filter: nur Argumente, falls angegeben
|
|
TARGETS=("$@")
|
|
|
|
TOTAL=${#ALL_LINES[@]}
|
|
i=0
|
|
ok=0
|
|
fail=0
|
|
|
|
for line in "${ALL_LINES[@]}"; do
|
|
i=$((i+1))
|
|
id="${line%%|||*}"
|
|
prompt="${line#*|||}"
|
|
|
|
# Filter
|
|
if [ ${#TARGETS[@]} -gt 0 ]; then
|
|
skip=1
|
|
for t in "${TARGETS[@]}"; do
|
|
if [ "$t" = "$id" ]; then skip=0; break; fi
|
|
done
|
|
[ $skip -eq 1 ] && continue
|
|
fi
|
|
|
|
out="$IMG_DIR/$id.png"
|
|
if [ -f "$out" ] && [ -z "$FORCE" ]; then
|
|
echo "[$i/$TOTAL] $id: ok (existiert, FORCE=1 zum Ueberschreiben)"
|
|
continue
|
|
fi
|
|
|
|
echo -n "[$i/$TOTAL] $id: "
|
|
payload=$(PROMPT="$prompt" python -c 'import json,os; print(json.dumps({"model":"dall-e-3","prompt":os.environ["PROMPT"],"n":1,"size":"1792x1024","quality":"standard"}))')
|
|
|
|
resp=$(curl -s --max-time 180 https://api.openai.com/v1/images/generations \
|
|
-H "Authorization: Bearer $OPENAI_API_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$payload")
|
|
|
|
url=$(echo "$resp" | python -c 'import sys,json
|
|
try:
|
|
d=json.load(sys.stdin)
|
|
print(d.get("data",[{}])[0].get("url",""))
|
|
except: print("")' 2>/dev/null)
|
|
|
|
if [ -z "$url" ]; then
|
|
err=$(echo "$resp" | python -c 'import sys,json
|
|
try: print(json.load(sys.stdin).get("error",{}).get("message","?")[:200])
|
|
except: print("unparseable: " + sys.stdin.read()[:200])' 2>/dev/null)
|
|
echo "x $err"
|
|
fail=$((fail+1))
|
|
sleep 5
|
|
continue
|
|
fi
|
|
|
|
if curl -s --max-time 60 "$url" -o "$out"; then
|
|
sz=$(stat -c%s "$out" 2>/dev/null || stat -f%z "$out" 2>/dev/null)
|
|
echo "ok ($((sz/1024)) KB)"
|
|
ok=$((ok+1))
|
|
else
|
|
echo "x download failed"
|
|
rm -f "$out"
|
|
fail=$((fail+1))
|
|
fi
|
|
sleep 2
|
|
done
|
|
|
|
echo ""
|
|
echo "Fertig: $ok ok, $fail Fehler"
|