mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 06:35:12 +00:00 
			
		
		
		
	[youtube:playlist] Add support for YouTube mixes (fixes #1839)
This commit is contained in:
		| @@ -107,5 +107,14 @@ class TestYoutubeLists(unittest.TestCase): | |||||||
|         result = ie.extract('http://www.youtube.com/show/airdisasters') |         result = ie.extract('http://www.youtube.com/show/airdisasters') | ||||||
|         self.assertTrue(len(result) >= 3) |         self.assertTrue(len(result) >= 3) | ||||||
|  |  | ||||||
|  |     def test_youtube_mix(self): | ||||||
|  |         dl = FakeYDL() | ||||||
|  |         ie = YoutubePlaylistIE(dl) | ||||||
|  |         result = ie.extract('http://www.youtube.com/watch?v=lLJf9qJHR3E&list=RDrjFaenf1T-Y') | ||||||
|  |         entries = result['entries'] | ||||||
|  |         self.assertTrue(len(entries) >= 20) | ||||||
|  |         original_video = entries[0] | ||||||
|  |         self.assertEqual(original_video['id'], 'rjFaenf1T-Y') | ||||||
|  |  | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|     unittest.main() |     unittest.main() | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ from ..utils import ( | |||||||
|     clean_html, |     clean_html, | ||||||
|     get_cachedir, |     get_cachedir, | ||||||
|     get_element_by_id, |     get_element_by_id, | ||||||
|  |     get_element_by_attribute, | ||||||
|     ExtractorError, |     ExtractorError, | ||||||
|     unescapeHTML, |     unescapeHTML, | ||||||
|     unified_strdate, |     unified_strdate, | ||||||
| @@ -1537,6 +1538,22 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor): | |||||||
|     def _real_initialize(self): |     def _real_initialize(self): | ||||||
|         self._login() |         self._login() | ||||||
|  |  | ||||||
|  |     def _ids_to_results(self, ids): | ||||||
|  |         return [self.url_result(vid_id, 'Youtube', video_id=vid_id) | ||||||
|  |                        for vid_id in ids] | ||||||
|  |  | ||||||
|  |     def _extract_mix(self, playlist_id): | ||||||
|  |         # The mixes are generated from a a single video | ||||||
|  |         # the id of the playlist is just 'RD' + video_id | ||||||
|  |         url = 'https://youtube.com/watch?v=%s&list=%s' % (playlist_id[2:], playlist_id) | ||||||
|  |         webpage = self._download_webpage(url, playlist_id, u'Downloading Youtube mix') | ||||||
|  |         title = clean_html(get_element_by_attribute('class', 'title long-title', webpage)) | ||||||
|  |         video_re = r'data-index="\d+".*?href="/watch\?v=([0-9A-Za-z_-]{11})&[^"]*?list=%s' % re.escape(playlist_id) | ||||||
|  |         ids = orderedSet(re.findall(video_re, webpage)) | ||||||
|  |         url_results = self._ids_to_results(ids) | ||||||
|  |  | ||||||
|  |         return self.playlist_result(url_results, playlist_id, title) | ||||||
|  |  | ||||||
|     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, re.VERBOSE) | ||||||
| @@ -1554,6 +1571,10 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor): | |||||||
|             else: |             else: | ||||||
|                 self.to_screen(u'Downloading playlist PL%s - add --no-playlist to just download video %s' % (playlist_id, video_id)) |                 self.to_screen(u'Downloading playlist PL%s - add --no-playlist to just download video %s' % (playlist_id, video_id)) | ||||||
|  |  | ||||||
|  |         if len(playlist_id) == 13:  # 'RD' + 11 characters for the video id | ||||||
|  |             # Mixes require a custom extraction process | ||||||
|  |             return self._extract_mix(playlist_id) | ||||||
|  |  | ||||||
|         # Extract the video ids from the playlist pages |         # Extract the video ids from the playlist pages | ||||||
|         ids = [] |         ids = [] | ||||||
|  |  | ||||||
| @@ -1571,8 +1592,7 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor): | |||||||
|  |  | ||||||
|         playlist_title = self._og_search_title(page) |         playlist_title = self._og_search_title(page) | ||||||
|  |  | ||||||
|         url_results = [self.url_result(vid_id, 'Youtube', video_id=vid_id) |         url_results = self._ids_to_results(ids) | ||||||
|                        for vid_id in ids] |  | ||||||
|         return self.playlist_result(url_results, playlist_id, playlist_title) |         return self.playlist_result(url_results, playlist_id, playlist_title) | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jaime Marquínez Ferrándiz
					Jaime Marquínez Ferrándiz