]> jfr.im git - yt-dlp.git/blobdiff - yt_dlp/extractor/paramountplus.py
[ie/matchtv] Fix extractor (#10190)
[yt-dlp.git] / yt_dlp / extractor / paramountplus.py
index 94a9319ea064b148c08ed3f1be017bf74355d762..317f53b2bcb82f02e4d7f52daa7e450ee11a7c5c 100644 (file)
@@ -1,9 +1,9 @@
-from __future__ import unicode_literals
 import itertools
 
-from .common import InfoExtractor
 from .cbs import CBSBaseIE
+from .common import InfoExtractor
 from ..utils import (
+    ExtractorError,
     int_or_none,
     url_or_none,
 )
@@ -25,10 +25,17 @@ class ParamountPlusIE(CBSBaseIE):
             'ext': 'mp4',
             'title': 'CatDog - Climb Every CatDog/The Canine Mutiny',
             'description': 'md5:7ac835000645a69933df226940e3c859',
-            'duration': 1418,
+            'duration': 1426,
             'timestamp': 920264400,
             'upload_date': '19990301',
             'uploader': 'CBSI-NEW',
+            'episode_number': 5,
+            'thumbnail': r're:https?://.+\.jpg$',
+            'season': 'Season 2',
+            'chapters': 'count:3',
+            'episode': 'Episode 5',
+            'season_number': 2,
+            'series': 'CatDog',
         },
         'params': {
             'skip_download': 'm3u8',
@@ -44,6 +51,13 @@ class ParamountPlusIE(CBSBaseIE):
             'timestamp': 1627063200,
             'upload_date': '20210723',
             'uploader': 'CBSI-NEW',
+            'episode_number': 81,
+            'thumbnail': r're:https?://.+\.jpg$',
+            'season': 'Season 2',
+            'chapters': 'count:4',
+            'episode': 'Episode 81',
+            'season_number': 2,
+            'series': 'Tooning Out The News',
         },
         'params': {
             'skip_download': 'm3u8',
@@ -55,14 +69,18 @@ class ParamountPlusIE(CBSBaseIE):
             'ext': 'mp4',
             'title': 'Daddy\'s Home',
             'upload_date': '20151225',
-            'description': 'md5:a0beaf24e8d3b0e81b2ee41d47c06f33',
+            'description': 'md5:9a6300c504d5e12000e8707f20c54745',
             'uploader': 'CBSI-NEW',
             'timestamp': 1451030400,
+            'thumbnail': r're:https?://.+\.jpg$',
+            'chapters': 'count:0',
+            'duration': 5761,
+            'series': 'Paramount+ Movies',
         },
         'params': {
             'skip_download': 'm3u8',
         },
-        'expected_warnings': ['Ignoring subtitle tracks'],  # TODO: Investigate this
+        'skip': 'DRM',
     }, {
         'url': 'https://www.paramountplus.com/movies/video/5EKDXPOzdVf9voUqW6oRuocyAEeJGbEc/',
         'info_dict': {
@@ -73,11 +91,15 @@ class ParamountPlusIE(CBSBaseIE):
             'timestamp': 1577865600,
             'title': 'Sonic the Hedgehog',
             'upload_date': '20200101',
+            'thumbnail': r're:https?://.+\.jpg$',
+            'chapters': 'count:0',
+            'duration': 5932,
+            'series': 'Paramount+ Movies',
         },
         'params': {
             'skip_download': 'm3u8',
         },
-        'expected_warnings': ['Ignoring subtitle tracks'],
+        'skip': 'DRM',
     }, {
         'url': 'https://www.paramountplus.com/shows/the-real-world/video/mOVeHeL9ub9yWdyzSZFYz8Uj4ZBkVzQg/the-real-world-reunion/',
         'only_matching': True,
@@ -94,24 +116,51 @@ class ParamountPlusIE(CBSBaseIE):
 
     def _extract_video_info(self, content_id, mpx_acc=2198311517):
         items_data = self._download_json(
-            'https://www.paramountplus.com/apps-api/v2.0/androidtv/video/cid/%s.json' % content_id,
-            content_id, query={'locale': 'en-us', 'at': 'ABCqWNNSwhIqINWIIAG+DFzcFUvF8/vcN6cNyXFFfNzWAIvXuoVgX+fK4naOC7V8MLI='}, headers=self.geo_verification_headers())
+            f'https://www.paramountplus.com/apps-api/v2.0/androidtv/video/cid/{content_id}.json',
+            content_id, query={
+                'locale': 'en-us',
+                'at': 'ABCXgPuoStiPipsK0OHVXIVh68zNys+G4f7nW9R6qH68GDOcneW6Kg89cJXGfiQCsj0=',
+            }, headers=self.geo_verification_headers())
 
         asset_types = {
             item.get('assetType'): {
                 'format': 'SMIL',
-                'formats': 'MPEG4,M3U',
+                'formats': 'M3U+none,MPEG4',  # '+none' specifies ProtectionScheme (no DRM)
             } for item in items_data['itemList']
         }
         item = items_data['itemList'][-1]
-        return self._extract_common_video_info(content_id, asset_types, mpx_acc, extra_info={
+
+        info, error = {}, None
+        metadata = {
             'title': item.get('title'),
             'series': item.get('seriesTitle'),
             'season_number': int_or_none(item.get('seasonNum')),
             'episode_number': int_or_none(item.get('episodeNum')),
             'duration': int_or_none(item.get('duration')),
             'thumbnail': url_or_none(item.get('thumbnail')),
-        })
+        }
+        try:
+            info = self._extract_common_video_info(content_id, asset_types, mpx_acc, extra_info=metadata)
+        except ExtractorError as e:
+            error = e
+
+        # Check for DRM formats to give appropriate error
+        if not info.get('formats'):
+            for query in asset_types.values():
+                query['formats'] = 'MPEG-DASH,M3U,MPEG4'  # allows DRM formats
+
+            try:
+                drm_info = self._extract_common_video_info(content_id, asset_types, mpx_acc, extra_info=metadata)
+            except ExtractorError:
+                if error:
+                    raise error from None
+                raise
+            if drm_info['formats']:
+                self.report_drm(content_id)
+            elif error:
+                raise error
+
+        return info
 
 
 class ParamountPlusSeriesIE(InfoExtractor):
@@ -121,19 +170,19 @@ class ParamountPlusSeriesIE(InfoExtractor):
         'playlist_mincount': 50,
         'info_dict': {
             'id': 'drake-josh',
-        }
+        },
     }, {
         'url': 'https://www.paramountplus.com/shows/hawaii_five_0/',
         'playlist_mincount': 240,
         'info_dict': {
             'id': 'hawaii_five_0',
-        }
+        },
     }, {
         'url': 'https://www.paramountplus.com/shows/spongebob-squarepants/',
         'playlist_mincount': 248,
         'info_dict': {
             'id': 'spongebob-squarepants',
-        }
+        },
     }]
 
     def _entries(self, show_name):
@@ -144,7 +193,7 @@ def _entries(self, show_name):
                 return
             for episode in show_json['result']['data']:
                 yield self.url_result(
-                    'https://www.paramountplus.com%s' % episode['url'],
+                    'https://www.paramountplus.com{}'.format(episode['url']),
                     ie=ParamountPlusIE.ie_key(), video_id=episode['content_id'])
 
     def _real_extract(self, url):