#!/usr/bin/env python3
from pathlib import Path
import subprocess, json, os, time, 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'
items = json.loads((BASE/'submit_results.json').read_text(encoding='utf-8'))
env = os.environ.copy(); env['HOME'] = '/Users/bot1'
summary = {it['segment']: {'submit_id': it['submit_id'], 'status': it.get('gen_status'), 'video_path': None, 'duration': None, 'width': None, 'height': None} for it in items}

def query(seg, submit_id):
    seg_dir = BASE/f'segment_{seg.replace("-", "_")}'
    dl = seg_dir/'downloads'
    dl.mkdir(parents=True, exist_ok=True)
    cmd = [BIN, 'query_result', '--submit_id', submit_id, '--download_dir', str(dl)]
    proc = subprocess.run(cmd, text=True, capture_output=True, env=env, timeout=120)
    (seg_dir/'query_latest.log').write_text(proc.stdout + '\n' + proc.stderr, encoding='utf-8')
    data = None
    try:
        data = json.loads(proc.stdout)
    except Exception:
        pass
    return proc.returncode, data, proc.stdout + proc.stderr

for round_idx in range(1, 37):
    print(f'--- poll round {round_idx} {datetime.datetime.now().astimezone().isoformat()} ---')
    all_done = True
    for it in items:
        seg = it['segment']; sid = it['submit_id']
        if summary[seg].get('status') == 'success' and summary[seg].get('video_path'):
            continue
        rc, data, text = query(seg, sid)
        if data:
            status = data.get('gen_status')
            summary[seg]['status'] = status
            videos = (((data.get('result_json') or {}).get('videos')) or [])
            if videos:
                v = videos[0]
                summary[seg].update({
                    'video_path': v.get('path'),
                    'duration': v.get('duration'),
                    'width': v.get('width'),
                    'height': v.get('height'),
                    'fps': v.get('fps'),
                    'format': v.get('format'),
                })
            if status == 'fail':
                summary[seg]['fail'] = data.get('fail_reason') or data.get('message') or text[-500:]
        else:
            summary[seg]['status'] = f'query_error_rc_{rc}'
        print(seg, summary[seg])
        if not (summary[seg].get('status') == 'success' and summary[seg].get('video_path') and Path(summary[seg]['video_path']).exists()):
            all_done = False
    (BASE/'poll_summary.json').write_text(json.dumps(summary, ensure_ascii=False, indent=2), encoding='utf-8')
    if all_done:
        print('ALL_DONE')
        break
    time.sleep(10)
else:
    raise SystemExit('Timed out before all videos finished')
print(json.dumps(summary, ensure_ascii=False, indent=2))
