#!/bin/bash
# Record a page in real-time using Xvfb + Chrome + ffmpeg x11grab
# Args: HTML_URL WIDTH HEIGHT DURATION_S OUTPUT_MP4
set -euo pipefail

HTML="${1:?HTML url required}"
W="${2:-1080}"
H="${3:-1920}"
DUR="${4:-51}"
OUT="${5:?output mp4 required}"

DISPLAY_ID=":99"
CHROME="$HOME/.cache/ms-playwright/chromium-1223/chrome-linux64/chrome"

# clean up any previous xvfb on same display
pkill -f "Xvfb $DISPLAY_ID" 2>/dev/null || true
pkill -f "chrome.*--user-data-dir=/tmp/chrome-record" 2>/dev/null || true
sleep 0.5

# start Xvfb
Xvfb $DISPLAY_ID -screen 0 ${W}x${H}x24 -ac +extension GLX +render -noreset >/tmp/xvfb.log 2>&1 &
XVFB_PID=$!
sleep 1.5

export DISPLAY=$DISPLAY_ID

# start chrome
rm -rf /tmp/chrome-record
"$CHROME" \
  --no-sandbox \
  --disable-gpu \
  --disable-web-security \
  --allow-file-access-from-files \
  --disable-features=Translate,BackForwardCache,AcceptCHFrame,MediaRouter,OptimizationHints \
  --disable-infobars \
  --disable-notifications \
  --disable-blink-features=AutomationControlled \
  --user-data-dir=/tmp/chrome-record \
  --window-size=${W},${H} \
  --window-position=0,0 \
  --start-fullscreen \
  --kiosk \
  --hide-scrollbars \
  --autoplay-policy=no-user-gesture-required \
  "$HTML" >/tmp/chrome.log 2>&1 &
CHROME_PID=$!

# wait for chrome to render + fonts to load
sleep 4

# start ffmpeg recording
ffmpeg -y -video_size ${W}x${H} -framerate 30 -f x11grab -i $DISPLAY_ID.0 \
  -t $DUR \
  -c:v libx264 -pix_fmt yuv420p -preset medium -crf 18 \
  -movflags +faststart \
  "$OUT" >/tmp/ffmpeg-rec.log 2>&1
FF_EXIT=$?

# cleanup
kill $CHROME_PID 2>/dev/null || true
kill $XVFB_PID 2>/dev/null || true
sleep 0.5
pkill -f "chrome.*--user-data-dir=/tmp/chrome-record" 2>/dev/null || true

echo "ffmpeg exit=$FF_EXIT"
ls -la "$OUT" 2>&1
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$OUT" 2>&1
exit $FF_EXIT
