#!/usr/bin/env bash # Convert ISO files to MKV format with automatic season/episode naming set -euo pipefail SEARCH_DIR="${1:-$(pwd)}" OUT_DIR="${2:-$SEARCH_DIR/out}" if [[ ! -d "$SEARCH_DIR" ]]; then echo "[ERROR] Search directory '$SEARCH_DIR' does not exist." exit 1 fi mkdir -p "$OUT_DIR" prev_season="" ep=1 echo "[INFO] Searching for ISO files in '$SEARCH_DIR'..." find "$SEARCH_DIR" -type f -iname '*.iso' | sort | while read -r iso; do echo "[INFO] Processing: $iso" parent=$(basename "$(dirname "$iso")") if [[ ! $parent =~ S([0-9]+) ]]; then echo "[WARN] Skipping '$iso' - parent directory doesn't match season pattern." continue fi season=$(printf "%02d" "${BASH_REMATCH[1]}") if [[ "$season" != "$prev_season" ]]; then ep=1 prev_season="$season" fi ripdir="$OUT_DIR/temp/$parent" mkdir -p "$ripdir" "$OUT_DIR/Season $season" echo "[INFO] Ripping ISO with MakeMKV..." if ! snap run makemkv.makemkvcon -r mkv --minlength=1800 iso:"$iso" all "$ripdir"; then echo "[ERROR] Failed to rip '$iso'. Skipping." continue fi for mkv in "$ripdir"/*.mkv; do [[ -e "$mkv" ]] || continue out="$OUT_DIR/Season $season/S${season}E$(printf "%02d" "$ep").mkv" echo "[INFO] Converting to: $out" if ffmpeg -nostdin -hide_banner -loglevel error -i "$mkv" \ -map 0:v -map 0:a:m:language:eng -map 0:s:m:language:eng \ -c copy "$out"; then rm "$mkv" ((ep++)) else echo "[ERROR] FFmpeg conversion failed for '$mkv'." fi done done echo "[INFO] Conversion complete. Output in '$OUT_DIR'."