[extractor] Fix bug in 617f658b7e

While the function signature don't enforce it, some IEs that override
`_download_webpage_handle` assume all optional arguments to be keyword-only

Closes #3954
This commit is contained in:
pukkandan 2022-06-03 17:25:05 +05:30
parent c7a7baaa13
commit c4910024f3
No known key found for this signature in database
GPG Key ID: 7EEE9E1E817D0A39

View File

@ -962,16 +962,18 @@ def parse(ie, content, *args, **kwargs):
# parser is fetched by name so subclasses can override it
return getattr(ie, parser)(content, *args, **kwargs)
def download_handle(self, url_or_request, video_id, note=note, errnote=errnote,
transform_source=None, fatal=True, *args, **kwargs):
res = self._download_webpage_handle(url_or_request, video_id, note, errnote, fatal, *args, **kwargs)
def download_handle(self, url_or_request, video_id, note=note, errnote=errnote, transform_source=None,
fatal=True, encoding=None, data=None, headers={}, query={}, expected_status=None):
res = self._download_webpage_handle(
url_or_request, video_id, note=note, errnote=errnote, fatal=fatal, encoding=encoding,
data=data, headers=headers, query=query, expected_status=expected_status)
if res is False:
return res
content, urlh = res
return parse(self, content, video_id, transform_source, fatal), urlh
return parse(self, content, video_id, transform_source=transform_source, fatal=fatal), urlh
def download_content(self, url_or_request, video_id, note=note, errnote=errnote, transform_source=None,
fatal=True, encoding=None, data=None, headers={}, query={}, *args, **kwargs):
fatal=True, encoding=None, data=None, headers={}, query={}, expected_status=None):
if self.get_param('load_pages'):
url_or_request = self._create_request(url_or_request, data, headers, query)
filename = self._request_dump_filename(url_or_request.full_url, video_id)
@ -984,11 +986,21 @@ def download_content(self, url_or_request, video_id, note=note, errnote=errnote,
else:
content = self.__decode_webpage(webpage_bytes, encoding, url_or_request.headers)
return parse(self, content, video_id, transform_source, fatal)
args = [url_or_request, video_id, note, errnote, transform_source, fatal, encoding, data, headers, query, *args]
kwargs = {
'note': note,
'errnote': errnote,
'transform_source': transform_source,
'fatal': fatal,
'encoding': encoding,
'data': data,
'headers': headers,
'query': query,
'expected_status': expected_status,
}
if parser is None:
args.pop(4) # transform_source
kwargs.pop('transform_source')
# The method is fetched by name so subclasses can override _download_..._handle
res = getattr(self, download_handle.__name__)(*args, **kwargs)
res = getattr(self, download_handle.__name__)(url_or_request, video_id, **kwargs)
return res if res is False else res[0]
def impersonate(func, name, return_value):