https://l9000.net/w/index.php?title=Backupgame.sh&feed=atom&action=history
Backupgame.sh - Revision history
2024-03-29T15:51:24Z
Revision history for this page on the wiki
MediaWiki 1.38.2
https://l9000.net/w/index.php?title=Backupgame.sh&diff=140&oldid=prev
Ju at 17:51, 10 February 2019
2019-02-10T17:51:53Z
<p></p>
<p><b>New page</b></p><div>Script to rip and compress game console media. Needs cdrdao and p7zip installed.<br />
File format will be CUE/BIN (with backup of TOC) in a 7z archive.<br />
Assists with multi-disc games also.<br />
You probably need to change ROMPATH and TMPPATH to suit your needs. As always, use at your own risk.<br />
[//{{SERVERNAME}}/files/licenses/gpl-3.0.txt Click here] to see the license text for this script.<br />
<br />
<syntaxhighlight lang="bash" line="line"><br />
#!/bin/bash<br />
<br />
# backupgame.sh 0.2 by Ju<br />
# Rips and compresses video game discs<br />
#<br />
# 0.2 changes:<br />
# - swap position of Disc no. and Region in file names (+space separated) to match RetroArch database<br />
# - suggest entering the full region name (ie. USA instead of U), also to match rdb<br />
<br />
# User configuration<br />
<br />
ROMPATH="$HOME/yourROMfolder"<br />
TMPPATH="/tmp"<br />
CONFFILE="$HOME/.backupgamerc"<br />
<br />
# Config file sourced below only contains the game information saved last time<br />
<br />
. $CONFFILE<br />
<br />
trap ctrl_c INT<br />
<br />
function ctrl_c() {<br />
echo "User abort, cleaning up..."<br />
cleanup<br />
exit<br />
}<br />
<br />
function cleanup {<br />
if [ ! -s "$GAMEPATH/$GAMEFILE.7z" ]; then rm -f "$GAMEPATH/$GAMEFILE.7z"; fi<br />
rm -f "$GAMEFILE.bin" "$GAMEFILE.toc.bak" "$GAMEFILE.cue" "$GAMEFILE.log"<br />
cd<br />
rmdir --ignore-fail-on-non-empty "$TMPPATH"<br />
}<br />
<br />
function saveconf {<br />
echo "LASTGAME=\"$GAMENAME\"<br />
LASTDISC=\"$DISCNO\"<br />
LASTSYSTEM=\"$SYSTEM\"<br />
LASTREGION=\"$REGION\"<br />
LASTDRIVE=\"$DRIVEDEV\"<br />
" > $CONFFILE<br />
}<br />
<br />
# Asking user for game name<br />
<br />
read -p "Enter game name [$LASTGAME]: " userinput<br />
GAMENAME="$LASTGAME"<br />
if [ "$userinput" != "" ]; then<br />
GAMENAME="$userinput"<br />
fi<br />
<br />
# Asking user for disc no.<br />
<br />
if [ $LASTDISC == "0" ]; then<br />
DISCNO=0<br />
else<br />
DISCNO=$((LASTDISC+1))<br />
fi<br />
while true; do<br />
read -p "Enter disc number, 0 for single-disc game [$DISCNO]: " userinput<br />
case $userinput in<br />
0) DISCNO="0"; break;;<br />
[123456789]) DISCNO="$userinput"; break;;<br />
"") break;;<br />
*) echo "Only numerical input allowed.";;<br />
esac<br />
done<br />
<br />
if [ "$DISCNO" == "0" ]; then<br />
FDISCNO=""<br />
else<br />
FDISCNO=" (Disc $DISCNO)"<br />
fi<br />
<br />
# Asking user for System<br />
<br />
echo "System list:<br />
0 - Sega Saturn<br />
1 - Sega CD/Mega CD<br />
2 - PlayStation<br />
3 - PlayStation (with subchannels)<br />
4 - PlayStation 2<br />
5 - PC Engine Super CD/Turbo CD"<br />
<br />
while true; do<br />
read -p "Enter system ID, see list above [$LASTSYSTEM]: " userinput<br />
case $userinput in<br />
0) SYSTEM="Sega Saturn"; break;;<br />
1) SYSTEM="Mega CD"; break;;<br />
2) SYSTEM="PlayStation"; break;;<br />
3) SYSTEM="PlayStation (with subchannels) (DONT USE - SBI INSTEAD)"; break;;<br />
4) SYSTEM="PlayStation 2"; break;;<br />
5) SYSTEM="PC Engine CD"; break;;<br />
"") SYSTEM="$LASTSYSTEM"; break;;<br />
*) echo "Invalid system ID";;<br />
esac<br />
done<br />
<br />
SYSTEMPATH="$SYSTEM"<br />
<br />
# Console specific settings<br />
<br />
if [ "$SYSTEM" == "PlayStation" ]; then MOREOPTS="--read-raw --no-mode2-mixed"; fi<br />
if [ "$SYSTEM" == "PlayStation (with subchannels) (DONT USE - SBI INSTEAD)" ]; then MOREOPTS="--read-raw --no-mode2-mixed --read-subchan rw_raw"; SYSTEMPATH="PlayStation"; fi<br />
<br />
# Asking user for game region<br />
<br />
REGION="$LASTREGION"<br />
read -p "Enter game region (i.e. Europe, USA, Japan, etc.) [$LASTREGION]: " userinput<br />
if [ "$userinput" != "" ]; then<br />
REGION="$userinput"<br />
fi<br />
FREGION=" ($REGION)"<br />
<br />
# Asking user for disc drive device<br />
<br />
DRIVEDEV=$LASTDRIVE<br />
read -p "Enter drive device [$DRIVEDEV]: " userinput<br />
if [ "$userinput" != "" ]; then <br />
DRIVEDEV="$userinput"<br />
fi<br />
FDRIVEDEV="/dev/$DRIVEDEV"<br />
<br />
GAMEFILE="$GAMENAME$FREGION$FDISCNO"<br />
GAMEPATH="$ROMPATH/$SYSTEMPATH"<br />
TMPPATH="$TMPPATH/backupgame-$$"<br />
<br />
# User confirmation<br />
while true; do<br />
read -p "Image will be saved as $GAMEPATH/$GAMEFILE.7z, type y if that's ok [y]: " userinput<br />
case $userinput in<br />
n) echo Too bad, bye then.; exit;;<br />
"") break;;<br />
*) echo Answer yes or no;;<br />
esac<br />
done<br />
<br />
saveconf<br />
mkdir -p "$GAMEPATH"<br />
if [ -e "$GAMEPATH/$GAMEFILE.7z" ]; then<br />
echo File already exists!<br />
exit<br />
fi<br />
<br />
echo "Ripping disc..."<br />
<br />
touch "$GAMEPATH/$GAMEFILE.7z"<br />
mkdir -p "$TMPPATH"<br />
cd $TMPPATH<br />
umount $FDRIVEDEV # can't rip if it's mounted<br />
LC_ALL=C cdrdao read-cd $MOREOPTS -v 2 --device "$FDRIVEDEV" --driver generic-mmc-raw:0x20000 --datafile "$GAMEFILE.bin" "$GAMEFILE.toc" &> "$GAMEFILE.log"<br />
<br />
if [ "$?" != "0" ]; then<br />
echo "Ripping process was not completed, ripped files will not be deleted."<br />
tail -n10 "$GAMEFILE.log"<br />
exit<br />
fi<br />
<br />
eject $DRIVEDEV<br />
toc2cue "$GAMEFILE.toc" "$GAMEFILE.cue" &> /dev/null<br />
mv "$GAMEFILE.toc" "$GAMEFILE.toc.bak"<br />
<br />
echo "Ripping done, compressing file..."<br />
rm -f "$GAMEPATH/$GAMEFILE.7z"<br />
nice -n20 ionice -c3 7za a -mx=9 "$GAMEPATH/$GAMEFILE.7z" "$GAMEFILE.bin" "$GAMEFILE.toc.bak" "$GAMEFILE.cue" "$GAMEFILE.log" &> /dev/null<br />
<br />
if [ "$?" != "0" ]; then<br />
echo "Archiving failed, ripped files will not be deleted."<br />
exit<br />
fi<br />
<br />
cleanup<br />
<br />
echo Done.<br />
<br />
</syntaxhighlight></div>
Ju