diff --git a/yt_dlp/networking/common.py b/yt_dlp/networking/common.py index ddceaa9a97..f5a04db24a 100644 --- a/yt_dlp/networking/common.py +++ b/yt_dlp/networking/common.py @@ -285,7 +285,16 @@ class RequestHandler(abc.ABC): return self.cookiejar if cookiejar is None else cookiejar def _get_proxies(self, request): - return (request.proxies or self.proxies).copy() + if request.proxies: + return request.proxies.copy() + + proxies = dict() + for proxy_key, proxy_url in self.proxies.items(): + # Proxy url can be a callable + if isinstance(proxy_url, typing.Callable): + proxy_url = proxy_url() + proxies[proxy_key] = proxy_url + return proxies def _check_url_scheme(self, request: Request): scheme = urllib.parse.urlparse(request.url).scheme.lower() @@ -318,6 +327,8 @@ class RequestHandler(abc.ABC): # Skip proxy scheme checks continue + if isinstance(proxy_url, typing.Callable): + proxy_url = proxy_url() try: if urllib.request._parse_proxy(proxy_url)[0] is None: # Scheme-less proxies are not supported diff --git a/yt_dlp/utils/networking.py b/yt_dlp/utils/networking.py index 542abace87..3b7ebf9563 100644 --- a/yt_dlp/utils/networking.py +++ b/yt_dlp/utils/networking.py @@ -215,6 +215,8 @@ def clean_proxies(proxies: dict, headers: HTTPHeaderDict): if proxy_key == 'no': # special case continue if proxy_url is not None: + if isinstance(proxy_url, typing.Callable): + proxy_url = proxy_url() # Ensure proxies without a scheme are http. try: proxy_scheme = urllib.request._parse_proxy(proxy_url)[0]