diff options
| author | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2025-01-24 20:35:27 +0900 |
|---|---|---|
| committer | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2025-01-24 20:35:27 +0900 |
| commit | c80a54e42b52ce297f0f2f71af23c562832025c7 (patch) | |
| tree | dcce8bb977a770f473325d48f6f70b21d9818a40 /ar/.local/bin/dmenurecord | |
init
Diffstat (limited to 'ar/.local/bin/dmenurecord')
| -rwxr-xr-x | ar/.local/bin/dmenurecord | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/ar/.local/bin/dmenurecord b/ar/.local/bin/dmenurecord new file mode 100755 index 0000000..4aef54f --- /dev/null +++ b/ar/.local/bin/dmenurecord @@ -0,0 +1,129 @@ +#!/bin/sh + +usage() { + echo "Asks for recording type via dmenu." + echo "If there is already a running instance, user will be prompted to end it. " + echo "" + echo "Usage: ${0##*/} [-h] [audio] [kill] [video] [screencast]" + echo "" + echo "Options:" + echo " - audio : Records only audio" + echo " - kill : Kills existing recording" + echo " - video : Records only screen" + echo " - screencast : Records both audio and screen" +} + +getdim() { xrandr | grep -oP '(?<=current ).*(?=,)' | tr -d ' '; } + +updateicon() { + echo "$1" >/tmp/recordingicon + pkill -RTMIN+31 "${STATUSBAR:-dwmblocks}" +} + +killrecording() { + recpid="$(cat /tmp/recordingpid)" + kill -15 "$recpid" + rm -f /tmp/recordingpid + updateicon "" + pkill -RTMIN+31 "${STATUSBAR:-dwmblocks}" +} + +screencast() { + ffmpeg -y \ + -f x11grab \ + -framerate 30 \ + -s "$(getdim)" \ + -i "$DISPLAY" \ + -r 24 \ + -use_wallclock_as_timestamps 1 \ + -f alsa -thread_queue_size 1024 -i default \ + -c:v h264 \ + -crf 0 -preset ultrafast -c:a aac \ + "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" & + echo $! >/tmp/recordingpid + updateicon "⏺️🎙️" +} + +video() { + ffmpeg \ + -f x11grab \ + -framerate 30 \ + -s "$(getdim)" \ + -i "$DISPLAY" \ + -c:v libx264 -qp 0 -r 30 \ + "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! >/tmp/recordingpid + updateicon "⏺️" +} + +webcamhidef() { + ffmpeg \ + -f v4l2 \ + -i /dev/video0 \ + -video_size 1920x1080 \ + "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! >/tmp/recordingpid + updateicon "🎥" +} + +webcam() { + ffmpeg \ + -f v4l2 \ + -i /dev/video0 \ + -video_size 640x480 \ + "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! >/tmp/recordingpid + updateicon "🎥" +} + +audio() { + ffmpeg \ + -f alsa -i default \ + -c:a flac \ + "$HOME/audio-$(date '+%y%m%d-%H%M-%S').flac" & + echo $! >/tmp/recordingpid + updateicon "🎙️" +} + +askrecording() { + choice=$(printf "screencast\\nvideo\\nvideo selected\\naudio\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style:") + case "$choice" in + screencast) screencast ;; + audio) audio ;; + video) video ;; + *selected) videoselected ;; + webcam) webcam ;; + "webcam (hi-def)") webcamhidef ;; + esac +} + +asktoend() { + response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") && + [ "$response" = "Yes" ] && killrecording +} + +videoselected() { + slop -f "%x %y %w %h" >/tmp/slop + read -r X Y W H </tmp/slop + rm /tmp/slop + + ffmpeg \ + -f x11grab \ + -framerate 30 \ + -video_size "$W"x"$H" \ + -i :0.0+"$X,$Y" \ + -c:v libx264 -qp 0 -r 30 \ + "$HOME/box-$(date '+%y%m%d-%H%M-%S').mkv" & + echo $! >/tmp/recordingpid + updateicon "⏺️" +} + +case "$1" in +-h | --help | help) usage && exit 0 ;; +audio) audio ;; +kill) killrecording ;; +screencast) screencast ;; +video) video ;; +*selected) videoselected ;; +*) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording ;; +esac |
