mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 06:35:12 +00:00 
			
		
		
		
	[cspan] add support for brightcove live embeds(closes #13028)
This commit is contained in:
		| @@ -5,6 +5,7 @@ import re | |||||||
| import json | import json | ||||||
|  |  | ||||||
| from .common import InfoExtractor | from .common import InfoExtractor | ||||||
|  | from .adobepass import AdobePassIE | ||||||
| from ..compat import ( | from ..compat import ( | ||||||
|     compat_etree_fromstring, |     compat_etree_fromstring, | ||||||
|     compat_parse_qs, |     compat_parse_qs, | ||||||
| @@ -448,7 +449,7 @@ class BrightcoveLegacyIE(InfoExtractor): | |||||||
|         return info |         return info | ||||||
|  |  | ||||||
|  |  | ||||||
| class BrightcoveNewIE(InfoExtractor): | class BrightcoveNewIE(AdobePassIE): | ||||||
|     IE_NAME = 'brightcove:new' |     IE_NAME = 'brightcove:new' | ||||||
|     _VALID_URL = r'https?://players\.brightcove\.net/(?P<account_id>\d+)/(?P<player_id>[^/]+)_(?P<embed>[^/]+)/index\.html\?.*videoId=(?P<video_id>\d+|ref:[^&]+)' |     _VALID_URL = r'https?://players\.brightcove\.net/(?P<account_id>\d+)/(?P<player_id>[^/]+)_(?P<embed>[^/]+)/index\.html\?.*videoId=(?P<video_id>\d+|ref:[^&]+)' | ||||||
|     _TESTS = [{ |     _TESTS = [{ | ||||||
| @@ -602,6 +603,20 @@ class BrightcoveNewIE(InfoExtractor): | |||||||
|                 raise ExtractorError(message, expected=True) |                 raise ExtractorError(message, expected=True) | ||||||
|             raise |             raise | ||||||
|  |  | ||||||
|  |         errors = json_data.get('errors') | ||||||
|  |         if errors and errors[0].get('error_subcode') == 'TVE_AUTH': | ||||||
|  |             custom_fields = json_data['custom_fields'] | ||||||
|  |             tve_token = self._extract_mvpd_auth( | ||||||
|  |                 smuggled_data['source_url'], video_id, | ||||||
|  |                 custom_fields['bcadobepassrequestorid'], | ||||||
|  |                 custom_fields['bcadobepassresourceid']) | ||||||
|  |             json_data = self._download_json( | ||||||
|  |                 api_url, video_id, headers={ | ||||||
|  |                     'Accept': 'application/json;pk=%s' % policy_key | ||||||
|  |                 }, query={ | ||||||
|  |                     'tveToken': tve_token, | ||||||
|  |                 }) | ||||||
|  |  | ||||||
|         title = json_data['name'].strip() |         title = json_data['name'].strip() | ||||||
|  |  | ||||||
|         formats = [] |         formats = [] | ||||||
| @@ -667,7 +682,6 @@ class BrightcoveNewIE(InfoExtractor): | |||||||
|                     }) |                     }) | ||||||
|                 formats.append(f) |                 formats.append(f) | ||||||
|  |  | ||||||
|         errors = json_data.get('errors') |  | ||||||
|         if not formats and errors: |         if not formats and errors: | ||||||
|             error = errors[0] |             error = errors[0] | ||||||
|             raise ExtractorError( |             raise ExtractorError( | ||||||
| @@ -684,7 +698,7 @@ class BrightcoveNewIE(InfoExtractor): | |||||||
|  |  | ||||||
|         is_live = False |         is_live = False | ||||||
|         duration = float_or_none(json_data.get('duration'), 1000) |         duration = float_or_none(json_data.get('duration'), 1000) | ||||||
|         if duration and duration < 0: |         if duration is not None and duration <= 0: | ||||||
|             is_live = True |             is_live = True | ||||||
|  |  | ||||||
|         return { |         return { | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ from ..utils import ( | |||||||
|     smuggle_url, |     smuggle_url, | ||||||
|     determine_ext, |     determine_ext, | ||||||
|     ExtractorError, |     ExtractorError, | ||||||
|  |     extract_attributes, | ||||||
| ) | ) | ||||||
| from .senateisvp import SenateISVPIE | from .senateisvp import SenateISVPIE | ||||||
| from .ustream import UstreamIE | from .ustream import UstreamIE | ||||||
| @@ -68,6 +69,7 @@ class CSpanIE(InfoExtractor): | |||||||
|             'uploader_id': '12987475', |             'uploader_id': '12987475', | ||||||
|         }, |         }, | ||||||
|     }] |     }] | ||||||
|  |     BRIGHTCOVE_URL_TEMPLATE = 'http://players.brightcove.net/%s/%s_%s/index.html?videoId=%s' | ||||||
|  |  | ||||||
|     def _real_extract(self, url): |     def _real_extract(self, url): | ||||||
|         video_id = self._match_id(url) |         video_id = self._match_id(url) | ||||||
| @@ -78,6 +80,19 @@ class CSpanIE(InfoExtractor): | |||||||
|         if ustream_url: |         if ustream_url: | ||||||
|             return self.url_result(ustream_url, UstreamIE.ie_key()) |             return self.url_result(ustream_url, UstreamIE.ie_key()) | ||||||
|  |  | ||||||
|  |         if '&vod' not in url: | ||||||
|  |             bc = self._search_regex( | ||||||
|  |                 r"(<[^>]+id='brightcove-player-embed'[^>]+>)", | ||||||
|  |                 webpage, 'brightcove embed', default=None) | ||||||
|  |             if bc: | ||||||
|  |                 bc_attr = extract_attributes(bc) | ||||||
|  |                 bc_url = self.BRIGHTCOVE_URL_TEMPLATE % ( | ||||||
|  |                     bc_attr.get('data-bcaccountid', '3162030207001'), | ||||||
|  |                     bc_attr.get('data-noprebcplayerid', 'SyGGpuJy3g'), | ||||||
|  |                     bc_attr.get('data-newbcplayerid', 'default'), | ||||||
|  |                     bc_attr['data-bcid']) | ||||||
|  |                 return self.url_result(smuggle_url(bc_url, {'source_url': url})) | ||||||
|  |  | ||||||
|         # We first look for clipid, because clipprog always appears before |         # We first look for clipid, because clipprog always appears before | ||||||
|         patterns = [r'id=\'clip(%s)\'\s*value=\'([0-9]+)\'' % t for t in ('id', 'prog')] |         patterns = [r'id=\'clip(%s)\'\s*value=\'([0-9]+)\'' % t for t in ('id', 'prog')] | ||||||
|         results = list(filter(None, (re.search(p, webpage) for p in patterns))) |         results = list(filter(None, (re.search(p, webpage) for p in patterns))) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Remita Amine
					Remita Amine