]> jfr.im git - yt-dlp.git/commitdiff
[jsinterp] Implement timeout
authorpukkandan <redacted>
Mon, 22 Aug 2022 00:49:06 +0000 (06:19 +0530)
committerpukkandan <redacted>
Mon, 22 Aug 2022 00:49:06 +0000 (06:19 +0530)
Workaround for #4716

yt_dlp/extractor/openload.py
yt_dlp/extractor/youtube.py
yt_dlp/utils.py

index e66ed4831bc03220d2d8e2dbd7a9a19e07aa3c69..4bba7bdd05e1da466d05e82ae2e39408ebbba9ba 100644 (file)
@@ -219,7 +219,7 @@ def get(self, url, html=None, video_id=None, note=None, note2='Executing JS on w
 
         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 @@ def execute(self, jscode, video_id=None, note='Executing JS'):
 
         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
index 5a19b591a12160e2939bef76381702809463d0cf..e9f8adbd156a6fc14855e6f21124c7a6d72587f9 100644 (file)
@@ -2630,7 +2630,7 @@ def _decrypt_nsig(self, s, video_id, player_url):
             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(
index 49ee2286504ee69140b00bb50246e05e686c7098..13768d84690ab35a52e6cbc8a9be4f0ab105a2e7 100644 (file)
@@ -860,9 +860,9 @@ def kill(self, *, timeout=0):
             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