Skip to content

Commit dcbf8db

Browse files
committed
[core] Properly handle Delta manifests (update base manifest)
Also removes the old workaround.
1 parent 36d02fa commit dcbf8db

1 file changed

Lines changed: 21 additions & 15 deletions

File tree

legendary/core.py

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from legendary.models.chunk import Chunk
3232
from legendary.utils.game_workarounds import is_opt_enabled
3333
from legendary.utils.savegame_helper import SaveGameHelper
34+
from legendary.utils.manifests import combine_manifests
3435

3536

3637
# ToDo: instead of true/false return values for success/failure actually raise an exception that the CLI/GUI
@@ -652,6 +653,9 @@ def get_uri_manifest(self, uri):
652653

653654
def get_delta_manifest(self, base_url, old_build_id, new_build_id):
654655
"""Get optimized delta manifest (doesn't seem to exist for most games)"""
656+
if old_build_id == new_build_id:
657+
return None
658+
655659
r = self.egs.unauth_session.get(f'{base_url}/Deltas/{new_build_id}/{old_build_id}.delta')
656660
if r.status_code == 200:
657661
return r.content
@@ -667,11 +671,10 @@ def prepare_download(self, game: Game, base_game: Game = None, base_path: str =
667671
file_exclude_filter: list = None, file_install_tag: list = None,
668672
dl_optimizations: bool = False, dl_timeout: int = 10,
669673
repair: bool = False, repair_use_latest: bool = False,
670-
disable_delta: bool = False, egl_guid: str = ''
671-
) -> (DLManager, AnalysisResult, ManifestMeta):
674+
disable_delta: bool = False, override_delta_manifest: str = '',
675+
egl_guid: str = '') -> (DLManager, AnalysisResult, ManifestMeta):
672676
# load old manifest
673677
old_manifest = None
674-
delta_manifest_used = False
675678

676679
# load old manifest if we have one
677680
if override_old_manifest:
@@ -710,19 +713,23 @@ def prepare_download(self, game: Game, base_game: Game = None, base_path: str =
710713
# save manifest with version name as well for testing/downgrading/etc.
711714
self.lgd.save_manifest(game.app_name, new_manifest_data,
712715
version=new_manifest.meta.build_version)
713-
# also fetch optimized delta manifest (may not exist)
714-
if old_manifest and new_manifest and not (override_old_manifest or override_manifest or disable_delta or
715-
old_manifest.meta.build_id == new_manifest.meta.build_id):
716-
delta_manifest_data = self.get_delta_manifest(randchoice(base_urls),
717-
old_manifest.meta.build_id,
718-
new_manifest.meta.build_id)
716+
717+
# check if we should use a delta manifest or not
718+
disable_delta = disable_delta or ((override_old_manifest or override_manifest) and not override_delta_manifest)
719+
if old_manifest and new_manifest and not disable_delta:
720+
if override_delta_manifest:
721+
self.log.info(f'Overriding delta manifest with "{override_delta_manifest}"')
722+
delta_manifest_data, _ = self.get_uri_manifest(override_delta_manifest)
723+
else:
724+
delta_manifest_data = self.get_delta_manifest(randchoice(base_urls),
725+
old_manifest.meta.build_id,
726+
new_manifest.meta.build_id)
719727
if delta_manifest_data:
720728
delta_manifest = self.load_manifest(delta_manifest_data)
721-
self.log.info(f'Using optimized delta manifest to upgrade from build'
722-
f'"{old_manifest.meta.build_id}" to'
729+
self.log.info(f'Using optimized delta manifest to upgrade from build '
730+
f'"{old_manifest.meta.build_id}" to '
723731
f'"{new_manifest.meta.build_id}"...')
724-
new_manifest = delta_manifest
725-
delta_manifest_used = True
732+
combine_manifests(new_manifest, delta_manifest)
726733
else:
727734
self.log.debug(f'No Delta manifest received from CDN.')
728735

@@ -794,8 +801,7 @@ def prepare_download(self, game: Game, base_game: Game = None, base_path: str =
794801
file_prefix_filter=file_prefix_filter,
795802
file_exclude_filter=file_exclude_filter,
796803
file_install_tag=file_install_tag,
797-
processing_optimization=process_opt,
798-
delta_manifest_used=delta_manifest_used)
804+
processing_optimization=process_opt)
799805

800806
prereq = None
801807
if new_manifest.meta.prereq_ids:

0 commit comments

Comments
 (0)