[jsinterp] Improve separating regex

Fixes https://github.com/yt-dlp/yt-dlp/issues/4635#issuecomment-1273974909
This commit is contained in:
pukkandan 2022-10-11 07:59:27 +05:30
parent d509c1f5a3
commit 0468a3b325
No known key found for this signature in database
GPG key ID: 7EEE9E1E817D0A39
4 changed files with 14 additions and 3 deletions

View file

@ -392,6 +392,11 @@ def test_regex(self):
''') ''')
self.assertEqual(jsi.call_function('x').pattern, r',][}",],()}(\[)') self.assertEqual(jsi.call_function('x').pattern, r',][}",],()}(\[)')
jsi = JSInterpreter(R'''
function x() { let a=[/[)\\]/]; return a[0]; }
''')
self.assertEqual(jsi.call_function('x').pattern, r'[)\\]')
def test_char_code_at(self): def test_char_code_at(self):
jsi = JSInterpreter('function x(i){return "test".charCodeAt(i)}') jsi = JSInterpreter('function x(i){return "test".charCodeAt(i)}')
self.assertEqual(jsi.call_function('x', 0), 116) self.assertEqual(jsi.call_function('x', 0), 116)

View file

@ -130,6 +130,10 @@
'https://www.youtube.com/s/player/5a3b6271/player_ias.vflset/en_US/base.js', 'https://www.youtube.com/s/player/5a3b6271/player_ias.vflset/en_US/base.js',
'B2j7f_UPT4rfje85Lu_e', 'm5DmNymaGQ5RdQ', 'B2j7f_UPT4rfje85Lu_e', 'm5DmNymaGQ5RdQ',
), ),
(
'https://www.youtube.com/s/player/7a062b77/player_ias.vflset/en_US/base.js',
'NRcE3y3mVtm_cV-W', 'VbsCYUATvqlt5w',
),
] ]

View file

@ -2832,7 +2832,7 @@ def _decrypt_nsig(self, s, video_id, player_url):
self.report_warning( self.report_warning(
f'Native nsig extraction failed: Trying with PhantomJS\n' f'Native nsig extraction failed: Trying with PhantomJS\n'
f' n = {s} ; player = {player_url}', video_id) f' n = {s} ; player = {player_url}', video_id)
self.write_debug(e) self.write_debug(e, only_once=True)
args, func_body = func_code args, func_body = func_code
ret = jsi.execute( ret = jsi.execute(

View file

@ -236,7 +236,7 @@ def _regex_flags(cls, expr):
@staticmethod @staticmethod
def _separate(expr, delim=',', max_split=None): def _separate(expr, delim=',', max_split=None):
OP_CHARS = '+-*/%&|^=<>!,;{}:' OP_CHARS = '+-*/%&|^=<>!,;{}:['
if not expr: if not expr:
return return
counters = {k: 0 for k in _MATCHING_PARENS.values()} counters = {k: 0 for k in _MATCHING_PARENS.values()}
@ -246,6 +246,8 @@ def _separate(expr, delim=',', max_split=None):
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
elif not in_quote and char in counters: elif not in_quote and char in counters:
# Something's wrong if we get negative, but ignore it anyway
if counters[char]:
counters[char] -= 1 counters[char] -= 1
elif not escaping: elif not escaping:
if char in _QUOTES and in_quote in (char, None): if char in _QUOTES and in_quote in (char, None):