diff --git a/yt_dlp/extractor/generic.py b/yt_dlp/extractor/generic.py index d44e6d3c4b..7c7bb71a74 100644 --- a/yt_dlp/extractor/generic.py +++ b/yt_dlp/extractor/generic.py @@ -821,13 +821,17 @@ class GenericIE(InfoExtractor): 'Referer': smuggled_data.get('referer'), }), impersonate=impersonate) except ExtractorError as e: - if not (isinstance(e.cause, HTTPError) and e.cause.status == 403 - and e.cause.response.get_header('cf-mitigated') == 'challenge' - and e.cause.response.extensions.get('impersonate') is None): + if not isinstance(e.cause, HTTPError) or e.cause.status != 403: + raise + res = e.cause.response + already_impersonating = res.extensions.get('impersonate') is not None + if already_impersonating or ( + res.get_header('cf-mitigated') != 'challenge' + and b'Attention Required! | Cloudflare' not in res.read() + ): raise cf_cookie_domain = traverse_obj( - LenientSimpleCookie(e.cause.response.get_header('set-cookie')), - ('__cf_bm', 'domain')) + LenientSimpleCookie(res.get_header('set-cookie')), ('__cf_bm', 'domain')) if cf_cookie_domain: self.write_debug(f'Clearing __cf_bm cookie for {cf_cookie_domain}') self.cookiejar.clear(domain=cf_cookie_domain, path='/', name='__cf_bm')