diff --git a/test/test_jsinterp.py b/test/test_jsinterp.py index 4c5256c4b..52f68f941 100644 --- a/test/test_jsinterp.py +++ b/test/test_jsinterp.py @@ -485,6 +485,14 @@ class TestJSInterpreter(unittest.TestCase): self._test('function f(){return NaN << 42}', 0) self._test('function f(){return "21.9" << 1}', 42) self._test('function f(){return 21 << 4294967297}', 42) + self._test('function f(){return true << "5";}', 32) + self._test('function f(){return true << true;}', 2) + self._test('function f(){return "19" & "21.9";}', 17) + self._test('function f(){return "19" & false;}', 0) + self._test('function f(){return "11.0" >> "2.1";}', 2) + self._test('function f(){return 5 ^ 9;}', 12) + self._test('function f(){return 0.0 << NaN}', 0) + self._test('function f(){return null << undefined}', 0) def test_negative(self): self._test('function f(){return 2 * -2.0 ;}', -4) diff --git a/youtube_dl/jsinterp.py b/youtube_dl/jsinterp.py index 5a45fbb03..f30a6f740 100644 --- a/youtube_dl/jsinterp.py +++ b/youtube_dl/jsinterp.py @@ -162,7 +162,7 @@ def _js_toString(v): else 'null' if v is None # bool <= int: do this first else ('false', 'true')[v] if isinstance(v, bool) - else '{0:.7f}'.format(v).rstrip('.0') if isinstance(v, compat_numeric_types) + else re.sub(r'\.?0*$', '', '{0:.7f}'.format(v)) if isinstance(v, compat_numeric_types) else _js_to_primitive(v)) @@ -546,7 +546,7 @@ class JSInterpreter(object): return "Invalid Date" def valueOf(self): - return _NaN if self._t is None else self._t + return _NaN if self._t is None else int(self._t) @classmethod def __op_chars(cls):