diff options
| -rw-r--r-- | test/test_all_urls.py | 2 | ||||
| -rw-r--r-- | test/test_youtube_lists.py | 7 | ||||
| -rw-r--r-- | youtube_dl/extractor/youtube.py | 15 | 
3 files changed, 16 insertions, 8 deletions
diff --git a/test/test_all_urls.py b/test/test_all_urls.py index 94cbce6e8..dcce9ddb8 100644 --- a/test/test_all_urls.py +++ b/test/test_all_urls.py @@ -37,6 +37,8 @@ class TestAllURLsMatching(unittest.TestCase):          assertPlaylist(u'https://www.youtube.com/playlist?list=PLwP_SiAcdui0KVebT0mU9Apz359a4ubsC')          assertPlaylist(u'https://www.youtube.com/watch?v=AV6J6_AeFEQ&playnext=1&list=PL4023E734DA416012') #668          self.assertFalse('youtube:playlist' in self.matching_ies(u'PLtS2H6bU1M')) +        # Top tracks +        assertPlaylist('https://www.youtube.com/playlist?list=MCUS.20142101')      def test_youtube_matching(self):          self.assertTrue(YoutubeIE.suitable(u'PLtS2H6bU1M')) diff --git a/test/test_youtube_lists.py b/test/test_youtube_lists.py index de157f657..c9632ddf6 100644 --- a/test/test_youtube_lists.py +++ b/test/test_youtube_lists.py @@ -117,6 +117,13 @@ class TestYoutubeLists(unittest.TestCase):          original_video = entries[0]          self.assertEqual(original_video['id'], 'rjFaenf1T-Y') +    def test_youtube_toptracks(self): +        dl = FakeYDL() +        ie = YoutubePlaylistIE(dl) +        result = ie.extract('https://www.youtube.com/playlist?list=MCUS') +        entries = result['entries'] +        self.assertEqual(len(entries), 100) +      def test_youtube_toplist(self):          dl = FakeYDL()          ie = YoutubeTopListIE(dl) diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py index 5dd2de5ee..765c690f1 100644 --- a/youtube_dl/extractor/youtube.py +++ b/youtube_dl/extractor/youtube.py @@ -1422,7 +1422,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor):  class YoutubePlaylistIE(YoutubeBaseInfoExtractor):      IE_DESC = u'YouTube.com playlists' -    _VALID_URL = r"""(?: +    _VALID_URL = r"""(?x)(?:                          (?:https?://)?                          (?:\w+\.)?                          youtube\.com/ @@ -1431,7 +1431,11 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor):                             \? (?:.*?&)*? (?:p|a|list)=                          |  p/                          ) -                        ((?:PL|EC|UU|FL|RD)?[0-9A-Za-z-_]{10,}) +                        ( +                            (?:PL|EC|UU|FL|RD)?[0-9A-Za-z-_]{10,} +                            # Top tracks, they can also include dots  +                            |(?:MC)[\w\.]* +                        )                          .*                       |                          ((?:PL|EC|UU|FL|RD)[0-9A-Za-z-_]{10,}) @@ -1441,11 +1445,6 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor):      _VIDEO_RE = r'href="/watch\?v=(?P<id>[0-9A-Za-z_-]{11})&[^"]*?index=(?P<index>\d+)'      IE_NAME = u'youtube:playlist' -    @classmethod -    def suitable(cls, url): -        """Receives a URL and returns True if suitable for this IE.""" -        return re.match(cls._VALID_URL, url, re.VERBOSE) is not None -      def _real_initialize(self):          self._login() @@ -1469,7 +1468,7 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor):      def _real_extract(self, url):          # Extract playlist id -        mobj = re.match(self._VALID_URL, url, re.VERBOSE) +        mobj = re.match(self._VALID_URL, url)          if mobj is None:              raise ExtractorError(u'Invalid URL: %s' % url)          playlist_id = mobj.group(1) or mobj.group(2)  | 
