#!/usr/bin/env python3
"""短剧《雨夜撞上陆总后》第十二集 - 场景图生成"""
import json, urllib.request, time
COMFYUI_URL = "http://127.0.0.1:8188"
BEST_MODEL = "SDXL 1.0\\9527DetailRealistic_v30.safetensors"
NEGATIVE_PROMPT = "(worst quality, low quality:1.4), deformed, distorted, disfigured, bad anatomy, bad proportions, ugly, noisy, blurry, low contrast, watermark, text, signature, cartoon, anime, 3d, painting, drawing, illustration, western features, blue eyes, blonde hair, extra fingers, malformed hands, missing limbs, floating limbs, disconnected limbs, nsfw, nude, naked"
SCENES = [
    {"id": "01", "name": "单身派对", "seed": 14001, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), group of young women at bachelorette party, bar setting, champagne glasses, celebrating, happy expressions, warm lighting, photorealistic, 8k, wide shot", "output_prefix": "Drama_EP12_01_Bachelorette_Party_"},
    {"id": "02", "name": "真心话游戏", "seed": 14002, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), women playing truth or dare game at party, chinese woman blushing, friends laughing, bar interior, fun atmosphere, photorealistic, 8k, medium shot", "output_prefix": "Drama_EP12_02_Truth_Game_"},
    {"id": "03", "name": "惊喜现身", "seed": 14003, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), group of men entering bar, handsome chinese man leading, women surprised, party setting, dramatic entrance, photorealistic, 8k, wide shot", "output_prefix": "Drama_EP12_03_Surprise_Enter_"},
    {"id": "04", "name": "闯关游戏", "seed": 14004, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), men doing push-ups at bar, women watching and laughing, bachelorette party challenge, fun atmosphere, photorealistic, 8k, medium shot", "output_prefix": "Drama_EP12_04_Challenge_Game_"},
    {"id": "05", "name": "当众求婚", "seed": 14005, "width": 832, "height": 1216, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man kneeling on one knee at bar, holding ring, woman surprised and emotional, friends watching, romantic moment, photorealistic, 8k, medium shot", "output_prefix": "Drama_EP12_05_Public_Proposal_"},
    {"id": "06", "name": "朋友祝福", "seed": 14006, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), group toast at party, champagne glasses clinking, everyone smiling and celebrating, bar setting, warm lighting, photorealistic, 8k, wide shot", "output_prefix": "Drama_EP12_06_Friends_Cheers_"},
    {"id": "07", "name": "甜蜜对视", "seed": 14007, "width": 832, "height": 1216, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), couple looking at each other lovingly at party, romantic eye contact, soft focus, warm lighting, photorealistic, 8k, close-up portrait", "output_prefix": "Drama_EP12_07_Sweet_Look_"},
    {"id": "08", "name": "回家路上", "seed": 14008, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), couple walking hand in hand at night, street lights, romantic atmosphere, city background, intimate moment, photorealistic, 8k, wide shot", "output_prefix": "Drama_EP12_08_Walk_Home_Night_"}
]
def submit_prompt(scene):
    prompt_data = {"prompt": {"3": {"class_type": "KSampler", "inputs": {"cfg": 7.0, "denoise": 1, "latent_image": ["5", 0], "model": ["4", 0], "negative": ["7", 0], "positive": ["6", 0], "sampler_name": "dpmpp_2m", "scheduler": "karras", "seed": scene["seed"], "steps": 30}}, "4": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": BEST_MODEL}}, "5": {"class_type": "EmptyLatentImage", "inputs": {"batch_size": 1, "height": scene["height"], "width": scene["width"]}}, "6": {"class_type": "CLIPTextEncode", "inputs": {"clip": ["4", 1], "text": scene["prompt"]}}, "7": {"class_type": "CLIPTextEncode", "inputs": {"clip": ["4", 1], "text": NEGATIVE_PROMPT}}, "8": {"class_type": "VAEDecode", "inputs": {"samples": ["3", 0], "vae": ["4", 2]}}, "9": {"class_type": "SaveImage", "inputs": {"filename_prefix": scene["output_prefix"], "images": ["8", 0]}}}}
    try:
        req = urllib.request.Request(f'{COMFYUI_URL}/prompt', data=json.dumps(prompt_data).encode('utf-8'), headers={'Content-Type': 'application/json'}, method='POST')
        with urllib.request.urlopen(req, timeout=10) as response:
            result = json.loads(response.read().decode('utf-8'))
            return True, result.get('prompt_id', 'unknown')
    except Exception as e:
        return False, str(e)
def main():
    print("=" * 70); print("🎬 短剧《雨夜撞上陆总后》第十二集 - 场景图生成"); print("=" * 70)
    print(f"\n📦 使用模型：{BEST_MODEL}"); print(f"📊 场景数量：{len(SCENES)} 个"); print("=" * 70)
    print("\n📡 检查 ComfyUI 连接...")
    try:
        req = urllib.request.Request(f'{COMFYUI_URL}/queue', method='GET')
        with urllib.request.urlopen(req, timeout=5) as response:
            queue = json.loads(response.read().decode('utf-8'))
            print(f"✅ ComfyUI 连接成功"); print(f"   当前队列：{len(queue.get('queue_running', []))} 运行中，{len(queue.get('queue_pending', []))} 等待中")
    except Exception as e:
        print(f"❌ 无法连接 ComfyUI: {e}"); return
    print("\n" + "=" * 70); print("🚀 开始提交生成任务..."); print("=" * 70)
    success_count = 0
    for i, scene in enumerate(SCENES, 1):
        print(f"\n[{i}/{len(SCENES)}] {scene['name']}"); success, result = submit_prompt(scene)
        if success: print(f"   ✅ 提交成功 (Prompt ID: {result})"); success_count += 1
        else: print(f"   ❌ 提交失败：{result}"); time.sleep(0.5)
    print("\n" + "=" * 70); print("📊 生成结果"); print("=" * 70); print(f"✅ 成功：{success_count}/{len(SCENES)}")
    if success_count > 0: print(f"\n💾 图片将保存到：ComfyUI/output/\n   文件名前缀：Drama_EP12_XX_场景名_\n\n🌐 查看进度：http://127.0.0.1:8188")
    print("\n" + "=" * 70); print("\n📋 场景清单:"); print("-" * 70)
    for scene in SCENES: print(f"  {scene['id']}. {scene['name']} - {scene['output_prefix']}")
    print("-" * 70)
if __name__ == "__main__":
    main()
