diff options
author | pukkandan <pukkandan.ytdlp@gmail.com> | 2021-04-15 18:01:16 +0530 |
---|---|---|
committer | pukkandan <pukkandan.ytdlp@gmail.com> | 2021-04-22 04:19:33 +0530 |
commit | a439a3a45ca884956cacc104680e0a32aa3faba5 (patch) | |
tree | 19f9b1fbc36d6d39c2d6819fdbc5a0d3d4f2af0c /yt_dlp/utils.py | |
parent | 26e2805c3f11066c79ed29cf78511eae7fdc7a7b (diff) | |
download | hypervideo-pre-a439a3a45ca884956cacc104680e0a32aa3faba5.tar.lz hypervideo-pre-a439a3a45ca884956cacc104680e0a32aa3faba5.tar.xz hypervideo-pre-a439a3a45ca884956cacc104680e0a32aa3faba5.zip |
Improve output template (see desc)
* Objects can be traversed like `%(field.key1.key2)s`
* A number can be added to the field as `%(field+n)s`
* Deprecates `--autonumber-start`
Diffstat (limited to 'yt_dlp/utils.py')
-rw-r--r-- | yt_dlp/utils.py | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/yt_dlp/utils.py b/yt_dlp/utils.py index 3e566285f..461f64db0 100644 --- a/yt_dlp/utils.py +++ b/yt_dlp/utils.py @@ -6092,11 +6092,20 @@ def load_plugins(name, type, namespace): def traverse_dict(dictn, keys, casesense=True): - if not isinstance(dictn, dict): - return None - first_key = keys[0] - if not casesense: - dictn = {key.lower(): val for key, val in dictn.items()} - first_key = first_key.lower() - value = dictn.get(first_key, None) - return value if len(keys) < 2 else traverse_dict(value, keys[1:], casesense) + keys = list(keys)[::-1] + while keys: + key = keys.pop() + if isinstance(dictn, dict): + if not casesense: + dictn = {k.lower(): v for k, v in dictn.items()} + key = key.lower() + dictn = dictn.get(key) + elif isinstance(dictn, (list, tuple, compat_str)): + key, n = int_or_none(key), len(dictn) + if key is not None and -n <= key < n: + dictn = dictn[key] + else: + dictn = None + else: + return None + return dictn |