diff options
author | pukkandan <pukkandan.ytdlp@gmail.com> | 2023-04-24 18:31:36 +0530 |
---|---|---|
committer | pukkandan <pukkandan.ytdlp@gmail.com> | 2023-04-24 18:43:54 +0530 |
commit | ec9311c41b111110bc52cfbd6ea682c6fb23f77a (patch) | |
tree | 0eeb8220e2c307d6c85afceb02bdbac23dcb2065 /yt_dlp | |
parent | 78fde6e3398ff11e5d383a66b28664badeab5180 (diff) | |
download | hypervideo-pre-ec9311c41b111110bc52cfbd6ea682c6fb23f77a.tar.lz hypervideo-pre-ec9311c41b111110bc52cfbd6ea682c6fb23f77a.tar.xz hypervideo-pre-ec9311c41b111110bc52cfbd6ea682c6fb23f77a.zip |
[outtmpl] Support `str.format` syntax inside replacements
Closes #6843
Diffstat (limited to 'yt_dlp')
-rw-r--r-- | yt_dlp/YoutubeDL.py | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 61c149e47..dce6cf928 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -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' |