#!/usr/bin/env python3
"""Render captured asciicast output as a paced, readable transcript playback.
Usage: python3 render.py RUN_DIRECTORY
This visualizes actual output; it is not a desktop screen recording.
"""
import pathlib,sys,json,textwrap,subprocess
p=pathlib.Path(sys.argv[1]); events=[json.loads(s) for s in (p/'recording.cast').read_text().splitlines()[1:]]
text=''; scenes=[]
for _,_,chunk in events:
    text+=chunk.replace('\r','')
    if chunk.startswith('HTTP 200') or chunk.startswith('{') or chunk.startswith('\nCompleted'):
        scenes.append(text)
concat=[]
for i,s in enumerate(scenes):
    lines=['CAPTURED HTTP OUTPUT - paced transcript playback','Viewport: 1440 x 1080 | dark | Linux x64','']
    for line in s.splitlines(): lines.extend(textwrap.wrap(line,100,replace_whitespace=False) or [''])
    f=p/f'scene-{i}.txt'; f.write_text('\n'.join(lines))
    png=p/f'scene-{i}.png'
    subprocess.run(['ffmpeg','-v','error','-f','lavfi','-i','color=c=0x111827:s=1440x1080','-vf',f'drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf:textfile={f}:fontcolor=0xf1f5f9:fontsize=20:line_spacing=6:x=32:y=30:expansion=none','-frames:v','1','-y',str(png)],check=True)
    concat.extend([f"file '{png.name}'",'duration 5'])
concat.append(f"file 'scene-{len(scenes)-1}.png'")
(p/'frames.txt').write_text('\n'.join(concat))
subprocess.run(['ffmpeg','-v','error','-f','concat','-safe','0','-i',str(p/'frames.txt'),'-vf','fps=15','-c:v','libx264','-pix_fmt','yuv420p','-movflags','+faststart','-y',str(p/(p.name.split('-')[0]+'.mp4'))],check=True)
print(p/(p.name.split('-')[0]+'.mp4'))
