#!/usr/bin/env bash # IMPORTANT: Ensure xournalpp is installed and in your PATH for .xopp conversions. # For example, on Debian/Ubuntu: sudo apt install xournalpp FILES=$(echo -e "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS") if [ -z "$FILES" ]; then zenity --error --text="No files selected." exit 1 fi first_file=$(echo "$FILES" | head -n1) EXT="${first_file##*.}" EXT_LOWER=$(echo "$EXT" | tr '[:upper:]' '[:lower:]') # Determine the primary category of the selected files based on the first file MIME_CATEGORY="" case "$EXT_LOWER" in jpg|jpeg|png|webp) MIME_CATEGORY="image" ;; pdf) MIME_CATEGORY="pdf" ;; xopp) # NEW: Xournal++ file category MIME_CATEGORY="xopp" ;; mp3|ogg|wav|flac) MIME_CATEGORY="audio" ;; mp4|webm|avi|mkv) MIME_CATEGORY="video" ;; *) zenity --error --text="Unsupported file extension for the first selected file: .$EXT" exit 1 ;; esac # Define conversion options based on the determined MIME_CATEGORY OPTIONS="" case "$MIME_CATEGORY" in image) OPTIONS="JPEG\tjpg\nPNG\tpng\nWEBP\twebp\nPDF\tpdf" ;; pdf) OPTIONS="PDF\tpdf" # PDF files can only be output as PDF in this script's current logic ;; xopp) # NEW: Options for Xournal++ files OPTIONS="PDF\tpdf" ;; audio) OPTIONS="MP3\tmp3\nOGG\togg\nWAV\twav\nFLAC\tflac" ;; video) OPTIONS="MP4\tmp4\nWEBM\twebm\nAVI\tavi\nMKV\tmkv\nMP3\tmp3\nOGG\togg\nWAV\twav\nFLAC\tflac" ;; esac # Prompt user for output format OUTPUT_EXT=$(zenity --list \ --title="Convert $MIME_CATEGORY files" \ --print-column=2 \ --column="Format" --column="Extension" \ $(echo -e "$OPTIONS")) if [ -z "$OUTPUT_EXT" ]; then exit 0; fi # User cancelled QUALITY="" case "$OUTPUT_EXT" in jpg|jpeg) QUALITY=$(zenity --scale --title="Select JPEG quality (1-100)" --min-value=1 --max-value=100 --value=85) ;; mp3|ogg|wav) QUALITY=$(zenity --scale --title="Select audio bitrate (kbps)" --min-value=64 --max-value=320 --value=192 --step=16) ;; mp4|webm|avi|mkv) QUALITY=$(zenity --scale --title="Select video bitrate (kbps)" --min-value=500 --max-value=5000 --value=2000 --step=100) ;; # No quality prompt for PDF or XOPP esac total=$(echo "$FILES" | wc -l) count=0 ( IFS=$'\n' for FILE in $FILES; do count=$((count + 1)) echo $(( count * 100 / total )) # update progress bar echo "Converting: $(basename "$FILE")" DIR=$(dirname "$FILE") BASENAME=$(basename "$FILE") NAME="${BASENAME%.*}" OUTPUT_PATH="$DIR/$NAME.$OUTPUT_EXT" EXT="${FILE##*.}" EXT_LOWER=$(echo "$EXT" | tr '[:upper:]' '[:lower:]') # Determine the category of the CURRENT file in the loop FILE_CATEGORY="unknown" case "$EXT_LOWER" in jpg|jpeg|png|webp) FILE_CATEGORY="image" ;; pdf) FILE_CATEGORY="pdf" ;; xopp) # NEW: Detect xopp for individual file processing FILE_CATEGORY="xopp" ;; mp3|ogg|wav|flac) # Note: 'flac' input is audio but output options might be limited FILE_CATEGORY="audio" ;; mp4|webm|avi|mkv) FILE_CATEGORY="video" ;; esac if [ "$FILE_CATEGORY" = "unknown" ]; then echo "Skipping unsupported file: $FILE" >&2 continue fi # Run commands with error output visible (not silent) case "$FILE_CATEGORY" in image|pdf) # ImageMagick's convert can handle images and PDF inputs if [ -n "$QUALITY" ] && [[ "$OUTPUT_EXT" == jpg || "$OUTPUT_EXT" == jpeg ]]; then convert "$FILE" -quality "$QUALITY" "$OUTPUT_PATH" || echo "Failed to convert $FILE" >&2 else convert "$FILE" "$OUTPUT_PATH" || echo "Failed to convert $FILE" >&2 fi ;; xopp) # NEW: Handle Xournal++ to PDF conversion if [ "$OUTPUT_EXT" = "pdf" ]; then # xournalpp xournalpp -p "$OUTPUT_PATH" "$FILE" || echo "Failed to convert $FILE" >&2 else echo "Skipping $FILE: XOPP files can only be converted to PDF." >&2 fi ;; audio) if [ -n "$QUALITY" ]; then ffmpeg -loglevel error -y -i "$FILE" -b:a "${QUALITY}k" "$OUTPUT_PATH" || echo "Failed to convert $FILE" >&2 else ffmpeg -loglevel error -y -i "$FILE" "$OUTPUT_PATH" || echo "Failed to convert $FILE" >&2 fi ;; video) case "$OUTPUT_EXT" in mp3|ogg|wav|flac) # Convert video to audio if [ -n "$QUALITY" ]; then ffmpeg -loglevel error -y -i "$FILE" -vn -b:a "${QUALITY}k" "$OUTPUT_PATH" || echo "Failed to convert $FILE" >&2 else ffmpeg -loglevel error -y -i "$FILE" -vn "$OUTPUT_PATH" || echo "Failed to convert $FILE" >&2 fi ;; *) # Convert video to another video format if [ -n "$QUALITY" ]; then ffmpeg -loglevel error -y -i "$FILE" -b:v "${QUALITY}k" "$OUTPUT_PATH" || echo "Failed to convert $FILE" >&2 else ffmpeg -loglevel error -y -i "$FILE" "$OUTPUT_PATH" || echo "Failed to convert $FILE" >&2 fi ;; esac ;; esac done ) | zenity --progress --title="Batch converting files..." --percentage=0 --auto-close --width=400