aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/test_jsinterp.py32
-rw-r--r--test/test_youtube_signature.py4
-rw-r--r--yt_dlp/jsinterp.py15
3 files changed, 51 insertions, 0 deletions
diff --git a/test/test_jsinterp.py b/test/test_jsinterp.py
index 3c4391c4a..e090dc791 100644
--- a/test/test_jsinterp.py
+++ b/test/test_jsinterp.py
@@ -155,6 +155,38 @@ class TestJSInterpreter(unittest.TestCase):
self.assertEqual(jsi.call_function('z'), 5)
self.assertEqual(jsi.call_function('y'), 2)
+ def test_if(self):
+ jsi = JSInterpreter('''
+ function x() {
+ let a = 9;
+ if (0==0) {a++}
+ return a
+ }''')
+ self.assertEqual(jsi.call_function('x'), 10)
+
+ jsi = JSInterpreter('''
+ function x() {
+ if (0==0) {return 10}
+ }''')
+ self.assertEqual(jsi.call_function('x'), 10)
+
+ jsi = JSInterpreter('''
+ function x() {
+ if (0!=0) {return 1}
+ else {return 10}
+ }''')
+ self.assertEqual(jsi.call_function('x'), 10)
+
+ """ # Unsupported
+ jsi = JSInterpreter('''
+ function x() {
+ if (0!=0) {return 1}
+ else if (1==0) {return 2}
+ else {return 10}
+ }''')
+ self.assertEqual(jsi.call_function('x'), 10)
+ """
+
def test_for_loop(self):
jsi = JSInterpreter('''
function x() { a=0; for (i=0; i-10; i++) {a++} return a }
diff --git a/test/test_youtube_signature.py b/test/test_youtube_signature.py
index 6d753fbf0..3203538bb 100644
--- a/test/test_youtube_signature.py
+++ b/test/test_youtube_signature.py
@@ -134,6 +134,10 @@ _NSIG_TESTS = [
'https://www.youtube.com/s/player/7a062b77/player_ias.vflset/en_US/base.js',
'NRcE3y3mVtm_cV-W', 'VbsCYUATvqlt5w',
),
+ (
+ 'https://www.youtube.com/s/player/dac945fd/player_ias.vflset/en_US/base.js',
+ 'o8BkRxXhuYsBCWi6RplPdP', '3Lx32v_hmzTm6A',
+ ),
]
diff --git a/yt_dlp/jsinterp.py b/yt_dlp/jsinterp.py
index 3f7d659ac..c2d056aa1 100644
--- a/yt_dlp/jsinterp.py
+++ b/yt_dlp/jsinterp.py
@@ -403,10 +403,25 @@ class JSInterpreter:
m = re.match(r'''(?x)
(?P<try>try)\s*\{|
+ (?P<if>if)\s*\(|
(?P<switch>switch)\s*\(|
(?P<for>for)\s*\(
''', expr)
md = m.groupdict() if m else {}
+ if md.get('if'):
+ cndn, expr = self._separate_at_paren(expr[m.end() - 1:])
+ if_expr, expr = self._separate_at_paren(expr.lstrip())
+ # TODO: "else if" is not handled
+ else_expr = None
+ m = re.match(r'else\s*{', expr)
+ if m:
+ else_expr, expr = self._separate_at_paren(expr[m.end() - 1:])
+ cndn = _js_ternary(self.interpret_expression(cndn, local_vars, allow_recursion))
+ ret, should_abort = self.interpret_statement(
+ if_expr if cndn else else_expr, local_vars, allow_recursion)
+ if should_abort:
+ return ret, True
+
if md.get('try'):
try_expr, expr = self._separate_at_paren(expr[m.end() - 1:])
err = None