mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00:00 
			
		
		
		
	[youtube:playlist] Recognize ‘top tracks’ urls (closes #2332)
The list parameter starts with ‘MC’ and can have more characters after it, including dots
This commit is contained in:
		| @@ -37,6 +37,8 @@ class TestAllURLsMatching(unittest.TestCase): | |||||||
|         assertPlaylist(u'https://www.youtube.com/playlist?list=PLwP_SiAcdui0KVebT0mU9Apz359a4ubsC') |         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 |         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')) |         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): |     def test_youtube_matching(self): | ||||||
|         self.assertTrue(YoutubeIE.suitable(u'PLtS2H6bU1M')) |         self.assertTrue(YoutubeIE.suitable(u'PLtS2H6bU1M')) | ||||||
|   | |||||||
| @@ -117,6 +117,13 @@ class TestYoutubeLists(unittest.TestCase): | |||||||
|         original_video = entries[0] |         original_video = entries[0] | ||||||
|         self.assertEqual(original_video['id'], 'rjFaenf1T-Y') |         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): |     def test_youtube_toplist(self): | ||||||
|         dl = FakeYDL() |         dl = FakeYDL() | ||||||
|         ie = YoutubeTopListIE(dl) |         ie = YoutubeTopListIE(dl) | ||||||
|   | |||||||
| @@ -1422,7 +1422,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): | |||||||
|  |  | ||||||
| class YoutubePlaylistIE(YoutubeBaseInfoExtractor): | class YoutubePlaylistIE(YoutubeBaseInfoExtractor): | ||||||
|     IE_DESC = u'YouTube.com playlists' |     IE_DESC = u'YouTube.com playlists' | ||||||
|     _VALID_URL = r"""(?: |     _VALID_URL = r"""(?x)(?: | ||||||
|                         (?:https?://)? |                         (?:https?://)? | ||||||
|                         (?:\w+\.)? |                         (?:\w+\.)? | ||||||
|                         youtube\.com/ |                         youtube\.com/ | ||||||
| @@ -1431,7 +1431,11 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor): | |||||||
|                            \? (?:.*?&)*? (?:p|a|list)= |                            \? (?:.*?&)*? (?:p|a|list)= | ||||||
|                         |  p/ |                         |  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,}) |                         ((?: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+)' |     _VIDEO_RE = r'href="/watch\?v=(?P<id>[0-9A-Za-z_-]{11})&[^"]*?index=(?P<index>\d+)' | ||||||
|     IE_NAME = u'youtube:playlist' |     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): |     def _real_initialize(self): | ||||||
|         self._login() |         self._login() | ||||||
|  |  | ||||||
| @@ -1469,7 +1468,7 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor): | |||||||
|  |  | ||||||
|     def _real_extract(self, url): |     def _real_extract(self, url): | ||||||
|         # Extract playlist id |         # Extract playlist id | ||||||
|         mobj = re.match(self._VALID_URL, url, re.VERBOSE) |         mobj = re.match(self._VALID_URL, url) | ||||||
|         if mobj is None: |         if mobj is None: | ||||||
|             raise ExtractorError(u'Invalid URL: %s' % url) |             raise ExtractorError(u'Invalid URL: %s' % url) | ||||||
|         playlist_id = mobj.group(1) or mobj.group(2) |         playlist_id = mobj.group(1) or mobj.group(2) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jaime Marquínez Ferrándiz
					Jaime Marquínez Ferrándiz