[brightcove] update policy key on failing requests
This commit is contained in:
		
							parent
							
								
									0a02732b56
								
							
						
					
					
						commit
						0606808746
					
				
					 1 changed files with 28 additions and 14 deletions
				
			
		| 
						 | 
				
			
			@ -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':
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue