parse_iso8601,
smuggle_url,
str_or_none,
+ try_get,
unescapeHTML,
unsmuggle_url,
UnsupportedError,
]
@classmethod
- def _build_brighcove_url(cls, object_str):
+ def _build_brightcove_url(cls, object_str):
"""
Build a Brightcove url from a xml string containing
<object class="BrightcoveExperience">{params}</object>
return cls._make_brightcove_url(params)
@classmethod
- def _build_brighcove_url_from_js(cls, object_js):
+ def _build_brightcove_url_from_js(cls, object_js):
# The layout of JS is as follows:
# customBC.createVideo = function (width, height, playerID, playerKey, videoPlayer, VideoRandomID) {
# // build Brightcove <object /> XML
).+?>\s*</object>''',
webpage)
if matches:
- return list(filter(None, [cls._build_brighcove_url(m) for m in matches]))
+ return list(filter(None, [cls._build_brightcove_url(m) for m in matches]))
matches = re.findall(r'(customBC\.createVideo\(.+?\);)', webpage)
if matches:
return list(filter(None, [
- cls._build_brighcove_url_from_js(custom_bc)
+ cls._build_brightcove_url_from_js(custom_bc)
for custom_bc in matches]))
return [src for _, src in re.findall(
r'<iframe[^>]+src=([\'"])((?:https?:)?//link\.brightcove\.com/services/player/(?!\1).+)\1', webpage)]
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