From 5066a4e2b3741bc2b594f58d483d9b09ebceb740 Mon Sep 17 00:00:00 2001 From: tretrauit Date: Wed, 13 Jul 2022 13:52:57 +0700 Subject: [PATCH] fix: update game & voiceover now works properly. --- setup.py | 2 +- worthless/cli.py | 13 ++++++++-- worthless/installer.py | 54 ++++++++++++++++++++++++++---------------- 3 files changed, 46 insertions(+), 23 deletions(-) diff --git a/setup.py b/setup.py index d931cfc..b4985d2 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ README = (HERE / "README.md").read_text() setup( name='worthless', - version='2.1.0-1', + version='2.1.1', packages=['worthless', 'worthless.classes', 'worthless.classes.launcher', 'worthless.classes.installer'], url='https://git.froggi.es/tretrauit/worthless-launcher', license='MIT License', diff --git a/worthless/cli.py b/worthless/cli.py index 96b7406..b3a879e 100755 --- a/worthless/cli.py +++ b/worthless/cli.py @@ -13,6 +13,7 @@ import worthless.constants as constants class UI: def __init__(self, gamedir: str, noconfirm: bool, tempdir: str | Path = None) -> None: + self._vo_version = None self._noconfirm = noconfirm self._gamedir = gamedir self._launcher = Launcher(gamedir) @@ -34,6 +35,9 @@ class UI: def override_game_version(self, version: str): self._installer._version = version + def override_voiceover_version(self, version: str): + self._vo_version = version + async def get_game_version(self): print(await self._installer.get_game_version()) @@ -194,12 +198,12 @@ class UI: print("Downloading game update (This will take a long time)...") await self._installer.download_game_update() print("Installing game update...") - await self.install_from_file(self._installer.temp_path.joinpath(res_info.game.latest.name)) + await self.install_from_file(self._installer.temp_path.joinpath(diff_archive.get_name())) async def update_voiceover(self, languages: str | list): if isinstance(languages, str): languages = languages.split(" ") - game_ver = await self._installer.get_game_version() + game_ver = self._vo_version or self._installer.get_game_version() if not game_ver: print("Couldn't detect current game installation, is game installed?") return @@ -225,6 +229,9 @@ class UI: await self.update_game() await self.update_voiceover(languages) + async def update_voiceover_all(self): + await self.update_voiceover(await self._installer.get_installed_voiceovers()) + async def update_all(self): await self.update_game() await self.update_voiceover(await self._installer.get_installed_voiceovers()) @@ -295,6 +302,8 @@ async def main(): parser.add_argument("--check-telemetry", action="store_true", help="Check for the telemetry information") parser.add_argument("--clear-cache", action="store_true", help="Clear cache used by worthless") parser.add_argument("--from-ver", action="store", help="Override the detected game version", type=str, default=None) + parser.add_argument("--from-vo-ver", action="store", help="Override the detected game version for voiceover " + "detection", type=str, default=None) parser.add_argument("--noconfirm", action="store_true", help="Do not ask any for confirmation. (Ignored in interactive mode)") args = parser.parse_args() diff --git a/worthless/installer.py b/worthless/installer.py index 358c7ec..e74c2fb 100644 --- a/worthless/installer.py +++ b/worthless/installer.py @@ -91,8 +91,10 @@ class HDiffPatch: if not any(self.data_path.iterdir()): return None platform_arch_path = self.data_path.joinpath(self._get_platform_arch()) - if platform_arch_path.joinpath(exec_name).exists(): - return str(platform_arch_path.joinpath(exec_name)) + file = platform_arch_path.joinpath(exec_name) + if file.exists(): + file.chmod(0o755) + return str(file) return None def get_hpatchz_executable(self): @@ -279,7 +281,8 @@ class Installer: return self._gamedir.joinpath(self.get_game_data_name()) async def get_game_archive_version(self, game_archive: str | Path): - if not game_archive.exists(): + game_archive = Path(game_archive) + if not game_archive.is_file(): raise FileNotFoundError(f"Game archive {game_archive} not found") with zipfile.ZipFile(game_archive, 'r') as f: return await self.read_version_from_game_file( @@ -345,18 +348,21 @@ class Installer: patch_file = str(file) + ".hdiff" async def extract_and_patch(old_file, diff_file): + diff_path = self.temp_path.joinpath(diff_file) + if await diff_path.is_file(): + await diff_path.unlink(missing_ok=True) await asyncio.to_thread(archive.extract, diff_file, self.temp_path) patch_path = self.temp_path.joinpath(diff_file) old_suffix = old_file.suffix - old_file = old_file.rename(old_file.with_suffix(".bak")) + old_file = await old_file.rename(old_file.with_suffix(".bak")) proc = await self._hdiffpatch.patch_file(old_file, old_file.with_suffix(old_suffix), patch_path, wait=True) - patch_path.unlink() + await patch_path.unlink() if proc.returncode != 0: # Let the game download the file. - old_file.rename(old_file.with_suffix(old_suffix)) + await old_file.rename(old_file.with_suffix(old_suffix)) return - old_file.unlink() + await old_file.unlink() files.remove(patch_file) patch_jobs.append(extract_and_patch(current_game_file, patch_file)) @@ -365,8 +371,8 @@ class Installer: deletefiles = archive.read("deletefiles.txt").decode().split("\n") for file in deletefiles: - current_game_file = self._gamedir.joinpath(file) - if not await current_game_file.exists(): + current_game_file = Path(self._gamedir.joinpath(file)) + if not current_game_file.exists(): continue if current_game_file.is_file(): current_game_file.unlink(missing_ok=True) @@ -433,20 +439,22 @@ class Installer: self._version = await self.get_game_version() self.set_version_config() - async def _get_game_resource(self, from_version: str = None): - if not from_version: - if self._version: - from_version = self._version - else: - from_version = self._version = await self.get_game_version() - if not from_version: - raise ValueError("No game version found") + async def _get_game_version(self): + if self._version: + from_version = self._version + else: + from_version = self._version = await self.get_game_version() + return from_version + + async def _get_game_resource(self): game_resource = await self._launcher.get_resource_info() if not game_resource: raise ValueError("Could not fetch game resource") return game_resource async def download_game_update(self, from_version: str = None): + if not from_version: + from_version = await self._get_game_version() version_info = await self._get_game_resource() if self._version == version_info.game.latest.version: raise ValueError("Game is already up to date.") @@ -456,6 +464,8 @@ class Installer: await self._download_file(diff_archive.path, diff_archive.name, diff_archive.size) async def download_voiceover_update(self, language: str, from_version: str = None): + if not from_version: + from_version = await self._get_game_version() diff_archive = await self.get_voiceover_diff_archive(language, from_version) if diff_archive is None: raise ValueError("Voiceover diff archive is not available for this version, please reinstall.") @@ -466,23 +476,27 @@ class Installer: If from_version is not specified, it will be taken from the game version. """ + if not from_version: + from_version = await self._get_game_version() game_resource = await self._get_game_resource() if not game_resource: raise ValueError("Could not fetch game resource") translated_lang = self.voiceover_lang_translate(lang) for v in game_resource.game.diffs: + print(v.raw) if v.version != from_version: continue for vo in v.voice_packs: - if vo.language != translated_lang: - continue - return vo + if vo.language == translated_lang: + return vo async def get_game_diff_archive(self, from_version: str = None): """Gets a diff archive from `from_version` to the latest one If from_version is not specified, it will be taken from the game version. """ + if not from_version: + from_version = await self._get_game_version() game_resource = await self._get_game_resource() for v in game_resource.game.diffs: if v.version == from_version: