I got bored and decided to write a basic python script that will create a 1:1 decrypted ("loadiine-ready") game dump to the SD card. It will automatically find the titleID of the game, create a the folder /gamedumps/*titleID*, and then dump the disc's code, content and meta folders there.
The main use I can see wit this it to dump disc-only games that can't be downloaded from NUS, repack them with NUSPacker and then install them to redNAND/sigpatched sysNAND. I've seen many people have issues trying to do this with current "loadiine-ready" dumps because they were made with DDD which will not give a 1:1 dump of the game.
I believe this is currently the fastest way to dump a game as it dumps straight to SD, unlike DDD which would dump over the network to a computer.
All you need is wupclient.py in the same folder and have it modified it to have your Wii U's IP address. Then just run any fw.img to load wupserver on the Wii U and then run DiscDump.py
Also I won't say I'm a perfect programmer, so if you see anything in my script I can improve or change feel free to let me know!
https://mega.nz/#!4QVxRTBK!Dk8aGwF2n5yUielabiuSvpBU6hrqnw8z-Rwu0udhVAI
The main use I can see wit this it to dump disc-only games that can't be downloaded from NUS, repack them with NUSPacker and then install them to redNAND/sigpatched sysNAND. I've seen many people have issues trying to do this with current "loadiine-ready" dumps because they were made with DDD which will not give a 1:1 dump of the game.
I believe this is currently the fastest way to dump a game as it dumps straight to SD, unlike DDD which would dump over the network to a computer.
All you need is wupclient.py in the same folder and have it modified it to have your Wii U's IP address. Then just run any fw.img to load wupserver on the Wii U and then run DiscDump.py
Also I won't say I'm a perfect programmer, so if you see anything in my script I can improve or change feel free to let me know!
https://mega.nz/#!4QVxRTBK!Dk8aGwF2n5yUielabiuSvpBU6hrqnw8z-Rwu0udhVAI
Code:
import wupclient
def isdir(path):
if path[0] != "/" and w.cwd[0] == "/":
return isdir(w.cwd + "/" + path)
fsa_handle = w.get_fsa_handle()
ret, dir_handle = w.FSA_OpenDir(fsa_handle, path if path != None else w.cwd)
if ret == 0:
w.FSA_CloseDir(fsa_handle, dir_handle)
return True
else:
return False
"""Connect to wupserver"""
print("Connecting to wupserver")
w = wupclient.wupclient()
if(w.s == None):
input("Failed to connect to wupserver!")
sys.exit(1)
print("Connected!")
wupclient.w = w
"""Mount SD card for dumping"""
print("Mounting SD")
ret = wupclient.mount_sd()
if(ret == 0):
input("Failed to mount SD! Press enter to quit.")
sys.exit(1)
"""Mount optical disc content for dumping"""
print("Mounted! Mounting optical disc content")
ret = wupclient.mount_odd_content()
if(ret == 0):
input("Failed to mount optical disc! Press enter to quit.")
sys.exit(1)
"""Download meta.xml from disc to pull title ID"""
print("Downloading meta.xml to obtain title ID")
ret = w.dl("/vol/storage_odd_content/meta/meta.xml")
if(ret == 0):
input("Failed to download meta.xml! Press enter to quit.")
sys.exit(1)
"""Grab title ID from downloaded meta.xml"""
print("Grabbing title ID from meta.xml")
import xml.etree.ElementTree as ET
tree = ET.parse("meta.xml")
root = tree.getroot()
for child in root:
if(child.tag.startswith("title_id")):
titleID = child.text
"""Make directories on SD to dump to"""
print("Creating directories on SD to dump to")
if isdir("/vol/storage_sdcard/gamedumps"):
if not(isdir("/vol/storage_sdcard/gamedumps/" + titleID)):
ret = w.mkdir("/vol/storage_sdcard/gamedumps/" + titleID, 0x600)
if(ret != 0):
print("Failed to make directory on SD to dump to.")
input("Press enter to quit.")
sys.exit(1)
else:
ret = w.mkdir("/vol/storage_sdcard/gamedumps", 0x600)
if(ret != 0):
print("Failed to make directory on SD to dump to.")
input("Press enter to quit.")
sys.exit(1)
else:
ret = w.mkdir("/vol/storage_sdcard/gamedumps/" + titleID, 0x600)
if(ret != 0):
print("Failed to make directory on SD to dump to.")
input("Press enter to quit.")
sys.exit(1)
"""Use cpdir() to dump disc contents to SD"""
print("Dumping decrypted disc contents")
ret = w.cpdir("/vol/storage_odd_content", "/vol/storage_sdcard/gamedumps/" + titleID)
if(ret == 0):
input("Game dump failed! Press enter to quit")
sys.exit(1)
else:
print("Game dump compete!")
input("Press enter to exit.")
Last edited by TheCyberQuake,