#!/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 INT 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.opus" \ -codec copy \ -shortest \ "$VREC_DIR/screencast-$OUTPUT.mp4" rm -f "$VREC_DIR/temp-$OUTPUT.mp4" rm -f "$VREC_DIR/temp-$OUTPUT.opus" 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 libopus "$VREC_DIR/temp-$OUTPUT.opus" & 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 libopus "$AREC_DIR/$OUTPUT.opus" & 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