You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.2 KiB
66 lines
2.2 KiB
#!/usr/bin/env python3
|
|
|
|
# Requirements:
|
|
# pip3 install requests
|
|
|
|
"""
|
|
This is free and unencumbered software released into the public domain.
|
|
|
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
|
distribute this software, either in source code form or as a compiled
|
|
binary, for any purpose, commercial or non-commercial, and by any
|
|
means.
|
|
|
|
In jurisdictions that recognize copyright laws, the author or authors
|
|
of this software dedicate any and all copyright interest in the
|
|
software to the public domain. We make this dedication for the benefit
|
|
of the public at large and to the detriment of our heirs and
|
|
successors. We intend this dedication to be an overt act of
|
|
relinquishment in perpetuity of all present and future rights to this
|
|
software under copyright law.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
For more information, please refer to <http://unlicense.org/>
|
|
"""
|
|
|
|
import argparse
|
|
from os.path import basename
|
|
import requests
|
|
import struct
|
|
|
|
parser = argparse.ArgumentParser(description="Downloads a TMD for a DSiWare from NUS")
|
|
parser.add_argument("input", metavar="input.nds", type=str, help="DSiWare to get the TMD of")
|
|
|
|
args = parser.parse_args()
|
|
|
|
with open(args.input, "rb") as nds:
|
|
# Read Title ID
|
|
nds.seek(0x230)
|
|
tid = struct.unpack("<LL", nds.read(8))
|
|
|
|
# Check if DSiWare
|
|
if tid[1] not in (0x00030004, 0x00030005, 0x00030015, 0x00030017):
|
|
print("Error! This is not DSiWare (0x%08X)" % tid[1])
|
|
exit()
|
|
|
|
# Download TMD
|
|
r = requests.get("http://nus.cdn.t.shop.nintendowifi.net/ccs/download/%08x%08x/tmd" % (tid[1], tid[0]))
|
|
if r.status_code != 200:
|
|
print("Error! Download failed (%d)" % r.status_code)
|
|
exit()
|
|
|
|
# Write to file
|
|
tmdName = args.input[:args.input.rfind(".")] + ".tmd"
|
|
with open(tmdName, "wb") as tmd:
|
|
tmd.write(r.content)
|
|
|
|
print("Successfully downloaded %s" % basename(tmdName))
|
|
|