diff options
| author | Sergey M․ <dstftw@gmail.com> | 2015-11-14 05:51:05 +0600 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2015-11-14 05:51:05 +0600 | 
| commit | 536f819eda975224666374a9ce83cc3472f5aa5a (patch) | |
| tree | 4cb62be08d6f0157774a5c36f5b89af4f3ef455d | |
| parent | a662489877aa8d88b898a4984c2e580b9edbe7de (diff) | |
[brightcove] Imrove extraction of new embeds
| -rw-r--r-- | youtube_dl/extractor/brightcove.py | 42 | 
1 files changed, 29 insertions, 13 deletions
diff --git a/youtube_dl/extractor/brightcove.py b/youtube_dl/extractor/brightcove.py index 2ad35ec90..d494b8b67 100644 --- a/youtube_dl/extractor/brightcove.py +++ b/youtube_dl/extractor/brightcove.py @@ -354,7 +354,7 @@ class BrightcoveIE(InfoExtractor):  class BrightcoveInPageEmbedIE(InfoExtractor): -    _VALID_URL = r'https?://players\.brightcove\.net/(?P<account_id>\d+)/(?P<player_id>[\da-f-]+)_(?P<embed>[a-z]+)/index\.html\?.*videoId=(?P<video_id>\d+)' +    _VALID_URL = r'https?://players\.brightcove\.net/(?P<account_id>\d+)/(?P<player_id>[^/]+)_(?P<embed>[^/]+)/index\.html\?.*videoId=(?P<video_id>\d+)'      _TEST = {          'url': 'http://players.brightcove.net/929656772001/e41d32dc-ec74-459e-a845-6c69f7b724ea_default/index.html?videoId=4463358922001',          'md5': 'c8100925723840d4b0d243f7025703be', @@ -370,18 +370,34 @@ class BrightcoveInPageEmbedIE(InfoExtractor):          }      } -    @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      def _real_extract(self, url):          account_id, player_id, embed, video_id = re.match(self._VALID_URL, url).groups()  | 
