From 37a3bc2a4aa88763ea546b3a7256395ae947be8e Mon Sep 17 00:00:00 2001 From: c-basalt <117849907+c-basalt@users.noreply.github.com> Date: Sun, 11 Aug 2024 08:03:00 -0400 Subject: [PATCH] update --- yt_dlp/jsinterp/__init__.py | 3 ++- yt_dlp/jsinterp/external.py | 34 ++++++++++++++++------------------ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/yt_dlp/jsinterp/__init__.py b/yt_dlp/jsinterp/__init__.py index 944d73fca6..7d44b46989 100644 --- a/yt_dlp/jsinterp/__init__.py +++ b/yt_dlp/jsinterp/__init__.py @@ -1,9 +1,10 @@ from .jsinterp import JSInterpreter -from .external import PhantomJSwrapper, DenoWrapper +from .external import PhantomJSwrapper, DenoWrapper, PuppeteerWrapper __all__ = [ JSInterpreter, PhantomJSwrapper, DenoWrapper, + PuppeteerWrapper, ] diff --git a/yt_dlp/jsinterp/external.py b/yt_dlp/jsinterp/external.py index 274c1aad69..c0a2b62d2b 100644 --- a/yt_dlp/jsinterp/external.py +++ b/yt_dlp/jsinterp/external.py @@ -112,18 +112,21 @@ def _execute(cls, jscode, extractor=None, video_id=None, note='', flags=[], time extractor.report_warning(f'JS console error msg:\n{stderr.strip()}', video_id=video_id) return stdout.strip() - def execute(self, jscode, video_id=None, *, note='Executing JS in Deno', flags=[], jit_less=True, base_js=None): + def execute(self, jscode, video_id=None, *, note='Executing JS in Deno', flags=[], base_js=None): """Execute JS directly in Deno runtime and return stdout""" base_js = base_js if base_js is not None else 'delete window.Deno; global = window;' - if jit_less: - flags = [*flags, '--v8-flags=--jitless'] - return self._execute(base_js + jscode, extractor=self.extractor, video_id=video_id, note=note, flags=flags, timeout=self.timeout) +class DenoJITlessJSI(DenoWrapper): + def execute(self, jscode, video_id=None, *, note='Executing JS in Deno', flags=[], base_js=None): + return super().execute(jscode, video_id, note=note, base_js=base_js, + flags=[*flags, '--v8-flags=--jitless,--noexpose-wasm']) + + class PuppeteerWrapper: _PACKAGE_VERSION = '16.2.0' _HEADLESS = False @@ -176,9 +179,9 @@ def _deno_execute(self, jscode, note=None): await browser.close(); }}''', note=note, flags=['--allow-all'], base_js='') - def evaluate(self, jscode, video_id=None, note='Executing JS in Puppeteer', url='about:blank'): + def execute(self, jscode, video_id=None, note='Executing JS in Puppeteer', url='about:blank'): self.extractor.to_screen(f'{format_field(video_id, None, "%s: ")}{note}') - return json.loads(self._deno_execute(f''' + return self._deno_execute(f''' const page = await browser.newPage(); window.setTimeout(async () => {{ console.error('Puppeteer execution timed out'); @@ -187,26 +190,21 @@ def evaluate(self, jscode, video_id=None, note='Executing JS in Puppeteer', url= }}, {int(self.timeout)}); page.resourceTimeout = {int(self.timeout)}; + // drop network requests await page.setRequestInterception(true); page.on("request", request => request.abort()); + // capture console output + page.on("console", msg => {{ + msg.type() === 'log' && console.log(msg.text()); + msg.type() === 'error' && console.error(msg.text()); + }}); const url = {json.dumps(str(url))}; await page.evaluate(`window.history.replaceState('', '', ${{JSON.stringify(url)}})`); - console.log(JSON.stringify(await page.evaluate({json.dumps(str(jscode))}))); + await page.evaluate({json.dumps(str(jscode))}); await browser.close(); Deno.exit(0); - ''')) - - def execute(self, jscode, **args): - return self.evaluate(''' - (() => {{ - const results = []; - const origConsole = console; - const console = new Proxy(console, { get: (target, prop, receiver) => { - if (prop === 'log') return (...data) => data.forEach(i => results.push(i)); - return target[prop]}}) - }})(); ''')