#!/usr/bin/env python3
from pathlib import Path
import json,urllib.request,uuid,wave,time
P=Path(__file__).resolve().parents[1]; assert P.name.startswith('048-')
URL='http://192.168.40.32:7861/voice/truong-giang'
def valid(f):
 try:
  with wave.open(str(f),'rb') as w:return w.getframerate()>0 and w.getnframes()>0
 except:return False
def one(x):
 out=Path(x['audio_path']);out.parent.mkdir(parents=True,exist_ok=True)
 if valid(out):return 'existing'
 b='----'+uuid.uuid4().hex;parts=[]
 for k,v in [('text',x['text']),('style','tu_nhien'),('speed','1'),('denoise','true')]:parts += [f'--{b}\r\nContent-Disposition: form-data; name="{k}"\r\n\r\n{v}\r\n'.encode()]
 body=b''.join(parts)+f'--{b}--\r\n'.encode();tmp=out.with_suffix('.tmp.wav')
 for n in range(3):
  try:
   req=urllib.request.Request(URL,data=body,headers={'Content-Type':f'multipart/form-data; boundary={b}'},method='POST')
   with urllib.request.urlopen(req,timeout=180) as r: tmp.write_bytes(r.read())
   if not valid(tmp):raise RuntimeError('invalid WAV')
   tmp.replace(out);return 'ok'
  except Exception:
   tmp.unlink(missing_ok=True)
   if n==2:raise
   time.sleep(2**n)
m=json.loads((P/'narration/narration.json').read_text())
for x in m['items']:print(x['id'],one(x),flush=True)
print('TTS_GATE',sum(valid(Path(x['audio_path'])) for x in m['items']),len(m['items']))
