[extractor/paramountplus] Better DRM detection (#5126)

Closes #5119
Authored by: bashonly
This commit is contained in:
bashonly 2022-10-03 19:35:05 +00:00 committed by GitHub
parent 4a61501db9
commit 8671f995cc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 56 additions and 7 deletions

View File

@ -3,6 +3,7 @@ import itertools
from .common import InfoExtractor from .common import InfoExtractor
from .cbs import CBSBaseIE from .cbs import CBSBaseIE
from ..utils import ( from ..utils import (
ExtractorError,
int_or_none, int_or_none,
url_or_none, url_or_none,
) )
@ -24,14 +25,22 @@ class ParamountPlusIE(CBSBaseIE):
'ext': 'mp4', 'ext': 'mp4',
'title': 'CatDog - Climb Every CatDog/The Canine Mutiny', 'title': 'CatDog - Climb Every CatDog/The Canine Mutiny',
'description': 'md5:7ac835000645a69933df226940e3c859', 'description': 'md5:7ac835000645a69933df226940e3c859',
'duration': 1418, 'duration': 1426,
'timestamp': 920264400, 'timestamp': 920264400,
'upload_date': '19990301', 'upload_date': '19990301',
'uploader': 'CBSI-NEW', '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': { 'params': {
'skip_download': 'm3u8', 'skip_download': 'm3u8',
}, },
'expected_warnings': ['Ignoring subtitle tracks'], # TODO: Investigate this
}, { }, {
'url': 'https://www.paramountplus.com/shows/video/6hSWYWRrR9EUTz7IEe5fJKBhYvSUfexd/', 'url': 'https://www.paramountplus.com/shows/video/6hSWYWRrR9EUTz7IEe5fJKBhYvSUfexd/',
'info_dict': { 'info_dict': {
@ -43,10 +52,18 @@ class ParamountPlusIE(CBSBaseIE):
'timestamp': 1627063200, 'timestamp': 1627063200,
'upload_date': '20210723', 'upload_date': '20210723',
'uploader': 'CBSI-NEW', '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': { 'params': {
'skip_download': 'm3u8', 'skip_download': 'm3u8',
}, },
'expected_warnings': ['Ignoring subtitle tracks'],
}, { }, {
'url': 'https://www.paramountplus.com/movies/video/vM2vm0kE6vsS2U41VhMRKTOVHyQAr6pC/', 'url': 'https://www.paramountplus.com/movies/video/vM2vm0kE6vsS2U41VhMRKTOVHyQAr6pC/',
'info_dict': { 'info_dict': {
@ -54,14 +71,18 @@ class ParamountPlusIE(CBSBaseIE):
'ext': 'mp4', 'ext': 'mp4',
'title': 'Daddy\'s Home', 'title': 'Daddy\'s Home',
'upload_date': '20151225', 'upload_date': '20151225',
'description': 'md5:a0beaf24e8d3b0e81b2ee41d47c06f33', 'description': 'md5:9a6300c504d5e12000e8707f20c54745',
'uploader': 'CBSI-NEW', 'uploader': 'CBSI-NEW',
'timestamp': 1451030400, 'timestamp': 1451030400,
'thumbnail': r're:https?://.+\.jpg$',
'chapters': 'count:0',
'duration': 5761,
'series': 'Paramount+ Movies',
}, },
'params': { 'params': {
'skip_download': 'm3u8', 'skip_download': 'm3u8',
}, },
'expected_warnings': ['Ignoring subtitle tracks'], # TODO: Investigate this 'skip': 'DRM',
}, { }, {
'url': 'https://www.paramountplus.com/movies/video/5EKDXPOzdVf9voUqW6oRuocyAEeJGbEc/', 'url': 'https://www.paramountplus.com/movies/video/5EKDXPOzdVf9voUqW6oRuocyAEeJGbEc/',
'info_dict': { 'info_dict': {
@ -72,11 +93,15 @@ class ParamountPlusIE(CBSBaseIE):
'timestamp': 1577865600, 'timestamp': 1577865600,
'title': 'Sonic the Hedgehog', 'title': 'Sonic the Hedgehog',
'upload_date': '20200101', 'upload_date': '20200101',
'thumbnail': r're:https?://.+\.jpg$',
'chapters': 'count:0',
'duration': 5932,
'series': 'Paramount+ Movies',
}, },
'params': { 'params': {
'skip_download': 'm3u8', '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/', 'url': 'https://www.paramountplus.com/shows/the-real-world/video/mOVeHeL9ub9yWdyzSZFYz8Uj4ZBkVzQg/the-real-world-reunion/',
'only_matching': True, 'only_matching': True,
@ -99,18 +124,42 @@ class ParamountPlusIE(CBSBaseIE):
asset_types = { asset_types = {
item.get('assetType'): { item.get('assetType'): {
'format': 'SMIL', 'format': 'SMIL',
'formats': 'MPEG4,M3U', 'formats': 'M3U+none,MPEG4', # '+none' specifies ProtectionScheme (no DRM)
} for item in items_data['itemList'] } for item in items_data['itemList']
} }
item = items_data['itemList'][-1] 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'), 'title': item.get('title'),
'series': item.get('seriesTitle'), 'series': item.get('seriesTitle'),
'season_number': int_or_none(item.get('seasonNum')), 'season_number': int_or_none(item.get('seasonNum')),
'episode_number': int_or_none(item.get('episodeNum')), 'episode_number': int_or_none(item.get('episodeNum')),
'duration': int_or_none(item.get('duration')), 'duration': int_or_none(item.get('duration')),
'thumbnail': url_or_none(item.get('thumbnail')), '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): class ParamountPlusSeriesIE(InfoExtractor):