aboutsummaryrefslogtreecommitdiffstats
path: root/yt_dlp/utils.py
diff options
context:
space:
mode:
authorpukkandan <pukkandan.ytdlp@gmail.com>2021-04-15 18:01:16 +0530
committerpukkandan <pukkandan.ytdlp@gmail.com>2021-04-22 04:19:33 +0530
commita439a3a45ca884956cacc104680e0a32aa3faba5 (patch)
tree19f9b1fbc36d6d39c2d6819fdbc5a0d3d4f2af0c /yt_dlp/utils.py
parent26e2805c3f11066c79ed29cf78511eae7fdc7a7b (diff)
downloadhypervideo-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.py25
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