mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00:00 
			
		
		
		
	[brightcove] some improvements and fixes
- use FFmpeg downloader to download m3u8 formats extracted from BrightcoveNew(some of the m3u8 media playlists use AES-128) - update comment and update_url_query to handle url query
This commit is contained in:
		| @@ -24,16 +24,16 @@ from ..utils import ( | |||||||
|     js_to_json, |     js_to_json, | ||||||
|     int_or_none, |     int_or_none, | ||||||
|     parse_iso8601, |     parse_iso8601, | ||||||
|     sanitized_Request, |  | ||||||
|     unescapeHTML, |     unescapeHTML, | ||||||
|     unsmuggle_url, |     unsmuggle_url, | ||||||
|  |     update_url_query, | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  |  | ||||||
| class BrightcoveLegacyIE(InfoExtractor): | class BrightcoveLegacyIE(InfoExtractor): | ||||||
|     IE_NAME = 'brightcove:legacy' |     IE_NAME = 'brightcove:legacy' | ||||||
|     _VALID_URL = r'(?:https?://.*brightcove\.com/(services|viewer).*?\?|brightcove:)(?P<query>.*)' |     _VALID_URL = r'(?:https?://.*brightcove\.com/(services|viewer).*?\?|brightcove:)(?P<query>.*)' | ||||||
|     _FEDERATED_URL_TEMPLATE = 'http://c.brightcove.com/services/viewer/htmlFederated?%s' |     _FEDERATED_URL = 'http://c.brightcove.com/services/viewer/htmlFederated' | ||||||
|  |  | ||||||
|     _TESTS = [ |     _TESTS = [ | ||||||
|         { |         { | ||||||
| @@ -156,7 +156,7 @@ class BrightcoveLegacyIE(InfoExtractor): | |||||||
|         # Not all pages define this value |         # Not all pages define this value | ||||||
|         if playerKey is not None: |         if playerKey is not None: | ||||||
|             params['playerKey'] = playerKey |             params['playerKey'] = playerKey | ||||||
|         # The three fields hold the id of the video |         # These fields hold the id of the video | ||||||
|         videoPlayer = find_param('@videoPlayer') or find_param('videoId') or find_param('videoID') or find_param('@videoList') |         videoPlayer = find_param('@videoPlayer') or find_param('videoId') or find_param('videoID') or find_param('@videoList') | ||||||
|         if videoPlayer is not None: |         if videoPlayer is not None: | ||||||
|             params['@videoPlayer'] = videoPlayer |             params['@videoPlayer'] = videoPlayer | ||||||
| @@ -185,8 +185,7 @@ class BrightcoveLegacyIE(InfoExtractor): | |||||||
|  |  | ||||||
|     @classmethod |     @classmethod | ||||||
|     def _make_brightcove_url(cls, params): |     def _make_brightcove_url(cls, params): | ||||||
|         data = compat_urllib_parse.urlencode(params) |         return update_url_query(cls._FEDERATED_URL, params) | ||||||
|         return cls._FEDERATED_URL_TEMPLATE % data |  | ||||||
|  |  | ||||||
|     @classmethod |     @classmethod | ||||||
|     def _extract_brightcove_url(cls, webpage): |     def _extract_brightcove_url(cls, webpage): | ||||||
| @@ -240,7 +239,7 @@ class BrightcoveLegacyIE(InfoExtractor): | |||||||
|             # We set the original url as the default 'Referer' header |             # We set the original url as the default 'Referer' header | ||||||
|             referer = smuggled_data.get('Referer', url) |             referer = smuggled_data.get('Referer', url) | ||||||
|             return self._get_video_info( |             return self._get_video_info( | ||||||
|                 videoPlayer[0], query_str, query, referer=referer) |                 videoPlayer[0], query, referer=referer) | ||||||
|         elif 'playerKey' in query: |         elif 'playerKey' in query: | ||||||
|             player_key = query['playerKey'] |             player_key = query['playerKey'] | ||||||
|             return self._get_playlist_info(player_key[0]) |             return self._get_playlist_info(player_key[0]) | ||||||
| @@ -249,15 +248,14 @@ class BrightcoveLegacyIE(InfoExtractor): | |||||||
|                 'Cannot find playerKey= variable. Did you forget quotes in a shell invocation?', |                 'Cannot find playerKey= variable. Did you forget quotes in a shell invocation?', | ||||||
|                 expected=True) |                 expected=True) | ||||||
|  |  | ||||||
|     def _get_video_info(self, video_id, query_str, query, referer=None): |     def _get_video_info(self, video_id, query, referer=None): | ||||||
|         request_url = self._FEDERATED_URL_TEMPLATE % query_str |         headers = {} | ||||||
|         req = sanitized_Request(request_url) |  | ||||||
|         linkBase = query.get('linkBaseURL') |         linkBase = query.get('linkBaseURL') | ||||||
|         if linkBase is not None: |         if linkBase is not None: | ||||||
|             referer = linkBase[0] |             referer = linkBase[0] | ||||||
|         if referer is not None: |         if referer is not None: | ||||||
|             req.add_header('Referer', referer) |             headers['Referer'] = referer | ||||||
|         webpage = self._download_webpage(req, video_id) |         webpage = self._download_webpage(self._FEDERATED_URL, video_id, headers=headers, query=query) | ||||||
|  |  | ||||||
|         error_msg = self._html_search_regex( |         error_msg = self._html_search_regex( | ||||||
|             r"<h1>We're sorry.</h1>([\s\n]*<p>.*?</p>)+", webpage, |             r"<h1>We're sorry.</h1>([\s\n]*<p>.*?</p>)+", webpage, | ||||||
| @@ -459,12 +457,11 @@ class BrightcoveNewIE(InfoExtractor): | |||||||
|                 r'policyKey\s*:\s*(["\'])(?P<pk>.+?)\1', |                 r'policyKey\s*:\s*(["\'])(?P<pk>.+?)\1', | ||||||
|                 webpage, 'policy key', group='pk') |                 webpage, 'policy key', group='pk') | ||||||
|  |  | ||||||
|         req = sanitized_Request( |         api_url = 'https://edge.api.brightcove.com/playback/v1/accounts/%s/videos/%s' % (account_id, video_id) | ||||||
|             'https://edge.api.brightcove.com/playback/v1/accounts/%s/videos/%s' |  | ||||||
|             % (account_id, video_id), |  | ||||||
|             headers={'Accept': 'application/json;pk=%s' % policy_key}) |  | ||||||
|         try: |         try: | ||||||
|             json_data = self._download_json(req, video_id) |             json_data = self._download_json(api_url, video_id, headers={ | ||||||
|  |                 'Accept': 'application/json;pk=%s' % policy_key | ||||||
|  |             }) | ||||||
|         except ExtractorError as e: |         except ExtractorError as e: | ||||||
|             if isinstance(e.cause, compat_HTTPError) and e.cause.code == 403: |             if isinstance(e.cause, compat_HTTPError) and e.cause.code == 403: | ||||||
|                 json_data = self._parse_json(e.cause.read().decode(), video_id) |                 json_data = self._parse_json(e.cause.read().decode(), video_id) | ||||||
| @@ -482,8 +479,7 @@ class BrightcoveNewIE(InfoExtractor): | |||||||
|                 if not src: |                 if not src: | ||||||
|                     continue |                     continue | ||||||
|                 formats.extend(self._extract_m3u8_formats( |                 formats.extend(self._extract_m3u8_formats( | ||||||
|                     src, video_id, 'mp4', entry_protocol='m3u8_native', |                     src, video_id, 'mp4', m3u8_id='hls', fatal=False)) | ||||||
|                     m3u8_id='hls', fatal=False)) |  | ||||||
|             elif source_type == 'application/dash+xml': |             elif source_type == 'application/dash+xml': | ||||||
|                 if not src: |                 if not src: | ||||||
|                     continue |                     continue | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 remitamine
					remitamine