Files
openwork/.devcontainer/start-daytona-recording.sh
T

97 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# Record the Daytona Electron display to an mp4 artifact. Stop with SIGINT so
# ffmpeg finalizes the file cleanly.
OUTPUT="/daytona-artifacts/recordings/daytona-recording.mp4"
SIZE="1920x1080"
FPS="15"
LOG_PATH="/tmp/daytona-recording.log"
DETACH=0
while [ "$#" -gt 0 ]; do
case "$1" in
--detach)
DETACH=1
;;
--output)
shift
OUTPUT="${1:?missing output path}"
;;
--size)
shift
SIZE="${1:?missing recording size}"
;;
--fps)
shift
FPS="${1:?missing recording fps}"
;;
--log)
shift
LOG_PATH="${1:?missing log path}"
;;
--help|-h)
printf '%s\n' \
"Usage: start-daytona-recording.sh [--detach] [--output PATH] [--size WxH] [--fps N]" \
"" \
"Records DISPLAY, defaulting to :99, and writes an mp4 file."
exit 0
;;
--*)
echo "Unknown option: $1" >&2
exit 1
;;
*)
echo "Unexpected argument: $1" >&2
exit 1
;;
esac
shift
done
if ! command -v ffmpeg >/dev/null 2>&1; then
echo "ERROR: ffmpeg is required for Daytona display recording." >&2
exit 1
fi
if [ "$DETACH" -eq 1 ]; then
SCRIPT_PATH="${BASH_SOURCE[0]}"
nohup bash "$SCRIPT_PATH" --output "$OUTPUT" --size "$SIZE" --fps "$FPS" >"$LOG_PATH" 2>&1 &
echo "Recording started: $OUTPUT"
echo "Recording log: $LOG_PATH"
exit 0
fi
FINAL_OUTPUT="$OUTPUT"
RECORD_OUTPUT="$OUTPUT"
if [[ "$OUTPUT" = /daytona-artifacts/* ]]; then
RECORD_OUTPUT="/tmp/daytona-recording-$(basename "$OUTPUT")"
fi
mkdir -p "$(dirname "$RECORD_OUTPUT")"
FFMPEG_ARGS=(
-y
-f x11grab
-video_size "$SIZE"
-framerate "$FPS"
-i "${DISPLAY:-:99}"
-codec:v libx264
-preset veryfast
-pix_fmt yuv420p
"$RECORD_OUTPUT"
)
set +e
ffmpeg "${FFMPEG_ARGS[@]}"
status="$?"
set -e
if [ "$RECORD_OUTPUT" != "$FINAL_OUTPUT" ]; then
mkdir -p "$(dirname "$FINAL_OUTPUT")"
cp "$RECORD_OUTPUT" "$FINAL_OUTPUT"
fi
exit "$status"