File size: 1,846 Bytes
119e586
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/**

 * Record demo.html as video using Puppeteer + FFmpeg

 * Usage: node record-demo.mjs

 */

import puppeteer from 'puppeteer';
import { spawn } from 'child_process';
import fs from 'fs';
import path from 'path';

const WIDTH = 1280;
const HEIGHT = 800;
const FPS = 30;
const OUTPUT = 'docs/demo.mp4';

async function recordDemo() {
  console.log('[Record] Starting demo video recording...');

  const browser = await puppeteer.launch({
    headless: true,
    args: ['--no-sandbox', '--disable-setuid-sandbox'],
  });

  const page = await browser.newPage();
  await page.setViewport({ width: WIDTH, height: HEIGHT });

  console.log('[Record] Loading demo.html...');
  await page.goto(`file://${path.resolve('docs/demo.html')}`, {
    waitUntil: 'networkidle2',
  });

  // Set up FFmpeg for video recording
  const ffmpeg = spawn('ffmpeg', [
    '-y',
    '-f', 'gdigrab',
    '-framerate', String(FPS),
    '-i', 'desktop',
    '-c:v', 'libx264',
    '-preset', 'medium',
    '-crf', '23',
    '-pix_fmt', 'yuv420p',
    OUTPUT,
  ]);

  ffmpeg.stderr.on('data', (data) => {
    console.log(`[FFmpeg] ${data}`);
  });

  // Wait for FFmpeg to start
  await new Promise(resolve => setTimeout(resolve, 1000));

  console.log('[Record] Running demo sequence...');

  // Click "Run Full Demo"
  await page.click('button[onclick="runDemo()"]');

  // Wait for demo to complete (~15 seconds)
  await page.waitForTimeout(18000);

  console.log('[Record] Stopping recording...');
  ffmpeg.stdin.write('q');

  await new Promise(resolve => {
    ffmpeg.on('close', resolve);
  });

  await browser.close();

  console.log(`[Record] ✓ Video saved: ${OUTPUT}`);
  console.log(`[Record] Size: ${fs.statSync(OUTPUT).size / 1024 / 1024}MB`);
}

recordDemo().catch(console.error);