voyeg3r

dmenurecord.sh

Sep 27th, 2022
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.09 KB | None | 0 0
  1. #!/bin/sh
  2. # Last Change: Mon, 26 Sep 2022 13:50:53
  3. # source: https://github.com/LukeSmithxyz/voidrice/blob/master/.local/bin/dmenurecord
  4. # vim:set softtabstop=2 shiftwidth=2 tabstop=2 expandtab ft=sh:
  5.  
  6. # code to study:
  7. # https://github.com/hoytech/screencast-capture/blob/master/screencast-capture.pl
  8.  
  9. # Usage:
  10. # `$0`: Ask for recording type via dmenu
  11. # `$0 screencast`: Record both audio and screen
  12. # `$0 video`: Record only screen
  13. # `$0 audio`: Record only audio
  14. # `$0 kill`: Kill existing recording
  15. #
  16. # If there is already a running instance, user will be prompted to end it.
  17.  
  18. updateicon() { \
  19.     echo "$1" > /tmp/recordingicon
  20.     pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
  21.     }
  22.  
  23. killrecording() {
  24.     recpid="$(cat /tmp/recordingpid)"
  25.     # kill with SIGTERM, allowing finishing touches.
  26.     kill -15 "$recpid"
  27.     rm -f /tmp/recordingpid
  28.     updateicon ""
  29.     pkill -RTMIN+9 "${STATUSBAR:-dwmblocks}"
  30.     # even after SIGTERM, ffmpeg may still run, so SIGKILL it.
  31.     sleep 3
  32.     kill -9 "$recpid"
  33.     exit
  34.     }
  35.  
  36. screencast() { \
  37.     ffmpeg -y \
  38.     -f x11grab \
  39.     -framerate 60 \
  40.     -s "$(xdpyinfo | awk '/dimensions/ {print $2;}')" \
  41.     -i "$DISPLAY" \
  42.     -f alsa -i default \
  43.     -r 30 \
  44.     -c:v h264 -crf 0 -preset ultrafast -c:a aac \
  45.     "$HOME/screencast-$(date '+%y%m%d-%H%M-%S').mp4" &
  46.     echo $! > /tmp/recordingpid
  47.     updateicon "⏺️🎙️"
  48.         }
  49.  
  50. video() { ffmpeg \
  51.     -f x11grab \
  52.     -s "$(xdpyinfo | awk '/dimensions/ {print $2;}')" \
  53.     -i "$DISPLAY" \
  54.     -c:v libx264 -qp 0 -r 30 \
  55.     "$HOME/video-$(date '+%y%m%d-%H%M-%S').mkv" &
  56.     echo $! > /tmp/recordingpid
  57.     updateicon "⏺️"
  58.     }
  59.  
  60. webcamhidef() { ffmpeg \
  61.     -f v4l2 \
  62.     -i /dev/video0 \
  63.     -video_size 1920x1080 \
  64.     "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
  65.     echo $! > /tmp/recordingpid
  66.     updateicon "🎥"
  67.     }
  68.  
  69. webcam() { ffmpeg \
  70.     -f v4l2 \
  71.     -i /dev/video0 \
  72.     -video_size 640x480 \
  73.     "$HOME/webcam-$(date '+%y%m%d-%H%M-%S').mkv" &
  74.     echo $! > /tmp/recordingpid
  75.     updateicon "🎥"
  76.     }
  77.  
  78. audio() { \
  79.     ffmpeg \
  80.     -f alsa -i default \
  81.     -c:a flac \
  82.     "$HOME/audio-$(date '+%y%m%d-%H%M-%S').flac" &
  83.     echo $! > /tmp/recordingpid
  84.     updateicon "🎙️"
  85.     }
  86.  
  87. askrecording() { \
  88.     choice=$(printf "screencast\\nvideo\\nvideo selected\\naudio\\nwebcam\\nwebcam (hi-def)" | dmenu -i -p "Select recording style:")
  89.     case "$choice" in
  90.         screencast) screencast;;
  91.         audio) audio;;
  92.         video) video;;
  93.         *selected) videoselected;;
  94.         webcam) webcam;;
  95.         "webcam (hi-def)") webcamhidef;;
  96.     esac
  97.     }
  98.  
  99. asktoend() { \
  100.     response=$(printf "No\\nYes" | dmenu -i -p "Recording still active. End recording?") &&
  101.     [ "$response" = "Yes" ] &&  killrecording
  102.     }
  103.  
  104. videoselected()
  105. {
  106.     slop -f "%x %y %w %h" > /tmp/slop
  107.     read -r X Y W H < /tmp/slop
  108.     rm /tmp/slop
  109.  
  110.     ffmpeg \
  111.     -f x11grab \
  112.     -framerate 60 \
  113.     -video_size "$W"x"$H" \
  114.     -i :0.0+"$X,$Y" \
  115.     -c:v libx264 -qp 0 -r 30 \
  116.     "$HOME/box-$(date '+%y%m%d-%H%M-%S').mkv" &
  117.     echo $! > /tmp/recordingpid
  118.     updateicon "⏺️"
  119. }
  120.  
  121. case "$1" in
  122.     screencast) screencast;;
  123.     audio) audio;;
  124.     video) video;;
  125.     *selected) videoselected;;
  126.     kill) killrecording;;
  127.     *) ([ -f /tmp/recordingpid ] && asktoend && exit) || askrecording;;
  128. esac
  129.  
  130.  
Add Comment
Please, Sign In to add comment