From dd07f8741288b3162f3fcfb9d369e90d4ee5d907 Mon Sep 17 00:00:00 2001 From: TechnoDot Date: Tue, 19 Sep 2023 09:08:19 -0500 Subject: [PATCH] Add a proxy option --- README.md | 2 ++ legendary/api/egs.py | 10 ++++++++-- legendary/cli.py | 9 ++++++--- legendary/core.py | 9 ++++++--- legendary/downloader/mp/manager.py | 5 +++-- legendary/downloader/mp/workers.py | 5 ++++- 6 files changed, 29 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 32fa4af..f21a97c 100644 --- a/README.md +++ b/README.md @@ -204,6 +204,8 @@ optional arguments: -J, --pretty-json Pretty-print JSON -A , --api-timeout API HTTP request timeout (default: 10 seconds) + -p , --proxy + SOCKS5 proxy setting (default: 127.0.0.1:1080) Commands: diff --git a/legendary/api/egs.py b/legendary/api/egs.py index 1f9dd87..e0df983 100644 --- a/legendary/api/egs.py +++ b/legendary/api/egs.py @@ -34,16 +34,22 @@ class EPCAPI: _store_gql_host = 'graphql.epicgames.com' _artifact_service_host = 'artifact-public-service-prod.beee.live.use1a.on.epicgames.com' - def __init__(self, lc='en', cc='US', timeout=10.0): + + def __init__(self, lc='en', cc='US', timeout=10.0, proxy=""): self.log = logging.getLogger('EPCAPI') + self.proxy = proxy + self.session = requests.session() + if proxy != "": + self.session.proxies.update({'http': f'socks5://{self.proxy}', 'https': f'socks5://{self.proxy}', 'socks5': f'socks5://{self.proxy}'}) self.session.headers['User-Agent'] = self._user_agent # increase maximum pool size for multithreaded metadata requests self.session.mount('https://', requests.adapters.HTTPAdapter(pool_maxsize=16)) self.unauth_session = requests.session() - self.unauth_session.headers['User-Agent'] = self._user_agent + if proxy != "": + self.unauth_session.proxies.update({'http': f'socks5://{self.proxy}', 'https': f'socks5://{self.proxy}', 'socks5': f'socks5://{self.proxy}'}) self._oauth_basic = HTTPBasicAuth(self._user_basic, self._pw_basic) diff --git a/legendary/cli.py b/legendary/cli.py index d287a21..24510a5 100644 --- a/legendary/cli.py +++ b/legendary/cli.py @@ -39,8 +39,8 @@ logger = logging.getLogger('cli') class LegendaryCLI: - def __init__(self, override_config=None, api_timeout=None): - self.core = LegendaryCore(override_config, timeout=api_timeout) + def __init__(self, override_config=None, api_timeout=None, proxy=""): + self.core = LegendaryCore(override_config, timeout=api_timeout, proxy=proxy) self.logger = logging.getLogger('cli') self.logging_queue = None @@ -2631,6 +2631,9 @@ def main(): parser.add_argument('-A', '--api-timeout', dest='api_timeout', action='store', type=float, default=10, metavar='', help='API HTTP request timeout (default: 10 seconds)') + parser.add_argument('-p', '--proxy', dest='proxy', action='store', + type=str, default="", metavar='', + help='SOCKS5 proxy setting (ex. 127.0.0.1:1080)') # all the commands subparsers = parser.add_subparsers(title='Commands', dest='subparser_name', metavar='') @@ -3023,7 +3026,7 @@ def main(): subprocess.Popen(['cmd', '/K', 'echo>nul']) return - cli = LegendaryCLI(override_config=args.config_file, api_timeout=args.api_timeout) + cli = LegendaryCLI(override_config=args.config_file, api_timeout=args.api_timeout, proxy=args.proxy) ql = cli.setup_threaded_logging() config_ll = cli.core.lgd.config.get('Legendary', 'log_level', fallback='info') diff --git a/legendary/core.py b/legendary/core.py index f2738f7..19176db 100644 --- a/legendary/core.py +++ b/legendary/core.py @@ -54,12 +54,13 @@ class LegendaryCore: """ _egl_version = '11.0.1-14907503+++Portal+Release-Live' - def __init__(self, override_config=None, timeout=10.0): + def __init__(self, override_config=None, timeout=10.0, proxy=""): self.log = logging.getLogger('Core') - self.egs = EPCAPI(timeout=timeout) + self.egs = EPCAPI(timeout=timeout, proxy=proxy) self.lgd = LGDLFS(config_file=override_config) self.egl = EPCLFS() self.lgdapi = LGDAPI() + self.proxy = proxy # on non-Windows load the programdata path from config if os.name != 'nt': @@ -99,6 +100,8 @@ class LegendaryCore: :return: exchange code """ s = session() + if self.proxy != "": + s.proxies.update({'http': f'socks5://{self.proxy}', 'https': f'socks5://{self.proxy}', 'socks5': f'socks5://{self.proxy}'}) s.headers.update({ 'X-Epic-Event-Action': 'login', 'X-Epic-Event-Category': 'login', @@ -1459,7 +1462,7 @@ class LegendaryCore: dlm = DLManager(install_path, base_url, resume_file=resume_file, status_q=status_q, max_shared_memory=max_shm * 1024 * 1024, max_workers=max_workers, - dl_timeout=dl_timeout) + dl_timeout=dl_timeout, proxy=self.proxy) anlres = dlm.run_analysis(manifest=new_manifest, old_manifest=old_manifest, patch=not disable_patching, resume=not force, file_prefix_filter=file_prefix_filter, diff --git a/legendary/downloader/mp/manager.py b/legendary/downloader/mp/manager.py index a60cb08..6ac0cf7 100644 --- a/legendary/downloader/mp/manager.py +++ b/legendary/downloader/mp/manager.py @@ -22,7 +22,7 @@ from legendary.models.manifest import ManifestComparison, Manifest class DLManager(Process): def __init__(self, download_dir, base_url, cache_dir=None, status_q=None, max_workers=0, update_interval=1.0, dl_timeout=10, resume_file=None, - max_shared_memory=1024 * 1024 * 1024): + max_shared_memory=1024 * 1024 * 1024, proxy=""): super().__init__(name='DLManager') self.log = logging.getLogger('DLM') self.proc_debug = False @@ -30,6 +30,7 @@ class DLManager(Process): self.base_url = base_url self.dl_dir = download_dir self.cache_dir = cache_dir or os.path.join(download_dir, '.cache') + self.proxy = proxy # All the queues! self.logging_queue = None @@ -658,7 +659,7 @@ class DLManager(Process): for i in range(self.max_workers): w = DLWorker(f'DLWorker {i + 1}', self.dl_worker_queue, self.dl_result_q, self.shared_memory.name, logging_queue=self.logging_queue, - dl_timeout=self.dl_timeout) + dl_timeout=self.dl_timeout, proxy=self.proxy) self.children.append(w) w.start() diff --git a/legendary/downloader/mp/workers.py b/legendary/downloader/mp/workers.py index e16cd96..1cc5883 100644 --- a/legendary/downloader/mp/workers.py +++ b/legendary/downloader/mp/workers.py @@ -20,11 +20,14 @@ from legendary.models.downloading import ( class DLWorker(Process): def __init__(self, name, queue, out_queue, shm, max_retries=7, - logging_queue=None, dl_timeout=10): + logging_queue=None, dl_timeout=10, proxy=""): super().__init__(name=name) self.q = queue self.o_q = out_queue + self.proxy = proxy self.session = requests.session() + if proxy != "": + self.session.proxies.update({'http': f'socks5://{self.proxy}', 'https': f'socks5://{self.proxy}', 'socks5': f'socks5://{self.proxy}'}) self.session.headers.update({ 'User-Agent': 'EpicGamesLauncher/11.0.1-14907503+++Portal+Release-Live Windows/10.0.19041.1.256.64bit' })