7 Commits

10 changed files with 230 additions and 340 deletions

View File

@@ -38,7 +38,7 @@ from modules.download_batch import run_nus_download_batch
from modules.download_wii import run_nus_download_wii
from modules.download_dsi import run_nus_download_dsi
nusget_version = "1.3.0"
nusget_version = "1.3.2"
regions = {"World": ["41"], "USA/NTSC": ["45"], "Europe/PAL": ["50"], "Japan": ["4A"], "Korea": ["4B"], "China": ["43"],
"Australia/NZ": ["55"]}
@@ -147,7 +147,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
title = source_index.internalPointer().metadata
if title is not None:
self.ui.console_select_dropdown.setCurrentIndex(self.ui.platform_tabs.currentIndex())
selected_title = TitleData(title.tid, title.name, title.archive_name, title.version, title.ticket,
selected_title = TitleData(title.tid, title.name, title.version, title.ticket,
title.region, title.category, title.danger)
self.load_title_data(selected_title)
@@ -212,20 +212,19 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# Load the TID and version into the entry boxes.
self.ui.tid_entry.setText(tid)
self.ui.version_entry.setText(str(selected_title.version))
# Load the WAD name, assuming it exists. This shouldn't ever be able to fail as the database has a WAD name
# for every single title, regardless of whether it can be packed or not.
archive_name = selected_title.archive_name
if selected_title.category != "System" and selected_title.category != "IOS":
# Create the WAD name by deriving it from the title name (basically just replace " " with "-").
archive_name = selected_title.name.replace(" ", "-")
if selected_title.category not in ["System", "IOS"]:
archive_name += f"-{str(bytes.fromhex(tid).decode())[-4:]}"
archive_name += f"-v{selected_title.version}"
if selected_title.region != "World":
archive_name += f"-{selected_title.region.split('/')[0]}"
if self.ui.console_select_dropdown.currentText() == "DSi":
archive_name += ".tad"
elif self.ui.console_select_dropdown.currentText() == "vWii":
else:
if self.ui.console_select_dropdown.currentText() == "vWii":
if selected_title.category.find("System") != -1 or selected_title.category == "IOS":
archive_name += "-vWii"
archive_name += ".wad"
else:
if selected_title.category.find("System") != -1 or selected_title.category == "IOS":
archive_name += "-Wii"
@@ -449,7 +448,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
for r in regions:
if f"{t['TID'][:-2]}{regions[r][0]}" == tid:
try:
archive_name = t["Archive Name"]
archive_name = t["Name"].replace(" ", "-")
break
except KeyError:
archive_name = ""
@@ -457,7 +456,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
else:
if t["TID"] == tid:
try:
archive_name = t["Archive Name"]
archive_name = t["Name"].replace(" ", "-")
break
except KeyError:
archive_name = ""
@@ -502,11 +501,21 @@ if __name__ == "__main__":
# it looks nice, but fallback on kvantum if it isn't, since kvantum is likely to exist. If all else fails, fusion.
if platform.system() == "Linux":
if os.path.isdir("/usr/lib/qt6/plugins"):
import subprocess
try:
# This CANNOT be the best way to get the system Qt version, but it's what I came up with for now.
result = subprocess.run(['/usr/lib/qt6/bin/qtdiag'], stdout=subprocess.PIPE)
result_str = result.stdout.decode("utf-8").split("\n")[0]
sys_qt_ver = result_str.split(" ")[1].split(".")
pyside_qt_ver = version("PySide6").split(".")
if sys_qt_ver[0:2] == pyside_qt_ver[0:2]:
app.addLibraryPath("/usr/lib/qt6/plugins")
if "Breeze" in QStyleFactory.keys():
app.setStyle("Breeze")
elif "kvantum" in QStyleFactory.keys():
app.setStyle("kvantum")
except Exception as e:
print(e)
# Load qtbase translations, and then apps-specific translations.
path = QLibraryInfo.path(QLibraryInfo.LibraryPath.TranslationsPath)

View File

@@ -1,9 +1,14 @@
# NUSGet
A modern and supercharged NUS downloader built with Python and Qt6. Powered by libWiiPy and libTWLPy.
<div align="center">
<img src="https://github.com/user-attachments/assets/156eb949-93aa-4453-b7a0-99b784ec0c8c" alt="The icon for NUSGet" width=256 height=256>
<h1>NUSGet</h1>
<p>A modern and supercharged NUS downloader built with Python and Qt6.</p>
<p>Powered by libWiiPy and libTWLPy.</p>
<a href="https://github.com/NinjaCheetah/NUSGet/actions/workflows/python-build.yml">
<img src="https://github.com/NinjaCheetah/NUSGet/actions/workflows/python-build.yml/badge.svg">
</a>
</div>
[![Python application](https://github.com/NinjaCheetah/NUSGet/actions/workflows/python-build.yml/badge.svg)](https://github.com/NinjaCheetah/NUSGet/actions/workflows/python-build.yml)
The name is a play on NuGet, the .NET package manager. Thank you [@Janni9009](https://github.com/Janni9009) for the name idea!
![Linux Screenshot](https://github.com/user-attachments/assets/f9e0e6c4-6a04-4c2b-bffd-7a1dc58671ff)
## Features
NUSGet allows you to download any content from the Nintendo Update Servers. Free content (content with a Ticket freely available on the servers) can be decrypted or packed directly into an installable archive (WAD/TAD).
@@ -73,7 +78,7 @@ A huge thanks to all the wonderful translators who've helped make NUSGet availab
If your language isn't present or is out of date, and you'd like to contribute, you can check out [TRANSLATING.md](https://github.com/NinjaCheetah/NUSGet/blob/main/TRANSLATING.md) for directions on how to translate NUSGet.
## Why this and not NUSD?
NUS Downloader (Nintendo Update Server Downloader), is an old tool for downloading titles from the Nintendo Update Servers for the Wii and DSi. Originally released in 2009, and effectively last updated in 2011, it stills works today, however it definitely shows its age, and is in need of a refresh. One of the major shortcomings of NUSD is that it only supports Windows, as most of the tools for the Wii from that era are written in C# and use the .NET Framework, especially since they tend to rely on the C# library libWiiSharp. NUSD also has far more limited support for DSi titles, and no support whatsoever for vWii titles.
## Additional Thanks
The name is a play on NuGet, the .NET package manager. Thank you [@Janni9009](https://github.com/Janni9009) for the name idea!
With my introduction of [libWiiPy](https://github.com/NinjaCheetah/libWiiPy), there's now a work-in-progress Python library designed to eventually have feature parity with libWiiSharp. At this point in time, the library is featured enough that every piece of libWiiSharp that NUSD relied on is now available in libWiiPy, so I decided to put that to use and create a replacement for it. NUSGet offers nearly all the same features as NUSD (currently there is no support for the DSi servers or for scripting), but is built on top of a modern library with a modern graphical framework, that being Qt6. A major benefit of this rewrite is that its fully cross-platform, and is natively compiled for Windows, Linux, and macOS.
Thanks to all those who contributed to libWiiSharp and NUSD, without which this project would not exist.

View File

@@ -6,11 +6,10 @@
"Versions": {
"World": [256, 512]
},
"Ticket": true,
"Archive Name": "Nintendo-DS-Cartridge-Whitelist"
"Ticket": true
},
{
"Name": "Launcher (System Menu)",
"Name": "Launcher",
"TID": "00030017484E41XX",
"Versions": {
"USA/NTSC": [512, 768, 1024, 1280, 1536, 1792],
@@ -21,7 +20,6 @@
"Australia/NZ": [512, 768, 1024, 1280, 1536, 1792]
},
"Ticket": true,
"Archive Name": "Launcher",
"Danger": "The Launcher (DSi Menu) is a critical part of the DSi's operation, and should not be modified unless you have Unlaunch installed."
},
{
@@ -35,8 +33,7 @@
"China": [4, 5, 6, 7, 8, 9],
"Australia/NZ": [3, 4, 5, 6, 7, 8, 9]
},
"Ticket": true,
"Archive Name": "Version-Data"
"Ticket": true
},
{
"Name": "WiFi Firmware",
@@ -45,7 +42,6 @@
"World": [256, 512]
},
"Ticket": true,
"Archive Name": "WiFi-Firmware",
"Danger": "The WiFi Firmware is the firmware that runs on the DSi's WiFi chip, and should not be modified. Your console WILL be bricked if this title is damaged or missing."
}
],
@@ -56,8 +52,7 @@
"Versions": {
"World": [256]
},
"Ticket": true,
"Archive Name": "DS-Download-Play"
"Ticket": true
},
{
"Name": "Flipnote Studio",
@@ -67,8 +62,7 @@
"Europe/PAL": [0],
"Japan": [512]
},
"Ticket": true,
"Archive Name": "Flipnote-Studio"
"Ticket": true
},
{
"Name": "Nintendo 3DS Transfer Tool",
@@ -80,8 +74,7 @@
"Korea": [256],
"Australia/NZ": [512, 768]
},
"Ticket": false,
"Archive Name": "Nintendo-3DS-Transfer-Tool"
"Ticket": false
},
{
"Name": "Nintendo DSi Browser",
@@ -91,8 +84,7 @@
"Europe/PAL": [768],
"Japan": [768]
},
"Ticket": true,
"Archive Name": "Nintendo-DSi-Browser"
"Ticket": true
},
{
"Name": "Nintendo DSi Camera",
@@ -103,8 +95,7 @@
"Japan": [256, 768, 1024],
"Australia/NZ": [768, 1024]
},
"Ticket": true,
"Archive Name": "Nintendo-DSi-Camera"
"Ticket": true
},
{
"Name": "Nintendo DSi Shop",
@@ -117,8 +108,7 @@
"China": [768],
"Australia/NZ": [1536, 1792, 2048, 2304, 2560, 2816, 3072]
},
"Ticket": true,
"Archive Name": "Nintendo-DSi-Shop"
"Ticket": true
},
{
"Name": "Nintendo DSi Sound",
@@ -129,8 +119,7 @@
"Japan": [256, 512],
"Australia/NZ": [256, 512]
},
"Ticket": true,
"Archive Name": "Nintendo-DSi-Sound"
"Ticket": true
},
{
"Name": "Nintendo Zone",
@@ -141,8 +130,7 @@
"Japan": [512, 768],
"Australia/NZ": [512, 768]
},
"Ticket": true,
"Archive Name": "Nintendo-DSi-Sound"
"Ticket": true
},
{
"Name": "System Settings",
@@ -155,8 +143,7 @@
"China": [768],
"Australia/NZ": [512, 768]
},
"Ticket": true,
"Archive Name": "System-Settings"
"Ticket": true
}
],
"DSiWare": [

View File

@@ -7,7 +7,6 @@
"World": [6, 7]
},
"Ticket": true,
"Archive Name": "BC-NAND",
"Danger": "BC-NAND is required for the Wii U to boot Wii titles. DO NOT modify it, or your Wii U will no longer be able to enter Wii mode."
},
{
@@ -17,7 +16,6 @@
"World": [1]
},
"Ticket": true,
"Archive Name": "BC-WFS",
"Danger": "BC-WFS is required for the Wii U to be able to boot Dragon Quest X Online. Do NOT modify it, or your Wii U may experience issues with Wii mode."
},
{
@@ -29,7 +27,6 @@
"Japan": [512, 544, 608]
},
"Ticket": true,
"Archive Name": "System-Menu",
"Danger": "The System Menu is a critical part of the vWii's operation, and should not be modified. If you intend to modify it, you should have Preloader installed, or else you may not be able to use the vWii.",
"Public Versions": {
"512": "4.3J - Wii U v1.0.0J",
@@ -51,8 +48,7 @@
"Versions": {
"World": [6]
},
"Ticket": true,
"Archive Name": "Mii-Channel"
"Ticket": true
},
{
"Name": "Shopping Channel",
@@ -60,8 +56,7 @@
"Versions": {
"World": [21]
},
"Ticket": true,
"Archive Name": "Shopping-Channel"
"Ticket": true
},
{
"Name": "Return to Wii U Menu",
@@ -70,7 +65,6 @@
"World": [0]
},
"Ticket": true,
"Archive Name": "Return-to-Wii-U-Menu",
"Danger": "\"Return to Wii U Menu\" is the channel launched from the vWii menu to reboot your console back into Wii U mode. While it generally should not be modified, modifying or removing it will not prevent the vWii from working."
},
{
@@ -81,8 +75,7 @@
"Europe/PAL": [0, 1, 2, 3, 4, 5],
"Japan": [0, 1, 2, 3, 5]
},
"Ticket": true,
"Archive Name": "Wii-Electronic-Manual"
"Ticket": true
}
],
"Hidden Channels": [
@@ -95,7 +88,6 @@
"Japan": [2]
},
"Ticket": true,
"Archive Name": "Region-Select",
"Danger": "\"Region Select\" is a hidden channel used during the Wii's initial setup. If this title is damaged or missing, you will not be able to set up your Wii again after a factory reset."
},
{
@@ -107,7 +99,6 @@
"Japan": [29, 31]
},
"Ticket": true,
"Archive Name": "Wii-System-Transfer-WC",
"Danger": "Note: It is currently unknown how this channel works, but it is involved somehow in the Wii to vWii transfer process. It is recommended to not modify it. Also note that this is separate from the normal, non-hidden channel \"Wii System Transfer Tool\" that works alongside \"Wii U Transfer Tool\" on a source Wii."
}
],
@@ -120,8 +111,7 @@
"Europe/PAL": [516],
"Japan": [516]
},
"Ticket": false,
"Archive Name": "Wii-System-Transfer-Tool-WNP"
"Ticket": false
}
],
"IOS": [
@@ -131,8 +121,7 @@
"Versions": {
"World": [1290]
},
"Ticket": true,
"Archive Name": "IOS9"
"Ticket": true
},
{
"Name": "IOS 12",
@@ -140,8 +129,7 @@
"Versions": {
"World": [782]
},
"Ticket": true,
"Archive Name": "IOS12"
"Ticket": true
},
{
"Name": "IOS 13",
@@ -149,8 +137,7 @@
"Versions": {
"World": [1288]
},
"Ticket": true,
"Archive Name": "IOS13"
"Ticket": true
},
{
"Name": "IOS 14",
@@ -158,8 +145,7 @@
"Versions": {
"World": [1288]
},
"Ticket": true,
"Archive Name": "IOS14"
"Ticket": true
},
{
"Name": "IOS 15",
@@ -167,8 +153,7 @@
"Versions": {
"World": [1288]
},
"Ticket": true,
"Archive Name": "IOS15"
"Ticket": true
},
{
"Name": "IOS 17",
@@ -176,8 +161,7 @@
"Versions": {
"World": [1288]
},
"Ticket": true,
"Archive Name": "IOS17"
"Ticket": true
},
{
"Name": "IOS 21",
@@ -185,8 +169,7 @@
"Versions": {
"World": [1295]
},
"Ticket": true,
"Archive Name": "IOS21"
"Ticket": true
},
{
"Name": "IOS 22",
@@ -194,8 +177,7 @@
"Versions": {
"World": [1550]
},
"Ticket": true,
"Archive Name": "IOS22"
"Ticket": true
},
{
"Name": "IOS 28",
@@ -203,8 +185,7 @@
"Versions": {
"World": [2063]
},
"Ticket": true,
"Archive Name": "IOS28"
"Ticket": true
},
{
"Name": "IOS 31",
@@ -212,8 +193,7 @@
"Versions": {
"World": [3864]
},
"Ticket": true,
"Archive Name": "IOS31"
"Ticket": true
},
{
"Name": "IOS 33",
@@ -221,8 +201,7 @@
"Versions": {
"World": [3864]
},
"Ticket": true,
"Archive Name": "IOS33"
"Ticket": true
},
{
"Name": "IOS 34",
@@ -230,8 +209,7 @@
"Versions": {
"World": [3864]
},
"Ticket": true,
"Archive Name": "IOS34"
"Ticket": true
},
{
"Name": "IOS 35",
@@ -239,8 +217,7 @@
"Versions": {
"World": [3864]
},
"Ticket": true,
"Archive Name": "IOS35"
"Ticket": true
},
{
"Name": "IOS 36",
@@ -248,8 +225,7 @@
"Versions": {
"World": [3864]
},
"Ticket": true,
"Archive Name": "IOS36"
"Ticket": true
},
{
"Name": "IOS 37",
@@ -257,8 +233,7 @@
"Versions": {
"World": [5919]
},
"Ticket": true,
"Archive Name": "IOS37"
"Ticket": true
},
{
"Name": "IOS 38",
@@ -266,8 +241,7 @@
"Versions": {
"World": [4380]
},
"Ticket": true,
"Archive Name": "IOS38"
"Ticket": true
},
{
"Name": "IOS 41",
@@ -275,8 +249,7 @@
"Versions": {
"World": [3863]
},
"Ticket": true,
"Archive Name": "IOS41"
"Ticket": true
},
{
"Name": "IOS 43",
@@ -284,8 +257,7 @@
"Versions": {
"World": [3863]
},
"Ticket": true,
"Archive Name": "IOS43"
"Ticket": true
},
{
"Name": "IOS 45",
@@ -293,8 +265,7 @@
"Versions": {
"World": [3863]
},
"Ticket": true,
"Archive Name": "IOS45"
"Ticket": true
},
{
"Name": "IOS 46",
@@ -302,8 +273,7 @@
"Versions": {
"World": [3863]
},
"Ticket": true,
"Archive Name": "IOS46"
"Ticket": true
},
{
"Name": "IOS 48",
@@ -311,8 +281,7 @@
"Versions": {
"World": [4380]
},
"Ticket": true,
"Archive Name": "IOS48"
"Ticket": true
},
{
"Name": "IOS 53",
@@ -320,8 +289,7 @@
"Versions": {
"World": [5919]
},
"Ticket": true,
"Archive Name": "IOS53"
"Ticket": true
},
{
"Name": "IOS 55",
@@ -329,8 +297,7 @@
"Versions": {
"World": [5919]
},
"Ticket": true,
"Archive Name": "IOS55"
"Ticket": true
},
{
"Name": "IOS 56",
@@ -338,8 +305,7 @@
"Versions": {
"World": [5918]
},
"Ticket": true,
"Archive Name": "IOS56"
"Ticket": true
},
{
"Name": "IOS 57",
@@ -347,8 +313,7 @@
"Versions": {
"World": [6175]
},
"Ticket": true,
"Archive Name": "IOS57"
"Ticket": true
},
{
"Name": "IOS 58",
@@ -356,8 +321,7 @@
"Versions": {
"World": [6432]
},
"Ticket": true,
"Archive Name": "IOS58"
"Ticket": true
},
{
"Name": "IOS 59",
@@ -365,8 +329,7 @@
"Versions": {
"World": [7201, 8737, 9249]
},
"Ticket": true,
"Archive Name": "IOS59"
"Ticket": true
},
{
"Name": "IOS 62",
@@ -374,8 +337,7 @@
"Versions": {
"World": [6430, 6686, 6942]
},
"Ticket": true,
"Archive Name": "IOS62"
"Ticket": true
},
{
"Name": "IOS 80",
@@ -383,8 +345,7 @@
"Versions": {
"World": [7200]
},
"Ticket": true,
"Archive Name": "IOS80"
"Ticket": true
}
]
}

View File

@@ -7,7 +7,6 @@
"World": [2, 4, 5, 6]
},
"Ticket": true,
"Archive Name": "BC",
"Danger": "BC is required for the Wii's backwards compatibility with the GameCube. GameCube games will not run properly if BC is damaged or missing."
},
{
@@ -17,7 +16,6 @@
"World": [4]
},
"Ticket": true,
"Archive Name": "boot2",
"Danger": "boot2 is a critical part of the Wii's boot process, and should not be modified. Most updated Wiis will already be running boot2v4, which is the only version of boot2 available on the NUS."
},
{
@@ -27,7 +25,6 @@
"World": [4, 5, 8, 9, 10]
},
"Ticket": true,
"Archive Name": "MIOS",
"Danger": "MIOS is required for the Wii's backwards compatibility with the GameCube. GameCube games will not run properly if MIOS is damaged or missing."
},
{
@@ -80,7 +77,6 @@
"518": "4.3K"
},
"Ticket": true,
"Archive Name": "System-Menu",
"Danger": "The System Menu is a critical part of the Wii's operation, and should not be modified without proper brick prevention in place. You should have BootMii installed as boot2 if possible, and if not, Priiloader installed before making changes to the System Menu."
}
],
@@ -94,8 +90,7 @@
"Europe/PAL": [6, 7],
"Japan": [6, 7]
},
"Ticket": true,
"Archive Name": "Forecast-Channel"
"Ticket": true
},
{
"Name": "Mii Channel",
@@ -103,8 +98,7 @@
"Versions": {
"World": [2, 3, 4, 5, 6]
},
"Ticket": true,
"Archive Name": "Mii-Channel"
"Ticket": true
},
{
"Name": "News Channel",
@@ -115,8 +109,7 @@
"Europe/PAL": [6, 7],
"Japan": [6, 7]
},
"Ticket": true,
"Archive Name": "News-Channel"
"Ticket": true
},
{
"Name": "Photo Channel",
@@ -124,8 +117,7 @@
"Versions": {
"World": [1, 2]
},
"Ticket": true,
"Archive Name": "Photo-Channel"
"Ticket": true
},
{
"Name": "Photo Channel 1.1",
@@ -134,8 +126,7 @@
"World": [1, 2, 3],
"Korea": [3]
},
"Ticket": true,
"Archive Name": "Photo-Channel-1.1"
"Ticket": true
},
{
"Name": "Shopping Channel",
@@ -144,8 +135,7 @@
"World": [3, 4, 5, 6, 7, 8, 10, 13, 16, 17, 18, 19, 20, 21],
"Korea": [3, 4, 5, 6, 7, 8, 10, 13, 14, 16, 17, 18, 19, 20, 21]
},
"Ticket": true,
"Archive Name": "Shopping-Channel"
"Ticket": true
}
],
"Hidden Channels": [
@@ -159,7 +149,6 @@
"Korea": [1, 2, 3]
},
"Ticket": true,
"Archive Name": "EULA",
"Danger": "\"EULA\" is a hidden channel used to display the End User License Agreement that must be accepted to connect to WiiConnect24. Online services may not work correctly if this channel is damaged or missing."
},
{
@@ -172,7 +161,6 @@
"Korea": [2]
},
"Ticket": true,
"Archive Name": "Region-Select",
"Danger": "\"Region Select\" is a hidden channel used during the Wii's initial setup. If this title is damaged or missing, you will not be able to set up your Wii again after a factory reset. This title will need to be reinstalled to fix your console."
},
{
@@ -181,8 +169,7 @@
"Versions": {
"Japan": [0, 1, 2]
},
"Ticket": true,
"Archive Name": "Set-Personal-Data-Channel"
"Ticket": true
}
],
"Downloadable Channels": [
@@ -192,8 +179,7 @@
"Versions": {
"USA/NTSC": [1280]
},
"Ticket": false,
"Archive Name": "Amazon-Instant-Video"
"Ticket": false
},
{
"Name": "BBC iPlayer Channel",
@@ -201,8 +187,7 @@
"Versions": {
"Europe/PAL": [768]
},
"Ticket": false,
"Archive Name": "BBC-iPlayer-Channel"
"Ticket": false
},
{
"Name": "Check Mii Out Channel",
@@ -212,8 +197,7 @@
"Europe/PAL": [1, 3, 512],
"Japan": [1, 3, 512]
},
"Ticket": false,
"Archive Name": "Check-Mii-Out-Channel"
"Ticket": false
},
{
"Name": "Demae Channel",
@@ -221,8 +205,7 @@
"Versions": {
"Japan": [512]
},
"Ticket": true,
"Archive Name": "Demae-Channel"
"Ticket": true
},
{
"Name": "Digicam Print Channel",
@@ -230,19 +213,17 @@
"Versions": {
"Japan": [1024]
},
"Ticket": true,
"Archive Name": "Digicam-Print-Channel"
"Ticket": true
},
{
"Name": "Everyone Votes Channel",
"Name": "Everybody Votes Channel",
"TID": "0001000148414AXX",
"Versions": {
"USA/NTSC": [1, 2, 3],
"Europe/PAL": [1, 2, 3],
"Japan": [1, 2, 3]
"USA/NTSC": [1, 2, 3, 512],
"Europe/PAL": [1, 2, 3, 512],
"Japan": [1, 2, 3, 512]
},
"Ticket": false,
"Archive Name": "Everyone-Votes-Channel"
"Ticket": false
},
{
"Name": "Hulu Plus",
@@ -251,8 +232,7 @@
"USA/NTSC": [1283],
"Japan": [1024]
},
"Ticket": false,
"Archive Name": "Hulu-Plus"
"Ticket": false
},
{
"Name": "Internet Channel",
@@ -262,8 +242,7 @@
"Europe/PAL": [1, 3, 257, 512, 1024],
"Japan": [1, 3, 257, 512, 1024]
},
"Ticket": true,
"Archive Name": "Internet-Channel"
"Ticket": true
},
{
"Name": "Jam With The Band Live Channel",
@@ -272,8 +251,7 @@
"Europe/PAL": [2],
"Japan": [2]
},
"Ticket": false,
"Archive Name": "Jam-With-The-Band-Live-Channel"
"Ticket": false
},
{
"Name": "Kirby TV Channel",
@@ -281,8 +259,7 @@
"Versions": {
"Europe/PAL": [257]
},
"Ticket": false,
"Archive Name": "Kirby-TV-Channel"
"Ticket": false
},
{
"Name": "Metroid Prime 3 Preview",
@@ -291,8 +268,7 @@
"Europe/PAL": [1, 2],
"Japan": [1, 2]
},
"Ticket": false,
"Archive Name": "Metroid-Prime-3-Preview"
"Ticket": false
},
{
"Name": "Netflix Channel",
@@ -301,8 +277,7 @@
"USA/NTSC": [2049],
"Europe/PAL": [2049]
},
"Ticket": false,
"Archive Name": "Netflix-Channel"
"Ticket": false
},
{
"Name": "Nintendo Channel",
@@ -312,8 +287,7 @@
"Europe/PAL": [1792],
"Japan": [1792]
},
"Ticket": false,
"Archive Name": "Nintendo-Channel"
"Ticket": false
},
{
"Name": "Photo Channel 1.0 Restore Program",
@@ -321,8 +295,7 @@
"Versions": {
"Japan": [0]
},
"Ticket": true,
"Archive Name": "Photo-Channel-1.0-Restore-Program"
"Ticket": true
},
{
"Name": "The Legend of Zelda: Skyward Sword Save Data Update Channel",
@@ -332,8 +305,7 @@
"Europe/PAL": [0],
"Japan": [1]
},
"Ticket": false,
"Archive Name": "Skyward-Sword-Save-Data-Update-Channel"
"Ticket": false
},
{
"Name": "Today and Tomorrow Channel",
@@ -342,17 +314,15 @@
"Europe/PAL": [1],
"Japan": [1]
},
"Ticket": true,
"Archive Name": "Today-and-Tomorrow-Channel"
"Ticket": true
},
{
"Name": "TV Friend Channel / G-Guide for Wii",
"Name": "TV Friend Channel/G-Guide for Wii",
"TID": "0001000148424EXX",
"Versions": {
"Japan": [1]
},
"Ticket": true,
"Archive Name": "TV-Friend-Channel"
"Ticket": true
},
{
"Name": "USB Memory Repair Program",
@@ -360,17 +330,15 @@
"Versions": {
"Japan": [12]
},
"Ticket": false,
"Archive Name": "USB-Repair-Program"
"Ticket": false
},
{
"Name": "Wii no Ma Channel",
"Name": "Wii Room",
"TID": "00010001484349XX",
"Versions": {
"Japan": [0]
"Japan": [0, 512, 770, 1025]
},
"Ticket": true,
"Archive Name": "Wii-no-Ma-Channel"
"Ticket": true
},
{
"Name": "Wii Speak Channel",
@@ -381,8 +349,7 @@
"Japan": [1, 256, 512],
"Korea": [512]
},
"Ticket": true,
"Archive Name": "Wii-Speak-Channel"
"Ticket": true
},
{
"Name": "Wii U Transfer Tool",
@@ -392,8 +359,7 @@
"Europe/PAL": [516],
"Japan": [516]
},
"Ticket": false,
"Archive Name": "Wii-U-Transfer-Tool"
"Ticket": false
},
{
"Name": "YouTube",
@@ -402,8 +368,7 @@
"USA/NTSC": [1536],
"Japan": [768]
},
"Ticket": false,
"Archive Name": "YouTube"
"Ticket": false
}
],
"IOS": [
@@ -414,7 +379,6 @@
"World": [65280]
},
"Ticket": true,
"Archive Name": "IOS4",
"Danger": "This IOS is a stub, and no longer offers any functionality. It cannot be used to run any code."
},
{
@@ -423,8 +387,7 @@
"Versions": {
"World": [520, 521, 778, 1034]
},
"Ticket": true,
"Archive Name": "IOS9"
"Ticket": true
},
{
"Name": "IOS 10",
@@ -432,8 +395,7 @@
"Versions": {
"World": [768]
},
"Ticket": true,
"Archive Name": "IOS10"
"Ticket": true
},
{
"Name": "IOS 11",
@@ -442,7 +404,6 @@
"World": [10, 256]
},
"Ticket": true,
"Archive Name": "IOS11",
"Danger": "Version 256 of IOS 11 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 2.0-2.1, DO NOT install version 256, as the System Menu relies on IOS 11."
},
{
@@ -451,8 +412,7 @@
"Versions": {
"World": [6, 11, 12, 269, 525, 526]
},
"Ticket": true,
"Archive Name": "IOS12"
"Ticket": true
},
{
"Name": "IOS 13",
@@ -460,8 +420,7 @@
"Versions": {
"World": [10, 15, 16, 273, 1031, 1032]
},
"Ticket": true,
"Archive Name": "IOS13"
"Ticket": true
},
{
"Name": "IOS 14",
@@ -469,8 +428,7 @@
"Versions": {
"World": [262, 263, 520, 1031, 1032]
},
"Ticket": true,
"Archive Name": "IOS14"
"Ticket": true
},
{
"Name": "IOS 15",
@@ -478,8 +436,7 @@
"Versions": {
"World": [257, 258, 259, 260, 265, 266, 523, 1031, 1032]
},
"Ticket": true,
"Archive Name": "IOS15"
"Ticket": true
},
{
"Name": "IOS 16",
@@ -488,7 +445,6 @@
"World": [512]
},
"Ticket": true,
"Archive Name": "IOS16",
"Danger": "This IOS is a stub, and no longer offers any functionality. It cannot be used to run any code."
},
{
@@ -497,8 +453,7 @@
"Versions": {
"World": [512, 517, 518, 775, 1031, 1032]
},
"Ticket": true,
"Archive Name": "IOS17"
"Ticket": true
},
{
"Name": "IOS 20",
@@ -507,7 +462,6 @@
"World": [12, 256]
},
"Ticket": true,
"Archive Name": "IOS20",
"Danger": "Version 256 of IOS 20 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 2.2, DO NOT install version 256, as the System Menu relies on IOS 20."
},
{
@@ -516,8 +470,7 @@
"Versions": {
"World": [514, 515, 516, 517, 522, 525, 782, 1038, 1039]
},
"Ticket": true,
"Archive Name": "IOS21"
"Ticket": true
},
{
"Name": "IOS 22",
@@ -525,8 +478,7 @@
"Versions": {
"World": [777, 780, 1037, 1293, 1294]
},
"Ticket": true,
"Archive Name": "IOS22"
"Ticket": true
},
{
"Name": "IOS 28",
@@ -534,8 +486,7 @@
"Versions": {
"World": [1292, 1293, 1550, 1806, 1807]
},
"Ticket": true,
"Archive Name": "IOS28"
"Ticket": true
},
{
"Name": "IOS 30",
@@ -544,7 +495,6 @@
"World": [1037, 1039, 1040, 2576, 2816]
},
"Ticket": true,
"Archive Name": "IOS30",
"Danger": "Version 2816 of IOS 30 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 3.0-3.3, DO NOT install version 2816, as the System Menu relies on IOS 30."
},
{
@@ -553,8 +503,7 @@
"Versions": {
"World": [1037, 1039, 1040, 2576, 3088, 3092, 3349, 3607, 3608]
},
"Ticket": true,
"Archive Name": "IOS31"
"Ticket": true
},
{
"Name": "IOS 33",
@@ -562,8 +511,7 @@
"Versions": {
"World": [1040, 2832, 2834, 3091, 3607, 3608]
},
"Ticket": true,
"Archive Name": "IOS33"
"Ticket": true
},
{
"Name": "IOS 34",
@@ -571,8 +519,7 @@
"Versions": {
"World": [1039, 3087, 3091, 3348, 3607, 3608]
},
"Ticket": true,
"Archive Name": "IOS34"
"Ticket": true
},
{
"Name": "IOS 35",
@@ -580,8 +527,7 @@
"Versions": {
"World": [1040, 3088, 3092, 3349, 3607, 3608]
},
"Ticket": true,
"Archive Name": "IOS35"
"Ticket": true
},
{
"Name": "IOS 36",
@@ -589,8 +535,7 @@
"Versions": {
"World": [1042, 3090, 3094, 3351, 3607, 3608]
},
"Ticket": true,
"Archive Name": "IOS36"
"Ticket": true
},
{
"Name": "IOS 37",
@@ -598,8 +543,7 @@
"Versions": {
"World": [2070, 3609, 3612, 3869, 5662, 5663]
},
"Ticket": true,
"Archive Name": "IOS37"
"Ticket": true
},
{
"Name": "IOS 38",
@@ -607,8 +551,7 @@
"Versions": {
"World": [3610, 3867, 4123, 4124]
},
"Ticket": true,
"Archive Name": "IOS38"
"Ticket": true
},
{
"Name": "IOS 40",
@@ -617,7 +560,6 @@
"World": [3072]
},
"Ticket": true,
"Archive Name": "IOS40",
"Danger": "Version 3072 of IOS 40 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 3.3K, DO NOT install version 3072, as the System Menu relies on IOS 40."
},
{
@@ -626,8 +568,7 @@
"Versions": {
"World": [2835, 3091, 3348, 3606, 3607]
},
"Ticket": true,
"Archive Name": "IOS41"
"Ticket": true
},
{
"Name": "IOS 43",
@@ -635,8 +576,7 @@
"Versions": {
"World": [2835, 3091, 3348, 3606, 3607]
},
"Ticket": true,
"Archive Name": "IOS43"
"Ticket": true
},
{
"Name": "IOS 45",
@@ -644,8 +584,7 @@
"Versions": {
"World": [2835, 3091, 3348, 3606, 3607]
},
"Ticket": true,
"Archive Name": "IOS45"
"Ticket": true
},
{
"Name": "IOS 46",
@@ -653,8 +592,7 @@
"Versions": {
"World": [2837, 3093, 3350, 3606, 3607]
},
"Ticket": true,
"Archive Name": "IOS46"
"Ticket": true
},
{
"Name": "IOS 48",
@@ -662,8 +600,7 @@
"Versions": {
"World": [4123, 4124]
},
"Ticket": true,
"Archive Name": "IOS48"
"Ticket": true
},
{
"Name": "IOS 50",
@@ -672,7 +609,6 @@
"World": [4889, 5120]
},
"Ticket": true,
"Archive Name": "IOS50",
"Danger": "Version 5120 of IOS 50 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 3.3K, DO NOT install version 5120, as the System Menu relies on IOS 50."
},
{
@@ -682,7 +618,6 @@
"World": [4633, 4864]
},
"Ticket": true,
"Archive Name": "IOS51",
"Danger": "Version 4864 of IOS 51 is a stub, and no longer offers any functionality. It cannot be used to run any code."
},
{
@@ -692,7 +627,6 @@
"World": [5661, 5888]
},
"Ticket": true,
"Archive Name": "IOS52",
"Danger": "Version 5888 of IOS 50 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 3.5, DO NOT install version 5888, as the System Menu relies on IOS 50."
},
{
@@ -701,8 +635,7 @@
"Versions": {
"World": [4113, 5149, 5406, 5662, 5663]
},
"Ticket": true,
"Archive Name": "IOS53"
"Ticket": true
},
{
"Name": "IOS 55",
@@ -710,8 +643,7 @@
"Versions": {
"World": [4633, 5149, 5406, 5662, 5663]
},
"Ticket": true,
"Archive Name": "IOS55"
"Ticket": true
},
{
"Name": "IOS 56",
@@ -719,8 +651,7 @@
"Versions": {
"World": [4890, 5405, 5661, 5662]
},
"Ticket": true,
"Archive Name": "IOS56"
"Ticket": true
},
{
"Name": "IOS 57",
@@ -728,8 +659,7 @@
"Versions": {
"World": [5404, 5661, 5918, 5919]
},
"Ticket": true,
"Archive Name": "IOS57"
"Ticket": true
},
{
"Name": "IOS 58",
@@ -737,8 +667,7 @@
"Versions": {
"World": [6175, 6176]
},
"Ticket": true,
"Archive Name": "IOS58"
"Ticket": true
},
{
"Name": "IOS 59",
@@ -746,8 +675,7 @@
"Versions": {
"World": [8737, 9249]
},
"Ticket": true,
"Archive Name": "IOS59"
"Ticket": true
},
{
"Name": "IOS 60",
@@ -756,7 +684,6 @@
"World": [6174, 6400]
},
"Ticket": true,
"Archive Name": "IOS60",
"Danger": "Version 6400 of IOS 60 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 4.0 or 4.1, DO NOT install version 6400, as the System Menu relies on IOS 60."
},
{
@@ -765,8 +692,7 @@
"Versions": {
"World": [4890, 5405, 5661, 5662]
},
"Ticket": true,
"Archive Name": "IOS61"
"Ticket": true
},
{
"Name": "IOS 62",
@@ -774,8 +700,7 @@
"Versions": {
"World": [6430]
},
"Ticket": true,
"Archive Name": "IOS62"
"Ticket": true
},
{
"Name": "IOS 70",
@@ -784,7 +709,6 @@
"World": [6687,6912]
},
"Ticket": true,
"Archive Name": "IOS70",
"Danger": "Version 6912 of IOS 70 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 4.2, DO NOT install version 6912, as the System Menu relies on IOS 70."
},
{
@@ -794,7 +718,6 @@
"World": [6943, 6944]
},
"Ticket": true,
"Archive Name": "IOS80",
"Danger": "IOS 80 is the IOS that the final System Menu, 4.3, relies on, and is required to load the System Menu. Do not modify or remove this IOS unless you have BootMii installed as boot2 to recover from a brick."
},
{
@@ -804,7 +727,6 @@
"World": [65280]
},
"Ticket": true,
"Archive Name": "IOS222",
"Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code."
},
{
@@ -814,7 +736,6 @@
"World": [65280]
},
"Ticket": true,
"Archive Name": "IOS223",
"Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code."
},
{
@@ -824,7 +745,6 @@
"World": [65280]
},
"Ticket": true,
"Archive Name": "IOS249",
"Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code."
},
{
@@ -834,7 +754,6 @@
"World": [65280]
},
"Ticket": true,
"Archive Name": "IOS250",
"Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code."
},
{
@@ -844,7 +763,6 @@
"World": [2, 3, 260, 65280]
},
"Ticket": true,
"Archive Name": "IOS254",
"Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code."
}
],

View File

@@ -13,7 +13,6 @@ class TitleData:
# Class to store all data for a Title.
tid: str
name: str
archive_name: str
version: str
ticket: bool
region: str

View File

@@ -2,7 +2,6 @@
# Copyright 2024-2025 NinjaCheetah
import pathlib
from typing import List, Tuple
import libTWLPy

View File

@@ -2,7 +2,6 @@
# Copyright 2024-2025 NinjaCheetah
import pathlib
from typing import List, Tuple
import libWiiPy
@@ -112,7 +111,7 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
title.ticket.title_key_enc = title_key_common
# Get the WAD certificate chain, courtesy of libWiiPy.
progress_callback.emit(" - Building certificate...")
title.wad.set_cert_data(libWiiPy.title.download_cert(wiiu_endpoint=wiiu_nus_enabled))
title.load_cert_chain(libWiiPy.title.download_cert_chain(wiiu_endpoint=wiiu_nus_enabled))
# Use a typed WAD name if there is one, and auto generate one based on the TID and version if there isn't.
progress_callback.emit(" - Packing WAD...")
if wad_file_name != "" and wad_file_name is not None:

View File

@@ -60,10 +60,8 @@ class NUSGetTreeModel(QAbstractItemModel):
tid_item.add_child(region_item)
for version in version_list:
danger = entry.get("Danger") if entry.get("Danger") is not None else ""
archive_name = (entry.get("Archive Name") if entry.get("Archive Name") is not None
else entry.get("Name").replace(" ", "-"))
metadata = TitleData(entry.get("TID"), entry.get("Name"), archive_name,
version, entry.get("Ticket"), region, key, danger)
metadata = TitleData(entry.get("TID"), entry.get("Name"), version,
entry.get("Ticket"), region, key, danger)
public_versions = entry.get("Public Versions")
if public_versions is not None:
try:

View File

@@ -15,277 +15,286 @@ Select a title from the list on the left, or enter a Title ID to begin.
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
Titles will be downloaded to a folder named &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation type="unfinished"></translation>
<translation>NUSGet v{nusget_version}
Développé par NinjaCheetah
Alimenté par libWiiPy {libwiipy_version}
Support DSi fourni par libTWLPy {libtwlpy_version}
Choisissez un titre depuis la liste à gauche, ou saisissez un ID de titre pour commencer.
Les titres marqués d&apos;une coche sont gratuits et ont un billet disponible, et peuvent être décryptés et/ou empaquetés dans un fichier WAD ou TAD. Les titres marqués d&apos;une croix n&apos;ont pas de billets, et seul leur contenu crypté peut être enregistré.
Les titres seront téléchargés dans un dossier &quot;NUSGet Downloads&quot;, à l&apos;intérieur de votre dossier de téléchargements.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="192"/>
<source>NUSGet Update Available</source>
<translation type="unfinished"></translation>
<translation>Mise à jour NUSGet disponible</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="193"/>
<source>There&apos;s a newer version of NUSGet available!</source>
<translation type="unfinished"></translation>
<translation>Une nouvelle version de NUSGet est disponible !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="286"/>
<source>No Output Selected</source>
<translation type="unfinished"></translation>
<translation>Aucun format sélectionné</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="287"/>
<source>You have not selected any format to output the data in!</source>
<translation type="unfinished"></translation>
<translation>Veuillez sélectionner un format de sortie pour les données !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="289"/>
<source>Please select at least one option for how you would like the download to be saved.</source>
<translation type="unfinished"></translation>
<translation>Veuillez sélectionner au moins une option de téléchargement.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="318"/>
<source>Invalid Title ID</source>
<translation type="unfinished"></translation>
<translation>ID de titre invalide</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="319"/>
<source>The Title ID you have entered is not in a valid format!</source>
<translation type="unfinished"></translation>
<translation>L&apos;ID de titre que vous avez saisi a un format invalide !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="321"/>
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
<translation type="unfinished"></translation>
<translation>Les ID de titre doivent être composés de 16 caractères alphanumériques. Veuillez saisir un ID formaté correctement, ou sélectionnez-en un depuis le menu de gauche.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="323"/>
<source>Title ID/Version Not Found</source>
<translation type="unfinished"></translation>
<translation>ID de titre / Version introuvable</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="324"/>
<source>No title with the provided Title ID or version could be found!</source>
<translation type="unfinished"></translation>
<translation>Aucun titre trouvé pour l&apos;ID ou la version fourni !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="326"/>
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
<translation type="unfinished"></translation>
<translation>Veuillez vous assurez que vous avez saisi un ID valide, ou sélectionnez-en un depuis la base de données, et que la version fournie existe pour le titre que vous souhaitez télécharger.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="328"/>
<source>Content Decryption Failed</source>
<translation type="unfinished"></translation>
<translation>Échec du décryptage</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="329"/>
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
<translation type="unfinished"></translation>
<translation>Le décryptage du contenu a échoué ! Le contenu décrypté ne peut être créé.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="332"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, try disabling that option before trying the download again to fix potential issues with local data.</source>
<translation type="unfinished"></translation>
<translation>Vos métadonnées (TMD) ou le billet sont probablement endommagés, ou ils ne correspondent pas au contenu décrypté. Si vous avez coché &quot;Utiliser des fichiers locaux, s&apos;ils existent&quot;, essayez de désactiver cette option avant d&apos;essayer à nouveau pour résoudre les éventuelles erreurs avec les données locales.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="335"/>
<source>Ticket Not Available</source>
<translation type="unfinished"></translation>
<translation>Billet indisponible</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="336"/>
<source>No Ticket is Available for the Requested Title!</source>
<translation type="unfinished"></translation>
<translation>Aucun billet disponible pour le titre demandé !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="339"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
<translation type="unfinished"></translation>
<translation>Un billet ne peut être téléchargé pour le titre demandé, mais vous avez sélectionné &quot;Empaqueter une archive d&apos;installation&quot; ou &quot;Décrypter le contenu&quot;. Ces options sont indisponibles pour les titres sans billet. Seul le contenu crypté a é enregistré.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="341"/>
<source>Unknown Error</source>
<translation type="unfinished"></translation>
<translation>Erreur inconnue</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="342"/>
<source>An Unknown Error has Occurred!</source>
<translation type="unfinished"></translation>
<translation>Une erreur inconnue est survenue !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="344"/>
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
<translation type="unfinished"></translation>
<translation>Veuillez essayer à nouveau. Si le problème persiste, déclarez un problème sur GitHub en décrivant les actions qui ont provoqué l&apos;erreur.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="363"/>
<source>Script Issues Occurred</source>
<translation type="unfinished"></translation>
<translation>Erreurs survenues dans le script</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="364"/>
<source>Some issues occurred while running the download script.</source>
<translation type="unfinished"></translation>
<translation>Des erreurs sont survenues pendant l&apos;exécution du script de téléchargement.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="366"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation type="unfinished"></translation>
<translation>Vérifiez le journal pour plus de détails à propos des erreurs rencontrées.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="373"/>
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
<translation type="unfinished"></translation>
<translation>Le téléchargement des titres suivants a échoué. Assurez-vous que les ID de titre et version du script soient valides.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="383"/>
<source>You enabled &quot;Create decrypted contents&quot; or &quot;Pack installable archive&quot;, but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
<translation type="unfinished"></translation>
<translation>Vous avez activé &quot;Décrypter le contenu&quot; ou &quot;Empaqueter une archive d&apos;installation&quot;, mais les billets des titres suivants sont indisponibles. Si activé(s), le contenu crypté a é téléchargé.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="402"/>
<source>Script Download Failed</source>
<translation type="unfinished"></translation>
<translation>Échec du script de téléchargement</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="403"/>
<source>Open NUS Script</source>
<translation type="unfinished"></translation>
<translation>Ouvrir un script NUS</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="404"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation type="unfinished"></translation>
<translation>Scripts NUS (*.nus *.json)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="414"/>
<source>An error occurred while parsing the script file!</source>
<translation type="unfinished"></translation>
<translation>Une erreur est survenue pendant la lecture du script !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="415"/>
<source>Error encountered at line {e.lineno}, column {e.colno}. Please double-check the script and try again.</source>
<translation type="unfinished"></translation>
<translation>Erreur recontrée ligne {e.lineno}, colonne {e.colno}. Vérifiez le script et réessayez.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="424"/>
<source>An error occurred while parsing Title IDs!</source>
<translation type="unfinished"></translation>
<translation>Une erreur est survenue à la lecture d&apos;un ID de titre !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="425"/>
<source>The title at index {script_data.index(title)} does not have a Title ID!</source>
<translation type="unfinished"></translation>
<translation>Le titre à l&apos;index {script_data.index(title)} n&apos;a pas d&apos;ID !</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
<source>MainWindow</source>
<translation type="unfinished"></translation>
<translation>FenetrePrincipale</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
<source>Search</source>
<translation type="unfinished"></translation>
<translation>Rechercher</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
<source>Clear</source>
<translation type="unfinished"></translation>
<translation>Effacer</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
<source>Wii</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="100"/>
<source>vWii</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="110"/>
<source>DSi</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
<source>Title ID</source>
<translation type="unfinished"></translation>
<translation>ID du titre</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="142"/>
<source>v</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="155"/>
<source>Version</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source>
<translation type="unfinished"></translation>
<translation>Console :</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source>
<translation type="unfinished"></translation>
<translation>Télécharger</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source>
<translation type="unfinished"></translation>
<translation>Exécuter le script</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source>
<translation type="unfinished"></translation>
<translation>Configuration</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="269"/>
<source>Pack installable archive (WAD/TAD)</source>
<translation type="unfinished"></translation>
<translation>Empaqueter une archive d&apos;installation (WAD / TAD)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="284"/>
<source>File Name</source>
<translation type="unfinished"></translation>
<translation>Nom du fichier</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="318"/>
<source>Keep encrypted contents</source>
<translation type="unfinished"></translation>
<translation>Conserver le contenu crypté</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="354"/>
<source>Create decrypted contents (*.app)</source>
<translation type="unfinished"></translation>
<translation>Décrypter le contenu (*.app)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="393"/>
<source>Use local files, if they exist</source>
<translation type="unfinished"></translation>
<translation>Utiliser des fichiers locaux, s&apos;ils existent</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="438"/>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
<translation type="unfinished"></translation>
<translation>Utiliser le NUS Wii U (plus rapide, n&apos;affecte que Wii / vWii)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="480"/>
<source>Apply patches to IOS (Applies to WADs only)</source>
<translation type="unfinished"></translation>
<translation>Appliquer des modifications aux IOS (WAD uniquement)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="536"/>
<source>vWii Title Settings</source>
<translation type="unfinished"></translation>
<translation>Titres vWii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="570"/>
<source>Re-encrypt title using the Wii Common Key</source>
<translation type="unfinished"></translation>
<translation>Encrypter le titre avec la clé commune Wii</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="627"/>
@@ -297,28 +306,34 @@ li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
<translation></translation>
</message>
<message>
<location filename="../../modules/core.py" line="52"/>
<source>
Could not check for updates.</source>
<translation type="unfinished"></translation>
<translation>
Impossible de vérifier les mises à jour.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="60"/>
<source>
There&apos;s a newer version of NUSGet available!</source>
<translation type="unfinished"></translation>
<translation>
Une nouvelle version de NUSGet est disponible !</translation>
</message>
<message>
<location filename="../../modules/core.py" line="62"/>
<source>
You&apos;re running the latest release of NUSGet.</source>
<translation type="unfinished"></translation>
<translation>
Vous utilisez la dernière version de NUSGet.</translation>
</message>
</context>
</TS>