mirror of
https://github.com/derrod/legendary.git
synced 2025-01-18 13:17:09 +00:00
[cli/core] Add option for preferred CDN host
Allows a user to specify a preferred CDN via config or command line. Also changes selection process to match EGS client (no random selection anymore).
This commit is contained in:
parent
454e2a2a69
commit
1760c34703
|
@ -621,7 +621,8 @@ class LegendaryCLI:
|
||||||
repair=args.repair_mode,
|
repair=args.repair_mode,
|
||||||
repair_use_latest=args.repair_and_update,
|
repair_use_latest=args.repair_and_update,
|
||||||
disable_delta=args.disable_delta,
|
disable_delta=args.disable_delta,
|
||||||
override_delta_manifest=args.override_delta_manifest)
|
override_delta_manifest=args.override_delta_manifest,
|
||||||
|
preferred_cdn=args.preferred_cdn)
|
||||||
|
|
||||||
# game is either up to date or hasn't changed, so we have nothing to do
|
# game is either up to date or hasn't changed, so we have nothing to do
|
||||||
if not analysis.dl_size:
|
if not analysis.dl_size:
|
||||||
|
@ -1203,6 +1204,8 @@ def main():
|
||||||
help='Do not use delta manifests when updating (may increase download size)')
|
help='Do not use delta manifests when updating (may increase download size)')
|
||||||
install_parser.add_argument('--reset-sdl', dest='reset_sdl', action='store_true',
|
install_parser.add_argument('--reset-sdl', dest='reset_sdl', action='store_true',
|
||||||
help='Reset selective downloading choices (requires repair to download new components)')
|
help='Reset selective downloading choices (requires repair to download new components)')
|
||||||
|
install_parser.add_argument('--preferred-cdn', dest='preferred_cdn', action='store', metavar='<hostname>',
|
||||||
|
help='Set the hostname of the preferred CDN to use when available.')
|
||||||
|
|
||||||
uninstall_parser.add_argument('--keep-files', dest='keep_files', action='store_true',
|
uninstall_parser.add_argument('--keep-files', dest='keep_files', action='store_true',
|
||||||
help='Keep files but remove game from Legendary database')
|
help='Keep files but remove game from Legendary database')
|
||||||
|
|
|
@ -11,7 +11,6 @@ from collections import defaultdict
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
from locale import getdefaultlocale
|
from locale import getdefaultlocale
|
||||||
from multiprocessing import Queue
|
from multiprocessing import Queue
|
||||||
from random import choice as randchoice
|
|
||||||
from requests import session
|
from requests import session
|
||||||
from requests.exceptions import HTTPError
|
from requests.exceptions import HTTPError
|
||||||
from typing import List, Dict
|
from typing import List, Dict
|
||||||
|
@ -705,7 +704,7 @@ class LegendaryCore:
|
||||||
dl_optimizations: bool = False, dl_timeout: int = 10,
|
dl_optimizations: bool = False, dl_timeout: int = 10,
|
||||||
repair: bool = False, repair_use_latest: bool = False,
|
repair: bool = False, repair_use_latest: bool = False,
|
||||||
disable_delta: bool = False, override_delta_manifest: str = '',
|
disable_delta: bool = False, override_delta_manifest: str = '',
|
||||||
egl_guid: str = '') -> (DLManager, AnalysisResult, ManifestMeta):
|
egl_guid: str = '', preferred_cdn: str = None) -> (DLManager, AnalysisResult, ManifestMeta):
|
||||||
# load old manifest
|
# load old manifest
|
||||||
old_manifest = None
|
old_manifest = None
|
||||||
|
|
||||||
|
@ -724,8 +723,7 @@ class LegendaryCore:
|
||||||
else:
|
else:
|
||||||
old_manifest = self.load_manifest(old_bytes)
|
old_manifest = self.load_manifest(old_bytes)
|
||||||
|
|
||||||
base_urls = list(game.base_urls) # copy list for manipulation
|
base_urls = game.base_urls
|
||||||
|
|
||||||
if override_manifest:
|
if override_manifest:
|
||||||
self.log.info(f'Overriding manifest with "{override_manifest}"')
|
self.log.info(f'Overriding manifest with "{override_manifest}"')
|
||||||
new_manifest_data, _base_urls = self.get_uri_manifest(override_manifest)
|
new_manifest_data, _base_urls = self.get_uri_manifest(override_manifest)
|
||||||
|
@ -733,8 +731,8 @@ class LegendaryCore:
|
||||||
if _base_urls:
|
if _base_urls:
|
||||||
base_urls = _base_urls
|
base_urls = _base_urls
|
||||||
else:
|
else:
|
||||||
new_manifest_data, _base_urls = self.get_cdn_manifest(game, platform_override)
|
new_manifest_data, base_urls = self.get_cdn_manifest(game, platform_override)
|
||||||
base_urls.extend(i for i in _base_urls if i not in base_urls)
|
# overwrite base urls in metadata with current ones to avoid using old/dead CDNs
|
||||||
game.base_urls = base_urls
|
game.base_urls = base_urls
|
||||||
# save base urls to game metadata
|
# save base urls to game metadata
|
||||||
self.lgd.set_game_meta(game.app_name, game)
|
self.lgd.set_game_meta(game.app_name, game)
|
||||||
|
@ -755,7 +753,7 @@ class LegendaryCore:
|
||||||
self.log.info(f'Overriding delta manifest with "{override_delta_manifest}"')
|
self.log.info(f'Overriding delta manifest with "{override_delta_manifest}"')
|
||||||
delta_manifest_data, _ = self.get_uri_manifest(override_delta_manifest)
|
delta_manifest_data, _ = self.get_uri_manifest(override_delta_manifest)
|
||||||
else:
|
else:
|
||||||
delta_manifest_data = self.get_delta_manifest(randchoice(base_urls),
|
delta_manifest_data = self.get_delta_manifest(base_urls[0],
|
||||||
old_manifest.meta.build_id,
|
old_manifest.meta.build_id,
|
||||||
new_manifest.meta.build_id)
|
new_manifest.meta.build_id)
|
||||||
if delta_manifest_data:
|
if delta_manifest_data:
|
||||||
|
@ -809,14 +807,22 @@ class LegendaryCore:
|
||||||
else:
|
else:
|
||||||
resume_file = None
|
resume_file = None
|
||||||
|
|
||||||
|
# Match EGS' behaviour and just use the first available URL
|
||||||
|
base_url = base_urls[0]
|
||||||
if override_base_url:
|
if override_base_url:
|
||||||
self.log.info(f'Overriding base URL with "{override_base_url}"')
|
self.log.info(f'Overriding base URL with "{override_base_url}"')
|
||||||
base_url = override_base_url
|
base_url = override_base_url
|
||||||
else:
|
elif preferred_cdn or (preferred_cdn := self.lgd.config.get('Legendary', 'preferred_cdn', fallback=None)):
|
||||||
# randomly select one CDN
|
for url in base_urls:
|
||||||
base_url = randchoice(base_urls)
|
if preferred_cdn in url:
|
||||||
|
base_url = url
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
self.log.warning(f'Preferred CDN "{preferred_cdn}" unavailable, using default selection.')
|
||||||
|
|
||||||
self.log.debug(f'Using base URL: {base_url}')
|
self.log.debug(f'Using base URL: {base_url}')
|
||||||
|
scheme, cdn_host = base_url.split('/')[0:3:2]
|
||||||
|
self.log.info(f'Selected CDN: {cdn_host} ({scheme.strip(":")})')
|
||||||
|
|
||||||
if not max_shm:
|
if not max_shm:
|
||||||
max_shm = self.lgd.config.getint('Legendary', 'max_memory', fallback=2048)
|
max_shm = self.lgd.config.getint('Legendary', 'max_memory', fallback=2048)
|
||||||
|
|
Loading…
Reference in a new issue