#!/bin/sh LOG_FILE=$([[ ${DEBUG_SCREENRECORDER:-false} == "true" ]] && echo "/tmp/screenrecord.log" || echo "/dev/null") usage() { echo "Usage: screen-recorder stop | screen-recorder [-a] [-m region|monitor|window] -o " >&2 } if [ "$#" -eq 1 ] && [ "$1" = stop ]; then pkill -SIGINT -f "gpu-screen-recorder" count=0 while pgrep -f "gpu-screen-recorder" >/dev/null && ((count < 50)); do sleep 0.1 count=$((count + 1)) done if pgrep -f "gpu-screen-recorder" >/dev/null; then pkill -9 -f "gpu-screen-recorder" fi notify-send "Screen Recorder" "Recording stopped" -t 2000 exit $? fi if pgrep -f "gpu-screen-recorder" >/dev/null; then notify-send "Screen Recorder" "Recording is already in progress" -t 2000 exit 1 fi mode=monitor output_filename="/tmp/output.mp4" audio_args=() while getopts ":am:o:h" opt; do case "$opt" in a) audio_args=(-a default_input -ac aac) ;; m) mode=$OPTARG ;; o) output_filename=$OPTARG ;; h) usage; exit 0 ;; :) usage; exit 1 ;; \?) usage; exit 1 ;; esac done shift $((OPTIND - 1)) if [ "$#" -ne 0 ] || [ -z "$output_filename" ]; then usage exit 1 fi script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) recorder=$(PATH=$(printf '%s' "$PATH" | awk -v RS=: -v ORS=: -v script_dir="$script_dir" '$0 != script_dir') command -v gpu-screen-recorder) if [ -z "$recorder" ]; then echo "gpu-screen-recorder executable not found" >&2 exit 1 fi capture_args=() case "$mode" in monitor) target=$(hyprctl monitors -j | jq -r '.[] | select(.focused == true) | .name') [ -n "$target" ] || exit 1 capture_args=(-w "$target") ;; region) target=$(slurp -f '%wx%h+%x+%y') || exit 1 [ -n "$target" ] || exit 1 capture_args=(-w region -region "$target") ;; window) target=$(hyprctl clients -j | jq -r '.[] | select(.mapped == true and .hidden == false and .at != null and .size != null) | "\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1]) \((.title // .class // "window") | gsub("[\\r\\n]"; " "))"' | slurp -r) || exit 1 [ -n "$target" ] || exit 1 capture_args=(-w region -region "$target") ;; *) echo "Invalid mode: $mode" >&2 usage exit 1 ;; esac exec "$recorder" "${capture_args[@]}" "${audio_args[@]}" -k auto -f 60 -fm cfr -fallback-cpu-encoding yes -o "$output_filename" 2>>"$LOG_FILE" &