]> jfr.im git - yt-dlp.git/blobdiff - yt_dlp/extractor/veo.py
Reject entire playlists faster with `--match-filter`
[yt-dlp.git] / yt_dlp / extractor / veo.py
index 9bc41114a1b9237276792c8d763c59e2964d6b1b..25d462a7d00517626f3bcfc231b7eceb24f10c3b 100644 (file)
@@ -1,11 +1,9 @@
-# coding: utf-8
-from __future__ import unicode_literals
-
 from .common import InfoExtractor
 
 from ..utils import (
     int_or_none,
     mimetype2ext,
+    str_or_none,
     unified_timestamp,
     url_or_none,
 )
@@ -24,6 +22,7 @@ class VeoIE(InfoExtractor):
             'upload_date': '20201028',
             'timestamp': 1603847208,
             'duration': 1916,
+            'view_count': int,
         }
     }, {
         'url': 'https://app.veo.co/matches/20220313-2022-03-13_u15m-plsjq-vs-csl/',
@@ -39,39 +38,41 @@ def _real_extract(self, url):
         video_data = self._download_json(
             'https://app.veo.co/api/app/matches/%s/videos' % video_id, video_id, 'Downloading video data')
 
-        title = metadata.get('title')
-        thumbnail = url_or_none(metadata.get('thumbnail'))
-
-        timestamp = unified_timestamp(metadata.get('created'))
-        duration = int_or_none(metadata.get('duration'))
-        view_count = int_or_none(metadata.get('view_count'))
-
         formats = []
         for fmt in video_data:
-            mimetype = fmt.get('mime_type')
+            mimetype = str_or_none(fmt.get('mime_type'))
+            format_url = url_or_none(fmt.get('url'))
             # skip configuration file for panoramic video
-            if mimetype == 'video/mp2t':
+            if not format_url or mimetype == 'video/mp2t':
                 continue
+
             height = int_or_none(fmt.get('height'))
-            bitrate = int_or_none(fmt.get('bit_rate'), scale=1000)
-            render_type = fmt.get('render_type')
+            render_type = str_or_none(fmt.get('render_type'))
+            format_id = f'{render_type}-{height}p' if render_type and height else None
+
+            # Veo returns panoramic video information even if panoramic video is not available.
+            # e.g. https://app.veo.co/matches/20201027-last-period/
+            if render_type == 'panorama':
+                if not self._is_valid_url(format_url, video_id, format_id):
+                    continue
+
             formats.append({
-                'url': url_or_none(fmt.get('url')),
-                'format_id': '%s-%sp' % (render_type, height),
+                'url': format_url,
+                'format_id': format_id,
                 'ext': mimetype2ext(mimetype),
                 'width': int_or_none(fmt.get('width')),
                 'height': height,
-                'vbr': bitrate
+                'vbr': int_or_none(fmt.get('bit_rate'), scale=1000),
             })
 
         self._sort_formats(formats)
 
         return {
             'id': video_id,
-            'title': title,
+            'title': str_or_none(metadata.get('title')),
             'formats': formats,
-            'thumbnail': thumbnail,
-            'timestamp': timestamp,
-            'view_count': view_count,
-            'duration': duration
+            'thumbnail': url_or_none(metadata.get('thumbnail')),
+            'timestamp': unified_timestamp(metadata.get('created')),
+            'view_count': int_or_none(metadata.get('view_count')),
+            'duration': int_or_none(metadata.get('duration')),
         }