#!/bin/sh # Screen recording script with audio # Toggle: starts recording if not running, stops if running # Records the focused monitor only # Saves to ~/Videos as sr-YYYY-MM-DD_HH-MM-SS.mkv VIDEOS_DIR="$HOME/Videos" mkdir -p "$VIDEOS_DIR" get_focused_monitor_geometry() { # Get mouse position as proxy for focused monitor eval $(xdotool getmouselocation --shell 2>/dev/null) xrandr --listmonitors | awk -v mx="$X" -v my="$Y" ' NR > 1 { geo = $3; gsub(/\/[0-9]+/, "", geo) split(geo, a, "[x+]") w = a[1]; h = a[2]; ox = a[3]; oy = a[4] if (mx >= ox && mx < ox+w && my >= oy && my < oy+h) { printf "%sx%s %s,%s", w, h, ox, oy; exit } }' } start_recording() { GEOM=$(get_focused_monitor_geometry) RES=$(echo "$GEOM" | cut -d' ' -f1) OFFSET=$(echo "$GEOM" | cut -d' ' -f2) TIMESTAMP=$(date '+%Y-%m-%d_%H-%M-%S') FILENAME="sr-${TIMESTAMP}-${RES}.mkv" # Record screen + audio from default sink (system audio) ffmpeg -y \ -video_size "$RES" \ -framerate 30 \ -f x11grab -i ":0.0+${OFFSET}" \ -f pulse -i default \ -c:v libx264 -preset ultrafast -qp 0 \ -c:a aac -b:a 192k \ "$VIDEOS_DIR/$FILENAME" >/dev/null 2>&1 & echo $! > /tmp/recpid echo "$FILENAME" > /tmp/recfile # Update status bar echo "󰑋" > /tmp/recordingicon && pkill -RTMIN+9 dwmblocks notify-send -t 2000 "󰑋 Recording Started" "$RES from ${OFFSET}" } stop_recording() { kill -15 "$(cat /tmp/recpid)" 2>/dev/null FILENAME=$(cat /tmp/recfile 2>/dev/null) rm -f /tmp/recpid /tmp/recfile # Clear status bar icon echo "" > /tmp/recordingicon && pkill -RTMIN+9 dwmblocks notify-send -t 3000 "󰑋 Recording Stopped" "Saved: $FILENAME" } case "$1" in -start|--start) [ -f /tmp/recpid ] && notify-send -t 2000 "󰑋 Already Recording" && exit 1 start_recording ;; -stop|--stop) [ ! -f /tmp/recpid ] && notify-send -t 2000 "󰑋 Not Recording" && exit 1 stop_recording ;; *) if [ -f /tmp/recpid ]; then stop_recording else start_recording fi ;; esac