#!/usr/bin/env python3
from pathlib import Path
import subprocess,json,wave
P=Path(__file__).resolve().parents[1];main=P/'video/output/main.mp4';outro=P/'video/outro.mp4';out=P/'video/output/main-with-outro.mp4'
def dur(f):return float(subprocess.check_output(['ffprobe','-v','error','-show_entries','format=duration','-of','default=nw=1:nk=1',str(f)]))
with wave.open(str(P/'audio/full_narration.wav'),'rb') as w:audio_d=w.getnframes()/w.getframerate()
video_d=dur(main);tail=max(0,audio_d-video_d);od=dur(outro)
cmd=['ffmpeg','-hide_banner','-loglevel','error','-y','-i',str(main),'-i',str(outro),'-filter_complex',f'[0:v]tpad=stop_mode=clone:stop_duration={tail+1.0},trim=duration={audio_d+1.0},setpts=PTS-STARTPTS[v0];[0:a]apad=pad_dur=1,atrim=duration={audio_d+1.0},asetpts=PTS-STARTPTS[a0];[1:v]scale=1920:1080,fps=30,setpts=PTS-STARTPTS[v1];[1:a]asetpts=PTS-STARTPTS[a1];[v0][a0][v1][a1]concat=n=2:v=1:a=1[v][a]','-map','[v]','-map','[a]','-c:v','libx264','-preset','veryfast','-crf','18','-c:a','aac','-b:a','192k',str(out)]
subprocess.run(cmd,check=True);actual=dur(out);e={'status':'PASS','main_video_duration':video_d,'main_audio_duration':audio_d,'normalized_tail':tail,'hold':1.0,'outro_duration':od,'expected_total':audio_d+1+od,'actual_total':actual,'delta':abs(actual-(audio_d+1+od))};(P/'logs/boundary_assembly.json').write_text(json.dumps(e,indent=2)+'\n');print(json.dumps(e))
