#!/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-storyboard3-two-5s-segments-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} for it in items}

def seg_dir_name(seg): return 'segment_'+seg.replace('-', '_')

def query(seg, submit_id):
    seg_dir = BASE/seg_dir_name(seg)
    dl = seg_dir/'downloads'
    dl.mkdir(parents=True, exist_ok=True)
    proc = subprocess.run([BIN, 'query_result', '--submit_id', submit_id, '--download_dir', str(dl)], text=True, capture_output=True, env=env, timeout=120)
    (seg_dir/'query_latest.log').write_text(proc.stdout+'\n'+proc.stderr, encoding='utf-8')
    try:
        return proc.returncode, json.loads(proc.stdout), proc.stdout+proc.stderr
    except Exception:
        return proc.returncode, None, 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') and Path(summary[seg]['video_path']).exists():
            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))
