#!/bin/bash

# Needs dolphin-emu, wit, 7z binaries. Should all be apt-gettable in Debian/Ubuntu
# You'll need to turn dry-run off to use it. Verify the conversion log before using it on your data

# --- Configuration ---
SOURCE_DIR="./"
WII_ROMS="./wii"
IMAGE_DIR="$WII_ROMS/images"
TEMP_DIR="./temp_extract"
LOG_FILE="./conversion.log"

# Binaries
DOLPHIN="/usr/games/dolphin-tool"
WIT=$(which wit)
SEVENZ=$(which 7z)

# Defaults
DRY_RUN=true
DEBUG=true

# --- Argument Parsing ---
for arg in "$@"; do
    case $arg in
        --dry-run) DRY_RUN=true ;;
        --debug)   DEBUG=true ;;
        *)         echo "Unknown argument: $arg"; exit 1 ;;
    esac
done

# --- Setup ---
mkdir -p "$WII_ROMS" "$IMAGE_DIR" "$TEMP_DIR"
echo "--- Conversion Started: $(date) ---" | tee -a "$LOG_FILE"
[[ "$DRY_RUN" == true ]] && echo "[DRY-RUN MODE] Active." | tee -a "$LOG_FILE"

# Initialize gamelist.xml
GAMELIST="$WII_ROMS/gamelist.xml"
if [[ "$DRY_RUN" == false ]]; then
    echo '<?xml version="1.0"?>' > "$GAMELIST"
    echo '<gameList>' >> "$GAMELIST"
fi

# --- Main Loop ---
for game_folder in "$SOURCE_DIR"/*/; do
    [ -d "$game_folder" ] || continue
    FOLDER_NAME=$(basename "$game_folder")
    echo "-------------------------------------------------------" | tee -a "$LOG_FILE"
    echo "Processing: $FOLDER_NAME" | tee -a "$LOG_FILE"

    # 1. Source Discovery Logic
    # Check for loose files first, then fallback to 7z
    LOOSE_FILE=$(find "$game_folder" -maxdepth 1 -type f \( -name "*.iso" -o -name "*.wbfs" \) | head -n 1)
    ARCHIVE=$(find "$game_folder" -maxdepth 1 -name "*.7z" | head -n 1)

    WORKING_FILE=""

    if [[ -n "$LOOSE_FILE" ]]; then
        echo "  [FOUND] Loose file: $(basename "$LOOSE_FILE")" | tee -a "$LOG_FILE"
        WORKING_FILE="$LOOSE_FILE"
    elif [[ -n "$ARCHIVE" ]]; then
        echo "  [EXTRACTING] $(basename "$ARCHIVE")..." | tee -a "$LOG_FILE"
        if [[ "$DRY_RUN" == false ]]; then
            $SEVENZ e "$ARCHIVE" -o"$TEMP_DIR" -y > /dev/null
            WORKING_FILE=$(find "$TEMP_DIR" -maxdepth 1 -type f \( -name "*.iso" -o -name "*.wbfs" \) | head -n 1)
        else
            WORKING_FILE="DRY_RUN_PLACEHOLDER"
        fi
    else
        echo "  [SKIP] No ISO, WBFS, or 7z found in $FOLDER_NAME." | tee -a "$LOG_FILE"
        continue
    fi

    # 2. Identification (Old-school WIT compatibility)
    if [[ "$DRY_RUN" == true ]]; then
        SAFE_NAME=$(echo "$FOLDER_NAME" | sed 's/[/\\:?*<>|]//g')
        FULL_NAME="Dry Run: $FOLDER_NAME"
    elif [[ -n "$WORKING_FILE" ]]; then
        # wit LIST -l provides: "ID6 MiB Reg. Title"
        # We skip the 3 header lines and the 2 footer lines
        RAW_LINE=$($WIT LIST -l "$WORKING_FILE" | sed -n '4p')

        # ID is the first 6 characters
        GAME_ID=$(echo "$RAW_LINE" | awk '{print $1}')

        # Title starts from the 4th column (after ID, Size, and Region)
        GAME_TITLE=$(echo "$RAW_LINE" | awk '{for(i=4;i<=NF;i++) printf $i" "; print ""}' | xargs)

        if [[ -n "$GAME_ID" && -n "$GAME_TITLE" ]]; then
            FULL_NAME="$GAME_TITLE [$GAME_ID]"
            SAFE_NAME=$(echo "$FULL_NAME" | sed 's/[/\\:?*<>|]//g' | xargs)
        fi
    fi        

    # 3. Processing
    if [[ -n "$SAFE_NAME" ]]; then
        # Conversion
        if [[ "$DRY_RUN" == true ]]; then
            echo "  [DRY-RUN] Would convert to $SAFE_NAME.rvz"
        else
            echo "  [CONVERT] Creating $SAFE_NAME.rvz..." | tee -a "$LOG_FILE"
            $DOLPHIN convert -i "$WORKING_FILE" -o "$WII_ROMS/$SAFE_NAME.rvz" -f rvz -c zstd -l 5 -b 131072 >> "$LOG_FILE" 2>&1
        fi




# Image Logic
        IMG_SOURCE=$(find "$game_folder" -maxdepth 1 -name "*.jpg" | head -n 1)
        if [[ -n "$IMG_SOURCE" ]]; then
            if [[ "$DRY_RUN" == false ]]; then
                cp "$IMG_SOURCE" "$IMAGE_DIR/$SAFE_NAME.jpg"
            fi
            echo "  [IMAGE] Associated: $(basename "$IMG_SOURCE")" | tee -a "$LOG_FILE"
        fi

        # XML Entry
        if [[ "$DRY_RUN" == false ]]; then
            cat <<EOF >> "$GAMELIST"
    <game>
        <path>./$SAFE_NAME.rvz</path>
        <name>$FULL_NAME</name>
        <image>./images/$SAFE_NAME.jpg</image>
    </game>
EOF
        fi
    else
        echo "  [ERROR] Could not determine game ID for $FOLDER_NAME" | tee -a "$LOG_FILE"
    fi



# 4. Cleanup (only if we extracted)
    [[ -d "$TEMP_DIR" && "$DRY_RUN" == false ]] && rm -rf "$TEMP_DIR"/*
done

[[ "$DRY_RUN" == false ]] && echo "</gameList>" >> "$GAMELIST"
echo "-------------------------------------------------------" | tee -a "$LOG_FILE"
echo "Finished. Log saved to $LOG_FILE"
Edit

Pub: 09 Feb 2026 20:24 UTC

Views: 29