mirror of
https://github.com/yt-dlp/yt-dlp
synced 2024-11-16 07:48:01 +01:00
parent
170605840e
commit
7cf51f2191
3 changed files with 25 additions and 3 deletions
|
@ -445,6 +445,22 @@ class TestJSInterpreter(unittest.TestCase):
|
||||||
jsi = JSInterpreter('function x(){return 1236566549 << 5}')
|
jsi = JSInterpreter('function x(){return 1236566549 << 5}')
|
||||||
self.assertEqual(jsi.call_function('x'), 915423904)
|
self.assertEqual(jsi.call_function('x'), 915423904)
|
||||||
|
|
||||||
|
def test_negative(self):
|
||||||
|
jsi = JSInterpreter("function f(){return 2 * -2.0;}")
|
||||||
|
self.assertEqual(jsi.call_function('f'), -4)
|
||||||
|
|
||||||
|
jsi = JSInterpreter('function f(){return 2 - - -2;}')
|
||||||
|
self.assertEqual(jsi.call_function('f'), 0)
|
||||||
|
|
||||||
|
jsi = JSInterpreter('function f(){return 2 - - - -2;}')
|
||||||
|
self.assertEqual(jsi.call_function('f'), 4)
|
||||||
|
|
||||||
|
jsi = JSInterpreter('function f(){return 2 - + + - -2;}')
|
||||||
|
self.assertEqual(jsi.call_function('f'), 0)
|
||||||
|
|
||||||
|
jsi = JSInterpreter('function f(){return 2 + - + - -2;}')
|
||||||
|
self.assertEqual(jsi.call_function('f'), 0)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -142,6 +142,10 @@ _NSIG_TESTS = [
|
||||||
'https://www.youtube.com/s/player/dac945fd/player_ias.vflset/en_US/base.js',
|
'https://www.youtube.com/s/player/dac945fd/player_ias.vflset/en_US/base.js',
|
||||||
'o8BkRxXhuYsBCWi6RplPdP', '3Lx32v_hmzTm6A',
|
'o8BkRxXhuYsBCWi6RplPdP', '3Lx32v_hmzTm6A',
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
'https://www.youtube.com/s/player/6f20102c/player_ias.vflset/en_US/base.js',
|
||||||
|
'lE8DhoDmKqnmJJ', 'pJTTX6XyJP2BYw',
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -243,7 +243,7 @@ class JSInterpreter:
|
||||||
return
|
return
|
||||||
counters = {k: 0 for k in _MATCHING_PARENS.values()}
|
counters = {k: 0 for k in _MATCHING_PARENS.values()}
|
||||||
start, splits, pos, delim_len = 0, 0, 0, len(delim) - 1
|
start, splits, pos, delim_len = 0, 0, 0, len(delim) - 1
|
||||||
in_quote, escaping, after_op, in_regex_char_group = None, False, True, False
|
in_quote, escaping, after_op, in_regex_char_group, in_unary_op = None, False, True, False, False
|
||||||
for idx, char in enumerate(expr):
|
for idx, char in enumerate(expr):
|
||||||
if not in_quote and char in _MATCHING_PARENS:
|
if not in_quote and char in _MATCHING_PARENS:
|
||||||
counters[_MATCHING_PARENS[char]] += 1
|
counters[_MATCHING_PARENS[char]] += 1
|
||||||
|
@ -258,9 +258,11 @@ class JSInterpreter:
|
||||||
elif in_quote == '/' and char in '[]':
|
elif in_quote == '/' and char in '[]':
|
||||||
in_regex_char_group = char == '['
|
in_regex_char_group = char == '['
|
||||||
escaping = not escaping and in_quote and char == '\\'
|
escaping = not escaping and in_quote and char == '\\'
|
||||||
after_op = not in_quote and char in OP_CHARS or (char.isspace() and after_op)
|
in_unary_op = (not in_quote and not in_regex_char_group
|
||||||
|
and after_op not in (True, False) and char in '-+')
|
||||||
|
after_op = char if (not in_quote and char in OP_CHARS) else (char.isspace() and after_op)
|
||||||
|
|
||||||
if char != delim[pos] or any(counters.values()) or in_quote:
|
if char != delim[pos] or any(counters.values()) or in_quote or in_unary_op:
|
||||||
pos = 0
|
pos = 0
|
||||||
continue
|
continue
|
||||||
elif pos != delim_len:
|
elif pos != delim_len:
|
||||||
|
|
Loading…
Reference in a new issue