diff options
Diffstat (limited to 'gallery_dl/extractor/common.py')
| -rw-r--r-- | gallery_dl/extractor/common.py | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/gallery_dl/extractor/common.py b/gallery_dl/extractor/common.py index afe4a16..52e5199 100644 --- a/gallery_dl/extractor/common.py +++ b/gallery_dl/extractor/common.py @@ -220,6 +220,14 @@ class Extractor(): headers = session.headers headers.clear() + source_address = self.config("source-address") + if source_address: + if isinstance(source_address, str): + source_address = (source_address, 0) + else: + source_address = (source_address[0], source_address[1]) + session.mount("http://", SourceAdapter(source_address)) + browser = self.config("browser") or self.browser if browser and isinstance(browser, str): browser, _, platform = browser.lower().partition(":") @@ -235,10 +243,12 @@ class Extractor(): platform = "Macintosh; Intel Mac OS X 11.5" if browser == "chrome": - _emulate_browser_chrome(session, platform) + _emulate_browser_chrome(session, platform, source_address) else: - _emulate_browser_firefox(session, platform) + _emulate_browser_firefox(session, platform, source_address) else: + if source_address: + session.mount("https://", SourceAdapter(source_address)) headers["User-Agent"] = self.config("user-agent", ( "Mozilla/5.0 (Windows NT 10.0; Win64; x64; " "rv:91.0) Gecko/20100101 Firefox/91.0")) @@ -605,26 +615,44 @@ class BaseExtractor(Extractor): ) +class SourceAdapter(HTTPAdapter): + + def __init__(self, source_address): + self.source_address = source_address + HTTPAdapter.__init__(self) + + def init_poolmanager(self, *args, **kwargs): + kwargs["source_address"] = self.source_address + return HTTPAdapter.init_poolmanager(self, *args, **kwargs) + + def proxy_manager_for(self, *args, **kwargs): + kwargs["source_address"] = self.source_address + return HTTPAdapter.proxy_manager_for(self, *args, **kwargs) + + class HTTPSAdapter(HTTPAdapter): - def __init__(self, ciphers): + def __init__(self, ciphers, source_address=None): context = self.ssl_context = ssl.create_default_context() context.options |= (ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1) context.set_ecdh_curve("prime256v1") context.set_ciphers(ciphers) + self.source_address = source_address HTTPAdapter.__init__(self) def init_poolmanager(self, *args, **kwargs): kwargs["ssl_context"] = self.ssl_context + kwargs["source_address"] = self.source_address return HTTPAdapter.init_poolmanager(self, *args, **kwargs) def proxy_manager_for(self, *args, **kwargs): kwargs["ssl_context"] = self.ssl_context + kwargs["source_address"] = self.source_address return HTTPAdapter.proxy_manager_for(self, *args, **kwargs) -def _emulate_browser_firefox(session, platform): +def _emulate_browser_firefox(session, platform, source_address): headers = session.headers headers["User-Agent"] = ("Mozilla/5.0 (" + platform + "; rv:91.0) " "Gecko/20100101 Firefox/91.0") @@ -654,11 +682,12 @@ def _emulate_browser_firefox(session, platform): "DHE-RSA-AES256-SHA:" "AES128-SHA:" "AES256-SHA:" - "DES-CBC3-SHA" + "DES-CBC3-SHA", + source_address )) -def _emulate_browser_chrome(session, platform): +def _emulate_browser_chrome(session, platform, source_address): if platform.startswith("Macintosh"): platform = platform.replace(".", "_") + "_2" @@ -690,7 +719,8 @@ def _emulate_browser_chrome(session, platform): "AES256-GCM-SHA384:" "AES128-SHA:" "AES256-SHA:" - "DES-CBC3-SHA" + "DES-CBC3-SHA", + source_address )) |
