]> jfr.im git - yt-dlp.git/blobdiff - yt_dlp/extractor/youtube.py
[utils] Add `get_first`
[yt-dlp.git] / yt_dlp / extractor / youtube.py
index 6451c08c0b2562da78d4ce845ae1eae0a410e0ab..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': {
@@ -3115,7 +3112,8 @@ def _extract_formats(self, streaming_data, video_id, player_url, is_live):
                 'language': join_nonempty(audio_track.get('id', '').split('.')[0],
                                           'desc' if language_preference < -1 else ''),
                 'language_preference': language_preference,
-                'preference': -10 if is_damaged else None,
+                # Strictly de-prioritize damaged and 3gp formats
+                'preference': -10 if is_damaged else -2 if itag == '17' else None,
             }
             mime_mobj = re.match(
                 r'((?:[^/]+)/(?:[^;]+))(?:;\s*codecs="([^"]+)")?', fmt.get('mimeType') or '')