1
0
mirror of https://github.com/yt-dlp/yt-dlp synced 2025-07-09 15:23:59 -05:00

[outtmpl] Support str.format syntax inside replacements

Closes #6843
This commit is contained in:
pukkandan
2023-04-24 18:31:36 +05:30
parent 78fde6e339
commit ec9311c41b
3 changed files with 21 additions and 4 deletions

View File

@ -21,7 +21,7 @@ import tokenize
import traceback
import unicodedata
import urllib.request
from string import ascii_letters
from string import Formatter, ascii_letters
from .cache import Cache
from .compat import compat_os_name, compat_shlex_quote
@ -1237,6 +1237,14 @@ class YoutubeDL:
return list(obj)
return repr(obj)
class _ReplacementFormatter(Formatter):
def get_field(self, field_name, args, kwargs):
if field_name.isdigit():
return args[0], -1
raise ValueError('Unsupported field')
replacement_formatter = _ReplacementFormatter()
def create_key(outer_mobj):
if not outer_mobj.group('has_key'):
return outer_mobj.group(0)
@ -1258,7 +1266,13 @@ class YoutubeDL:
if fmt == 's' and value is not None and key in field_size_compat_map.keys():
fmt = f'0{field_size_compat_map[key]:d}d'
value = default if value is None else value if replacement is None else replacement
if value is None:
value = default
elif replacement is not None:
try:
value = replacement_formatter.format(replacement, value)
except ValueError:
value = na
flags = outer_mobj.group('conversion') or ''
str_fmt = f'{fmt[:-1]}s'