121 lines
3.8 KiB
Bash
Executable File
121 lines
3.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# ==========================================
|
|
# CONFIGURATION (Edit these!)
|
|
# ==========================================
|
|
GOTIFY_TOKEN= # <--- 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
|