#!/usr/bin/env python3
from pathlib import Path
import json,urllib.request,time
P=Path(__file__).resolve().parents[1];assert P.name.startswith('034-')
URL='http://192.168.1.103:8001/transcribe-and-save'
m=json.loads((P/'narration/narration.json').read_text())
def ok(f):
 try:
  d=json.loads(Path(f).read_text());return bool(d.get('segments')) and float(d.get('duration',0))>0
 except:return False
for x in m['items']:
 out=Path(x['asr_path']);out.parent.mkdir(parents=True,exist_ok=True)
 if ok(out):print(x['id'],'existing');continue
 payload=json.dumps({'input_path':x['audio_path'],'output_path':str(out),'language':'vi','task':'transcribe','word_timestamps':True}).encode()
 for n in range(3):
  try:
   req=urllib.request.Request(URL,data=payload,headers={'Content-Type':'application/json'},method='POST')
   with urllib.request.urlopen(req,timeout=180) as r:
    if r.status<200 or r.status>=300:raise RuntimeError(r.status)
   if not ok(out):raise RuntimeError('invalid ASR artifact')
   print(x['id'],'ok');break
  except Exception:
   if n==2:raise
   time.sleep(2**n)
print('ASR_GATE',sum(ok(x['asr_path']) for x in m['items']),len(m['items']))
# compact timeline with canonical text and WAV fallback timing if segments lack usable endpoints
timeline=[];cur=0.0
for x in m['items']:
 d=json.loads(Path(x['asr_path']).read_text());dur=float(d.get('duration',0))
 timeline.append({'id':x['id'],'text':x['text'],'audio_path':x['audio_path'],'asr_path':x['asr_path'],'image_path':str(P/f'images/scenes/scene_{x["id"]:03d}.png'),'start':cur,'end':cur+dur,'duration':dur});cur+=dur
(P/'asr/timeline.json').write_text(json.dumps({'version':1,'language':'vi','scenes':timeline},ensure_ascii=False,indent=2)+'\n')
print('TIMELINE_ITEMS',len(timeline),'END',cur)
