parse_iso8601,
smuggle_url,
str_or_none,
+ try_get,
unescapeHTML,
unsmuggle_url,
UnsupportedError,
def _parse_brightcove_metadata(self, json_data, video_id, headers={}):
title = json_data['name'].strip()
+ num_drm_sources = 0
formats = []
- sources_num = len(json_data.get('sources'))
- key_systems_present = 0
- for source in json_data.get('sources', []):
+ sources = json_data.get('sources') or []
+ for source in sources:
container = source.get('container')
ext = mimetype2ext(source.get('type'))
src = source.get('src')
- # https://apis.support.brightcove.com/playback/references/playback-api-video-fields-reference.html
- if source.get('key_systems'):
- key_systems_present += 1
+ # https://support.brightcove.com/playback-api-video-fields-reference#key_systems_object
+ if container == 'WVM' or source.get('key_systems'):
+ num_drm_sources += 1
continue
- elif ext == 'ism' or container == 'WVM':
+ elif ext == 'ism':
continue
elif ext == 'm3u8' or container == 'M2TS':
if not src:
})
formats.append(f)
- if sources_num == key_systems_present:
- raise ExtractorError('This video is DRM protected', expected=True)
-
if not formats:
- # for sonyliv.com DRM protected videos
- s3_source_url = json_data.get('custom_fields', {}).get('s3sourceurl')
- if s3_source_url:
- formats.append({
- 'url': s3_source_url,
- 'format_id': 'source',
- })
-
- errors = json_data.get('errors')
- if not formats and errors:
- error = errors[0]
- raise ExtractorError(
- error.get('message') or error.get('error_subcode') or error['error_code'], expected=True)
+ errors = json_data.get('errors')
+ if errors:
+ error = errors[0]
+ raise ExtractorError(
+ error.get('message') or error.get('error_subcode') or error['error_code'], expected=True)
+ if sources and num_drm_sources == len(sources):
+ raise ExtractorError('This video is DRM protected.', expected=True)
self._sort_formats(formats)
store_pk = lambda x: self._downloader.cache.store('brightcove', policy_key_id, x)
def extract_policy_key():
- webpage = self._download_webpage(
- 'http://players.brightcove.net/%s/%s_%s/index.min.js'
- % (account_id, player_id, embed), video_id)
-
- policy_key = None
+ base_url = 'http://players.brightcove.net/%s/%s_%s/' % (account_id, player_id, embed)
+ config = self._download_json(
+ base_url + 'config.json', video_id, fatal=False) or {}
+ policy_key = try_get(
+ config, lambda x: x['video_cloud']['policy_key'])
+ if not policy_key:
+ webpage = self._download_webpage(
+ base_url + 'index.min.js', video_id)
- catalog = self._search_regex(
- r'catalog\(({.+?})\);', webpage, 'catalog', default=None)
- if catalog:
- catalog = self._parse_json(
- js_to_json(catalog), video_id, fatal=False)
+ catalog = self._search_regex(
+ r'catalog\(({.+?})\);', webpage, 'catalog', default=None)
if catalog:
- policy_key = catalog.get('policyKey')
-
- if not policy_key:
- policy_key = self._search_regex(
- r'policyKey\s*:\s*(["\'])(?P<pk>.+?)\1',
- webpage, 'policy key', group='pk')
+ catalog = self._parse_json(
+ js_to_json(catalog), video_id, fatal=False)
+ if catalog:
+ policy_key = catalog.get('policyKey')
+
+ if not policy_key:
+ policy_key = self._search_regex(
+ r'policyKey\s*:\s*(["\'])(?P<pk>.+?)\1',
+ webpage, 'policy key', group='pk')
store_pk(policy_key)
return policy_key