1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | #!/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"
|