Compare commits

...

3 Commits

Author SHA1 Message Date
bashonly
ef103b2d11
[ie/hotstar] Fix error handling (#13793)
Fix 7e0af2b1f0c3edb688603b022f3a9ca0bfdf75e9

Closes #13790
Authored by: bashonly
2025-07-21 19:09:52 +00:00
bashonly
3e49bc8a1b
Make extractor-designated impersonation override --impersonate (#13792)
Fix 32809eb2da92c649e540a5b714f6235036026161

Authored by: bashonly
2025-07-21 18:42:21 +00:00
bashonly
2ac3eb9837
Fix ImpersonateTarget sanitization (#13791)
Fix 32809eb2da92c649e540a5b714f6235036026161

Authored by: bashonly
2025-07-21 18:41:00 +00:00
4 changed files with 17 additions and 11 deletions

View File

@ -3232,15 +3232,6 @@ class YoutubeDL:
else:
params = self.params
impersonate = info.pop('impersonate', None)
# Do not override --impersonate with extractor-specified impersonation
if params.get('impersonate') is None:
available_target, requested_targets = self._parse_impersonate_targets(impersonate)
if available_target:
info['impersonate'] = available_target
elif requested_targets:
self.report_warning(self._unavailable_targets_message(requested_targets), only_once=True)
fd = get_suitable_downloader(info, params, to_stdout=(name == '-'))(self, params)
if not test:
for ph in self._progress_hooks:
@ -3716,6 +3707,8 @@ class YoutubeDL:
return {k: filter_fn(v) for k, v in obj.items() if not reject(k, v)}
elif isinstance(obj, (list, tuple, set, LazyList)):
return list(map(filter_fn, obj))
elif isinstance(obj, ImpersonateTarget):
return str(obj)
elif obj is None or isinstance(obj, (str, int, float, bool)):
return obj
else:

View File

@ -495,3 +495,14 @@ class FileDownloader:
exe = os.path.basename(args[0])
self.write_debug(f'{exe} command line: {shell_quote(args)}')
def _get_impersonate_target(self, info_dict):
impersonate = info_dict.get('impersonate')
if impersonate is None:
return None
available_target, requested_targets = self.ydl._parse_impersonate_targets(impersonate)
if available_target:
return available_target
elif requested_targets:
self.report_warning(self.ydl._unavailable_targets_message(requested_targets))
return None

View File

@ -28,8 +28,9 @@ class HttpFD(FileDownloader):
url = info_dict['url']
request_data = info_dict.get('request_data', None)
request_extensions = {}
if info_dict.get('impersonate') is not None:
request_extensions['impersonate'] = info_dict['impersonate']
impersonate_target = self._get_impersonate_target(info_dict)
if impersonate_target is not None:
request_extensions['impersonate'] = impersonate_target
class DownloadContext(dict):
__getattr__ = dict.get

View File

@ -42,6 +42,7 @@ class HotStarBaseIE(InfoExtractor):
}
def _has_active_subscription(self, cookies, server_time):
server_time = int_or_none(server_time) or int(time.time())
expiry = traverse_obj(cookies, (
self._TOKEN_NAME, 'value', {jwt_decode_hs256}, 'sub', {json.loads},
'subscriptions', 'in', ..., 'expiry', {parse_iso8601}, all, {max})) or 0