]> jfr.im git - yt-dlp.git/commitdiff
[jsinterp] Fix division (#7279)
authorbashonly <redacted>
Sat, 10 Jun 2023 22:49:12 +0000 (17:49 -0500)
committerGitHub <redacted>
Sat, 10 Jun 2023 22:49:12 +0000 (22:49 +0000)
* Fixes nsig decryption for Youtube JS player `8c7583ff`

Authored by: bashonly

test/test_jsinterp.py
test/test_youtube_signature.py
yt_dlp/jsinterp.py

index 4d44e6efe6aed7c4f3882a06b24e3d4504891e17..b01477e6ff78e76161c423fb4f6358f383e4ded4 100644 (file)
@@ -28,6 +28,13 @@ def test_basic(self):
     def test_calc(self):
         self._test('function f(a){return 2*a+1;}', 7, args=[3])
 
     def test_calc(self):
         self._test('function f(a){return 2*a+1;}', 7, args=[3])
 
+    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_empty_return(self):
         self._test('function f(){return; y()}', None)
 
     def test_empty_return(self):
         self._test('function f(){return; y()}', None)
 
index 13120d97f8ad6106be948d800387c0ae7429f324..01f09de88c3b85eddde285a6794cec99079e58eb 100644 (file)
         'https://www.youtube.com/s/player/cfa9e7cb/player_ias.vflset/en_US/base.js',
         'aCi3iElgd2kq0bxVbQ', 'QX1y8jGb2IbZ0w',
     ),
         'https://www.youtube.com/s/player/cfa9e7cb/player_ias.vflset/en_US/base.js',
         'aCi3iElgd2kq0bxVbQ', 'QX1y8jGb2IbZ0w',
     ),
+    (
+        'https://www.youtube.com/s/player/8c7583ff/player_ias.vflset/en_US/base.js',
+        '1wWCVpRR96eAmMI87L', 'KSkWAVv1ZQxC3A',
+    ),
 ]
 
 
 ]
 
 
index 7c7940efd581f7646cb0521935da529b8eb2ab68..d6d555733abc701ad37a5dd3b37500b7da3cb31b 100644 (file)
@@ -44,7 +44,7 @@ def wrapped(a, b):
 
 
 def _js_div(a, b):
 
 
 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 float('nan')
     return (a or 0) / b if b else float('inf')
 
         return float('nan')
     return (a or 0) / b if b else float('inf')