aboutsummaryrefslogtreecommitdiffstats
path: root/yt_dlp
diff options
context:
space:
mode:
authorpukkandan <pukkandan.ytdlp@gmail.com>2023-04-24 18:31:36 +0530
committerpukkandan <pukkandan.ytdlp@gmail.com>2023-04-24 18:43:54 +0530
commitec9311c41b111110bc52cfbd6ea682c6fb23f77a (patch)
tree0eeb8220e2c307d6c85afceb02bdbac23dcb2065 /yt_dlp
parent78fde6e3398ff11e5d383a66b28664badeab5180 (diff)
downloadhypervideo-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.py18
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'