Add quick-record script

This commit is contained in:
ItsDrike 2024-06-21 15:59:11 +02:00
parent 3f17fea0af
commit 036b1a9064
Signed by: ItsDrike
GPG key ID: FA2745890B7048C0
5 changed files with 114 additions and 7 deletions

View file

@ -18,6 +18,7 @@ in {
home.packages = [
hyprPkgs.hyprland-move-window
hyprPkgs.hyprland-screenshot
hyprPkgs.quick-record
pkgs.brightnessctl
pkgs.hyprpicker
hyprPkgs.brightness

View file

@ -6,6 +6,7 @@
hyprland-move-window = pkgs.callPackage ./hyprland-move-window {};
brightness = pkgs.callPackage ./brightness {};
hyprland-screenshot = pkgs.callPackage ./hyprland-screenshot {};
quick-record = pkgs.callPackage ./quick-record {};
};
in
packages

View file

@ -1,11 +1,4 @@
# - `grim`: screenshot utility for wayland
# - `slurp`: to select an area
# - `hyprctl`: to read properties of current window
# - `wl-copy`: clipboard utility
# - `jq`: json utility to parse hyprctl output
# - `notify-send`: to show notifications
# - `swappy`: for editing the screenshots (only required for --edit)
{pkgs, ...}:
pkgs.writeShellApplication {
name = "hyprland-screenshot";

View file

@ -0,0 +1,16 @@
{pkgs, ...}:
pkgs.writeShellApplication {
name = "quick-record";
runtimeInputs = with pkgs; [
slurp
wl-clipboard
libnotify
procps
killall
wf-recorder
];
text = ''
${builtins.readFile ./quick-record.sh}
'';
}

View file

@ -0,0 +1,96 @@
#!/bin/bash
EXTENSION="mp4"
NOTIFY=0
save_file() {
wl-copy -t text/uri-list "file://${file}"
[ "$NOTIFY" -eq 1 ] && notify-send -a "quick-record" "Recording saved" "$file <file://${file}>"
echo "Recording saved: $file"
}
stop_recording() {
if pidof -s wf-recorder >/dev/null 2>&1; then
[ "$NOTIFY" -eq 1 ] && notify-send -a "quick-record" "Recording stopped"
killall -s SIGINT wf-recorder
else
>&2 echo "No active recording to stop"
return 1
fi
}
start_recording() {
# Remove all previous recordings
# No need to clutter /tmp, since this is used for copying the recording
# as a file, it's unlikely that we'll need any of the old recordings
# when a new one is requested
rm "${TMPDIR:-/tmp}"/wf-recorder-video-*."$EXTENSION" 2>/dev/null || true
file="$(mktemp -t "wf-recorder-video-XXXXX.$EXTENSION")"
geom="$(slurp)"
[ "$NOTIFY" -eq 1 ] && notify-send "quick-record" "Recording starting"
trap save_file SIGINT
trap save_file SIGTERM
trap save_file SIGHUP
# Wee need 'y' stdin to confirm that we want to override the file
# since mktemp creates a blank file there already
echo "y" | wf-recorder -g "$geom" -f "$file"
# If wf-recorder process ends directly, rather than a trap being hit
# we also want to run the save_file func
save_file
}
# Parse any CLI flags first, before getting to positional args
# (As long as we have $2, meaning there's at least 2 args, treat
# $1 arg as CLI flag``)
while [ "${2-}" ]; do
case "$1" in
-h | --help)
cat <<EOF
quick-record is a simple tool for performing quick screen capture recordings
on wayland WMs easily, using wf-recorder.
Optional flags:
-n | --notify: Produce notifications on recording start/end
-e | --extension [extension]: Use a different file extension (default: mp4)
Required positional arguments:
{start|stop|toggle}: Action which to perform.
- start: Start a new recording
- stop: Stop any already running recording(s)
- toggle: If there is a running recording, stop it, otherwise start a new one
EOF
exit 0
;;
-n | --notify)
NOTIFY=1
shift
;;
-e | --extension)
EXTENSION="$2"
shift
shift
;;
esac
done
if [ "${1-}" = "start" ]; then
start_recording
elif [ "${1-}" = "stop" ]; then
stop_recording
elif [ "${1-}" = "toggle" ]; then
if stop_recording 2>/dev/null; then
exit 0
else
start_recording
fi
else
>&2 echo "Error: No argument provided!"
>&2 echo "Expected one of: start, stop, toggle"
exit 1
fi