mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00:00 
			
		
		
		
	[dailymotion] Add an extractor for Dailymotion playlists
This commit is contained in:
		
							
								
								
									
										30
									
								
								test/test_playlists.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								test/test_playlists.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  |  | ||||||
|  | import sys | ||||||
|  | import unittest | ||||||
|  | import json | ||||||
|  |  | ||||||
|  | # Allow direct execution | ||||||
|  | import os | ||||||
|  | sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | ||||||
|  |  | ||||||
|  | from youtube_dl.extractor import DailymotionPlaylistIE | ||||||
|  | from youtube_dl.utils import * | ||||||
|  |  | ||||||
|  | from helper import FakeYDL | ||||||
|  |  | ||||||
|  | class TestPlaylists(unittest.TestCase): | ||||||
|  |     def assertIsPlaylist(self, info): | ||||||
|  |         """Make sure the info has '_type' set to 'playlist'""" | ||||||
|  |         self.assertEqual(info['_type'], 'playlist') | ||||||
|  |  | ||||||
|  |     def test_dailymotion_playlist(self): | ||||||
|  |         dl = FakeYDL() | ||||||
|  |         ie = DailymotionPlaylistIE(dl) | ||||||
|  |         result = ie.extract('http://www.dailymotion.com/playlist/xv4bw_nqtv_sport/1#video=xl8v3q') | ||||||
|  |         self.assertIsPlaylist(result) | ||||||
|  |         self.assertEqual(result['title'], u'SPORT') | ||||||
|  |         self.assertTrue(len(result['entries']) > 20) | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     unittest.main() | ||||||
| @@ -12,7 +12,7 @@ from .comedycentral import ComedyCentralIE | |||||||
| from .condenast import CondeNastIE | from .condenast import CondeNastIE | ||||||
| from .criterion import CriterionIE | from .criterion import CriterionIE | ||||||
| from .cspan import CSpanIE | from .cspan import CSpanIE | ||||||
| from .dailymotion import DailymotionIE | from .dailymotion import DailymotionIE, DailymotionPlaylistIE | ||||||
| from .depositfiles import DepositFilesIE | from .depositfiles import DepositFilesIE | ||||||
| from .dotsub import DotsubIE | from .dotsub import DotsubIE | ||||||
| from .dreisat import DreiSatIE | from .dreisat import DreiSatIE | ||||||
|   | |||||||
| @@ -1,9 +1,12 @@ | |||||||
| import re | import re | ||||||
| import json | import json | ||||||
|  | import itertools | ||||||
|  |  | ||||||
| from .common import InfoExtractor | from .common import InfoExtractor | ||||||
| from ..utils import ( | from ..utils import ( | ||||||
|     compat_urllib_request, |     compat_urllib_request, | ||||||
|  |     get_element_by_attribute, | ||||||
|  |     get_element_by_id, | ||||||
|  |  | ||||||
|     ExtractorError, |     ExtractorError, | ||||||
| ) | ) | ||||||
| @@ -77,3 +80,31 @@ class DailymotionIE(InfoExtractor): | |||||||
|             'ext':      video_extension, |             'ext':      video_extension, | ||||||
|             'thumbnail': info['thumbnail_url'] |             'thumbnail': info['thumbnail_url'] | ||||||
|         }] |         }] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class DailymotionPlaylistIE(InfoExtractor): | ||||||
|  |     _VALID_URL = r'(?:https?://)?(?:www\.)?dailymotion\.[a-z]{2,3}/playlist/(?P<id>.+?)/' | ||||||
|  |     _MORE_PAGES_INDICATOR = r'<div class="next">.*?<a.*?href="/playlist/.+?".*?>.*?</a>.*?</div>' | ||||||
|  |  | ||||||
|  |     def _real_extract(self, url): | ||||||
|  |         mobj = re.match(self._VALID_URL, url) | ||||||
|  |         playlist_id =  mobj.group('id') | ||||||
|  |         video_ids = [] | ||||||
|  |  | ||||||
|  |         for pagenum in itertools.count(1): | ||||||
|  |             webpage = self._download_webpage('https://www.dailymotion.com/playlist/%s/%s' % (playlist_id, pagenum), | ||||||
|  |                                              playlist_id, u'Downloading page %s' % pagenum) | ||||||
|  |  | ||||||
|  |             playlist_el = get_element_by_attribute(u'class', u'video_list', webpage) | ||||||
|  |             video_ids.extend(re.findall(r'data-id="(.+?)" data-ext-id', playlist_el)) | ||||||
|  |  | ||||||
|  |             if re.search(self._MORE_PAGES_INDICATOR, webpage, re.DOTALL) is None: | ||||||
|  |                 break | ||||||
|  |  | ||||||
|  |         entries = [self.url_result('http://www.dailymotion.com/video/%s' % video_id, 'Dailymotion') | ||||||
|  |                    for video_id in video_ids] | ||||||
|  |         return {'_type': 'playlist', | ||||||
|  |                 'id': playlist_id, | ||||||
|  |                 'title': get_element_by_id(u'playlist_name', webpage), | ||||||
|  |                 'entries': entries, | ||||||
|  |                 } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Jaime Marquínez Ferrándiz
					Jaime Marquínez Ferrándiz