{ self, pkgs }: { record = pkgs.writeShellScriptBin "record" ('' #!/usr/bin/env bash TMP_FILE_UNOPTIMIZED="/tmp/recording_unoptimized.gif" TMP_PALETTE_FILE="/tmp/palette.png" TMP_MP4_FILE="/tmp/recording.mp4" TMP_GIF_RESULT="/tmp/gif_result" APP_NAME="Recorder" OUT_DIR="$HOME/Videos" filename=$(date +"%Y-%m-%d_%H-%M-%S") FILENAME="$OUT_DIR/$filename." if [ ! -d "$OUT_DIR" ]; then mkdir -p "$OUT_DIR" fi is_recorder_running() { pgrep -x wf-recorder >/dev/null } convert_to_gif() { ffmpeg -i "$TMP_MP4_FILE" -filter_complex "[0:v] palettegen" "$TMP_PALETTE_FILE" ffmpeg -i "$TMP_MP4_FILE" -i "$TMP_PALETTE_FILE" -filter_complex "[0:v] fps=10,scale=1400:-1,setpts=0.5*PTS [new];[new][1:v] paletteuse" "$TMP_FILE_UNOPTIMIZED" if [ -f "$TMP_PALETTE_FILE" ]; then rm "$TMP_PALETTE_FILE" fi if [ -f "$TMP_MP4_FILE" ]; then rm "$TMP_MP4_FILE" fi gifsicle -O3 --lossy=100 -i "$TMP_FILE_UNOPTIMIZED" -o "$TMP_GIF_RESULT" if [ -f "$TMP_FILE_UNOPTIMIZED" ]; then rm "$TMP_FILE_UNOPTIMIZED" fi } notify() { notify-send -a "$APP_NAME" "$1" "$2" -t 5000 } screen() { notify "Starting Recording" "Your screen is being recorded" timeout 600 wf-recorder -F format=rgb24 -x rgb24 -p qp=0 -p crf=0 -p preset=slow -c libx264rgb -f "$TMP_MP4_FILE" } area() { GEOMETRY=$(slurp) if [[ ! -z "$GEOMETRY" ]]; then notify "Starting Recording" "Your screen is being recorded" timeout 600 wf-recorder -F format=rgb24 -x rgb24 -p qp=0 -p crf=0 -p preset=slow -c libx264rgb -g "$GEOMETRY" -f "$TMP_MP4_FILE" fi } gif() { touch /tmp/recording_gif area } stop() { if is_recorder_running; then kill $(pgrep -x wf-recorder) if [[ -f /tmp/recording_gif ]] then notify "Stopped Recording" "Starting GIF conversion phase..." FILENAME+="gif" convert_to_gif SavePath=$( zenity --file-selection --save --file-filter=*.gif --filename="$OUT_DIR"'/.gif' ) if [ "$SavePath" == "" ]; then SavePath="$FILENAME" fi [[ $SavePath =~ \.gif$ ]] || SavePath+='.gif' mv $TMP_GIF_RESULT $SavePath wl-copy -t image/png < $SavePath notify "GIF conversion completed" "GIF saved to $SavePath" else FILENAME+="mp4" SavePath=$( zenity --file-selection --save --file-filter=*.mp4 --filename="$OUT_DIR"'/.mp4' ) if [ "$SavePath" == "" ]; then SavePath="$FILENAME" fi [[ $SavePath =~ \.mp4$ ]] || SavePath+='.mp4' mv $TMP_MP4_FILE $SavePath wl-copy -t video/mp4 < $SavePath notify "Stopped Recording" "Video saved to $SavePath" fi [[ -f $TMP_FILE_UNOPTIMIZED ]] && rm -f "$TMP_FILE_UNOPTIMIZED" [[ -f $TMP_PALETTE_FILE ]] && rm -f "$TMP_PALETTE_FILE" [[ -f $TMP_GIF_RESULT ]] && rm -f "$TMP_GIF_RESULT" [[ -f $TMP_MP4_FILE ]] && rm -f "$TMP_MP4_FILE" [[ -f /tmp/recording_gif ]] && rm -f /tmp/recording_gif exit 0 fi } if is_recorder_running; then stop fi if [ "$1" != "stop" ]; then [[ -f $TMP_FILE_UNOPTIMIZED ]] && rm -f "$TMP_FILE_UNOPTIMIZED" [[ -f $TMP_PALETTE_FILE ]] && rm -f "$TMP_PALETTE_FILE" [[ -f $TMP_GIF_RESULT ]] && rm -f "$TMP_GIF_RESULT" [[ -f $TMP_MP4_FILE ]] && rm -f "$TMP_MP4_FILE" [[ -f /tmp/recording_gif ]] && rm -f /tmp/recording_gif fi case "$1" in screen) screen ;; area) area ;; gif) gif ;; stop) stop ;; *) echo "Usage: $0 {screen|area|gif|stop}" exit 1 ;; esac ''); }