]> jfr.im git - yt-dlp.git/commitdiff
[extractor/paramountplus] Better DRM detection (#5126)
authorbashonly <redacted>
Mon, 3 Oct 2022 19:35:05 +0000 (19:35 +0000)
committerGitHub <redacted>
Mon, 3 Oct 2022 19:35:05 +0000 (01:05 +0530)
Closes #5119
Authored by: bashonly

yt_dlp/extractor/paramountplus.py

index 7987d77c6e2e1ca23892aa38aa037663e62566a4..fb6d07ac7c408c8ec2ff386564bbd1f31d70a0da 100644 (file)
@@ -3,6 +3,7 @@
 from .common import InfoExtractor
 from .cbs import CBSBaseIE
 from ..utils import (
+    ExtractorError,
     int_or_none,
     url_or_none,
 )
@@ -24,14 +25,22 @@ 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',
         },
+        'expected_warnings': ['Ignoring subtitle tracks'],  # TODO: Investigate this
     }, {
         'url': 'https://www.paramountplus.com/shows/video/6hSWYWRrR9EUTz7IEe5fJKBhYvSUfexd/',
         'info_dict': {
@@ -43,10 +52,18 @@ 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',
         },
+        'expected_warnings': ['Ignoring subtitle tracks'],
     }, {
         'url': 'https://www.paramountplus.com/movies/video/vM2vm0kE6vsS2U41VhMRKTOVHyQAr6pC/',
         'info_dict': {
@@ -54,14 +71,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': {
@@ -72,11 +93,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,
@@ -99,18 +124,42 @@ def _extract_video_info(self, content_id, mpx_acc=2198311517):
         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):