aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordirkf <fieldhouse@gmx.net>2023-06-11 13:33:50 +0100
committerdirkf <fieldhouse@gmx.net>2023-06-11 17:23:00 +0100
commita2534f7b888416e872d5afd1862eb3e30fc69fc7 (patch)
tree4e0020f047de77e54a924a6db4ca85ef562b97c4
parentb8a86dcf1aa837577178ae25357d8241ab4ba6c1 (diff)
[jsinterp] Fix div bug breaking player 8c7583ff
Thx bashonly: https://github.com/ytdl-org/youtube-dl/issues/32292#issuecomment-1585639223 Fixes #32292
-rw-r--r--test/test_jsinterp.py49
-rw-r--r--test/test_youtube_signature.py4
-rw-r--r--youtube_dl/jsinterp.py2
3 files changed, 54 insertions, 1 deletions
diff --git a/test/test_jsinterp.py b/test/test_jsinterp.py
index 1cc148b15..ecd6ab3c9 100644
--- a/test/test_jsinterp.py
+++ b/test/test_jsinterp.py
@@ -33,6 +33,55 @@ class TestJSInterpreter(unittest.TestCase):
jsi = JSInterpreter('function x4(a){return 2*a+1;}')
self.assertEqual(jsi.call_function('x4', 3), 7)
+ def test_add(self):
+ jsi = JSInterpreter('function f(){return 42 + 7;}')
+ self.assertEqual(jsi.call_function('f'), 49)
+ jsi = JSInterpreter('function f(){return 42 + undefined;}')
+ self.assertTrue(math.isnan(jsi.call_function('f')))
+ jsi = JSInterpreter('function f(){return 42 + null;}')
+ self.assertEqual(jsi.call_function('f'), 42)
+
+ def test_sub(self):
+ jsi = JSInterpreter('function f(){return 42 - 7;}')
+ self.assertEqual(jsi.call_function('f'), 35)
+ jsi = JSInterpreter('function f(){return 42 - undefined;}')
+ self.assertTrue(math.isnan(jsi.call_function('f')))
+ jsi = JSInterpreter('function f(){return 42 - null;}')
+ self.assertEqual(jsi.call_function('f'), 42)
+
+ def test_mul(self):
+ jsi = JSInterpreter('function f(){return 42 * 7;}')
+ self.assertEqual(jsi.call_function('f'), 294)
+ jsi = JSInterpreter('function f(){return 42 * undefined;}')
+ self.assertTrue(math.isnan(jsi.call_function('f')))
+ jsi = JSInterpreter('function f(){return 42 * null;}')
+ self.assertEqual(jsi.call_function('f'), 0)
+
+ def test_div(self):
+ jsi = JSInterpreter('function f(a, b){return a / b;}')
+ self.assertTrue(math.isnan(jsi.call_function('f', 0, 0)))
+ self.assertTrue(math.isnan(jsi.call_function('f', JS_Undefined, 1)))
+ self.assertTrue(math.isinf(jsi.call_function('f', 2, 0)))
+ self.assertEqual(jsi.call_function('f', 0, 3), 0)
+
+ def test_mod(self):
+ jsi = JSInterpreter('function f(){return 42 % 7;}')
+ self.assertEqual(jsi.call_function('f'), 0)
+ jsi = JSInterpreter('function f(){return 42 % 0;}')
+ self.assertTrue(math.isnan(jsi.call_function('f')))
+ jsi = JSInterpreter('function f(){return 42 % undefined;}')
+ self.assertTrue(math.isnan(jsi.call_function('f')))
+
+ def test_exp(self):
+ jsi = JSInterpreter('function f(){return 42 ** 2;}')
+ self.assertEqual(jsi.call_function('f'), 1764)
+ jsi = JSInterpreter('function f(){return 42 ** undefined;}')
+ self.assertTrue(math.isnan(jsi.call_function('f')))
+ jsi = JSInterpreter('function f(){return 42 ** null;}')
+ self.assertEqual(jsi.call_function('f'), 1)
+ jsi = JSInterpreter('function f(){return undefined ** 42;}')
+ self.assertTrue(math.isnan(jsi.call_function('f')))
+
def test_empty_return(self):
jsi = JSInterpreter('function f(){return; y()}')
self.assertEqual(jsi.call_function('f'), None)
diff --git a/test/test_youtube_signature.py b/test/test_youtube_signature.py
index d41d708a0..e7bce9d68 100644
--- a/test/test_youtube_signature.py
+++ b/test/test_youtube_signature.py
@@ -151,6 +151,10 @@ _NSIG_TESTS = [
'https://www.youtube.com/s/player/cfa9e7cb/player_ias.vflset/en_US/base.js',
'qO0NiMtYQ7TeJnfFG2', 'k9cuJDHNS5O7kQ',
),
+ (
+ 'https://www.youtube.com/s/player/8c7583ff/player_ias.vflset/en_US/base.js',
+ 'E2AQVN6y_zM7uN9w8z', '9A2dbY5GDZrt9A',
+ ),
]
diff --git a/youtube_dl/jsinterp.py b/youtube_dl/jsinterp.py
index dc580943e..9d4a5bc57 100644
--- a/youtube_dl/jsinterp.py
+++ b/youtube_dl/jsinterp.py
@@ -82,7 +82,7 @@ def _js_arith_op(op):
def _js_div(a, b):
- if JS_Undefined in (a, b) or not (a and b):
+ if JS_Undefined in (a, b) or not (a or b):
return _NaN
return operator.truediv(a or 0, b) if b else float('inf')