#!/usr/bin/env python3
from pathlib import Path
import subprocess, json, os, re, datetime

BASE = Path('/Users/bot1/Volumes/root_for_ai/AI工作区/通用_产品宣传视频_古钱币杜邦纸钱袋包_20260530_1702/outputs/dreamina-seedance2-storyboard2-four-single-image-videos-20260530')
BIN = '/Users/bot1/.hermes/profiles/video/home/.local/bin/dreamina'

segments = [
    {
        'id': '2-1-1',
        'image': BASE/'crops/分镜2-1-1.png',
        'prompt': '''使用这张单独分镜图作为唯一画面参考，生成一段4秒、3:4竖版、连续单画面视频。画面是浅米色桌面上的多个拟人化古钱币小角色，它们保留原本钱币身体，只长出短圆软萌手脚。黑色椭圆刻纹币、金色贝形币、绿色长柄铲形币和圆形方孔币等角色松散同向前行，前后左右自然错开，不整齐排队。动作是刚学会走路的小步前进：脚接近或踩在桌面上，有柔和接触阴影，身体轻微左右摇摆，节奏小心、可爱。镜头低机位轻微跟随，保持浅米色桌面、柔和暖光、微缩商业广告质感。不要出现九宫格、分镜边框、画中画、文字、水印或UI。不要把角色统一成同一种圆形方孔钱，不要新增复杂五官、衣服、机械关节。不要跳起或飞行。声音只要轻微脚步、桌面摩擦和环境声，不要BGM。'''
    },
    {
        'id': '2-1-2',
        'image': BASE/'crops/分镜2-1-2.png',
        'prompt': '''使用这张单独分镜图作为唯一画面参考，生成一段4秒、3:4竖版、连续单画面视频。画面保持浅米色桌面和柔和暖光，金色裂纹圆片钱币角色在前景背对镜头向前走，旁边和后方有棕色圆形方孔币、绿色长柄铲形币、灰银桥形币等拟人化钱币小角色。所有角色保留各自钱币轮廓、颜色、刻纹和旧金属材质，只带短圆手脚。它们分散排列、同向小步前进，脚部贴近桌面，有接触阴影，动作轻、小、略不稳定，像刚成人的钱币角色在探索行走。镜头轻微向前跟拍，背景浅景深。不要九宫格、分镜边框、画中画、文字、水印或UI。不要把全部钱币改成普通金币或统一圆币，不要跳舞、飞行或夸张奔跑。声音只要轻微脚步、桌面摩擦和环境声，不要BGM。'''
    },
    {
        'id': '2-2-1',
        'image': BASE/'crops/分镜2-2-1.png',
        'prompt': '''使用这张单独分镜图作为唯一画面参考，生成一段4秒、3:4竖版、连续单画面视频。画面是浅米色微缩桌面世界，黑色椭圆刻纹钱币小角色在前景站立并成为焦点，短圆手脚清楚可见；背景有金色贝形币、绿色长柄铲形币等钱币小角色。黑色椭圆刻纹币先小步前行，随后像察觉到什么一样轻微停顿，身体有一点紧张的左右晃动，准备被惊到，但这一段不要完全跳起。背景角色可以继续小步走或停下回望。保持原图构图、角色类型、浅米色桌面、柔和暖光和浅景深。不要九宫格、分镜边框、画中画、文字、水印或UI。不要新增复杂五官、衣服或机械关节；不要让全部角色同时跳起；不要把黑色椭圆币改成普通圆金币。声音只要轻微脚步、停顿摩擦和环境声，不要BGM。'''
    },
    {
        'id': '2-2-2',
        'image': BASE/'crops/分镜2-2-2.png',
        'prompt': '''使用这张单独分镜图作为唯一画面参考，生成一段4秒、3:4竖版、连续单画面视频。画面是浅米色桌面上的黑色椭圆刻纹钱币小角色受到惊吓后轻轻跃起：双手上举，双脚离开桌面，下方保留柔和圆形投影。跃起幅度不大，是被吓了一下的轻跳，不是兴奋跳舞或飞行。背景保留金色贝形钱币、绿色长柄铲形币和其他钱币小角色，它们可以停顿或回望。角色都保留原本古钱币身体、短圆软萌手脚、旧金属质感和分镜里的浅米色桌面环境。镜头低机位轻微上抬，突出跃起瞬间和下方投影。不要九宫格、分镜边框、画中画、文字、水印或UI。不要让全部角色一起跳，不要夸张飞行，不要把黑色椭圆币改成普通圆形金币。声音只要轻微惊跳、落地前空气感和环境声，不要BGM。'''
    },
]

BASE.mkdir(parents=True, exist_ok=True)
results = []
for seg in segments:
    sid = seg['id']
    seg_dir = BASE/f'segment_{sid.replace("-", "_")}'
    seg_dir.mkdir(parents=True, exist_ok=True)
    prompt_path = seg_dir/f'prompt_{sid}.txt'
    prompt_path.write_text(seg['prompt'], encoding='utf-8')
    cmd = [BIN, 'image2video', '--image', str(seg['image']), '--prompt', seg['prompt'], '--duration', '4', '--video_resolution', '1080p', '--model_version', 'seedance2.0_vip', '--poll', '8']
    env = os.environ.copy()
    env['HOME'] = '/Users/bot1'
    proc = subprocess.run(cmd, text=True, capture_output=True, env=env, timeout=180)
    (seg_dir/'submit_stdout.log').write_text(proc.stdout, encoding='utf-8')
    (seg_dir/'submit_stderr.log').write_text(proc.stderr, encoding='utf-8')
    text = proc.stdout + '\n' + proc.stderr
    submit_id = None
    gen_status = None
    credit_count = None
    try:
        data = json.loads(proc.stdout)
        submit_id = data.get('submit_id')
        gen_status = data.get('gen_status')
        credit_count = data.get('credit_count')
    except Exception:
        m = re.search(r'"submit_id"\s*:\s*"([^"]+)"', text)
        if m: submit_id = m.group(1)
        m = re.search(r'"gen_status"\s*:\s*"([^"]+)"', text)
        if m: gen_status = m.group(1)
        m = re.search(r'"credit_count"\s*:\s*([0-9]+)', text)
        if m: credit_count = int(m.group(1))
    status = {
        'segment': sid,
        'submitted_at': datetime.datetime.now().astimezone().isoformat(),
        'image': str(seg['image']),
        'prompt_file': str(prompt_path),
        'model_version': 'seedance2.0_vip',
        'video_resolution': '1080p',
        'duration': 4,
        'submit_id': submit_id,
        'gen_status': gen_status,
        'credit_count': credit_count,
        'returncode': proc.returncode,
    }
    (seg_dir/'submit_status.json').write_text(json.dumps(status, ensure_ascii=False, indent=2), encoding='utf-8')
    results.append(status)
    print(json.dumps(status, ensure_ascii=False))
    if proc.returncode != 0 or not submit_id or gen_status == 'fail':
        raise SystemExit(f'submit failed for {sid}')

(BASE/'submit_results.json').write_text(json.dumps(results, ensure_ascii=False, indent=2), encoding='utf-8')
print('ALL_SUBMITTED')
print(json.dumps(results, ensure_ascii=False, indent=2))
