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:
parent
ee6a129be8
commit
2ebc12b1f5
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue