#!/usr/bin/env python3
from pathlib import Path
import hashlib,json,subprocess,urllib.request
P=Path(__file__).resolve().parents[1];URL='http://192.168.1.104:8018/package-audio-safe'
def sha(f):
 h=hashlib.sha256()
 with open(f,'rb') as x:
  for b in iter(lambda:x.read(1024*1024),b''):h.update(b)
 return h.hexdigest()
def audio_sha(f):return hashlib.sha256(subprocess.check_output(['ffmpeg','-v','error','-i',str(f),'-map','0:a:0','-f','s16le','-ac','1','-ar','24000','-'])).hexdigest()
def probe(f):return json.loads(subprocess.check_output(['ffprobe','-v','error','-show_streams','-show_format','-of','json',str(f)]))
rows=[{'variant':'youtube','bgm':Path('/data/video-pipeline/Channel-Loi-Co-Nhan/data/bgm/Borderless-Aakash-Gandhi.mp3'),'out':P/'video/output/final.mp4'},{'variant':'facebook','bgm':Path('/data/video-pipeline/Channel-Loi-Co-Nhan/data/bgm/miromaxmusic-documentary-background-436079.mp3'),'out':P/'video/output/final-fb.mp4'}]
assert len(rows)==2 and rows[0]['bgm'].resolve()!=rows[1]['bgm'].resolve() and sha(rows[0]['bgm'])!=sha(rows[1]['bgm']) and rows[0]['out']!=rows[1]['out']
table=[{'variant':r['variant'],'bgm_audio_path':str(r['bgm'].resolve()),'bgm_size':r['bgm'].stat().st_size,'bgm_sha256':sha(r['bgm']),'output_video_path':str(r['out'].resolve())} for r in rows];(P/'logs/package_variant_table.json').write_text(json.dumps(table,indent=2)+'\n')
for r in rows:
 req={'intro_video_path':str((P/'video/intro.mp4').resolve()),'main_video_path':str((P/'video/output/main-with-outro.mp4').resolve()),'bgm_audio_path':str(r['bgm'].resolve()),'output_video_path':str(r['out'].resolve()),'bgm_volume':0.2,'width':1920,'height':1080,'aspect_ratio':'16:9'}
 (P/f"logs/package_request_{r['variant']}.json").write_text(json.dumps(req,indent=2)+'\n');resp=json.load(urllib.request.urlopen(urllib.request.Request(URL,data=json.dumps(req).encode(),headers={'Content-Type':'application/json'},method='POST'),timeout=3600));assert resp.get('status')=='ok',resp
 q=probe(r['out']);v=next(x for x in q['streams'] if x['codec_type']=='video');assert (v['width'],v['height'])==(1920,1080) and any(x['codec_type']=='audio' for x in q['streams']) and r['out'].stat().st_size>10000
 d={'variant':r['variant'],'request':req,'bgm_size':r['bgm'].stat().st_size,'bgm_sha256':sha(r['bgm']),'response':resp,'size':r['out'].stat().st_size,'sha256':sha(r['out']),'decoded_audio_sha256':audio_sha(r['out'])};(P/f"logs/package_provenance_{r['variant']}.json").write_text(json.dumps(d,indent=2)+'\n');print(r['variant'],'PASS')
a=json.loads((P/'logs/package_provenance_youtube.json').read_text());b=json.loads((P/'logs/package_provenance_facebook.json').read_text());assert a['sha256']!=b['sha256'] and a['decoded_audio_sha256']!=b['decoded_audio_sha256'];(P/'logs/package_provenance.json').write_text(json.dumps({'status':'PASS','variants':{'youtube':a,'facebook':b}},indent=2)+'\n');print('COPYRIGHT_BGM_GATE PASS')
