#!/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": 22001, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), couple in bedroom at night, man sitting on bed talking to pregnant woman, gentle expression, soft bedside lamp, intimate atmosphere, photorealistic, 8k, medium shot", "output_prefix": "Drama_EP20_01_Discuss_Photoshoot_"},
    {"id": "02", "name": "摄影师到达", "seed": 22002, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), photographer with camera equipment arriving at luxury home, pregnant woman greeting, professional setting, home interior, photorealistic, 8k, wide shot", "output_prefix": "Drama_EP20_02_Photographer_Arrive_"},
    {"id": "03", "name": "居家风拍摄", "seed": 22003, "width": 832, "height": 1216, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), pregnant woman in white dress sitting for photoshoot, hands on belly, soft natural lighting, home studio, elegant pose, photorealistic, 8k, full body shot", "output_prefix": "Drama_EP20_03_Casual_Photoshoot_"},
    {"id": "04", "name": "陆总回来", "seed": 22004, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man in business suit entering home studio, pregnant woman blushing, photographer in background, photorealistic, 8k, medium shot", "output_prefix": "Drama_EP20_04_Husband_Return_"},
    {"id": "05", "name": "背后拥抱", "seed": 22005, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), couple photoshoot, man hugging pregnant woman from behind, hands on her belly, intimate pose, studio lighting, photorealistic, 8k, medium shot", "output_prefix": "Drama_EP20_05_Back_Hug_Photo_"},
    {"id": "06", "name": "亲吻额头", "seed": 22006, "width": 832, "height": 1216, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), man kissing pregnant woman's forehead during photoshoot, romantic moment, soft studio lighting, intimate expression, photorealistic, 8k, close-up", "output_prefix": "Drama_EP20_06_Kiss_Forehead_"},
    {"id": "07", "name": "亲吻肚子", "seed": 22007, "width": 832, "height": 1216, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), handsome chinese man kneeling, kissing pregnant woman's belly, emotional moment, woman looking down with love, studio setting, photorealistic, 8k, medium shot", "output_prefix": "Drama_EP20_07_Kiss_Belly_"},
    {"id": "08", "name": "卧室夜话", "seed": 22008, "width": 1216, "height": 832, "prompt": "(masterpiece, best quality, ultra-detailed:1.3), couple in bedroom at night, man sitting on bed touching woman's pregnant belly, moonlight through window, intimate conversation, photorealistic, 8k, medium shot", "output_prefix": "Drama_EP20_08_Bedroom_Night_Final_"}
]
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_EP20_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()
