aboutsummaryrefslogtreecommitdiffstats
path: root/yt_dlp/utils.py
diff options
context:
space:
mode:
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