[jsinterp] Implement timeout

Workaround for #4716
This commit is contained in:
pukkandan 2022-08-22 06:19:06 +05:30
parent 822d66e591
commit 992dc6b486
No known key found for this signature in database
GPG Key ID: 7EEE9E1E817D0A39
3 changed files with 10 additions and 6 deletions

View File

@ -219,7 +219,7 @@ class PhantomJSwrapper:
return html, stdout
def execute(self, jscode, video_id=None, note='Executing JS'):
def execute(self, jscode, video_id=None, *, note='Executing JS'):
"""Execute JS and return stdout"""
if 'phantom.exit();' not in jscode:
jscode += ';\nphantom.exit();'
@ -231,8 +231,12 @@ class PhantomJSwrapper:
cmd = [self.exe, '--ssl-protocol=any', self._TMP_FILES['script'].name]
self.extractor.write_debug(f'PhantomJS command line: {shell_quote(cmd)}')
stdout, stderr, returncode = Popen.run(cmd, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
try:
stdout, stderr, returncode = Popen.run(cmd, timeout=self.options['timeout'] / 1000,
text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except Exception as e:
raise ExtractorError(f'{note} failed: Unable to run PhantomJS binary', cause=e)
if returncode:
raise ExtractorError(f'Executing JS failed:\n{stderr.strip()}')
raise ExtractorError(f'{note} failed:\n{stderr.strip()}')
return stdout

View File

@ -2630,7 +2630,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
ret = extract_nsig(jsi, func_code)(s)
except JSInterpreter.Exception as e:
try:
jsi = PhantomJSwrapper(self)
jsi = PhantomJSwrapper(self, timeout=5000)
except ExtractorError:
raise e
self.report_warning(

View File

@ -860,9 +860,9 @@ class Popen(subprocess.Popen):
self.wait(timeout=timeout)
@classmethod
def run(cls, *args, **kwargs):
def run(cls, *args, timeout=None, **kwargs):
with cls(*args, **kwargs) as proc:
stdout, stderr = proc.communicate_or_kill()
stdout, stderr = proc.communicate_or_kill(timeout=timeout)
return stdout or '', stderr or '', proc.returncode