- Deterministic hash-based character portraits and reference sheets - Implemented strict early Renaissance aesthetic controls and role-specific headwear rules - Added audiobook batch export scripts and progress tooling - Verified book profiles with a new 'confirmed' state tracking mechanism - Updated Pillow dependency for robust image handling - Configured .gitignore for audiobook and audio cache exports
53 lines
2.5 KiB
Python
53 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Generate ten concept-sheet shared-identity character image pairs after export."""
|
|
from __future__ import annotations
|
|
|
|
import requests
|
|
|
|
BASE = "http://127.0.0.1:7890"
|
|
TARGETS = [
|
|
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 01 - Der Sturm", "Darrag"),
|
|
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 01 - Der Sturm", "Eolan"),
|
|
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 01 - Der Sturm", "Baronin Ira von Seewiesen"),
|
|
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 01 - Der Sturm", "Gamba"),
|
|
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 02 - Die Entdeckung", "Alrik von Blautann"),
|
|
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 02 - Die Entdeckung", "Andra"),
|
|
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 02 - Die Entdeckung", "Cindira"),
|
|
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 03 - Die Amazone", "Admiral Sanin"),
|
|
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 03 - Die Amazone", "Arthag"),
|
|
("Hohlbein & Hennen - DSA - Das Jahr des Greifen 03 - Die Amazone", "Anshelm"),
|
|
]
|
|
|
|
|
|
def main() -> None:
|
|
all_chars = requests.get(f"{BASE}/api/characters", timeout=30).json()["characters"]
|
|
for book, name in TARGETS:
|
|
item = next(c for c in all_chars if c.get("book") == book and c.get("name") == name)
|
|
record = requests.get(f"{BASE}/api/characters/{item['id']}", timeout=30).json()
|
|
sheet = record.get("sheet") or {}
|
|
print(f"[{name}] generating concept profile + reference sheet", flush=True)
|
|
response = requests.post(
|
|
f"{BASE}/api/character-generate-consistent-images",
|
|
json={
|
|
"profile_prompt": sheet.get("image_prompt", ""),
|
|
"reference_prompt": sheet.get("concept_art_prompt", ""),
|
|
"visual_style": "concept",
|
|
"identity_image": record.get("image", ""),
|
|
},
|
|
# The local Qwen graph renders the portrait and 3:2 sheet in
|
|
# sequence; allow the app's 25-minute server-side deadline.
|
|
timeout=1800,
|
|
)
|
|
response.raise_for_status()
|
|
result = response.json()
|
|
record["image"] = result["profile"]
|
|
record["sheet"] = {**sheet, "concept_art_image": result["reference"]}
|
|
saved = requests.put(f"{BASE}/api/characters/{item['id']}", json=record, timeout=60)
|
|
saved.raise_for_status()
|
|
print(f"[{name}] saved", flush=True)
|
|
print("TEN CHARACTER IMAGE SAMPLES COMPLETE", flush=True)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|