diff options
| -rw-r--r-- | test/test_playlists.py | 11 | ||||
| -rw-r--r-- | youtube_dl/extractor/brightcove.py | 19 | ||||
| -rw-r--r-- | youtube_dl/extractor/generic.py | 18 | 
3 files changed, 36 insertions, 12 deletions
diff --git a/test/test_playlists.py b/test/test_playlists.py index b3ce6f71e..fda2e0112 100644 --- a/test/test_playlists.py +++ b/test/test_playlists.py @@ -34,6 +34,7 @@ from youtube_dl.extractor import (      KhanAcademyIE,      EveryonesMixtapeIE,      RutubeChannelIE, +    GenericIE,  ) @@ -229,6 +230,16 @@ class TestPlaylists(unittest.TestCase):          self.assertEqual(result['id'], '1409')          self.assertTrue(len(result['entries']) >= 34) +    def test_multiple_brightcove_videos(self): +        # https://github.com/rg3/youtube-dl/issues/2283 +        dl = FakeYDL() +        ie = GenericIE(dl) +        result = ie.extract('http://www.newyorker.com/online/blogs/newsdesk/2014/01/always-never-nuclear-command-and-control.html') +        self.assertIsPlaylist(result) +        self.assertEqual(result['id'], 'always-never-nuclear-command-and-control') +        self.assertEqual(result['title'], 'Always/Never: A Little-Seen Movie About Nuclear Command and Control : The New Yorker') +        self.assertEqual(len(result['entries']), 3) +  if __name__ == '__main__':      unittest.main() diff --git a/youtube_dl/extractor/brightcove.py b/youtube_dl/extractor/brightcove.py index 9ccf923a6..031fe385d 100644 --- a/youtube_dl/extractor/brightcove.py +++ b/youtube_dl/extractor/brightcove.py @@ -127,25 +127,28 @@ class BrightcoveIE(InfoExtractor):      @classmethod      def _extract_brightcove_url(cls, webpage): -        """Try to extract the brightcove url from the wepbage, returns None +        """Try to extract the brightcove url from the webpage, returns None          if it can't be found          """ +        urls = cls._extract_brightcove_urls(webpage) +        return urls[0] if urls else None + +    @classmethod +    def _extract_brightcove_urls(cls, webpage): +        """Return a list of all Brightcove URLs from the webpage """          url_m = re.search(r'<meta\s+property="og:video"\s+content="(http://c.brightcove.com/[^"]+)"', webpage)          if url_m: -            return url_m.group(1) +            return [url_m.group(1)] -        m_brightcove = re.search( +        matches = re.findall(              r'''(?sx)<object              (?: -                [^>]+?class=([\'"])[^>]*?BrightcoveExperience.*?\1 | +                [^>]+?class=[\'"][^>]*?BrightcoveExperience.*?[\'"] |                  [^>]*?>\s*<param\s+name="movie"\s+value="https?://[^/]*brightcove\.com/              ).+?</object>''',              webpage) -        if m_brightcove is not None: -            return cls._build_brighcove_url(m_brightcove.group()) -        else: -            return None +        return [cls._build_brighcove_url(m) for m in matches]      def _real_extract(self, url):          url, smuggled_data = unsmuggle_url(url, {}) diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index 082da9c77..5bcc78bf7 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -234,11 +234,21 @@ class GenericIE(InfoExtractor):              r'^(?:https?://)?([^/]*)/.*', url, 'video uploader')          # Look for BrightCove: -        bc_url = BrightcoveIE._extract_brightcove_url(webpage) -        if bc_url is not None: +        bc_urls = BrightcoveIE._extract_brightcove_urls(webpage) +        if bc_urls:              self.to_screen('Brightcove video detected.') -            surl = smuggle_url(bc_url, {'Referer': url}) -            return self.url_result(surl, 'Brightcove') +            entries = [{ +                '_type': 'url', +                'url': smuggle_url(bc_url, {'Referer': url}), +                'ie_key': 'Brightcove' +            } for bc_url in bc_urls] + +            return { +                '_type': 'playlist', +                'title': video_title, +                'id': video_id, +                'entries': entries, +            }          # Look for embedded (iframe) Vimeo player          mobj = re.search(  | 
