Revert "ready for ignis"

This reverts commit 9d404b100f.
This commit is contained in:
sankalp committed 2025-09-01 12:39:28 +05:45
1 parent 9d404b100f
commit 158ce6590c
204 files changed
+51505

No files matched your search

+40
View File
@@ -0,0 +1,40 @@
#!/usr/bin/env sh
# Check if animations are disabled (game mode is active)
check_gamemode() {
HYPRGAMEMODE=$(hyprctl getoption animations:enabled | awk 'NR==1{print $2}')
if [ "$HYPRGAMEMODE" = 0 ]; then
echo "t"
return 0
else
echo "f"
return 1
fi
}
# Toggle game mode state
toggle_gamemode() {
HYPRGAMEMODE=$(hyprctl getoption animations:enabled | awk 'NR==1{print $2}')
if [ "$HYPRGAMEMODE" = 1 ]; then
hyprctl --batch "\
keyword animations:enabled 0;\
keyword decoration:shadow:enabled 0;\
keyword decoration:blur:enabled 0;\
keyword general:gaps_in 0;\
keyword general:gaps_out 0;\
keyword general:border_size 1;\
keyword decoration:rounding 0"
exit
fi
hyprctl reload
}
# Main script logic
case "$1" in
check)
check_gamemode
;;
*)
toggle_gamemode
;;
esac
+75
View File
@@ -0,0 +1,75 @@
#!/bin/bash
pick_rgb() {
# Execute hyprpicker with RGB format and save the output to a variable
hyprpicker -a -n -f rgb && sleep 0.1
# Create a temporal 64x64 PNG file with the color in /tmp using convert
magick -size 64x64 xc:"rgb($(wl-paste))" /tmp/color.png
# Send a notification using the file as an icon
notify-send "RGB color picked" "rgb($(wl-paste))" -i /tmp/color.png -a "Hyprpicker"
# Remove the temporal file
rm /tmp/color.png
# Exit
exit 0
}
pick_hex() {
# Execute hyprpicker and save the output to a variable
hyprpicker -a -n -f hex && sleep 0.1
# Create a temporal 64x64 PNG file with the color in /tmp using convert
magick -size 64x64 xc:"$(wl-paste)" /tmp/color.png
# Send a notification using the file as an icon
notify-send "HEX color picked" "$(wl-paste)" -i /tmp/color.png -a "Hyprpicker"
# Remove the temporal file
rm /tmp/color.png
# Exit
exit 0
}
pick_hsv() {
# Copy the color to the clipboard
echo -n "$(hyprpicker -n -f hsv)" | wl-copy -n
# Create a temporal 64x64 PNG file with the color in /tmp using convert
magick -size 64x64 xc:"hsv($(wl-paste))" /tmp/color.png
# Send a notification using the file as an icon
notify-send "HSV color picked" "hsv($(wl-paste))" -i /tmp/color.png -a "Hyprpicker"
# Remove the temporal file
rm /tmp/color.png
# Exit
exit 0
}
case "$1" in
-rgb)
pick_rgb
;;
-hsv)
pick_hsv
;;
-hex)
pick_hex
;;
*)
echo "Usage: $0 [-rgb|-hex|-hsv]"
exit 1
;;
esac
+704
View File
@@ -0,0 +1,704 @@
#!/bin/env bash
# Script name
SCRIPT_NAME=$(basename "$0")
# Function to display usage
usage() {
cat <<EOF
Usage: $SCRIPT_NAME <command> [options]
Commands:
screenshot <target> Take a screenshot
Targets:
selection - Screenshot selected area
eDP-1 - Screenshot eDP-1 display
HDMI-A-1 - Screenshot HDMI-A-1 display
both - Screenshot both displays
record <target> Start/stop recording (with audio)
Targets:
selection - Record selected area
eDP-1 - Record eDP-1 display
HDMI-A-1 - Record HDMI-A-1 display
stop - Stop current recording
record-noaudio <target> Start/stop recording (no audio)
Targets:
selection - Record selected area without audio
eDP-1 - Record eDP-1 display without audio
HDMI-A-1 - Record HDMI-A-1 display without audio
stop - Stop current recording
record-hq <target> Start/stop high-quality recording (for YouTube)
Targets:
selection - Record selected area in high quality
eDP-1 - Record eDP-1 display in high quality
HDMI-A-1 - Record HDMI-A-1 display in high quality
stop - Stop current recording
record-gif <target> Start/stop GIF recording
Targets:
selection - Record selected area as GIF
eDP-1 - Record eDP-1 display as GIF
HDMI-A-1 - Record HDMI-A-1 display as GIF
stop - Stop current recording
status Check if recording is active (exit 0 if recording, 1 if not)
convert <format> [file] Convert recordings
Formats:
webm - Convert latest MKV to WebM (or specify file)
iphone - Convert latest MKV to iPhone format (or specify file)
youtube - Convert latest video to YouTube format (or specify file)
gif - Convert latest video to GIF (or specify file)
Optional [file] parameter:
- If not provided, converts the latest recorded video
- If provided, converts the specified file (full path or filename in Recordings folder)
Examples:
$SCRIPT_NAME screenshot selection
$SCRIPT_NAME record eDP-1
$SCRIPT_NAME record-noaudio selection
$SCRIPT_NAME record-hq eDP-1
$SCRIPT_NAME record-gif selection
$SCRIPT_NAME record stop
$SCRIPT_NAME convert gif # Convert latest video to GIF
$SCRIPT_NAME convert youtube # Convert latest video for YouTube
$SCRIPT_NAME convert webm /path/to/video.mkv # Convert specific file to WebM
EOF
exit 1
}
# Check if no arguments provided
if [ $# -eq 0 ]; then
usage
fi
# Function to send screenshot notification with action buttons
send_screenshot_notification() {
local full_path="$1"
local save_dir=$(dirname "$full_path")
ACTION=$(notify-send -a "Modus" -i "$full_path" "Screenshot saved" "in $full_path" \
-A "view=View" -A "edit=Edit" -A "open=Open Folder")
case "$ACTION" in
view) xdg-open "$full_path" ;;
edit) swappy -f "$full_path" ;;
open) xdg-open "$save_dir" ;;
esac
}
# Function to send recording notification with action buttons
send_recording_notification() {
local full_path="$1"
local save_dir=$(dirname "$full_path")
ACTION=$(notify-send -a "Modus" -i "camera-video-symbolic" "Recording saved" "in $full_path" \
-A "view=View" -A "open=Open Folder")
case "$ACTION" in
view) xdg-open "$full_path" ;;
open) xdg-open "$save_dir" ;;
esac
}
wf-recorder_check() {
if pgrep -x "wf-recorder" >/dev/null; then
pkill -INT -x wf-recorder
# Get the recording file path and send notification with actions
if [ -f /tmp/recording.txt ]; then
recording_file=$(cat /tmp/recording.txt)
wl-copy <"$recording_file"
send_recording_notification "$recording_file"
else
notify-send "Recording stopped" "wf-recorder process terminated"
fi
# Clean up recording start time file
rm -f /tmp/recording_start_time.txt
exit 0
fi
}
# Function to record with standard settings
record_video() {
local output_file="$1"
shift
wf-recorder "$@" -f "$output_file" -c libvpx-vp9 --pixel-format yuv420p -F "eq=brightness=0.12:contrast=1.1"
}
# Function to record without audio
record_video_noaudio() {
local output_file="$1"
shift
wf-recorder "$@" -f "$output_file" -c libvpx-vp9 --pixel-format yuv420p -F "eq=brightness=0.12:contrast=1.1" --no-audio
}
record_high_quality() {
local output_file="$1"
shift
# High quality settings for YouTube uploads
# - h264_vaapi for hardware encoding (if available) or libx264 for software
# - yuv420p pixel format for maximum compatibility
# - High bitrate (8000k) for quality
# - GOP size of 30 for better seeking
# - Preset 'slow' for better compression efficiency
# - CRF 18 for high quality (lower = better quality, 0-51 scale)
# - Audio at 192k bitrate
# - 60 FPS for smooth motion
# - No color filters to maintain original colors
# Check if VAAPI hardware encoding is available
if vainfo &>/dev/null && wf-recorder --help | grep -q "h264_vaapi"; then
# Use hardware encoding for better performance
wf-recorder "$@" -f "$output_file" \
-c h264_vaapi \
-p "preset=slow" \
-p "crf=18" \
-r 60 \
-b 8000000 \
-B 192000 \
--pixel-format yuv420p \
-g 30
else
# Fallback to software encoding
wf-recorder "$@" -f "$output_file" \
-c libx264 \
-p "preset=slow" \
-p "crf=18" \
-r 60 \
-b 8000000 \
-B 192000 \
--pixel-format yuv420p \
-g 30
fi
}
record_gif() {
local output_file="$1"
shift
# Record temporary video first (MKV format for better quality)
local temp_video="/tmp/gif_recording_$(date +%s).mkv"
echo "$temp_video" >/tmp/gif_temp_video.txt
# GIF-optimized recording settings:
# - Lower framerate (15 fps) for smaller file size
# - No audio recording
# - Standard codec for compatibility
wf-recorder "$@" -f "$temp_video" \
-c libvpx-vp9 \
-r 15 \
--pixel-format yuv420p \
--no-audio
# After recording stops, convert to GIF
if [ -f "$temp_video" ]; then
notify-send "Converting to GIF" "Processing recording..."
# Create high-quality GIF with optimized palette
# Using ffmpeg with palette generation for better colors
ffmpeg -i "$temp_video" \
-vf "fps=15,scale=iw:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=128:stats_mode=diff[p];[s1][p]paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle" \
-loop 0 \
"$output_file" 2>/tmp/gif_conversion.log
if [ $? -eq 0 ]; then
# Clean up temp file
rm -f "$temp_video"
rm -f /tmp/gif_temp_video.txt
# Copy to clipboard and send notification with actions
wl-copy <"$output_file"
send_recording_notification "$output_file"
else
error=$(cat /tmp/gif_conversion.log | tail -n 5)
notify-send "GIF Conversion Failed" "Error: $error"
rm -f "$temp_video"
rm -f /tmp/gif_temp_video.txt
fi
fi
}
# Function to find the latest video file for conversion
find_latest_video() {
local format="$1"
local recording_dir="${HOME}/Videos/Recordings"
case "$format" in
"webm"|"iphone")
# For webm and iphone, only look for MKV files
find "$recording_dir" -name "*.mkv" -type f -printf '%T@ %p\n' 2>/dev/null | sort -n | tail -1 | cut -d' ' -f2-
;;
"youtube"|"gif")
# For youtube and gif, look for both MKV and MP4 files
find "$recording_dir" \( -name "*.mkv" -o -name "*.mp4" \) -type f -printf '%T@ %p\n' 2>/dev/null | sort -n | tail -1 | cut -d' ' -f2-
;;
*)
echo ""
;;
esac
}
# Function to resolve video file path
resolve_video_file() {
local format="$1"
local file_param="$2"
local recording_dir="${HOME}/Videos/Recordings"
if [ -n "$file_param" ]; then
# File parameter provided
if [ -f "$file_param" ]; then
# Full path provided and exists
echo "$file_param"
elif [ -f "$recording_dir/$file_param" ]; then
# Filename provided, exists in recordings folder
echo "$recording_dir/$file_param"
else
echo ""
fi
else
# No file parameter, find latest
find_latest_video "$format"
fi
}
# Parse command
COMMAND="$1"
TARGET="$2"
FILE_PARAM="$3" # Optional file parameter for convert command
# Set up file paths
IMG="${HOME}/Pictures/Screenshots/$(date +%Y-%m-%d_%H-%m-%s).png"
VID="${HOME}/Videos/Recordings/$(date +%Y-%m-%d_%H-%m-%s).mkv"
case "$COMMAND" in
"screenshot")
case "$TARGET" in
"selection")
grim -g "$(slurp)" "$IMG"
wl-copy <"$IMG"
send_screenshot_notification "$IMG"
;;
"eDP-1")
grim -c -o eDP-1 "$IMG"
wl-copy <"$IMG"
send_screenshot_notification "$IMG"
;;
"HDMI-A-1")
grim -c -o HDMI-A-1 "$IMG"
wl-copy <"$IMG"
send_screenshot_notification "$IMG"
;;
"both")
grim -c -o eDP-1 "${IMG//.png/-eDP-1.png}"
grim -c -o HDMI-A-1 "${IMG//.png/-HDMI-A-1.png}"
montage "${IMG//.png/-eDP-1.png}" "${IMG//.png/-HDMI-A-1.png}" -tile 2x1 -geometry +0+0 "$IMG"
wl-copy <"$IMG"
rm "${IMG//.png/-eDP-1.png}" "${IMG//.png/-HDMI-A-1.png}"
send_screenshot_notification "$IMG"
;;
*)
echo "Error: Invalid screenshot target '$TARGET'"
usage
;;
esac
;;
"record")
case "$TARGET" in
"stop")
wf-recorder_check
;;
"selection")
wf-recorder_check
echo "$VID" >/tmp/recording.txt
date +%s >/tmp/recording_start_time.txt
record_video "$VID" -g "$(slurp)"
;;
"eDP-1")
wf-recorder_check
echo "$VID" >/tmp/recording.txt
date +%s >/tmp/recording_start_time.txt
record_video "$VID" -a -o eDP-1
;;
"HDMI-A-1")
wf-recorder_check
echo "$VID" >/tmp/recording.txt
date +%s >/tmp/recording_start_time.txt
record_video "$VID" -a -o HDMI-A-1
;;
*)
echo "Error: Invalid record target '$TARGET'"
usage
;;
esac
;;
"record-noaudio")
case "$TARGET" in
"stop")
wf-recorder_check
;;
"selection")
wf-recorder_check
echo "$VID" >/tmp/recording.txt
date +%s >/tmp/recording_start_time.txt
record_video_noaudio "$VID" -g "$(slurp)"
;;
"eDP-1")
wf-recorder_check
echo "$VID" >/tmp/recording.txt
date +%s >/tmp/recording_start_time.txt
record_video_noaudio "$VID" -o eDP-1
;;
"HDMI-A-1")
wf-recorder_check
echo "$VID" >/tmp/recording.txt
date +%s >/tmp/recording_start_time.txt
record_video_noaudio "$VID" -o HDMI-A-1
;;
*)
echo "Error: Invalid record-noaudio target '$TARGET'"
usage
;;
esac
;;
"record-hq")
# Change file extension to mp4 for high quality recordings
VID_HQ="${HOME}/Videos/Recordings/$(date +%Y-%m-%d_%H-%m-%s)-hq.mp4"
case "$TARGET" in
"stop")
wf-recorder_check
;;
"selection")
wf-recorder_check
echo "$VID_HQ" >/tmp/recording.txt
date +%s >/tmp/recording_start_time.txt
notify-send "High Quality Recording" "Starting YouTube-quality recording..."
record_high_quality "$VID_HQ" -g "$(slurp)"
;;
"eDP-1")
wf-recorder_check
echo "$VID_HQ" >/tmp/recording.txt
date +%s >/tmp/recording_start_time.txt
notify-send "High Quality Recording" "Starting YouTube-quality recording on eDP-1..."
record_high_quality "$VID_HQ" -a -o eDP-1
;;
"HDMI-A-1")
wf-recorder_check
echo "$VID_HQ" >/tmp/recording.txt
date +%s >/tmp/recording_start_time.txt
notify-send "High Quality Recording" "Starting YouTube-quality recording on HDMI-A-1..."
record_high_quality "$VID_HQ" -a -o HDMI-A-1
;;
*)
echo "Error: Invalid record-hq target '$TARGET'"
usage
;;
esac
;;
"record-gif")
# GIF files go to a specific location
GIF="${HOME}/Videos/Recordings/$(date +%Y-%m-%d_%H-%m-%s).gif"
case "$TARGET" in
"stop")
wf-recorder_check
;;
"selection")
wf-recorder_check
echo "$GIF" >/tmp/recording.txt
date +%s >/tmp/recording_start_time.txt
notify-send "GIF Recording" "Starting GIF recording (15 FPS)..."
record_gif "$GIF" -g "$(slurp)"
;;
"eDP-1")
wf-recorder_check
echo "$GIF" >/tmp/recording.txt
date +%s >/tmp/recording_start_time.txt
notify-send "GIF Recording" "Starting GIF recording on eDP-1..."
record_gif "$GIF" -o eDP-1
;;
"HDMI-A-1")
wf-recorder_check
echo "$GIF" >/tmp/recording.txt
date +%s >/tmp/recording_start_time.txt
notify-send "GIF Recording" "Starting GIF recording on HDMI-A-1..."
record_gif "$GIF" -o HDMI-A-1
;;
*)
echo "Error: Invalid record-gif target '$TARGET'"
usage
;;
esac
;;
"status")
# Check if wf-recorder is running
if pgrep -x "wf-recorder" >/dev/null; then
echo "true"
exit 0
else
echo "false"
exit 0
fi
;;
"convert")
case "$TARGET" in
"webm")
# Check if ffmpeg is installed
if ! command -v ffmpeg >/dev/null 2>&1; then
notify-send "Error" "ffmpeg is not installed. Please install it to use this feature."
exit 1
fi
# Resolve the video file to convert
video_file=$(resolve_video_file "webm" "$FILE_PARAM")
if [ -z "$video_file" ] || [ ! -f "$video_file" ]; then
if [ -n "$FILE_PARAM" ]; then
notify-send "WebM Conversion Error" "File not found: $FILE_PARAM"
else
notify-send "WebM Conversion Error" "No MKV files found in Recordings folder"
fi
exit 1
fi
# Ensure it's an MKV file
if [[ "$video_file" != *.mkv ]]; then
notify-send "WebM Conversion Error" "Only MKV files can be converted to WebM. Found: $(basename "$video_file")"
exit 1
fi
webm_file="${video_file%.mkv}.webm"
# Check if webm version doesn't already exist
if [ -f "$webm_file" ]; then
notify-send "WebM Conversion Skipped" "WebM version already exists: $(basename "$webm_file")"
exit 0
fi
notify-send "Converting to WebM" "Processing: $(basename "$video_file")"
# Convert the file
ffmpeg -y -i "$video_file" -c:v libvpx -b:v 1M -c:a libvorbis "$webm_file" 2>/tmp/ffmpeg_error.log
if [ $? -eq 0 ]; then
file_size=$(du -h "$webm_file" | cut -f1)
notify-send "WebM Conversion Success" "$(basename "$video_file") → $(basename "$webm_file") ($file_size)"
else
error=$(cat /tmp/ffmpeg_error.log | tail -n 5)
notify-send "WebM Conversion Failed" "Error: $error"
fi
;;
"iphone")
# Check if ffmpeg is installed
if ! command -v ffmpeg >/dev/null 2>&1; then
notify-send "Error" "ffmpeg is not installed. Please install it to use this feature."
exit 1
fi
# Resolve the video file to convert
video_file=$(resolve_video_file "iphone" "$FILE_PARAM")
if [ -z "$video_file" ] || [ ! -f "$video_file" ]; then
if [ -n "$FILE_PARAM" ]; then
notify-send "iPhone Conversion Error" "File not found: $FILE_PARAM"
else
notify-send "iPhone Conversion Error" "No MKV files found in Recordings folder"
fi
exit 1
fi
# Ensure it's an MKV file
if [[ "$video_file" != *.mkv ]]; then
notify-send "iPhone Conversion Error" "Only MKV files can be converted for iPhone. Found: $(basename "$video_file")"
exit 1
fi
base_filename=$(basename "$video_file")
# Skip files with "iphone" in the filename
if [[ $base_filename == *"iphone"* ]]; then
notify-send "iPhone Conversion Skipped" "File already appears to be iPhone format: $(basename "$video_file")"
exit 0
fi
iphone_file="${video_file%.mkv}-iphone.mp4"
# Check if iPhone version doesn't already exist
if [ -f "$iphone_file" ]; then
notify-send "iPhone Conversion Skipped" "iPhone version already exists: $(basename "$iphone_file")"
exit 0
fi
notify-send "Converting for iPhone" "Processing: $(basename "$video_file")"
# Convert the file
ffmpeg -y -i "$video_file" -vcodec h264 -acodec aac "$iphone_file" 2>/tmp/ffmpeg_error.log
if [ $? -eq 0 ]; then
file_size=$(du -h "$iphone_file" | cut -f1)
notify-send "iPhone Conversion Success" "$(basename "$video_file") → $(basename "$iphone_file") ($file_size)"
else
error=$(cat /tmp/ffmpeg_error.log | tail -n 5)
notify-send "iPhone Conversion Failed" "Error: $error"
fi
;;
"youtube")
# Check if ffmpeg is installed
if ! command -v ffmpeg >/dev/null 2>&1; then
notify-send "Error" "ffmpeg is not installed. Please install it to use this feature."
exit 1
fi
# Resolve the video file to convert
video_file=$(resolve_video_file "youtube" "$FILE_PARAM")
if [ -z "$video_file" ] || [ ! -f "$video_file" ]; then
if [ -n "$FILE_PARAM" ]; then
notify-send "YouTube Conversion Error" "File not found: $FILE_PARAM"
else
notify-send "YouTube Conversion Error" "No video files found in Recordings folder"
fi
exit 1
fi
base_filename=$(basename "$video_file")
# Skip files already marked as YouTube uploads
if [[ $base_filename == *"youtube"* ]]; then
notify-send "YouTube Conversion Skipped" "File already appears to be YouTube format: $(basename "$video_file")"
exit 0
fi
# Create YouTube optimized filename
youtube_file="${video_file%.*}-youtube.mp4"
# Check if YouTube version doesn't already exist
if [ -f "$youtube_file" ]; then
notify-send "YouTube Conversion Skipped" "YouTube version already exists: $(basename "$youtube_file")"
exit 0
fi
notify-send "Converting for YouTube" "Processing: $(basename "$video_file")"
# YouTube recommended settings:
# - H.264 codec with High profile
# - 1080p or source resolution
# - 60fps or source framerate
# - High bitrate for quality (8-12 Mbps for 1080p60)
# - AAC audio at 384kbps
# - yuv420p pixel format for compatibility
# - Keyframe interval of 2 seconds (GOP)
# - No filters to preserve original colors
ffmpeg -y -i "$video_file" \
-c:v libx264 \
-profile:v high \
-preset slow \
-crf 18 \
-pix_fmt yuv420p \
-c:a aac \
-b:a 384k \
-movflags +faststart \
"$youtube_file" 2>/tmp/ffmpeg_error.log
if [ $? -eq 0 ]; then
file_size=$(du -h "$youtube_file" | cut -f1)
notify-send "YouTube Conversion Success" "$(basename "$video_file") → $(basename "$youtube_file") ($file_size)"
else
error=$(cat /tmp/ffmpeg_error.log | tail -n 5)
notify-send "YouTube Conversion Failed" "Error converting $(basename "$video_file"): $error"
fi
;;
"gif")
# Check if ffmpeg is installed
if ! command -v ffmpeg >/dev/null 2>&1; then
notify-send "Error" "ffmpeg is not installed. Please install it to use this feature."
exit 1
fi
# Resolve the video file to convert
video_file=$(resolve_video_file "gif" "$FILE_PARAM")
if [ -z "$video_file" ] || [ ! -f "$video_file" ]; then
if [ -n "$FILE_PARAM" ]; then
notify-send "GIF Conversion Error" "File not found: $FILE_PARAM"
else
notify-send "GIF Conversion Error" "No video files found in Recordings folder"
fi
exit 1
fi
base_filename=$(basename "$video_file")
# Skip files already GIFs
if [[ $base_filename == *.gif ]]; then
notify-send "GIF Conversion Skipped" "File is already a GIF: $(basename "$video_file")"
exit 0
fi
# Create GIF filename
gif_file="${video_file%.*}.gif"
# Check if GIF version doesn't already exist
if [ -f "$gif_file" ]; then
notify-send "GIF Conversion Skipped" "GIF version already exists: $(basename "$gif_file")"
exit 0
fi
notify-send "Converting to GIF" "Processing: $(basename "$video_file")"
# Get video dimensions for scaling
width=$(ffprobe -v error -select_streams v:0 -show_entries stream=width -of csv=s=x:p=0 "$video_file")
# Scale down if wider than 800px to keep file size reasonable
if [ "$width" -gt 800 ]; then
scale_filter="scale=800:-1:flags=lanczos,"
else
scale_filter=""
fi
# Create high-quality GIF with optimized palette
ffmpeg -i "$video_file" \
-vf "${scale_filter}fps=15,split[s0][s1];[s0]palettegen=max_colors=256:stats_mode=diff[p];[s1][p]paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle" \
-loop 0 \
"$gif_file" 2>/tmp/ffmpeg_error.log
if [ $? -eq 0 ]; then
file_size=$(du -h "$gif_file" | cut -f1)
notify-send "GIF Conversion Success" "$(basename "$video_file") → $(basename "$gif_file") ($file_size)"
send_recording_notification "$gif_file"
else
error=$(cat /tmp/ffmpeg_error.log | tail -n 5)
notify-send "GIF Conversion Failed" "Error converting $(basename "$video_file"): $error"
fi
;;
*)
echo "Error: Invalid convert format '$TARGET'"
usage
;;
esac
;;
*)
echo "Error: Invalid command '$COMMAND'"
usage
;;
esac