|
|
|
@ -588,11 +588,15 @@ class BrightcoveNewIE(AdobePassIE):
|
|
|
|
|
|
|
|
|
|
policy_key_id = '%s_%s' % (account_id, player_id)
|
|
|
|
|
policy_key = self._downloader.cache.load('brightcove', policy_key_id)
|
|
|
|
|
if not policy_key:
|
|
|
|
|
policy_key_extracted = False
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
catalog = self._search_regex(
|
|
|
|
|
r'catalog\(({.+?})\);', webpage, 'catalog', default=None)
|
|
|
|
|
if catalog:
|
|
|
|
@ -605,28 +609,38 @@ class BrightcoveNewIE(AdobePassIE):
|
|
|
|
|
policy_key = self._search_regex(
|
|
|
|
|
r'policyKey\s*:\s*(["\'])(?P<pk>.+?)\1',
|
|
|
|
|
webpage, 'policy key', group='pk')
|
|
|
|
|
|
|
|
|
|
self._downloader.cache.store('brightcove', policy_key_id, policy_key)
|
|
|
|
|
return policy_key
|
|
|
|
|
|
|
|
|
|
api_url = 'https://edge.api.brightcove.com/playback/v1/accounts/%s/%ss/%s' % (account_id, content_type, video_id)
|
|
|
|
|
headers = {
|
|
|
|
|
'Accept': 'application/json;pk=%s' % policy_key,
|
|
|
|
|
}
|
|
|
|
|
headers = {}
|
|
|
|
|
referrer = smuggled_data.get('referrer')
|
|
|
|
|
if referrer:
|
|
|
|
|
headers.update({
|
|
|
|
|
'Referer': referrer,
|
|
|
|
|
'Origin': re.search(r'https?://[^/]+', referrer).group(0),
|
|
|
|
|
})
|
|
|
|
|
try:
|
|
|
|
|
json_data = self._download_json(api_url, video_id, headers=headers)
|
|
|
|
|
except ExtractorError as e:
|
|
|
|
|
if isinstance(e.cause, compat_HTTPError) and e.cause.code == 403:
|
|
|
|
|
json_data = self._parse_json(e.cause.read().decode(), video_id)[0]
|
|
|
|
|
message = json_data.get('message') or json_data['error_code']
|
|
|
|
|
if json_data.get('error_subcode') == 'CLIENT_GEO':
|
|
|
|
|
self.raise_geo_restricted(msg=message)
|
|
|
|
|
raise ExtractorError(message, expected=True)
|
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
for _ in range(2):
|
|
|
|
|
if not policy_key:
|
|
|
|
|
policy_key = extract_policy_key()
|
|
|
|
|
policy_key_extracted = True
|
|
|
|
|
headers['Accept'] = 'application/json;pk=%s' % policy_key
|
|
|
|
|
try:
|
|
|
|
|
json_data = self._download_json(api_url, video_id, headers=headers)
|
|
|
|
|
break
|
|
|
|
|
except ExtractorError as e:
|
|
|
|
|
if isinstance(e.cause, compat_HTTPError) and e.cause.code in (401, 403):
|
|
|
|
|
json_data = self._parse_json(e.cause.read().decode(), video_id)[0]
|
|
|
|
|
message = json_data.get('message') or json_data['error_code']
|
|
|
|
|
if json_data.get('error_subcode') == 'CLIENT_GEO':
|
|
|
|
|
self.raise_geo_restricted(msg=message)
|
|
|
|
|
elif json_data.get('error_code') == 'INVALID_POLICY_KEY' and not policy_key_extracted:
|
|
|
|
|
policy_key = None
|
|
|
|
|
continue
|
|
|
|
|
raise ExtractorError(message, expected=True)
|
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
errors = json_data.get('errors')
|
|
|
|
|
if errors and errors[0].get('error_subcode') == 'TVE_AUTH':
|
|
|
|
|