From c5663edf453e9cf04b600268bfae2aa57987cde5 Mon Sep 17 00:00:00 2001 From: krolxon Date: Sat, 16 Dec 2023 19:32:27 +0530 Subject: [PATCH] dmenurecord --- .local/bin/dmenurecord | 127 +++++++++++++++++++++++++++++++++++------ .local/bin/wrdm | 2 +- 2 files changed, 109 insertions(+), 20 deletions(-) diff --git a/.local/bin/dmenurecord b/.local/bin/dmenurecord index b8fa8eb..ca6b011 100755 --- a/.local/bin/dmenurecord +++ b/.local/bin/dmenurecord @@ -1,25 +1,94 @@ #!/bin/sh -screencast() { \ - ffmpeg -f x11grab -r 30 -s 1920x1080 -i :0.0 \ - -f pulse -ac 2 -ar 48000 -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor \ - -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 \ - ~/vids/recs/"$(date '+%C%y-%m%M-%d-%H-%M-%S').mp4" & - echo $! > /tmp/recordingpid -} +# Usage: +# `$0`: Ask for recording type via dmenu +# `$0 screencast`: Record both audio and screen +# `$0 video`: Record only screen +# `$0 audio`: Record only audio +# `$0 kill`: Kill existing recording +# +# If there is already a running instance, user will be prompted to end it. +getdim() { xrandr | grep -oP '(?<=current ).*(?=,)' | tr -d ' ' ;} + +updateicon() { \ + echo "$1" > /tmp/recordingicon + pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}" + } killrecording() { recpid="$(cat /tmp/recordingpid)" kill -15 "$recpid" rm -f /tmp/recordingpid - sleep 3 - kill -9 "$recpid" - exit + updateicon "" + pkill -RTMIN+9 "${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() { \ @@ -27,8 +96,28 @@ asktoend() { \ [ "$response" = "Yes" ] && killrecording } -if [ -f /tmp/recordingpid ]; then - asktoend && exit -else - screencast -fi +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 + screencast) screencast;; + audio) audio;; + video) video;; + *selected) videoselected;; + kill) killrecording;; + *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;; +esac diff --git a/.local/bin/wrdm b/.local/bin/wrdm index 51dfe6d..5b10f05 100755 --- a/.local/bin/wrdm +++ b/.local/bin/wrdm @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/env bash # word=$(dmenu -p "Enter Word: " <&-) word=$(cat ~/.local/bin/words.txt | dmenu -l 25 -p "Choose Word: ")