- @staticmethod
- def _extract_url(webpage):
- video_attributes = re.search(r'(?s)<video([^>]*)>.*?</(?:video|audio)>', webpage)
- if video_attributes:
- video_attributes = extract_attributes(video_attributes.group(), r'(?s)\s*data-(account|video-id|playlist-id|policy-key|player|embed)\s*=\s*["\']([^"\']+)["\']')
- account_id = video_attributes.get('account')
- player_id = video_attributes.get('player')
- embed = video_attributes.get('embed')
- video_id = video_attributes.get('video-id')
- if account_id and player_id and embed and video_id:
- return 'http://players.brightcove.net/%s/%s_%s/index.html?videoId=%s' % (account_id, player_id, embed, video_id)
- return None
+ def _extract_urls(self, webpage):
+ # Reference:
+ # 1. http://docs.brightcove.com/en/video-cloud/brightcove-player/guides/publish-video.html#setvideoiniframe
+ # 2. http://docs.brightcove.com/en/video-cloud/brightcove-player/guides/publish-video.html#setvideousingjavascript)
+ # 3. http://docs.brightcove.com/en/video-cloud/brightcove-player/guides/embed-in-page.html
+
+ entries = []
+
+ # Look for iframe embeds [1]
+ for _, url in re.findall(
+ r'<iframe[^>]+src=(["\'])((?:https?:)//players\.brightcove\.net/\d+/[^/]+/index\.html.+?)\1', webpage):
+ entries.append(self.url_result(self._proto_relative_url(url)))
+ # Look for embed_in_page embeds [2]
+ # According to examples from [3] it's unclear whether video id may be optional
+ # and what to do when it is
+ for video_id, account_id, player_id, embed in re.findall(
+ r'''(?sx)
+ <video[^>]+
+ data-video-id=["\'](\d+)["\'][^>]*>.*?
+ </video>.*?
+ <script[^>]+
+ src=["\'](?:https?:)?//players\.brightcove\.net/
+ (\d+)/([\da-f-]+)_([^/]+)/index\.min\.js
+ ''', webpage):
+ entries.append(self.url_result(
+ 'http://players.brightcove.net/%s/%s_%s/index.html?videoId=%s'
+ % (account_id, player_id, embed, video_id)))
+ return entries