1
0
Fork 0
mirror of synced 2024-06-02 10:44:40 +12:00

LgdnrCore: Add egstore_write and egstore_delete methods

`egl_unintall` and `egl_export` try to access EGL's programdata folder which raises an exception if the folder doesn't exist (Windows) or it isn't specified (Linux). Copy the relevant bits from LegendaryCore to LgndrCore and create two new methods that only manipulate the `.egstore` folder.
This commit is contained in:
Stelios Tsampas 2023-03-15 17:59:33 +02:00
parent ee6a129be8
commit 2ebc12b1f5
2 changed files with 44 additions and 2 deletions

View file

@ -1,11 +1,16 @@
import json
import os
from multiprocessing import Queue
from uuid import uuid4
# On Windows the monkeypatching of `run_real` below doesn't work like on Linux
# This has the side effect of emitting the UIUpdate in DownloadThread complaining with a TypeError
# So import `legendary.core` and monkeypatch its imported DLManager
import legendary.core
from legendary.core import LegendaryCore as LegendaryCoreReal
from legendary.lfs.utils import delete_folder
from legendary.models.downloading import AnalysisResult
from legendary.models.egl import EGLManifest
from legendary.models.game import Game, InstalledGame
from legendary.models.manifest import ManifestMeta
@ -79,6 +84,43 @@ class LegendaryCore(LegendaryCoreReal):
finally:
pass
def egstore_write(self, app_name):
self.log.debug(f'Exporting ".egstore" for "{app_name}"')
# load igame/game
lgd_game = self.get_game(app_name)
lgd_igame = self._get_installed_game(app_name)
manifest_data, _ = self.get_installed_manifest(app_name)
if not manifest_data:
self.log.error(f'Game Manifest for "{app_name}" not found, cannot export!')
return
# create guid if it's not set already
if not lgd_igame.egl_guid:
lgd_igame.egl_guid = str(uuid4()).replace('-', '').upper()
_ = self._install_game(lgd_igame)
# convert to egl manifest
egl_game = EGLManifest.from_lgd_game(lgd_game, lgd_igame)
# make sure .egstore folder exists
egstore_folder = os.path.join(lgd_igame.install_path, '.egstore')
if not os.path.exists(egstore_folder):
os.makedirs(egstore_folder)
# copy manifest and create mancpn file in .egstore folder
with open(os.path.join(egstore_folder, f'{egl_game.installation_guid}.manifest', ), 'wb') as mf:
mf.write(manifest_data)
mancpn = dict(FormatVersion=0, AppName=app_name,
CatalogItemId=lgd_game.catalog_item_id,
CatalogNamespace=lgd_game.namespace)
with open(os.path.join(egstore_folder, f'{egl_game.installation_guid}.mancpn', ), 'w') as mcpnf:
json.dump(mancpn, mcpnf, indent=4, sort_keys=True)
def egstore_delete(self, igame: InstalledGame, delete_files=True):
self.log.debug(f'Removing ".egstore" for "{igame.app_name}"')
if delete_files:
delete_folder(os.path.join(igame.install_path, '.egstore'))
def egl_export(self, app_name):
try:
super(LegendaryCore, self).egl_export(app_name)

View file

@ -161,8 +161,8 @@ class RareGame(RareGameSlim):
def update_igame(self):
self.igame = self.core.get_installed_game(self.app_name)
if self.igame is not None:
self.core.egl_uninstall(self.igame)
self.core.egl_export(self.igame.app_name)
self.core.egstore_delete(self.igame)
self.core.egstore_write(self.igame.app_name)
def store_igame(self):
self.core.lgd.set_installed_game(self.app_name, self.igame)