diff --git a/NUSGet.py b/NUSGet.py index e978c0a..41536d7 100644 --- a/NUSGet.py +++ b/NUSGet.py @@ -1,5 +1,5 @@ # "NUSGet.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah and Contributors +# Copyright 2024-2026 NinjaCheetah and Contributors # Nuitka options. These determine compilation settings based on the current OS. # nuitka-project-if: {OS} == "Darwin": @@ -39,9 +39,9 @@ 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.5.0" +NUSGET_VERSION = "1.5.1" -regions = {"World": ["41"], "USA/NTSC": ["45"], "Europe/PAL": ["50"], "Japan": ["4A"], "Korea": ["4B"], "China": ["43"], +REGIONS = {"World": ["41"], "USA/NTSC": ["45"], "Europe/PAL": ["50"], "Japan": ["4A"], "Korea": ["4B"], "China": ["43"], "Australia/NZ": ["55"]} @@ -247,9 +247,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): save_config(config_data) if auto_update: # Do a quick check to see if there's a newer release available if auto-updates are enabled. - worker = Worker(check_nusget_updates, app, nusget_version) + worker = Worker(check_nusget_updates, app, NUSGET_VERSION) worker.signals.result.connect(self.prompt_for_update) - worker.signals.progress.connect(self.update_log_text) + worker.signals.progress.connect(self.progress_update) self.threadpool.start(worker) def title_double_clicked(self, index): @@ -287,7 +287,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): return self.ui.patch_ios_checkbox.setEnabled(False) - def download_progress_update(self, done, total, log_text): + def progress_update(self, done, total, log_text): if done == 0 and total == 0: self.ui.progress_bar.setRange(0, 0) elif done == -1 and total == -1: @@ -316,10 +316,10 @@ class MainWindow(QMainWindow, Ui_MainWindow): msg_box.setDefaultButton(QMessageBox.StandardButton.Yes) msg_box.setWindowTitle(app.translate("MainWindow", "NUSGet Update Available")) msg_box.setText(app.translate("MainWindow", "There's a newer version of NUSGet available!")) - msg_box.setInformativeText(app.translate("MainWindow", "You're currently running v{nusget_version}, " + msg_box.setInformativeText(app.translate("MainWindow", "You're currently running v{NUSGET_VERSION}, " "but v{new_version} is available on GitHub. Would you like to view" " the latest version?" - .format(nusget_version=nusget_version, new_version=new_version))) + .format(NUSGET_VERSION=NUSGET_VERSION, new_version=new_version))) ret = msg_box.exec() if ret == QMessageBox.StandardButton.Yes: webbrowser.open("https://github.com/NinjaCheetah/NUSGet/releases/latest") @@ -329,8 +329,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): # If the last two characters are "XX", then this title has multiple regions, and each region uses its own # two-digit code. Use the region info passed to load the correct code. if selected_title.tid[-2:] == "XX": - global regions - region_code = regions[selected_title.region][0] + global REGIONS + region_code = REGIONS[selected_title.region][0] tid = selected_title.tid[:-2] + region_code else: tid = selected_title.tid @@ -440,7 +440,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.ui.pack_vwii_mode_checkbox.isChecked(), self.ui.patch_ios_checkbox.isChecked(), self.ui.archive_file_entry.text()) worker.signals.result.connect(self.check_download_result) - worker.signals.progress.connect(self.download_progress_update) + worker.signals.progress.connect(self.progress_update) self.threadpool.start(worker) def check_download_result(self, result): @@ -584,8 +584,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): for category in target_database: for t in target_database[category]: if t["TID"][-2:] == "XX": - for r in regions: - if f"{t['TID'][:-2]}{regions[r][0]}" == tid: + for r in REGIONS: + if f"{t['TID'][:-2]}{REGIONS[r][0]}" == tid: try: archive_name = t["Name"].replace(" ", "-") break @@ -610,7 +610,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.ui.use_wiiu_nus_checkbox.isChecked(), self.ui.use_local_checkbox.isChecked(), self.ui.pack_vwii_mode_checkbox.isChecked(), self.ui.patch_ios_checkbox.isChecked()) worker.signals.result.connect(self.check_batch_result) - worker.signals.progress.connect(self.download_progress_update) + worker.signals.progress.connect(self.progress_update) self.threadpool.start(worker) def open_output_dir(self): @@ -692,7 +692,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): return out_folder def about_nusget(self): - about_box = AboutNUSGet([nusget_version, version("libWiiPy"), version("libTWLPy")]) + about_box = AboutNUSGet([NUSGET_VERSION, version("libWiiPy"), version("libTWLPy")]) about_box.exec() def change_language(self, new_lang): diff --git a/build_translations.py b/build_translations.py index bc515e8..850e260 100644 --- a/build_translations.py +++ b/build_translations.py @@ -1,5 +1,5 @@ # "build_translations.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah +# Copyright 2024-2026 NinjaCheetah & Contributors # This script exists to work around an issue in PySide6 where the "pyside6-project build" command incorrectly places # translation files in the root of the project directory while building. diff --git a/modules/config.py b/modules/config.py index 2e75796..a92b7d5 100644 --- a/modules/config.py +++ b/modules/config.py @@ -1,5 +1,5 @@ # "modules/config.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah & Contributors +# Copyright 2024-2026 NinjaCheetah & Contributors import os import json diff --git a/modules/core.py b/modules/core.py index 093b2a7..02acd1c 100644 --- a/modules/core.py +++ b/modules/core.py @@ -1,5 +1,5 @@ # "modules/core.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah & Contributors +# Copyright 2024-2026 NinjaCheetah & Contributors import requests from dataclasses import dataclass @@ -69,9 +69,11 @@ def fixup_qmenu_background(menu): def check_nusget_updates(app, current_version: str, progress_callback=None) -> str | None: # Simple function to make a request to the GitHub API and then check if the latest available version is newer. + print("checking for updates...") gh_api_request = requests.get(url="https://api.github.com/repos/NinjaCheetah/NUSGet/releases/latest", stream=True) if gh_api_request.status_code != 200: - progress_callback.emit(app.translate("MainWindow", "\n\nCould not check for updates.")) + progress_callback.emit(-1, -1, app.translate("MainWindow", "\n\nCould not check for updates.")) + print(f"update check failed, status code: {gh_api_request.status_code}") else: api_response = gh_api_request.json() new_version: str = api_response["tag_name"].replace('v', '') @@ -79,9 +81,13 @@ def check_nusget_updates(app, current_version: str, progress_callback=None) -> s current_version_split = current_version.split('.') for place in range(len(new_version_split)): if new_version_split[place] < current_version_split[place]: + progress_callback.emit(-1, -1, "\n\nYou're running a development version of NUSGet.") + print("no update available, this is a development version") return None elif new_version_split[place] > current_version_split[place]: - progress_callback.emit(app.translate("MainWindow", "\n\nThere's a newer version of NUSGet available!")) + progress_callback.emit(-1, -1, app.translate("MainWindow", "\n\nThere's a newer version of NUSGet available!")) + print("update available") return new_version - progress_callback.emit(app.translate("MainWindow", "\n\nYou're running the latest release of NUSGet.")) + progress_callback.emit(-1, -1, app.translate("MainWindow", "\n\nYou're running the latest release of NUSGet.")) + print("no update available") return None diff --git a/modules/download_batch.py b/modules/download_batch.py index e76ace4..9b90dcc 100644 --- a/modules/download_batch.py +++ b/modules/download_batch.py @@ -1,5 +1,5 @@ # "modules/download_batch.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah +# Copyright 2024-2026 NinjaCheetah & Contributors import pathlib from typing import List diff --git a/modules/download_dsi.py b/modules/download_dsi.py index 8c2bd66..d9075ec 100644 --- a/modules/download_dsi.py +++ b/modules/download_dsi.py @@ -1,5 +1,5 @@ # "modules/download_dsi.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah +# Copyright 2024-2026 NinjaCheetah & Contributors import pathlib @@ -76,11 +76,11 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_ content = libTWLPy.download_content(tid, title.tmd.content_record.content_id) progress_callback.emit(-1, -1, " - Done!") # If keep encrypted contents is on, write out the content after its downloaded. - if keep_enc_chkbox is True: + if keep_enc_chkbox: version_dir.joinpath(content_file_name).write_bytes(content) title.content.content = content # If decrypt local contents is still true, decrypt the content and write out the decrypted file. - if decrypt_contents_enabled is True: + if decrypt_contents_enabled: try: progress_callback.emit(-1, -1, f" - Decrypting content (Content ID: {title.tmd.content_record.content_id})...") dec_content = title.get_content() @@ -91,7 +91,7 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_ # local encrypted contents that have been altered at present. return -3 # If pack TAD is still true, pack the TMD, ticket, and content into a TAD. - if pack_tad_enabled is True: + if pack_tad_enabled: # Get the TAD certificate chain, courtesy of libTWLPy. progress_callback.emit(-1, -1, " - Building certificate...") title.tad.set_cert_data(libTWLPy.download_cert()) diff --git a/modules/download_wii.py b/modules/download_wii.py index e2d1be0..3589ee8 100644 --- a/modules/download_wii.py +++ b/modules/download_wii.py @@ -1,5 +1,5 @@ # "modules/download_wii.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah & Contributors +# Copyright 2024-2026 NinjaCheetah & Contributors import pathlib @@ -85,11 +85,11 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_ wiiu_endpoint=wiiu_nus_enabled, progress=progress_update)) progress_callback.emit(-1, -1, " - Done!") # If keep encrypted contents is on, write out each content after its downloaded. - if keep_enc_chkbox is True: + if keep_enc_chkbox: version_dir.joinpath(content_file_name).write_bytes(content_list[content]) title.content.content_list = content_list # If decrypt local contents is still true, decrypt each content and write out the decrypted file. - if decrypt_contents_enabled is True: + if decrypt_contents_enabled: try: for content in range(len(title.tmd.content_records)): progress_callback.emit(-1, -1, f" - Decrypting content {content + 1} of {len(title.tmd.content_records)} " @@ -102,7 +102,7 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_ # local encrypted contents that have been altered at present. return -3 # If pack WAD is still true, pack the TMD, ticket, and contents all into a WAD. - if pack_wad_enabled is True: + if pack_wad_enabled: # If the option to pack for vWii mode instead of Wii U mode is enabled, then the Title Key needs to be # re-encrypted with the common key instead of the vWii key, so that the title can be installed from within # vWii mode. (vWii mode does not have access to the vWii key, only Wii U mode has that.) diff --git a/modules/language.py b/modules/language.py index a9259c6..f95c48b 100644 --- a/modules/language.py +++ b/modules/language.py @@ -1,5 +1,5 @@ # "modules/language.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah & Contributors +# Copyright 2024-2026 NinjaCheetah & Contributors from modules.config import update_setting diff --git a/modules/theme.py b/modules/theme.py index 68357aa..160e951 100644 --- a/modules/theme.py +++ b/modules/theme.py @@ -1,5 +1,5 @@ # "modules/theme.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah & Contributors +# Copyright 2024-2026 NinjaCheetah & Contributors import os import platform diff --git a/modules/tree.py b/modules/tree.py index a4a23c2..2c3e0e9 100644 --- a/modules/tree.py +++ b/modules/tree.py @@ -1,5 +1,5 @@ # "modules/tree.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah +# Copyright 2024-2026 NinjaCheetah & Contributors from modules.core import TitleData from PySide6.QtCore import QAbstractItemModel, QModelIndex, Qt, QSortFilterProxyModel diff --git a/qt/py/ui_AboutDialog.py b/qt/py/ui_AboutDialog.py index 679213b..9374498 100644 --- a/qt/py/ui_AboutDialog.py +++ b/qt/py/ui_AboutDialog.py @@ -1,5 +1,5 @@ # "qt/py/ui_AboutDialog.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah and Contributors +# Copyright 2024-2026 NinjaCheetah and Contributors # Thanks Isla and Alex for making such a nice about dialog that I could then "borrow" :p import os @@ -46,7 +46,7 @@ class AboutNUSGet(QDialog): libraries_label.setAlignment(Qt.AlignmentFlag.AlignCenter) # Copyright - copyright_label = QLabel(self.tr("© 2024-2025 NinjaCheetah & Contributors")) + copyright_label = QLabel(self.tr("© 2024-2026 NinjaCheetah & Contributors")) copyright_label.setProperty("class", "copyright") copyright_label.setAlignment(Qt.AlignmentFlag.AlignCenter) diff --git a/update_translations.py b/update_translations.py index 1daab1d..68c9c64 100644 --- a/update_translations.py +++ b/update_translations.py @@ -1,5 +1,5 @@ # "update_translations.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah +# Copyright 2024-2026 NinjaCheetah & Contributors # This script exists to work around an issue in PySide6 where the "pyside6-project lupdate" command doesn't work as # expected, as it struggles to parse the paths in the .pyproject file. This does what it's meant to do for it.