Compare commits

..

No commits in common. "d644aeb2c344b542284dc3b79eb2223f9b8fc0e2" and "2cd37f9c57b4cba216962f1d22a57151709f473b" have entirely different histories.

4 changed files with 9 additions and 11 deletions

View File

@ -289,11 +289,7 @@ While all the other dependencies are optional, `ffmpeg` and `ffprobe` are highly
* [**brotli**](https://github.com/google/brotli)\* or [**brotlicffi**](https://github.com/python-hyper/brotlicffi) - [Brotli](https://en.wikipedia.org/wiki/Brotli) content encoding support. Both licensed under MIT <sup>[1](https://github.com/google/brotli/blob/master/LICENSE) [2](https://github.com/python-hyper/brotlicffi/blob/master/LICENSE) </sup> * [**brotli**](https://github.com/google/brotli)\* or [**brotlicffi**](https://github.com/python-hyper/brotlicffi) - [Brotli](https://en.wikipedia.org/wiki/Brotli) content encoding support. Both licensed under MIT <sup>[1](https://github.com/google/brotli/blob/master/LICENSE) [2](https://github.com/python-hyper/brotlicffi/blob/master/LICENSE) </sup>
* [**websockets**](https://github.com/aaugustin/websockets)\* - For downloading over websocket. Licensed under [BSD-3-Clause](https://github.com/aaugustin/websockets/blob/main/LICENSE) * [**websockets**](https://github.com/aaugustin/websockets)\* - For downloading over websocket. Licensed under [BSD-3-Clause](https://github.com/aaugustin/websockets/blob/main/LICENSE)
* [**requests**](https://github.com/psf/requests)\* - HTTP library. For HTTPS proxy and persistent connections support. Licensed under [Apache-2.0](https://github.com/psf/requests/blob/main/LICENSE) * [**requests**](https://github.com/psf/requests)\* - HTTP library. For HTTPS proxy and persistent connections support. Licensed under [Apache-2.0](https://github.com/psf/requests/blob/main/LICENSE)
* [**curl_cffi**](https://github.com/yifeikong/curl_cffi)\* - Python binding for [curl-impersonate](https://github.com/lwthiker/curl-impersonate). Provides impersonation support for chrome, edge and safari. Licensed under [MIT](https://github.com/yifeikong/curl_cffi/blob/main/LICENSE)
#### Impersonation
The following provide support for impersonating browser requests. This may be required for some sites that employ TLS fingerprinting and other checks.
* [**curl_cffi**](https://github.com/yifeikong/curl_cffi)\* (recommended) - Python binding for [curl-impersonate](https://github.com/lwthiker/curl-impersonate). Provides impersonation targets for Chrome, Edge and Safari. Licensed under [MIT](https://github.com/yifeikong/curl_cffi/blob/main/LICENSE)
### Metadata ### Metadata

View File

@ -157,7 +157,6 @@ from .utils import (
windows_enable_vt_mode, windows_enable_vt_mode,
write_json_file, write_json_file,
write_string, write_string,
YoutubeDLError,
) )
from .utils._utils import _YDLLogger from .utils._utils import _YDLLogger
from .utils.networking import ( from .utils.networking import (
@ -715,10 +714,9 @@ class YoutubeDL:
impersonate_target = self.params.get('impersonate') impersonate_target = self.params.get('impersonate')
if impersonate_target is not None: if impersonate_target is not None:
if not self.impersonate_target_available(impersonate_target): if not self.impersonate_target_available(impersonate_target):
raise YoutubeDLError( raise ValueError(
f'Impersonate target "{self.params.get("impersonate")}" is not available. ' f'Impersonate target "{self.params.get("impersonate")}" is not available. '
f'Use --list-impersonate-targets to see available targets. ' f'Use --list-impersonate-targets to see available targets.')
f'You may be missing dependencies required to support this target - check the manual for what dependencies you may need to install.')
if 'list-formats' in self.params['compat_opts']: if 'list-formats' in self.params['compat_opts']:
self.params['listformats_table'] = False self.params['listformats_table'] = False
@ -4135,9 +4133,8 @@ class YoutubeDL:
elif re.match(r'unsupported (?:extensions: impersonate|impersonate target)', ue.msg.lower()): elif re.match(r'unsupported (?:extensions: impersonate|impersonate target)', ue.msg.lower()):
raise RequestError( raise RequestError(
f'Impersonate target "{req.extensions["impersonate"]}" is not available.' f'Impersonate target "{req.extensions["impersonate"]}" is not available.'
f' See --list-impersonate-targets for available targets.'
f' This request requires browser impersonation, however you may be missing dependencies' f' This request requires browser impersonation, however you may be missing dependencies'
f' required to support this target. Check the manual for what dependencies you may need to install.') f' required to support this target. See the documentation for more information.')
raise raise
except SSLError as e: except SSLError as e:
if 'UNSAFE_LEGACY_RENEGOTIATION_DISABLED' in str(e): if 'UNSAFE_LEGACY_RENEGOTIATION_DISABLED' in str(e):

View File

@ -997,6 +997,10 @@ def _real_main(argv=None):
ydl.to_stdout( ydl.to_stdout(
render_table(['Client', 'Version', 'OS', 'OS Version', 'Source'], rows) render_table(['Client', 'Version', 'OS', 'OS Version', 'Source'], rows)
) )
if not available_targets:
ydl.to_stdout('You are missing dependencies for impersonation. See the README for more info.')
ydl.to_stdout(
'If the above table is missing targets, you may be missing dependencies for impersonation.')
return return
if not actual_use: if not actual_use:

View File

@ -131,6 +131,7 @@ class ImpersonateRequestHandler(RequestHandler, ABC):
headers = self._merge_headers(request.headers) headers = self._merge_headers(request.headers)
if self._get_request_target(request) is not None: if self._get_request_target(request) is not None:
# remove all headers present in std_headers # remove all headers present in std_headers
headers.pop('User-Agent', None)
for header in std_headers: for header in std_headers:
if header in headers and std_headers[header] == headers[header]: if header in headers and std_headers[header] == headers[header]:
headers.pop(header, None) headers.pop(header, None)