From 03d64d4401ee7739ea1964a9ab01b8721a0a0ce0 Mon Sep 17 00:00:00 2001 From: skymike03 Date: Wed, 5 Nov 2025 05:33:18 +0100 Subject: [PATCH] v2.3.1.6 (2025.11.05) - Replace xdvdfs by extract_xiso because conversion not working in all xbox games --- ports/RGSX/assets/progs/extract-xiso_linux | Bin 0 -> 60632 bytes ports/RGSX/assets/progs/extract-xiso_win.exe | Bin 0 -> 40960 bytes ports/RGSX/config.py | 6 +- ports/RGSX/utils.py | 64 +++++++++++-------- version.json | 2 +- 5 files changed, 42 insertions(+), 30 deletions(-) create mode 100644 ports/RGSX/assets/progs/extract-xiso_linux create mode 100644 ports/RGSX/assets/progs/extract-xiso_win.exe diff --git a/ports/RGSX/assets/progs/extract-xiso_linux b/ports/RGSX/assets/progs/extract-xiso_linux new file mode 100644 index 0000000000000000000000000000000000000000..59f30d748a0402d92acc1bf04affdd834d5a1823 GIT binary patch literal 60632 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 literal 0 HcmV?d00001 diff --git a/ports/RGSX/assets/progs/extract-xiso_win.exe b/ports/RGSX/assets/progs/extract-xiso_win.exe new file mode 100644 index 0000000000000000000000000000000000000000..43a10a6d0affd9d4f4b3bded53a3da25bd8190a5 GIT binary patch literal 40960 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 E4``$E`2YX_ literal 0 HcmV?d00001 diff --git a/ports/RGSX/config.py b/ports/RGSX/config.py index 76d2728..7cd9541 100644 --- a/ports/RGSX/config.py +++ b/ports/RGSX/config.py @@ -13,7 +13,7 @@ except Exception: pygame = None # type: ignore # Version actuelle de l'application -app_version = "2.3.1.5" +app_version = "2.3.1.6" def get_application_root(): @@ -106,8 +106,8 @@ OTA_data_ZIP = os.path.join(OTA_SERVER_URL, "games.zip") #CHEMINS DES EXECUTABLES UNRAR_EXE = os.path.join(APP_FOLDER,"assets","progs","unrar.exe") -XDVDFS_EXE = os.path.join(APP_FOLDER,"assets", "progs", "xdvdfs.exe") -XDVDFS_LINUX = os.path.join(APP_FOLDER,"assets", "progs", "xdvdfs") +XISO_EXE = os.path.join(APP_FOLDER,"assets", "progs", "extract-xiso_win.exe") +XISO_LINUX = os.path.join(APP_FOLDER,"assets", "progs", "extact_xiso_linux") PS3DEC_EXE = os.path.join(APP_FOLDER,"assets", "progs", "ps3dec_win.exe") PS3DEC_LINUX = os.path.join(APP_FOLDER,"assets", "progs", "ps3dec_linux") SEVEN_Z_LINUX = os.path.join(APP_FOLDER,"assets", "progs", "7zz") diff --git a/ports/RGSX/utils.py b/ports/RGSX/utils.py index edad617..20b884a 100644 --- a/ports/RGSX/utils.py +++ b/ports/RGSX/utils.py @@ -1788,31 +1788,31 @@ def handle_xbox(dest_dir, iso_files, url=None): time.sleep(2) if config.OPERATING_SYSTEM == "Windows": # Sur Windows; telecharger le fichier exe - XDVDFS_EXE = config.XDVDFS_EXE - xdvdfs_cmd = [XDVDFS_EXE, "pack"] # Liste avec 2 éléments + XISO_EXE = config.XISO_EXE + extract_xiso_cmd = [XISO_EXE, "-r"] # Liste avec 2 éléments else: # Linux/Batocera : télécharger le fichier xdvdfs - XDVDFS_LINUX = config.XDVDFS_LINUX + XISO_LINUX = config.XISO_LINUX try: - stat_info = os.stat(XDVDFS_LINUX) + stat_info = os.stat(XISO_LINUX) mode = stat_info.st_mode - logger.debug(f"Permissions de {XDVDFS_LINUX}: {oct(mode)}") + logger.debug(f"Permissions de {XISO_LINUX}: {oct(mode)}") logger.debug(f"Propriétaire: {stat_info.st_uid}, Groupe: {stat_info.st_gid}") # Vérifier si le fichier est exécutable - if not os.access(XDVDFS_LINUX, os.X_OK): - logger.error(f"Le fichier {XDVDFS_LINUX} n'est pas exécutable") + if not os.access(XISO_LINUX, os.X_OK): + logger.error(f"Le fichier {XISO_LINUX} n'est pas exécutable") try: - os.chmod(XDVDFS_LINUX, 0o755) - logger.info(f"Permissions corrigées pour {XDVDFS_LINUX}") + os.chmod(XISO_LINUX, 0o755) + logger.info(f"Permissions corrigées pour {XISO_LINUX}") except Exception as e: logger.error(f"Impossible de modifier les permissions: {str(e)}") return False, "Erreur de permissions sur xdvdfs" except Exception as e: logger.error(f"Erreur lors de la vérification des permissions: {str(e)}") - xdvdfs_cmd = [XDVDFS_LINUX, "pack"] # Liste avec 2 éléments + extract_xiso_cmd = [XISO_LINUX, "-r"] # Liste avec 2 éléments try: # Utiliser uniquement la liste fournie (nouveaux ISO extraits). Fallback scan uniquement si liste vide. @@ -1862,16 +1862,21 @@ def handle_xbox(dest_dir, iso_files, url=None): logger.info(f"Démarrage conversion Xbox: {total} ISO(s)") for idx, iso_xbox_source in enumerate(iso_files, start=1): logger.debug(f"Traitement de l'ISO Xbox: {iso_xbox_source}") - xiso_dest = os.path.splitext(iso_xbox_source)[0] + "_xbox.iso" - - # Construction de la commande avec des arguments distincts - cmd = xdvdfs_cmd + [iso_xbox_source, xiso_dest] - logger.debug(f"Exécution de la commande: {' '.join(cmd)}") + + # extract-xiso -r repackage l'ISO en place + # Il faut exécuter la commande depuis le dossier contenant l'ISO + iso_dir = os.path.dirname(iso_xbox_source) + iso_filename = os.path.basename(iso_xbox_source) + + # Utiliser le nom de fichier relatif et définir le répertoire de travail + cmd = extract_xiso_cmd + [iso_filename] + logger.debug(f"Exécution de la commande: {' '.join(cmd)} (cwd: {iso_dir})") process = subprocess.run( cmd, capture_output=True, - text=True + text=True, + cwd=iso_dir ) if process.returncode != 0: @@ -1883,27 +1888,34 @@ def handle_xbox(dest_dir, iso_files, url=None): if url not in config.download_progress: config.download_progress[url] = {} config.download_progress[url]["status"] = "Error" - config.download_progress[url]["message"] = {process.stderr} + config.download_progress[url]["message"] = process.stderr config.download_progress[url]["progress_percent"] = 0 config.needs_redraw = True if isinstance(config.history, list): for entry in config.history: if entry.get("url") == url and entry.get("status") in ("Converting", "Extracting", "Téléchargement", "Downloading"): entry["status"] = "Error" - entry["message"] = {process.stderr} + entry["message"] = process.stderr save_history(config.history) break except Exception: pass return False, err_msg - # Vérifier que l'ISO converti a été créé - if os.path.exists(xiso_dest): - logger.info(f"ISO converti avec succès: {xiso_dest}") - # Remplacer l'ISO original par l'ISO converti - os.remove(iso_xbox_source) - os.rename(xiso_dest, iso_xbox_source) - logger.debug(f"ISO original remplacé par la version convertie") + # Vérifier que l'ISO existe toujours (extract-xiso le modifie en place) + if os.path.exists(iso_xbox_source): + logger.info(f"ISO repackagé avec succès: {iso_xbox_source}") + logger.debug(f"ISO converti au format XISO en place") + + # Supprimer le fichier .old créé par extract-xiso (backup) + old_file = iso_xbox_source + ".old" + if os.path.exists(old_file): + try: + os.remove(old_file) + logger.debug(f"Fichier backup .old supprimé: {old_file}") + except Exception as e: + logger.warning(f"Impossible de supprimer le fichier .old: {e}") + # Mise à jour progression de conversion (coarse-grain) try: percent = int(idx / total * 100) if total > 0 else 100 @@ -1922,7 +1934,7 @@ def handle_xbox(dest_dir, iso_files, url=None): except Exception: pass else: - err_msg = f"L'ISO converti n'a pas été créé: {xiso_dest}" + err_msg = f"L'ISO source a disparu après conversion: {iso_xbox_source}" logger.error(err_msg) try: if url: diff --git a/version.json b/version.json index 470f35d..abc5461 100644 --- a/version.json +++ b/version.json @@ -1,3 +1,3 @@ { - "version": "2.3.1.5" + "version": "2.3.1.6" } \ No newline at end of file