#!/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