mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 06:35:12 +00:00 
			
		
		
		
	GenericIE: Detect videos from Brightcove
Brightcove videos info is usually found in an <object class="BrightcoveExperience"></object> node, this is passed to a new method of BrightcoveIE that builds a url to extract the video.
This commit is contained in:
		| @@ -1,17 +1,44 @@ | |||||||
| import re | import re | ||||||
| import json | import json | ||||||
|  | import xml.etree.ElementTree | ||||||
|  |  | ||||||
| from .common import InfoExtractor | from .common import InfoExtractor | ||||||
|  | from ..utils import ( | ||||||
|  |     compat_urllib_parse, | ||||||
|  | ) | ||||||
|  |  | ||||||
| class BrightcoveIE(InfoExtractor): | class BrightcoveIE(InfoExtractor): | ||||||
|     _VALID_URL = r'http://.*brightcove\.com/.*\?(?P<query>.*videoPlayer=(?P<id>\d*).*)' |     _VALID_URL = r'http://.*brightcove\.com/.*\?(?P<query>.*videoPlayer=(?P<id>\d*).*)' | ||||||
|  |     _FEDERATED_URL_TEMPLATE = 'http://c.brightcove.com/services/viewer/htmlFederated?%s' | ||||||
|  |      | ||||||
|  |     # There is a test for Brigtcove in GenericIE, that way we test both the download | ||||||
|  |     # and the detection of videos, and we don't have to find an URL that is always valid | ||||||
|  |  | ||||||
|  |     @classmethod | ||||||
|  |     def _build_brighcove_url(cls, object_str): | ||||||
|  |         """ | ||||||
|  |         Build a Brightcove url from a xml string containing | ||||||
|  |         <object class="BrightcoveExperience">{params}</object> | ||||||
|  |         """ | ||||||
|  |         object_doc = xml.etree.ElementTree.fromstring(object_str) | ||||||
|  |         assert object_doc.attrib['class'] == u'BrightcoveExperience' | ||||||
|  |         params = {'flashID': object_doc.attrib['id'], | ||||||
|  |                   'playerID': object_doc.find('./param[@name="playerID"]').attrib['value'], | ||||||
|  |                   '@videoPlayer': object_doc.find('./param[@name="@videoPlayer"]').attrib['value'], | ||||||
|  |                   } | ||||||
|  |         playerKey = object_doc.find('./param[@name="playerKey"]') | ||||||
|  |         # Not all pages define this value | ||||||
|  |         if playerKey is not None: | ||||||
|  |             params['playerKey'] = playerKey.attrib['value'] | ||||||
|  |         data = compat_urllib_parse.urlencode(params) | ||||||
|  |         return cls._FEDERATED_URL_TEMPLATE % data | ||||||
|  |  | ||||||
|     def _real_extract(self, url): |     def _real_extract(self, url): | ||||||
|         mobj = re.match(self._VALID_URL, url) |         mobj = re.match(self._VALID_URL, url) | ||||||
|         query = mobj.group('query') |         query = mobj.group('query') | ||||||
|         video_id = mobj.group('id') |         video_id = mobj.group('id') | ||||||
|  |  | ||||||
|         request_url = 'http://c.brightcove.com/services/viewer/htmlFederated?%s' % query |         request_url = self._FEDERATED_URL_TEMPLATE % query | ||||||
|         webpage = self._download_webpage(request_url, video_id) |         webpage = self._download_webpage(request_url, video_id) | ||||||
|  |  | ||||||
|         self.report_extraction(video_id) |         self.report_extraction(video_id) | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | # encoding: utf-8 | ||||||
|  |  | ||||||
| import os | import os | ||||||
| import re | import re | ||||||
|  |  | ||||||
| @@ -9,20 +11,34 @@ from ..utils import ( | |||||||
|  |  | ||||||
|     ExtractorError, |     ExtractorError, | ||||||
| ) | ) | ||||||
|  | from .brightcove import BrightcoveIE | ||||||
|  |  | ||||||
| class GenericIE(InfoExtractor): | class GenericIE(InfoExtractor): | ||||||
|     IE_DESC = u'Generic downloader that works on some sites' |     IE_DESC = u'Generic downloader that works on some sites' | ||||||
|     _VALID_URL = r'.*' |     _VALID_URL = r'.*' | ||||||
|     IE_NAME = u'generic' |     IE_NAME = u'generic' | ||||||
|     _TEST = { |     _TESTS = [ | ||||||
|         u'url': u'http://www.hodiho.fr/2013/02/regis-plante-sa-jeep.html', |         { | ||||||
|         u'file': u'13601338388002.mp4', |             u'url': u'http://www.hodiho.fr/2013/02/regis-plante-sa-jeep.html', | ||||||
|         u'md5': u'85b90ccc9d73b4acd9138d3af4c27f89', |             u'file': u'13601338388002.mp4', | ||||||
|         u'info_dict': { |             u'md5': u'85b90ccc9d73b4acd9138d3af4c27f89', | ||||||
|             u"uploader": u"www.hodiho.fr",  |             u'info_dict': { | ||||||
|             u"title": u"R\u00e9gis plante sa Jeep" |                 u"uploader": u"www.hodiho.fr",  | ||||||
|         } |                 u"title": u"R\u00e9gis plante sa Jeep" | ||||||
|     } |             } | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             u'url': u'http://www.8tv.cat/8aldia/videos/xavier-sala-i-martin-aquesta-tarda-a-8-al-dia/', | ||||||
|  |             u'file': u'2371591881001.mp4', | ||||||
|  |             u'md5': u'9e80619e0a94663f0bdc849b4566af19', | ||||||
|  |             u'note': u'Test Brightcove downloads and detection in GenericIE', | ||||||
|  |             u'info_dict': { | ||||||
|  |                 u'title': u'Xavier Sala i Martín: “Un banc que no presta és un banc zombi que no serveix per a res”', | ||||||
|  |                 u'uploader': u'8TV', | ||||||
|  |                 u'description': u'md5:a950cc4285c43e44d763d036710cd9cd', | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |     ] | ||||||
|  |  | ||||||
|     def report_download_webpage(self, video_id): |     def report_download_webpage(self, video_id): | ||||||
|         """Report webpage download.""" |         """Report webpage download.""" | ||||||
| @@ -103,6 +119,13 @@ class GenericIE(InfoExtractor): | |||||||
|             raise ExtractorError(u'Invalid URL: %s' % url) |             raise ExtractorError(u'Invalid URL: %s' % url) | ||||||
|  |  | ||||||
|         self.report_extraction(video_id) |         self.report_extraction(video_id) | ||||||
|  |         # Look for BrigthCove: | ||||||
|  |         m_brightcove = re.search(r'<object.+?class="BrightcoveExperience".+?</object>', webpage, re.DOTALL) | ||||||
|  |         if m_brightcove is not None: | ||||||
|  |             self.to_screen(u'Brightcove video detected.') | ||||||
|  |             bc_url = BrightcoveIE._build_brighcove_url(m_brightcove.group()) | ||||||
|  |             return self.url_result(bc_url, 'Brightcove') | ||||||
|  |  | ||||||
|         # Start with something easy: JW Player in SWFObject |         # Start with something easy: JW Player in SWFObject | ||||||
|         mobj = re.search(r'flashvars: [\'"](?:.*&)?file=(http[^\'"&]*)', webpage) |         mobj = re.search(r'flashvars: [\'"](?:.*&)?file=(http[^\'"&]*)', webpage) | ||||||
|         if mobj is None: |         if mobj is None: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jaime Marquínez Ferrándiz
					Jaime Marquínez Ferrándiz