Skip to content

Commit

Permalink
[core] Fix format selection parse error for CPython 3.12 (#8797)
Browse files Browse the repository at this point in the history
Authored by: Grub4K
  • Loading branch information
Grub4K committed Dec 24, 2023
1 parent 116c268 commit 00cdda4
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 2 deletions.
2 changes: 2 additions & 0 deletions test/test_YoutubeDL.py
Expand Up @@ -140,6 +140,8 @@ def test(inp, *expected, multi=False):
test('example-with-dashes', 'example-with-dashes')
test('all', '2', '47', '45', 'example-with-dashes', '35')
test('mergeall', '2+47+45+example-with-dashes+35', multi=True)
# See: https://github.com/yt-dlp/yt-dlp/pulls/8797
test('7_a/worst', '35')

def test_format_selection_audio(self):
formats = [
Expand Down
11 changes: 9 additions & 2 deletions yt_dlp/YoutubeDL.py
Expand Up @@ -2465,9 +2465,16 @@ def final_selector(ctx):
return selector_function(ctx_copy)
return final_selector

stream = io.BytesIO(format_spec.encode())
# HACK: Python 3.12 changed the underlying parser, rendering '7_a' invalid
# Prefix numbers with random letters to avoid it being classified as a number
# See: https://github.com/yt-dlp/yt-dlp/pulls/8797
# TODO: Implement parser not reliant on tokenize.tokenize
prefix = ''.join(random.choices(string.ascii_letters, k=32))
stream = io.BytesIO(re.sub(r'\d[_\d]*', rf'{prefix}\g<0>', format_spec).encode())
try:
tokens = list(_remove_unused_ops(tokenize.tokenize(stream.readline)))
tokens = list(_remove_unused_ops(
token._replace(string=token.string.replace(prefix, ''))
for token in tokenize.tokenize(stream.readline)))
except tokenize.TokenError:
raise syntax_error('Missing closing/opening brackets or parenthesis', (0, len(format_spec)))

Expand Down

0 comments on commit 00cdda4

Please sign in to comment.