feat: support pre-downloading game & voicepacks
This commit is contained in:
@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user