|
|
@ -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': |
|
|
|