feat: support pre-downloading game & voicepacks

This commit is contained in:
2022-08-23 17:02:20 +07:00
parent 34a8ab6d99
commit 04dc922230
5 changed files with 62 additions and 49 deletions

View File

@ -389,19 +389,15 @@ class Installer:
self._config.set_game_version(version)
self._config.save()
async def download_full_game(self):
resource = await self._launcher.get_resource_info()
if resource is None:
raise RuntimeError("Failed to fetch game resource info.")
archive_name = resource.game.latest.path.split("/")[-1]
await self._download_file(resource.game.latest.path, archive_name, resource.game.latest.size)
async def download_full_game(self, pre_download=False):
game = await self._get_game(pre_download)
archive_name = game.latest.path.split("/")[-1]
await self._download_file(game.latest.path, archive_name, game.latest.size)
async def download_full_voiceover(self, language: str):
archive = await self._launcher.get_resource_info()
if archive is None:
raise RuntimeError("Failed to fetch game resource info.")
async def download_full_voiceover(self, language: str, pre_download=False):
game = await self._get_game(pre_download)
translated_lang = self.voiceover_lang_translate(language)
for vo in archive.game.latest.voice_packs:
for vo in game.latest.voice_packs:
if vo.language == translated_lang:
await self._download_file(vo.path, vo.get_name(), vo.size)
@ -452,52 +448,57 @@ class Installer:
raise ValueError("Could not fetch game resource")
return game_resource
async def download_game_update(self, from_version: str = None):
async def _get_game(self, pre_download=False):
game_resource = await self._get_game_resource()
game = game_resource.game
if pre_download:
game = game_resource.pre_download_game
return game
async def download_game_update(self, from_version: str = None, pre_download=False):
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:
game = await self._get_game(pre_download=pre_download)
if self._version == game.latest.version:
raise ValueError("Game is already up to date.")
diff_archive = await self.get_game_diff_archive(from_version)
diff_archive = await self.get_game_diff_archive(from_version, pre_download)
if diff_archive is None:
raise ValueError("Game diff archive is not available for this version, please reinstall.")
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):
async def download_voiceover_update(self, language: str, from_version: str = None, pre_download=False):
if not from_version:
from_version = await self._get_game_version()
diff_archive = await self.get_voiceover_diff_archive(language, from_version)
diff_archive = await self.get_voiceover_diff_archive(language, from_version, pre_download)
if diff_archive is None:
raise ValueError("Voiceover diff archive is not available for this version, please reinstall.")
await self._download_file(diff_archive.path, diff_archive.name, diff_archive.size)
async def get_voiceover_diff_archive(self, lang: str, from_version: str = None):
async def get_voiceover_diff_archive(self, lang: str, from_version: str = None, pre_download=False):
"""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()
if not game_resource:
raise ValueError("Could not fetch game resource")
game = await self._get_game(pre_download=pre_download)
translated_lang = self.voiceover_lang_translate(lang)
for v in game_resource.game.diffs:
for v in game.diffs:
if v.version != from_version:
continue
for vo in v.voice_packs:
if vo.language == translated_lang:
return vo
async def get_game_diff_archive(self, from_version: str = None):
async def get_game_diff_archive(self, from_version: str = None, pre_download=False):
"""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:
game = await self._get_game(pre_download=pre_download)
for v in game.diffs:
if v.version == from_version:
return v