3131from legendary .models .chunk import Chunk
3232from legendary .utils .game_workarounds import is_opt_enabled
3333from 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