fix: update game & voiceover now works properly.
This commit is contained in:
@ -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:
|
||||
|
||||
Reference in New Issue
Block a user