import asyncio,base64,json,subprocess,sys,time from playwright.async_api import async_playwright OUT='/home/claude/afterlight/film3/build' A=float(sys.argv[1]) if len(sys.argv)>1 else 0; B=float(sys.argv[2]) if len(sys.argv)>2 else None async def main(): async with async_playwright() as p: b=await p.chromium.launch();pg=await b.new_page(viewport={'width':1280,'height':720}) errs=[];pg.on('pageerror',lambda e:errs.append(str(e))) await pg.goto('http://localhost:8765/film3/film.html');await pg.wait_for_function('window.READY',timeout=60000) END=B or await pg.evaluate('SS.END');n0=int(A*24);n=int(END*24) ff=subprocess.Popen(['ffmpeg','-v','error','-y','-f','image2pipe','-framerate','24','-c:v','mjpeg','-i','-','-c:v','libx264','-preset','veryfast','-crf','17','-pix_fmt','yuv420p',f'{OUT}/picture.mp4'],stdin=subprocess.PIPE) t0=time.time() for i in range(n0,n): d=await pg.evaluate(f"(SS.frame({i}/24),document.getElementById('c').toDataURL('image/jpeg',0.93))") ff.stdin.write(base64.b64decode(d.split(',',1)[1])) if i%240==0:print(i/24,round(time.time()-t0),flush=True) ff.stdin.close();ff.wait() json.dump(await pg.evaluate('SS.EV'),open(f'{OUT}/events.json','w')) print('errors',errs[:3],'frames',n-n0,round(time.time()-t0));await b.close() asyncio.run(main())