#!/bin/sh
# Source settings from .bemenurc
. ~/.config/bemenurc
if ! [ -d $VREC_DIR ]; then
mkdir -p $VREC_DIR
fi
if ! [ -d $AREC_DIR ]; then
mkdir -p $AREC_DIR
fi
MONITOR=""
OUTPUT="$(date '+%y%m%d-%H%M-%S')"
TYPE="$1"
VIDEO_PID=""
AUDIO_PID=""
trap finishrecording SIGINT
finishvideo () {
kill -2 "$VIDEO_PID"
notify-send "🔴 Recording" \
"Screen recording stopped and saved at "$VREC_DIR"/video-"$OUTPUT".mp4"
}
finishaudio () {
kill -2 "$AUDIO_PID"
notify-send "🎙 Recording" \
"Audio recording stopped and saved at "$AREC_DIR/$OUTPUT.flac""
}
finishscreencast () {
kill -2 "$VIDEO_PID"
kill -2 "$AUDIO_PID"
notify-send "📼 Recording" "One moment, screencast is being encoded..."
ffmpeg -i "$VREC_DIR/temp-$OUTPUT.mp4" \
-i "$VREC_DIR/temp-$OUTPUT.mp3" \
-codec copy \
-shortest \
"$VREC_DIR/screencast-$OUTPUT.mp4"
rm -f "$VREC_DIR/temp-$OUTPUT.mp4"
rm -f "$VREC_DIR/temp-$OUTPUT.mp3"
notify-send "📼 Recording" \
"Screencast recording stopped and saved at "$VREC_DIR/screencast-$OUTPUT.mp4""
}
finishscreenshare() {
kill -2 "$VIDEO_PID"
notify-send "📺 Recording" \
"Screen sharing stopped."
}
finishrecording () {
case "$TYPE" in
video) finishvideo;;
audio) finishaudio;;
screencast) finishscreencast;;
screenshare) finishscreenshare;;
esac
rm -f ~/.cache/recordingpid
rm -f ~/.cache/recordingicon
killall -39 waybar
}
killrecording () {
RECPID="$(cat "$HOME/.cache/recordingpid")"
kill -2 "$RECPID"
exit
}
video () {
wf-recorder -o "$MONITOR" -f "$VREC_DIR/video-$OUTPUT.mp4" &
VIDEO_PID=$!
echo $$ > ~/.cache/recordingpid
echo "🔴" > ~/.cache/recordingicon
notify-send "🔴 Recording" "Screen recording started"
killall -39 waybar
wait
}
screenshare () {
# Hack to share screen in certain apps under wayland wlroots-based compositors
loopbackcam="$(v4l2-ctl --list-devices | \
grep v4l2loopback -m1 -A1 | \
sed -e '1d' -e 's/\s//g')"
wf-recorder -o "$MONITOR" -x yuv420p -c rawvideo -m v4l2 -f $loopbackcam &
VIDEO_PID=$!
echo $$ > ~/.cache/recordingpid
echo "📺" > ~/.cache/recordingicon
notify-send "📺 Recording" "Screen share to fake webcam started"
killall -39 waybar
wait
}
screencast () {
wf-recorder -o "$MONITOR" -f "$VREC_DIR/temp-$OUTPUT.mp4" &
VIDEO_PID=$!
ffmpeg -f alsa -i default -c:a mp3 "$VREC_DIR/temp-$OUTPUT.mp3" &
AUDIO_PID=$!
echo $$ > ~/.cache/recordingpid
echo "📼" > ~/.cache/recordingicon
notify-send "📼 Recording" "Screencast recording started"
killall -39 waybar
wait
}
audio () {
ffmpeg -f alsa -i default -c:a flac "$AREC_DIR/$OUTPUT.flac" &
AUDIO_PID=$!
echo $$ > ~/.cache/recordingpid
echo "🎙" > ~/.cache/recordingicon
notify-send "🎙 Recording" "Audio recording started"
killall -39 waybar
wait
}
askrecording () {
TYPE="$(printf "video\nscreencast\nscreenshare\naudio\n" | bemenu -l 6 -i -p "What should be recorded?" --tf="$BEMENU_TF" --tb="$BEMENU_NB" --fb="$BEMENU_NB" --fn="$BEMENU_FN" --nb="$BEMENU_NB" --nf="$BEMENU_NF" --hf="$BEMENU_HF" --hb="$BEMENU_HB")"
case "$TYPE" in
video) video;;
screencast) screencast;;
screenshare) screenshare;;
audio) audio;;
*) exit;;
esac
}
if [ -f "$HOME/.cache/recordingpid" ]; then
killrecording
exit
fi
if [ $(swaymsg -t get_outputs | jq '. | length') -gt 1 ]; then
MONITOR=$(swaymsg -t get_outputs | grep -E "name" | sed "s/^.*\"name\": \"//g;s/\",$//g;" | bemenu -p "Select display for capture: " --tf="$BEMENU_TF" --tb="$BEMENU_NB" --fb="$BEMENU_NB" --fn="$BEMENU_FN" --nb="$BEMENU_NB" --nf="$BEMENU_NF" --hf="$BEMENU_HF" --hb="$BEMENU_HB" --monitor="$BEMENU_MONITOR")
else
MONITOR="$(swaymsg -t get_outputs | jq -r '.[0]["name"]')"
fi
case $1 in
video) video;;
screencast) screencast;;
screenshare) screenshare;;
audio) audio;;
kill) killrecording;;
*) askrecording;;
esac