Add nrg disc image launch support #162

Merged
Boria138 merged 1 commits from nrg into main 2026-06-08 04:58:13 +00:00
9 changed files with 15 additions and 10 deletions

No files matched your search

+1
View File
@@ -18,6 +18,7 @@
- Добавлено обновление `steam_scripts` в миграции ярлыков
- Добавлена вкладка избранных параметров в диалог настроек exe
- Добавлена вкладка настроек vkBasalt в диалог настроек exe
- Добавлена поддержка запуска `.nrg`
### Changed
- Действия управления питанием во вкладке `System` переведены на использование `loginctl`
+1 -1
View File
@@ -60,7 +60,7 @@ PortProtonQt использует код и зависимости от след
- [Icoextract](https://github.com/jlu5/icoextract) — библиотека для извлечения иконок, лицензия [MIT](https://github.com/jlu5/icoextract/blob/master/LICENSE).
- [HowLongToBeat Python API](https://github.com/ScrappyCocco/HowLongToBeat-PythonAPI) — библиотека для взаимодействия с HowLongToBeat, лицензия [MIT](https://github.com/ScrappyCocco/HowLongToBeat-PythonAPI/blob/master/LICENSE.md).
- [iat](https://sourceforge.net/projects/iat.berlios) — библиотека для конвертации mdf в iso, лицензия GPLv3
- [iat](https://sourceforge.net/projects/iat.berlios) — библиотека для конвертации mdf и nrg в iso, лицензия GPLv3
- [pyte](https://github.com/selectel/pyte) — разбор ANSI escape-кодов, лицензия [LGPLv3](https://github.com/selectel/pyte?tab=LGPL-3.0-1-ov-file)
Полный текст лицензий см. в файле [LICENSE](LICENSE).
@@ -11,4 +11,4 @@ Terminal=false
Icon=ru.linux_gaming.PortProtonQt
StartupWMClass=ru.linux_gaming.PortProtonQt
Categories=Game;Utility;
MimeType=x-scheme-handler/portproton;application/x-portproton-prefix-backup;application/x-ms-dos-exec;application/x-ms-dos-batch;application/x-bat;application/x-msi;text/x-ms-regedit;application/x-executable;application/x-dosexec;application/x-iso9660-image;application/x-cd-image;application/x-raw-disk-image;application/x-mdf;application/x-mds-disk;
MimeType=x-scheme-handler/portproton;application/x-portproton-prefix-backup;application/x-ms-dos-exec;application/x-ms-dos-batch;application/x-bat;application/x-msi;text/x-ms-regedit;application/x-executable;application/x-dosexec;application/x-iso9660-image;application/x-cd-image;application/x-raw-disk-image;application/x-mdf;application/x-mds-disk;application/x-nrg;
+2 -2
View File
@@ -7,7 +7,7 @@ from pathlib import Path
from portprotonqt.steam_api import get_steam_home
LAUNCH_FILE_EXTENSIONS = ('.exe', '.bat', '.cmd', '.msi', '.reg', '.iso', '.mdf')
LAUNCH_FILE_EXTENSIONS = ('.exe', '.bat', '.cmd', '.msi', '.reg', '.iso', '.mdf', '.nrg')
PREFIX_BACKUP_EXTENSION = '.ppack'
@@ -83,7 +83,7 @@ def parse_args():
parser.add_argument(
'file_or_url',
nargs='?',
help="Launch file path (.exe/.bat/.cmd/.msi/.reg/.iso/.mdf) or portproton:// URL"
help="Launch file path (.exe/.bat/.cmd/.msi/.reg/.iso/.mdf/.nrg) or portproton:// URL"
)
if os.environ.get("STEAM_COMPAT") == "1" and "--" in sys.argv[1:]:
separator_index = sys.argv.index("--")
+1 -1
View File
@@ -434,7 +434,7 @@ def parse_desktop_entry(file_path: str) -> configparser.SectionProxy | None:
WINDOWS_LAUNCH_EXTENSIONS = (".exe", ".bat", ".cmd", ".msi", ".reg")
DISC_IMAGE_EXTENSIONS = (".iso", ".mdf")
DISC_IMAGE_EXTENSIONS = (".iso", ".mdf", ".nrg")
LAUNCH_FILE_EXTENSIONS = WINDOWS_LAUNCH_EXTENSIONS + DISC_IMAGE_EXTENSIONS
THEMED_LAUNCH_ICON_NAMES = {
".bat": "bat",
+1 -1
View File
@@ -31,7 +31,7 @@ from portprotonqt.icon_extractor import generate_thumbnail
logger = get_logger(__name__)
theme_manager = ThemeManager()
DISC_IMAGE_EXTENSIONS = (".iso", ".mdf")
DISC_IMAGE_EXTENSIONS = (".iso", ".mdf", ".nrg")
class FileSelectedSignal(QObject):
+1 -1
View File
@@ -28,7 +28,7 @@ from portprotonqt.scripts_utils.mount_points import list_mounted_drive_paths
logger = get_logger(__name__)
theme_manager = ThemeManager()
DISC_IMAGE_EXTENSIONS = (".iso", ".mdf")
DISC_IMAGE_EXTENSIONS = (".iso", ".mdf", ".nrg")
THUMBNAIL_PRELOAD_ROWS = 5
THUMBNAIL_QUEUE_LIMIT = 24
THUMBNAIL_SCROLL_DELAY_MS = 80
+6 -2
View File
@@ -21,6 +21,7 @@ SVCD_SUB_HEADERS = (
b"\x00\x00\x89\x00\x00\x00\x89\x00",
)
UDF_SIGNATURES = (b"BEA01", b"BOOT2", b"CD001", b"CDW02", b"NSR02", b"NSR03", b"TEA01")
CONVERTIBLE_DISC_EXTENSIONS = (".mdf", ".nrg")
class DiscImageManager:
@@ -300,7 +301,10 @@ class DiscImageManager:
logger.error("7zz or 7z is required to extract MDF set %s", mdf_path)
return None
mdf_sources = self._get_mdf_sources(normalized_mdf)
if normalized_mdf.lower().endswith(".mdf"):
mdf_sources = self._get_mdf_sources(normalized_mdf)
else:
mdf_sources = [normalized_mdf]
source_stamp = self._get_disc_source_stamp(mdf_sources)
if not source_stamp:
return None
@@ -338,7 +342,7 @@ class DiscImageManager:
def sync_iso_to_rw(self, iso_path: str) -> str | None:
"""Extract disc image content to writable runtime directory if source changed."""
normalized_iso = os.path.abspath(os.path.expanduser(iso_path))
if normalized_iso.lower().endswith(".mdf"):
if normalized_iso.lower().endswith(CONVERTIBLE_DISC_EXTENSIONS):
return self._sync_mdf_set_to_rw(normalized_iso)
rw_root = self._iso_rw_paths.get(normalized_iso, self._get_iso_rw_root(normalized_iso))
os.makedirs(rw_root, exist_ok=True)
+1 -1
View File
@@ -84,7 +84,7 @@ from concurrent.futures import ThreadPoolExecutor
from datetime import datetime
logger = get_logger(__name__)
DISC_IMAGE_EXTENSIONS = (".iso", ".mdf")
DISC_IMAGE_EXTENSIONS = (".iso", ".mdf", ".nrg")
class MainWindow(MainWindowControlHintsMixin, MainWindowSystemTabMixin, MainWindowWorkersMixin, QMainWindow):
games_loaded = Signal(list)