Automatikus ISO → MKV Konvertáló Script Bash-ben

#!/usr/bin/env bash
# DVD ISO -> MP4 konvertáló (összes film)
# Szerzői jog: 2025, YnM
# Szerkesztette: Markus ([email protected])
# Minden jog fenntartva.

ISO_DIR="/media/x/e/[DVD] Rolie Polie Olie 1 - 2 - 3"
OUTPUT_DIR="/media/x/e"
MOUNT_BASE="/mnt/rolie"

# Minimum fájlméret bájtban (pl. 50MB = 52428800 bájt)
# Ez kiszűri a kis menü/trailer fájlokat
MIN_SIZE=52428800

mkdir -p "$OUTPUT_DIR"
mkdir -p "$MOUNT_BASE"

echo "🔍 ISO könyvtár ellenőrzése: $ISO_DIR"
if [ ! -d "$ISO_DIR" ]; then
    echo "❌ HIBA: Az ISO könyvtár nem létezik: $ISO_DIR"
    exit 1
fi

echo "📁 ISO fájlok keresése..."
ls -la "$ISO_DIR"/*.iso 2>/dev/null || echo "⚠️ Nem található .iso fájl a könyvtárban"

for iso in "$ISO_DIR"/*.ISO "$ISO_DIR"/*.iso; do
    [ -e "$iso" ] || continue
    
    echo "🎯 Feldolgozás alatt: $iso"
    
    # ISO fájl neve (kiterjesztés nélkül) - mind .iso, mind .ISO támogatása
    if [[ "$iso" == *.ISO ]]; then
        iso_name=$(basename "$iso" .ISO)
    else
        iso_name=$(basename "$iso" .iso)
    fi
    mount_point="$MOUNT_BASE/$iso_name"
    
    mkdir -p "$mount_point"
    echo "🔹 Mountolás: $iso -> $mount_point"
    sudo mount -o loop "$iso" "$mount_point"
    
    # Keresd meg az összes VTS_XX_1.VOB fájlt (ezek a fő filmek)
    # és szűrd ki a túl kicsiket
    vob_files=$(find "$mount_point/VIDEO_TS" -type f -name "VTS_*_1.VOB" -size +${MIN_SIZE}c | sort)
    
    if [ -n "$vob_files" ]; then
        echo "📁 Talált filmek az ISO-ban:"
        
        while IFS= read -r vob_file; do
            # VTS szám kinyerése (pl. VTS_01_1.VOB -> 01)
            vts_num=$(basename "$vob_file" | grep -o 'VTS_[0-9]*' | cut -d'_' -f2)
            
            # Fájlméret ellenőrzése
            file_size=$(stat -f%z "$vob_file" 2>/dev/null || stat -c%s "$vob_file" 2>/dev/null)
            size_mb=$((file_size / 1024 / 1024))
            
            echo "  📼 VTS_${vts_num} (${size_mb}MB)"
            
            # Időtartam lekérdezése
            duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$vob_file" 2>/dev/null)
            
            if [ -n "$duration" ] && [ "$duration" != "N/A" ]; then
                duration_int=${duration%.*}  # Tizedes rész eltávolítása
                duration_hms=$(printf '%02d:%02d:%02d\n' $((duration_int/3600)) $((duration_int%3600/60)) $((duration_int%60)))
                output_file="$OUTPUT_DIR/${iso_name}_VTS${vts_num}_${duration_hms}.mp4"
            else
                output_file="$OUTPUT_DIR/${iso_name}_VTS${vts_num}.mp4"
            fi
            
            echo "  🎬 Konvertálás: $(basename "$vob_file") -> $(basename "$output_file")"
            
            # FFmpeg konvertálás
            if ffmpeg -hide_banner -loglevel error -i "$vob_file" \
                -c:v libx264 -crf 23 -preset medium \
                -c:a aac -b:a 192k \
                -avoid_negative_ts make_zero \
                "$output_file"; then
                echo "  ✅ Sikeres: $(basename "$output_file")"
            else
                echo "  ❌ Hiba a konvertálás során: $(basename "$vob_file")"
            fi
            
        done <<< "$vob_files"
        
    else
        echo "⚠️ Nem található megfelelő VOB fájl: $iso (min. ${MIN_SIZE} bájt)"
    fi
    
    echo "🔻 Unmount: $mount_point"
    sudo umount "$mount_point"
    rmdir "$mount_point"
    echo ""
done

echo "✅ Minden ISO feldolgozva!"
echo "📂 Kimeneti könyvtár: $OUTPUT_DIR"
> root@ynm:/media/x/e# ./convert.sh
> 🔍 ISO könyvtár ellenőrzése: /media/x/e/[DVD] Rolie Polie Olie 1 - 2 - 3
> 📁 ISO fájlok keresése...
> ⚠️ Nem található .iso fájl a könyvtárban
> 🎯 Feldolgozás alatt: /media/x/e/[DVD] Rolie Polie Olie 1 - 2 - 3/Rolie Polie Olie 1.ISO
> 🔹 Mountolás: /media/x/e/[DVD] Rolie Polie Olie 1 - 2 - 3/Rolie Polie Olie 1.ISO -> /mnt/rolie/Rolie Polie Olie 1
> mount: /mnt/rolie/Rolie Polie Olie 1: WARNING: source write-protected, mounted read-only.
> 📁 Talált filmek az ISO-ban:
>   📼 VTS_01 (1023MB)
>   🎬 Konvertálás: VTS_01_1.VOB -> Rolie Polie Olie 1_VTS01_00:17:09.mp4
> [mpeg2video @ 0x55bc79ca9a40] ac-tex damaged at 15 14
> [mpeg2video @ 0x55bc79ca9a40] Warning MVs not available
>   ✅ Sikeres: Rolie Polie Olie 1_VTS01_00:17:09.mp4
> 🔻 Unmount: /mnt/rolie/Rolie Polie Olie 1
> 
> 🎯 Feldolgozás alatt: /media/x/e/[DVD] Rolie Polie Olie 1 - 2 - 3/Rolie Polie Olie 2.ISO
> 🔹 Mountolás: /media/x/e/[DVD] Rolie Polie Olie 1 - 2 - 3/Rolie Polie Olie 2.ISO -> /mnt/rolie/Rolie Polie Olie 2
> mount: /mnt/rolie/Rolie Polie Olie 2: WARNING: source write-protected, mounted read-only.
> 📁 Talált filmek az ISO-ban:
>   📼 VTS_01 (1023MB)
>   🎬 Konvertálás: VTS_01_1.VOB -> Rolie Polie Olie 2_VTS01_00:17:09.mp4
#!/usr/bin/env bash
# DVD ISO -> MP4 konvertáló (hibatűrő verzió)
# Szerzői jog: 2025, YnM
# Szerkesztette: Markus ([email protected])
# Minden jog fenntartva.

ISO_DIR="/media/x/e/[DVD] Rolie Polie Olie 1 - 2 - 3"
OUTPUT_DIR="/media/x/e"
MOUNT_BASE="/mnt/rolie"

mkdir -p "$OUTPUT_DIR"
mkdir -p "$MOUNT_BASE"

echo "🔍 ISO könyvtár ellenőrzése: $ISO_DIR"
if [ ! -d "$ISO_DIR" ]; then
    echo "❌ HIBA: Az ISO könyvtár nem létezik: $ISO_DIR"
    exit 1
fi

echo "📁 ISO fájlok keresése..."

iso_counter=1
for iso in "$ISO_DIR"/*.ISO "$ISO_DIR"/*.iso; do
    [ -e "$iso" ] || continue

    echo "🎯 Feldolgozás alatt: $iso"

    # ISO fájl neve (kiterjesztés nélkül)
    if [[ "$iso" == *.ISO ]]; then
        iso_name=$(basename "$iso" .ISO)
    else
        iso_name=$(basename "$iso" .iso)
    fi

    # Szóköz-mentes mount pont
    mount_point="$MOUNT_BASE/iso$iso_counter"

    mkdir -p "$mount_point"
    echo "🔹 Mountolás: $iso -> $mount_point"
    sudo mount -o loop "$iso" "$mount_point"

    # Keressük meg a VTS számokat
    vts_nums=$(ls "$mount_point/VIDEO_TS"/VTS_*_1.VOB 2>/dev/null | sed 's/.*VTS_\([0-9]*\)_1\.VOB/\1/' | sort -u)

    if [ -n "$vts_nums" ]; then
        echo "📁 Talált VTS csoportok az ISO-ban:"

        for vts_num in $vts_nums; do
            echo "🔍 VTS_${vts_num} feldolgozása:"

            # Gyűjtsük össze az összes VTS_XX_Y.VOB fájlt (Y >= 1)
            vts_files=()
            while IFS= read -r -d '' vob; do
                if [[ ! "$vob" =~ _0\.VOB$ ]]; then
                    vts_files+=("$vob")
                fi
            done < <(find "$mount_point/VIDEO_TS" -name "VTS_${vts_num}_*.VOB" -print0 | sort -z)

            echo "  Talált fájlok: ${#vts_files[@]} db"

            if [ ${#vts_files[@]} -gt 0 ]; then
                # Első fájlból időtartam
                first_file="${vts_files[0]}"
                duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$first_file" 2>/dev/null)

                if [ -n "$duration" ] && [ "$duration" != "N/A" ]; then
                    duration_int=${duration%.*}
                    duration_hms=$(printf '%02d:%02d:%02d\n' $((duration_int/3600)) $((duration_int%3600/60)) $((duration_int%60)))
                    output_file="$OUTPUT_DIR/${iso_name}_VTS${vts_num}_${duration_hms}.mp4"
                else
                    output_file="$OUTPUT_DIR/${iso_name}_VTS${vts_num}.mp4"
                fi

                # Ellenőrizzük, hogy már létezik-e a fájl
                if [ -f "$output_file" ]; then
                    echo "  ⏭️ Már létezik: $(basename "$output_file")"
                    continue
                fi

                echo "  🎬 Konvertálás: VTS_${vts_num} -> $(basename "$output_file")"

                # Robusztus konvertálási beállítások
                if [ ${#vts_files[@]} -eq 1 ]; then
                    # Egyetlen fájl - hibatűrő beállítások
                    echo "  Debug: Egyetlen fájl konvertálása hibatűrő módon..."
                    ffmpeg -hide_banner -loglevel warning \
                        -fflags +genpts+igndts \
                        -err_detect ignore_err \
                        -i "$first_file" \
                        -c:v libx264 -crf 23 -preset medium \
                        -c:a aac -b:a 192k \
                        -avoid_negative_ts make_zero \
                        -max_muxing_queue_size 1024 \
                        -y "$output_file"
                    
                    conversion_result=$?
                else
                    # Több fájl - concat módszer hibatűréssel
                    temp_list="/tmp/concat_${vts_num}_$$.txt"
                    > "$temp_list"
                    
                    for vts_file in "${vts_files[@]}"; do
                        echo "file '$vts_file'" >> "$temp_list"
                    done

                    echo "  Debug: Concat lista tartalma:"
                    cat "$temp_list"
                    echo "  Debug: Több fájl konvertálása hibatűrő módon..."

                    ffmpeg -hide_banner -loglevel warning \
                        -fflags +genpts+igndts \
                        -err_detect ignore_err \
                        -f concat -safe 0 -i "$temp_list" \
                        -c:v libx264 -crf 23 -preset medium \
                        -c:a aac -b:a 192k \
                        -avoid_negative_ts make_zero \
                        -max_muxing_queue_size 1024 \
                        -y "$output_file"
                    
                    conversion_result=$?
                    rm -f "$temp_list"
                fi

                echo "  Debug: FFmpeg kilépési kód: $conversion_result"

                if [ $conversion_result -eq 0 ]; then
                    echo "  ✅ Sikeres: $(basename "$output_file")"
                    
                    # Ellenőrizzük a kimeneti fájl méretét
                    if [ -f "$output_file" ]; then
                        output_size=$(ls -lh "$output_file" | awk '{print $5}')
                        echo "  📊 Kimeneti fájl mérete: $output_size"
                    fi
                else
                    echo "  ❌ Hiba a konvertálás során: VTS_${vts_num}"
                    
                    # Ha a concat módszer nem működött, próbáljuk egyenként
                    if [ ${#vts_files[@]} -gt 1 ]; then
                        echo "  🔄 Próbálkozás egyenként való konvertálással..."
                        part_counter=1
                        for vts_file in "${vts_files[@]}"; do
                            part_output="${output_file%.mp4}_part${part_counter}.mp4"
                            echo "    Rész $part_counter: $(basename "$part_output")"
                            
                            ffmpeg -hide_banner -loglevel warning \
                                -fflags +genpts+igndts \
                                -err_detect ignore_err \
                                -i "$vts_file" \
                                -c:v libx264 -crf 23 -preset medium \
                                -c:a aac -b:a 192k \
                                -avoid_negative_ts make_zero \
                                -max_muxing_queue_size 1024 \
                                -y "$part_output"
                            
                            if [ $? -eq 0 ]; then
                                echo "    ✅ Rész $part_counter sikeres"
                            else
                                echo "    ❌ Rész $part_counter sikertelen"
                            fi
                            part_counter=$((part_counter + 1))
                        done
                    fi
                fi
            else
                echo "  ⚠️ Nem található VOB fájl VTS_${vts_num}-hoz"
            fi
        done
    else
        echo "⚠️ Nem található VTS fájl: $iso"
    fi

    echo "🔻 Unmount: $mount_point"
    sudo umount "$mount_point"
    rmdir "$mount_point"
    echo ""
    
    iso_counter=$((iso_counter + 1))
done

echo "✅ Minden ISO feldolgozva!"
echo "📂 Kimeneti könyvtár: $OUTPUT_DIR"