From ca46e3097374b7f2488bc52c471896fb6a37deb2 Mon Sep 17 00:00:00 2001 From: Christian Moser Date: Thu, 13 Mar 2025 23:17:06 +0100 Subject: [PATCH] removed some unused GameData and did some fixes --- sgbackup/archiver/zipfilearchiver.py | 1 + sgbackup/game.py | 294 +++++++-------------------- sgbackup/gui/_backupdialog.py | 8 +- sgbackup/settings.py | 15 +- 4 files changed, 93 insertions(+), 225 deletions(-) diff --git a/sgbackup/archiver/zipfilearchiver.py b/sgbackup/archiver/zipfilearchiver.py index 572bdee..7558f0e 100644 --- a/sgbackup/archiver/zipfilearchiver.py +++ b/sgbackup/archiver/zipfilearchiver.py @@ -31,6 +31,7 @@ class ZipfileArchiver(Archiver): _calc_fraction = lambda n,cnt: ((1.0 / n) * cnt) self._backup_progress(game,0.0,"Starting {game} ...".format(game=game.name)) + files = game.get_backup_files() div = len(files) + 2 cnt=1 diff --git a/sgbackup/game.py b/sgbackup/game.py index 4436651..5e08c80 100644 --- a/sgbackup/game.py +++ b/sgbackup/game.py @@ -37,17 +37,17 @@ from string import Template logger = logging.getLogger(__name__) from .settings import settings +from .utility import ( + PLATFORM_WINDOWS, + PLATFORM_UNIX, + PLATFORM_LINUX, + PLATFORM_MACOS, + sanitize_windows_path, +) -if sys.platform.lower() == "win32": - PLATFORM_WIN32 = True +if PLATFORM_WINDOWS: import winreg -else: - PLATFORM_WIN32 = False -if sys.platform.lower() in ['linux','freebsd','netbsd','openbsd','dragonfly']: - PLATFORM_LINUX = True -else: - PLATFORM_LINUX = False class SavegameType(StrEnum): @@ -611,15 +611,15 @@ class WindowsGame(GameData): GameData.__init__(self, SavegameType.WINDOWS, - savegame_root, - savegame_dir, + sanitize_windows_path(savegame_root), + sanitize_windows_path(savegame_dir), variables, file_match, ignore_match) if not installdir: self.__installdir = None else: - self.__installdir = installdir + self.__installdir = sanitize_windows_path(installdir) if not game_registry_keys: self.__game_registry_keys = [] @@ -656,7 +656,7 @@ class WindowsGame(GameData): @installdir.setter def installdir(self,installdir:str|None): - self.__installdir = installdir + self.__installdir = sanitize_windows_path(installdir) @Property def game_registry_keys(self)->list: @@ -682,7 +682,7 @@ class WindowsGame(GameData): @Property def is_installed(self)->bool|None: - if not PLATFORM_WIN32 or not self.game_registry_keys: + if not PLATFORM_WINDOWS or not self.game_registry_keys: return None for regkey in self.__game_registry_keys: hkey = self.__get_hkey(regkey) @@ -700,7 +700,7 @@ class WindowsGame(GameData): @Property def registry_installdir(self)->str|None: - if not PLATFORM_WIN32 or not (self.installdir_registry_keys): + if not PLATFORM_WINDOWS or not (self.installdir_registry_keys): return None for regkey in self.__game_registry_keys: hkey = self.__get_hkey(regkey) @@ -809,145 +809,6 @@ class MacOSGame(GameData): if self.binary: ret['binary'] = self.binary return ret - - -class SteamGame(GameData): - def __init__(self, - sgtype:SavegameType, - appid:int, - savegame_root:str, - savegame_dir:str, - variables:dict|None=None, - installdir:str|None=None, - file_match:list|None=None, - ignore_match:list|None=None): - if sgtype not in (SavegameType.STEAM_WINDOWS, - SavegameType.STEAM_LINUX, - SavegameType.STEAM_MACOS): - raise TypeError("SaveGameType") - - GameData.__init__(self, - sgtype, - savegame_root, - savegame_dir, - variables, - file_match, - ignore_match) - self.appid = int(appid) - self.installdir = installdir - self.librarydir=None - - def get_variables(self): - vars = super().get_variables() - vars["INSTALLDIR"] = self.installdir if self.installdir else "" - vars["STEAM_APPID"] = str(self.appid) - vars["STEAM_LIBDIR"] = self.librarydir if self.librarydir else "" - vars["STEAM_LIBRARY_DIR"] = self.librarydir if self.librarydir else "" - vars["STEAM_COMPATDATA"] = self.compatdata if self.compatdata else "" - - return vars - - @Property(type=int) - def appid(self): - return self.__appid - @appid.setter - def appid(self,appid): - self.__appid = appid - - @Property - def installdir(self): - return self.__installdir - @installdir.setter - def installdir(self,installdir:str|None): - self.__installdir = installdir - - @Property - def librarydir(self)->str|None: - if not self.__librarydir and self.installdir: - return str(pathlib.Path(self.installdir).resolve().parent.parent.parent) - return self.__librarydir - - @librarydir.setter - def librarydir(self,directory): - if not directory: - self.__librarydir = None - elif not os.path.isdir(directory): - raise ValueError("Steam librarydir is not a valid directory!") - self.__librarydir = directory - - @Property - def compatdata(self)->str|None: - libdir = self.librarydir - if libdir: - return str(pathlib.Path(libdir).resolve() / 'steamapps' / 'compatdata') - return None - - def serialize(self): - ret = super().serialize() - ret['appid'] = self.appid - - if self.installdir: - ret['installdir'] = str(self.installdir) if self.installdir else "" - ret['librarydir'] = str(self.librarydir) if self.librarydir else "" - - return ret - -class SteamWindowsGame(SteamGame): - def __init__(self, - appid:int, - savegame_root:str, - savegame_dir:str, - variables:dict|None=None, - installdir:str|None=None, - file_match:list|None=None, - ignore_match:list|None=None): - SteamGame.__init__(self, - SavegameType.STEAM_WINDOWS, - appid, - savegame_root, - savegame_dir, - variables, - installdir, - file_match, - ignore_match) - -class SteamLinuxGame(SteamGame): - def __init__(self, - appid:int, - savegame_root:str, - savegame_dir:str, - variables:dict|None=None, - installdir:str|None=None, - file_match:list|None=None, - ignore_match:list|None=None): - SteamGame.__init__(self, - SavegameType.STEAM_LINUX, - appid, - savegame_root, - savegame_dir, - variables, - installdir, - file_match, - ignore_match) - -class SteamMacOSGame(SteamGame): - def __init__(self, - appid:int, - savegame_root:str, - savegame_dir:str, - variables:dict|None=None, - installdir:str|None=None, - file_match:list|None=None, - ignore_match:list|None=None): - SteamGame.__init__(self, - SavegameType.STEAM_MACOS, - appid, - savegame_root, - savegame_dir, - variables, - installdir, - file_match, - ignore_match) class SteamPlatformData(GameData): def __init__(self, @@ -1001,6 +862,14 @@ class SteamPlatformData(GameData): return data + def get_variables(self): + variables = super().get_variables() + variables.update({ + 'INSTALLDIR': self.installdir if self.installdir else "" + }) + return variables + + class SteamWindowsData(SteamPlatformData): def __init__(self, savegame_root:str, @@ -1102,41 +971,16 @@ class SteamGameData(GObject): def macos(self,data:SteamMacOSData|None): self.__macos_data = data - @property - def windows_game(self)->SteamWindowsGame|None: - if self.windows: - return SteamWindowsGame(appid=self.appid, - savegame_root=self.windows.savegame_root, - savegame_dir=self.windows.savegame_dir, - variables=self.windows.variables, - installdir=self.windows.installdir, - file_match=self.windows.file_matchers, - ignore_match=self.windows.ignore_matchers) - return None - - @property - def linux_game(self)->SteamLinuxGame|None: - if self.linux: - return SteamLinuxGame(appid=self.appid, - savegame_root=self.linux.savegame_root, - savegame_dir=self.linux.savegame_dir, - variables=self.linux.variables, - installdir=self.linux.installdir, - file_match=self.linux.file_matchers, - ignore_match=self.linux.ignore_matchers) - return None - - @property - def macos_game(self)->SteamLinuxGame|None: - if self.macos: - return SteamMacOSGame(appid=self.appid, - savegame_root=self.macos.savegame_root, - savegame_dir=self.macos.savegame_dir, - variables=self.macos.variables, - installdir=self.macos.installdir, - file_match=self.macos.file_matchers, - ignore_match=self.macos.ignore_matchers) - return None + def get_variables(self,sgtype:SavegameType): + variables = {"STEAM_APPID":self.appid} + if sgtype == SavegameType.STEAM_WINDOWS and self.windows: + variables.update(self.windows.get_variables()) + elif sgtype == SavegameType.STEAM_LINUX and self.linux: + variables.update(self.linux.get_variables()) + elif sgtype == SavegameType.STEAM_MACOS: + variables.update(self.macos.get_variables()) + + return variables def serialize(self)->dict: data = { @@ -1188,6 +1032,11 @@ class EpicPlatformData(GameData): data['installdir'] = self.__installdir return data + def get_variables(self): + variables = {"INSTALLDIR":self.installdir} + variables.update(super().get_variables()) + return variables + class EpicWindowsData(EpicPlatformData): def __init__(self, savegame_root:str, @@ -1245,6 +1094,15 @@ class EpicGameData(GObject): return ret + def get_variables(self,sgtype:SavegameType): + variables = { + "EPIC_CatalogItemId":self.catalog_item_id, + } + if sgtype == SavegameType.EPIC_WINDOWS and self.windows: + variables.update(self.windows.get_variables()) + + return variables + class Game(GObject): __gtype_name__ = "Game" @@ -1546,20 +1404,20 @@ class Game(GObject): return self.macos elif (sgtype == SavegameType.STEAM_WINDOWS): if self.steam: - return self.steam.windows_game + return self.steam.windows elif (sgtype == SavegameType.STEAM_LINUX): if self.steam: - return self.steam.linux_game + return self.steam.linux elif (sgtype == SavegameType.STEAM_MACOS): if self.steam: - return self.steam.macos_game + return self.steam.macos #elif (sgtype == SavegameType.GOG_WINDOWS): # return self.__gog_windows #elif (sgtype == SavegameType.GOG_LINUX): # return self.__gog_linux elif (sgtype == SavegameType.EPIC_WINDOWS): if self.epic: - return self.__epic.windows + return self.epic.windows elif (sgtype == SavegameType.EPIC_LINUX): return None return None @@ -1615,38 +1473,34 @@ class Game(GObject): self.__steam = steam_data - @Property - def steam_windows(self)->SteamWindowsGame|None: - if self.steam: - return self.steam.windows_game - return None - - @Property - def steam_linux(self)->SteamLinuxGame|None: - if self.steam: - return self.steam.linux_game - return None - - - @Property - def steam_macos(self)->SteamMacOSGame|None: - if self.steam: - return self.steam.macos_game - return None - @Property def savegame_root(self)->str|None: if not self.game_data: return None + t = Template(self.game_data.savegame_root) - return t.safe_substitute(self.get_variables()) + ret = t.safe_substitute(self.get_variables()) + + if self.savegame_type in (SavegameType.WINDOWS, + SavegameType.STEAM_WINDOWS, + SavegameType.EPIC_WINDOWS, + SavegameType.GOG_WINDOWS): + ret = sanitize_windows_path(ret) + return ret @Property def savegame_dir(self)->str|None: if not self.game_data: return None t = Template(self.game_data.savegame_dir) - return t.safe_substitute(self.get_variables()) + ret = t.safe_substitute(self.get_variables()) + + if self.savegame_type in (SavegameType.WINDOWS, + SavegameType.STEAM_WINDOWS, + SavegameType.EPIC_WINDOWS, + SavegameType.GOG_WINDOWS): + ret = sanitize_windows_path(ret) + return ret @Property def epic(self)->EpicGameData|None: @@ -1666,9 +1520,15 @@ class Game(GObject): def get_variables(self): vars = settings.get_variables() vars.update(self.__variables) - game_data = self.game_data - if game_data is not None: - vars.update(game_data.get_variables()) + if self.savegame_type in (SavegameType.WINDOWS,SavegameType.LINUX,SavegameType.MACOS): + if self.game_data: + vars.update(self.game_data.get_variables()) + elif self.savegame_type in (SavegameType.STEAM_WINDOWS,SavegameType.STEAM_LINUX,SavegameType.STEAM_MACOS): + if self.steam: + vars.update(self.steam.get_variables(self.savegame_type)) + elif self.savegame_type in (SavegameType.EPIC_WINDOWS,): + if self.epic: + vars.update(self.epic.get_variables(self.savegame_type)) return vars def get_variable(self,name): @@ -1762,7 +1622,7 @@ class Game(GObject): return ret - if not bool(self): + if not self.savegame_root or not self.savegame_dir: return None sgroot = pathlib.Path(self.savegame_root).resolve() diff --git a/sgbackup/gui/_backupdialog.py b/sgbackup/gui/_backupdialog.py index 93053b4..282219b 100644 --- a/sgbackup/gui/_backupdialog.py +++ b/sgbackup/gui/_backupdialog.py @@ -81,8 +81,14 @@ class BackupSingleDialog(Gtk.Dialog): return False def _on_am_backup_game_progress(self,am,game,fraction,message): + def sanitize_fraction(fraction): + if fraction < 0.0: + return 0.0 + if fraction > 1.0: + return 1.0 + return fraction if self.__game.key == game.key: - GLib.idle_add(self._on_propgress,fraction,message) + GLib.idle_add(self._on_propgress,sanitize_fraction(fraction),message) def _on_am_backup_game_finished(self,am,game): if self.__game.key == game.key: diff --git a/sgbackup/settings.py b/sgbackup/settings.py index 29596f5..66d1957 100644 --- a/sgbackup/settings.py +++ b/sgbackup/settings.py @@ -24,7 +24,14 @@ from gi.repository import GLib,GObject import zipfile from threading import RLock -from .utility import sanitize_path +from .utility import ( + sanitize_path, + sanitize_windows_path, + PLATFORM_WINDOWS, + PLATFORM_MACOS, + PLATFORM_LINUX, + PLATFORM_UNIX +) ZIPFILE_COMPRESSION_STR = { @@ -47,12 +54,6 @@ for _zc,_zs in ZIPFILE_COMPRESSION_STR.items(): del _zc del _zs -if sys.platform.lower() == 'win32': - PLATFORM_WINDOWS = True - import winreg -else: - PLATFORM_WINDOWS = False - class Settings(GObject.GObject): __gtype_name__ = "Settings"