Files
Starship/scripts/compress.sh
T
2026-04-21 15:41:44 +01:00

121 lines
3.8 KiB
Bash
Executable File

#!/bin/bash
# ==========================================
# CONFIGURATION (Edit these!)
# ==========================================
GOTIFY_TOKEN="AH5NXt3g0lSCyfT" # <--- Paste your token here
GOTIFY_URL="https://gotify.marlow.quest"
SRC_DIR="$HOME/Videos/Compress"
OUT_DIR="$SRC_DIR/Complete"
# ==========================================
# DEPENDENCY CHECKS
# ==========================================
for cmd in gum HandBrakeCLI curl awk; do
if ! command -v $cmd &> /dev/null; then
echo "Error: '$cmd' is not installed."
exit 1
fi
done
# Ensure directories exist
mkdir -p "$SRC_DIR"
mkdir -p "$OUT_DIR"
# ==========================================
# GUM UI & SETTINGS
# ==========================================
clear
gum style \
--border double --border-foreground 240 --foreground 208 \
--padding "1 6" --margin "1 1" --align center \
"Video Converter"
# 1. Quality Selection
QUALITY=$(gum input --prompt "Enter Quality Factor (CQ): " --placeholder "35" --width 50)
[ -z "$QUALITY" ] && exit 0
export QUALITY
# 2. Gotify Toggle
if gum confirm "Enable Gotify notification upon completion?" --default=no --affirmative "Yes" --negative "No"; then
if [ -z "$GOTIFY_TOKEN" ]; then
gum style --foreground 196 "!! Warning: Gotify enabled but GOTIFY_TOKEN is empty at top of script. Skipping notification."
GOTIFY_ENABLED=false
else
GOTIFY_ENABLED=true
fi
else
GOTIFY_ENABLED=false
fi
# ==========================================
# FILE PROCESSING
# ==========================================
shopt -s nocaseglob
shopt -s nullglob
cd "$SRC_DIR" || exit 1
files=( *.mp4 *.mkv *.mov *.avi )
if [ ${#files[@]} -eq 0 ]; then
gum style --foreground 208 "No video files found in $SRC_DIR."
exit 0
fi
TOTAL_OLD_BYTES=0
TOTAL_NEW_BYTES=0
FILE_COUNT=0
gum style --foreground 208 --margin "1 0" "Found ${#files[@]} files. Starting queue..."
for f in "${files[@]}"; do
filename=$(basename -- "$f")
basename="${filename%.*}"
export IN_FILE="$f"
export OUT_FILE="$OUT_DIR/${basename}.mkv"
# Size calculations
old_size=$(wc -c < "$f")
old_mb=$(awk "BEGIN {printf \"%.1f\", $old_size/1048576}")
# Spinner & Handbrake
gum spin --spinner minidot --spinner.foreground 208 --title "Encoding: $filename ($old_mb MB)..." -- \
bash -c 'HandBrakeCLI -i "$IN_FILE" -o "$OUT_FILE" -e svt_av1 --encoder-preset 8 -q "$QUALITY" --vfr -l 1080 -E opus -B 128 > /dev/null 2>&1'
if [ $? -eq 0 ] && [ -f "$OUT_FILE" ]; then
new_size=$(wc -c < "$OUT_FILE")
new_mb=$(awk "BEGIN {printf \"%.1f\", $new_size/1048576}")
saved_mb=$(awk "BEGIN {printf \"%.1f\", $old_mb - $new_mb}")
gum style --foreground 76 "$filename"
gum style --foreground 245 " ↳ Size: ${old_mb}MB → ${new_mb}MB (Saved: ${saved_mb}MB)"
TOTAL_OLD_BYTES=$((TOTAL_OLD_BYTES + old_size))
TOTAL_NEW_BYTES=$((TOTAL_NEW_BYTES + new_size))
((FILE_COUNT++))
else
gum style --foreground 196 "✗ Failed: $filename"
fi
echo ""
done
# ==========================================
# SUMMARY & NOTIFICATION
# ==========================================
TOTAL_SAVED_MB=$(awk "BEGIN {printf \"%.1f\", ($TOTAL_OLD_BYTES - TOTAL_NEW_BYTES)/1048576}")
gum style \
--border rounded --border-foreground 208 --foreground 245 \
--padding "1 2" --margin "1 0" \
"Batch Complete! Processed: $FILE_COUNT files | Total Saved: $TOTAL_SAVED_MB MB"
if [ "$GOTIFY_ENABLED" = true ] && [ $FILE_COUNT -gt 0 ]; then
MESSAGE="Finished processing $FILE_COUNT videos. Total space saved: $TOTAL_SAVED_MB MB."
curl -s -S "$GOTIFY_URL/message?token=$GOTIFY_TOKEN" \
-F "title=✅ Video Encoding Complete" \
-F "message=$MESSAGE" \
-F "priority=5" > /dev/null
gum style --foreground 240 " (Gotify notification sent)"
fi