]> jfr.im git - yt-dlp.git/commitdiff
[utils] Add `get_first`
authorpukkandan <redacted>
Tue, 8 Mar 2022 20:54:41 +0000 (02:24 +0530)
committerpukkandan <redacted>
Tue, 8 Mar 2022 20:56:52 +0000 (02:26 +0530)
yt_dlp/extractor/facebook.py
yt_dlp/extractor/tiktok.py
yt_dlp/extractor/youtube.py
yt_dlp/utils.py

index d39dcc05813d4dd98984782f4b2060fbcd003b54..ef57b221cd42016513f1b0667d91ae42c415b51b 100644 (file)
@@ -18,6 +18,7 @@
     ExtractorError,
     float_or_none,
     get_element_by_id,
+    get_first,
     int_or_none,
     js_to_json,
     merge_dicts,
@@ -405,11 +406,9 @@ def extract_metadata(webpage):
                 ..., 'require', ..., ..., ..., '__bbox', 'result', 'data'), expected_type=dict) or []
             media = [m for m in traverse_obj(post, (..., 'attachments', ..., 'media'), expected_type=dict) or []
                      if str(m.get('id')) == video_id and m.get('__typename') == 'Video']
-            title = traverse_obj(media, (..., 'title', 'text'), get_all=False)
-            description = traverse_obj(media, (
-                ..., 'creation_story', 'comet_sections', 'message', 'story', 'message', 'text'), get_all=False)
-            uploader_data = (traverse_obj(media, (..., 'owner'), get_all=False)
-                             or traverse_obj(post, (..., 'node', 'actors', ...), get_all=False) or {})
+            title = get_first(media, ('title', 'text'))
+            description = get_first(media, ('creation_story', 'comet_sections', 'message', 'story', 'message', 'text'))
+            uploader_data = get_first(media, 'owner') or get_first(post, ('node', 'actors', ...)) or {}
 
             page_title = title or self._html_search_regex((
                 r'<h2\s+[^>]*class="uiHeaderTitle"[^>]*>(?P<content>[^<]*)</h2>',
index 620973a9f09ed1d6182295f05d8636ace571786c..56cc2dcc63d98a693828cc9efe8e0c0d41802e41 100644 (file)
@@ -15,6 +15,7 @@
 from ..utils import (
     ExtractorError,
     HEADRequest,
+    get_first,
     int_or_none,
     join_nonempty,
     LazyList,
@@ -816,8 +817,7 @@ def _real_extract(self, url):
 
         render_data = self._parse_json(
             render_data_json, video_id, transform_source=compat_urllib_parse_unquote)
-        return self._parse_aweme_video_web(
-            traverse_obj(render_data, (..., 'aweme', 'detail'), get_all=False), url)
+        return self._parse_aweme_video_web(get_first(render_data, ('aweme', 'detail')), url)
 
 
 class TikTokVMIE(InfoExtractor):
index da49df8cd72ae075019b1c97cb4ba1b2c18d1731..66bb8d9f07f99efe192ca9f193f6b22dd18fb364 100644 (file)
@@ -39,6 +39,7 @@
     ExtractorError,
     float_or_none,
     format_field,
+    get_first,
     int_or_none,
     is_html,
     join_nonempty,
 )
 
 
-def get_first(obj, keys, **kwargs):
-    return traverse_obj(obj, (..., *variadic(keys)), **kwargs, get_all=False)
-
-
 # any clients starting with _ cannot be explicity requested by the user
 INNERTUBE_CLIENTS = {
     'web': {
index 10a9a72ff413b85e52447a0bd2e4d07a3eb7a8bc..9b130e109b1c535008491226f8e7589e1f52d4a0 100644 (file)
@@ -5218,6 +5218,10 @@ def traverse_dict(dictn, keys, casesense=True):
     return traverse_obj(dictn, keys, casesense=casesense, is_user_input=True, traverse_string=True)
 
 
+def get_first(obj, keys, **kwargs):
+    return traverse_obj(obj, (..., *variadic(keys)), **kwargs, get_all=False)
+
+
 def variadic(x, allowed_types=(str, bytes, dict)):
     return x if isinstance(x, collections.abc.Iterable) and not isinstance(x, allowed_types) else (x,)