| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | # coding: utf-8 | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-23 20:09:47 +02:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2013-07-05 14:15:26 +02:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2013-07-29 12:07:38 +02:00
										 |  |  | import itertools | 
					
						
							| 
									
										
										
										
											2013-06-23 20:09:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2013-08-07 18:59:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-13 12:24:42 +01:00
										 |  |  | from ..compat import ( | 
					
						
							| 
									
										
										
										
											2013-08-07 18:59:11 +02:00
										 |  |  |     compat_str, | 
					
						
							| 
									
										
										
										
											2014-12-13 12:24:42 +01:00
										 |  |  |     compat_urllib_request, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | from ..utils import ( | 
					
						
							|  |  |  |     ExtractorError, | 
					
						
							|  |  |  |     int_or_none, | 
					
						
							| 
									
										
										
										
											2013-10-04 14:07:29 +02:00
										 |  |  |     orderedSet, | 
					
						
							| 
									
										
										
										
											2013-12-06 13:36:36 +01:00
										 |  |  |     str_to_int, | 
					
						
							| 
									
										
										
										
											2014-04-23 19:42:34 +07:00
										 |  |  |     unescapeHTML, | 
					
						
							| 
									
										
										
										
											2013-06-23 20:09:47 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-29 12:44:02 +02:00
										 |  |  | class DailymotionBaseInfoExtractor(InfoExtractor): | 
					
						
							|  |  |  |     @staticmethod | 
					
						
							|  |  |  |     def _build_request(url): | 
					
						
							|  |  |  |         """Build a request with the family filter disabled""" | 
					
						
							|  |  |  |         request = compat_urllib_request.Request(url) | 
					
						
							| 
									
										
										
										
											2015-03-31 20:55:21 +06:00
										 |  |  |         request.add_header('Cookie', 'family_filter=off; ff=off') | 
					
						
							| 
									
										
										
										
											2013-09-29 12:44:02 +02:00
										 |  |  |         return request | 
					
						
							| 
									
										
										
										
											2013-08-07 18:59:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 21:28:06 +01:00
										 |  |  | class DailymotionIE(DailymotionBaseInfoExtractor): | 
					
						
							| 
									
										
										
										
											2013-06-23 20:09:47 +02:00
										 |  |  |     """Information Extractor for Dailymotion""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-14 14:20:12 +01:00
										 |  |  |     _VALID_URL = r'(?i)(?:https?://)?(?:(www|touch)\.)?dailymotion\.[a-z]{2,3}/(?:(embed|#)/)?video/(?P<id>[^/?_]+)' | 
					
						
							| 
									
										
										
										
											2014-08-27 19:20:20 +02:00
										 |  |  |     IE_NAME = 'dailymotion' | 
					
						
							| 
									
										
										
										
											2013-10-23 17:33:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     _FORMATS = [ | 
					
						
							| 
									
										
										
										
											2014-08-27 19:20:20 +02:00
										 |  |  |         ('stream_h264_ld_url', 'ld'), | 
					
						
							|  |  |  |         ('stream_h264_url', 'standard'), | 
					
						
							|  |  |  |         ('stream_h264_hq_url', 'hq'), | 
					
						
							|  |  |  |         ('stream_h264_hd_url', 'hd'), | 
					
						
							|  |  |  |         ('stream_h264_hd1080_url', 'hd180'), | 
					
						
							| 
									
										
										
										
											2013-10-23 17:33:38 +02:00
										 |  |  |     ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-01 15:05:41 +02:00
										 |  |  |     _TESTS = [ | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2015-03-06 22:45:05 +01:00
										 |  |  |             'url': 'https://www.dailymotion.com/video/x2iuewm_steam-machine-models-pricing-listed-on-steam-store-ign-news_videogames', | 
					
						
							|  |  |  |             'md5': '2137c41a8e78554bb09225b8eb322406', | 
					
						
							| 
									
										
										
										
											2014-08-27 19:20:20 +02:00
										 |  |  |             'info_dict': { | 
					
						
							| 
									
										
										
										
											2015-03-06 22:45:05 +01:00
										 |  |  |                 'id': 'x2iuewm', | 
					
						
							| 
									
										
										
										
											2014-08-27 19:20:20 +02:00
										 |  |  |                 'ext': 'mp4', | 
					
						
							| 
									
										
										
										
											2015-03-06 22:45:05 +01:00
										 |  |  |                 'uploader': 'IGN', | 
					
						
							|  |  |  |                 'title': 'Steam Machine Models, Pricing Listed on Steam Store - IGN News', | 
					
						
							| 
									
										
										
										
											2015-05-10 15:27:55 +08:00
										 |  |  |                 'upload_date': '20150306', | 
					
						
							| 
									
										
										
										
											2013-10-01 15:05:41 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         # Vevo video | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2014-08-27 19:20:20 +02:00
										 |  |  |             'url': 'http://www.dailymotion.com/video/x149uew_katy-perry-roar-official_musi', | 
					
						
							|  |  |  |             'info_dict': { | 
					
						
							|  |  |  |                 'title': 'Roar (Official)', | 
					
						
							|  |  |  |                 'id': 'USUV71301934', | 
					
						
							|  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |                 'uploader': 'Katy Perry', | 
					
						
							|  |  |  |                 'upload_date': '20130905', | 
					
						
							| 
									
										
										
										
											2013-10-01 15:05:41 +02:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2014-08-27 19:20:20 +02:00
										 |  |  |             'params': { | 
					
						
							|  |  |  |                 'skip_download': True, | 
					
						
							| 
									
										
										
										
											2013-10-01 15:05:41 +02:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2014-08-27 19:20:20 +02:00
										 |  |  |             'skip': 'VEVO is only available in some countries', | 
					
						
							| 
									
										
										
										
											2013-10-01 15:05:41 +02:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2013-10-31 00:20:49 +01:00
										 |  |  |         # age-restricted video | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2014-08-27 19:20:20 +02:00
										 |  |  |             'url': 'http://www.dailymotion.com/video/xyh2zz_leanna-decker-cyber-girl-of-the-year-desires-nude-playboy-plus_redband', | 
					
						
							|  |  |  |             'md5': '0d667a7b9cebecc3c89ee93099c4159d', | 
					
						
							|  |  |  |             'info_dict': { | 
					
						
							|  |  |  |                 'id': 'xyh2zz', | 
					
						
							|  |  |  |                 'ext': 'mp4', | 
					
						
							|  |  |  |                 'title': 'Leanna Decker - Cyber Girl Of The Year Desires Nude [Playboy Plus]', | 
					
						
							|  |  |  |                 'uploader': 'HotWaves1012', | 
					
						
							|  |  |  |                 'age_limit': 18, | 
					
						
							| 
									
										
										
										
											2013-10-31 00:20:49 +01:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-10-01 15:05:41 +02:00
										 |  |  |     ] | 
					
						
							| 
									
										
										
										
											2013-06-23 20:09:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2014-10-05 21:59:53 +02:00
										 |  |  |         video_id = self._match_id(url) | 
					
						
							| 
									
										
										
										
											2015-05-03 16:59:14 +02:00
										 |  |  |         url = 'https://www.dailymotion.com/video/%s' % video_id | 
					
						
							| 
									
										
										
										
											2013-06-23 20:09:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Retrieve video webpage to extract further information | 
					
						
							| 
									
										
										
										
											2013-09-29 12:44:02 +02:00
										 |  |  |         request = self._build_request(url) | 
					
						
							| 
									
										
										
										
											2013-06-23 20:09:47 +02:00
										 |  |  |         webpage = self._download_webpage(request, video_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Extract URL, uploader and title from webpage | 
					
						
							|  |  |  |         self.report_extraction(video_id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-01 15:05:41 +02:00
										 |  |  |         # It may just embed a vevo video: | 
					
						
							|  |  |  |         m_vevo = re.search( | 
					
						
							| 
									
										
										
										
											2014-11-12 23:32:27 +01:00
										 |  |  |             r'<link rel="video_src" href="[^"]*?vevo.com[^"]*?video=(?P<id>[\w]*)', | 
					
						
							| 
									
										
										
										
											2013-10-01 15:05:41 +02:00
										 |  |  |             webpage) | 
					
						
							|  |  |  |         if m_vevo is not None: | 
					
						
							|  |  |  |             vevo_id = m_vevo.group('id') | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |             self.to_screen('Vevo video detected: %s' % vevo_id) | 
					
						
							|  |  |  |             return self.url_result('vevo:%s' % vevo_id, ie='Vevo') | 
					
						
							| 
									
										
										
										
											2013-10-01 15:05:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-31 00:20:49 +01:00
										 |  |  |         age_limit = self._rta_search(webpage) | 
					
						
							| 
									
										
										
										
											2013-06-23 20:09:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         video_upload_date = None | 
					
						
							| 
									
										
										
										
											2015-05-10 15:27:55 +08:00
										 |  |  |         mobj = re.search(r'<meta property="video:release_date" content="([0-9]{4})-([0-9]{2})-([0-9]{2}).+?"/>', webpage) | 
					
						
							| 
									
										
										
										
											2013-06-23 20:09:47 +02:00
										 |  |  |         if mobj is not None: | 
					
						
							| 
									
										
										
										
											2015-05-10 15:27:55 +08:00
										 |  |  |             video_upload_date = mobj.group(1) + mobj.group(2) + mobj.group(3) | 
					
						
							| 
									
										
										
										
											2013-06-23 20:09:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-03 16:59:14 +02:00
										 |  |  |         embed_url = 'https://www.dailymotion.com/embed/video/%s' % video_id | 
					
						
							| 
									
										
										
										
											2015-03-31 20:55:21 +06:00
										 |  |  |         embed_request = self._build_request(embed_url) | 
					
						
							|  |  |  |         embed_page = self._download_webpage( | 
					
						
							|  |  |  |             embed_request, video_id, 'Downloading embed page') | 
					
						
							| 
									
										
										
										
											2013-09-03 11:33:59 +02:00
										 |  |  |         info = self._search_regex(r'var info = ({.*?}),$', embed_page, | 
					
						
							| 
									
										
										
										
											2014-11-23 21:39:15 +01:00
										 |  |  |                                   'video info', flags=re.MULTILINE) | 
					
						
							| 
									
										
										
										
											2013-07-05 14:15:26 +02:00
										 |  |  |         info = json.loads(info) | 
					
						
							| 
									
										
										
										
											2013-09-21 12:15:54 +02:00
										 |  |  |         if info.get('error') is not None: | 
					
						
							|  |  |  |             msg = 'Couldn\'t get video, Dailymotion says: %s' % info['error']['title'] | 
					
						
							|  |  |  |             raise ExtractorError(msg, expected=True) | 
					
						
							| 
									
										
										
										
											2013-07-05 14:15:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-23 17:33:38 +02:00
										 |  |  |         formats = [] | 
					
						
							|  |  |  |         for (key, format_id) in self._FORMATS: | 
					
						
							|  |  |  |             video_url = info.get(key) | 
					
						
							|  |  |  |             if video_url is not None: | 
					
						
							|  |  |  |                 m_size = re.search(r'H264-(\d+)x(\d+)', video_url) | 
					
						
							|  |  |  |                 if m_size is not None: | 
					
						
							| 
									
										
										
										
											2014-03-04 22:24:38 +01:00
										 |  |  |                     width, height = map(int_or_none, (m_size.group(1), m_size.group(2))) | 
					
						
							| 
									
										
										
										
											2013-10-23 17:33:38 +02:00
										 |  |  |                 else: | 
					
						
							|  |  |  |                     width, height = None, None | 
					
						
							|  |  |  |                 formats.append({ | 
					
						
							|  |  |  |                     'url': video_url, | 
					
						
							|  |  |  |                     'ext': 'mp4', | 
					
						
							|  |  |  |                     'format_id': format_id, | 
					
						
							|  |  |  |                     'width': width, | 
					
						
							|  |  |  |                     'height': height, | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |         if not formats: | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |             raise ExtractorError('Unable to extract video URL') | 
					
						
							| 
									
										
										
										
											2013-07-05 14:15:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-07 18:59:11 +02:00
										 |  |  |         # subtitles | 
					
						
							| 
									
										
										
										
											2013-11-02 18:01:05 +01:00
										 |  |  |         video_subtitles = self.extract_subtitles(video_id, webpage) | 
					
						
							| 
									
										
										
										
											2013-08-07 18:59:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-05 21:59:53 +02:00
										 |  |  |         view_count = str_to_int(self._search_regex( | 
					
						
							|  |  |  |             r'video_views_count[^>]+>\s+([\d\.,]+)', | 
					
						
							|  |  |  |             webpage, 'view count', fatal=False)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         title = self._og_search_title(webpage, default=None) | 
					
						
							|  |  |  |         if title is None: | 
					
						
							|  |  |  |             title = self._html_search_regex( | 
					
						
							|  |  |  |                 r'(?s)<span\s+id="video_title"[^>]*>(.*?)</span>', webpage, | 
					
						
							|  |  |  |                 'title') | 
					
						
							| 
									
										
										
										
											2013-12-06 13:36:36 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-31 00:20:49 +01:00
										 |  |  |         return { | 
					
						
							| 
									
										
										
										
											2014-10-05 21:59:53 +02:00
										 |  |  |             'id': video_id, | 
					
						
							| 
									
										
										
										
											2013-10-23 17:33:38 +02:00
										 |  |  |             'formats': formats, | 
					
						
							| 
									
										
										
										
											2014-06-25 17:44:19 +02:00
										 |  |  |             'uploader': info['owner.screenname'], | 
					
						
							| 
									
										
										
										
											2014-10-05 21:59:53 +02:00
										 |  |  |             'upload_date': video_upload_date, | 
					
						
							|  |  |  |             'title': title, | 
					
						
							|  |  |  |             'subtitles': video_subtitles, | 
					
						
							| 
									
										
										
										
											2013-10-31 00:20:49 +01:00
										 |  |  |             'thumbnail': info['thumbnail_url'], | 
					
						
							|  |  |  |             'age_limit': age_limit, | 
					
						
							| 
									
										
										
										
											2013-12-06 13:36:36 +01:00
										 |  |  |             'view_count': view_count, | 
					
						
							| 
									
										
										
										
											2013-10-31 00:20:49 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-07-29 12:07:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-16 21:28:06 +01:00
										 |  |  |     def _get_subtitles(self, video_id, webpage): | 
					
						
							| 
									
										
										
										
											2013-09-11 15:21:09 +02:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2013-09-11 16:24:47 +02:00
										 |  |  |             sub_list = self._download_webpage( | 
					
						
							|  |  |  |                 'https://api.dailymotion.com/video/%s/subtitles?fields=id,language,url' % video_id, | 
					
						
							|  |  |  |                 video_id, note=False) | 
					
						
							|  |  |  |         except ExtractorError as err: | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |             self._downloader.report_warning('unable to download video subtitles: %s' % compat_str(err)) | 
					
						
							| 
									
										
										
										
											2013-09-11 15:21:09 +02:00
										 |  |  |             return {} | 
					
						
							|  |  |  |         info = json.loads(sub_list) | 
					
						
							|  |  |  |         if (info['total'] > 0): | 
					
						
							| 
									
										
										
										
											2015-02-16 21:28:06 +01:00
										 |  |  |             sub_lang_list = dict((l['language'], [{'url': l['url'], 'ext': 'srt'}]) for l in info['list']) | 
					
						
							| 
									
										
										
										
											2013-09-11 15:21:09 +02:00
										 |  |  |             return sub_lang_list | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |         self._downloader.report_warning('video doesn\'t have subtitles') | 
					
						
							| 
									
										
										
										
											2013-09-11 15:21:09 +02:00
										 |  |  |         return {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-29 12:07:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-29 12:44:02 +02:00
										 |  |  | class DailymotionPlaylistIE(DailymotionBaseInfoExtractor): | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |     IE_NAME = 'dailymotion:playlist' | 
					
						
							| 
									
										
										
										
											2013-07-29 12:07:38 +02:00
										 |  |  |     _VALID_URL = r'(?:https?://)?(?:www\.)?dailymotion\.[a-z]{2,3}/playlist/(?P<id>.+?)/' | 
					
						
							| 
									
										
										
										
											2014-04-04 02:04:16 +02:00
										 |  |  |     _MORE_PAGES_INDICATOR = r'(?s)<div class="pages[^"]*">.*?<a\s+class="[^"]*?icon-arrow_right[^"]*?"' | 
					
						
							| 
									
										
										
										
											2013-09-21 12:45:53 +02:00
										 |  |  |     _PAGE_TEMPLATE = 'https://www.dailymotion.com/playlist/%s/%s' | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |     _TESTS = [{ | 
					
						
							|  |  |  |         'url': 'http://www.dailymotion.com/playlist/xv4bw_nqtv_sport/1#video=xl8v3q', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'title': 'SPORT', | 
					
						
							| 
									
										
										
										
											2015-02-18 00:49:10 +01:00
										 |  |  |             'id': 'xv4bw_nqtv_sport', | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |         }, | 
					
						
							|  |  |  |         'playlist_mincount': 20, | 
					
						
							|  |  |  |     }] | 
					
						
							| 
									
										
										
										
											2013-07-29 12:07:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-21 12:45:53 +02:00
										 |  |  |     def _extract_entries(self, id): | 
					
						
							| 
									
										
										
										
											2013-07-29 12:07:38 +02:00
										 |  |  |         video_ids = [] | 
					
						
							|  |  |  |         for pagenum in itertools.count(1): | 
					
						
							| 
									
										
										
										
											2013-09-29 12:44:02 +02:00
										 |  |  |             request = self._build_request(self._PAGE_TEMPLATE % (id, pagenum)) | 
					
						
							|  |  |  |             webpage = self._download_webpage(request, | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |                                              id, 'Downloading page %s' % pagenum) | 
					
						
							| 
									
										
										
										
											2013-07-29 12:07:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-23 19:42:34 +07:00
										 |  |  |             video_ids.extend(re.findall(r'data-xid="(.+?)"', webpage)) | 
					
						
							| 
									
										
										
										
											2013-07-29 12:07:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-04 02:04:16 +02:00
										 |  |  |             if re.search(self._MORE_PAGES_INDICATOR, webpage) is None: | 
					
						
							| 
									
										
										
										
											2013-07-29 12:07:38 +02:00
										 |  |  |                 break | 
					
						
							| 
									
										
										
										
											2013-09-21 12:45:53 +02:00
										 |  |  |         return [self.url_result('http://www.dailymotion.com/video/%s' % video_id, 'Dailymotion') | 
					
						
							| 
									
										
										
										
											2014-11-23 21:39:15 +01:00
										 |  |  |                 for video_id in orderedSet(video_ids)] | 
					
						
							| 
									
										
										
										
											2013-09-21 12:45:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							|  |  |  |         mobj = re.match(self._VALID_URL, url) | 
					
						
							|  |  |  |         playlist_id = mobj.group('id') | 
					
						
							|  |  |  |         webpage = self._download_webpage(url, playlist_id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-11 02:16:46 +02:00
										 |  |  |         return { | 
					
						
							|  |  |  |             '_type': 'playlist', | 
					
						
							|  |  |  |             'id': playlist_id, | 
					
						
							|  |  |  |             'title': self._og_search_title(webpage), | 
					
						
							|  |  |  |             'entries': self._extract_entries(playlist_id), | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-09-21 12:45:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DailymotionUserIE(DailymotionPlaylistIE): | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |     IE_NAME = 'dailymotion:user' | 
					
						
							| 
									
										
										
										
											2015-05-26 22:16:47 +06:00
										 |  |  |     _VALID_URL = r'https?://(?:www\.)?dailymotion\.[a-z]{2,3}/(?:(?:old/)?user/)?(?P<user>[^/]+)$' | 
					
						
							| 
									
										
										
										
											2013-09-21 12:45:53 +02:00
										 |  |  |     _PAGE_TEMPLATE = 'http://www.dailymotion.com/user/%s/%s' | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |     _TESTS = [{ | 
					
						
							|  |  |  |         'url': 'https://www.dailymotion.com/user/nqtv', | 
					
						
							|  |  |  |         'info_dict': { | 
					
						
							|  |  |  |             'id': 'nqtv', | 
					
						
							|  |  |  |             'title': 'Rémi Gaillard', | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         'playlist_mincount': 100, | 
					
						
							|  |  |  |     }] | 
					
						
							| 
									
										
										
										
											2013-09-21 12:45:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							|  |  |  |         mobj = re.match(self._VALID_URL, url) | 
					
						
							|  |  |  |         user = mobj.group('user') | 
					
						
							| 
									
										
										
										
											2015-05-26 22:12:26 +06:00
										 |  |  |         webpage = self._download_webpage( | 
					
						
							|  |  |  |             'https://www.dailymotion.com/user/%s' % user, user) | 
					
						
							| 
									
										
										
										
											2014-04-23 19:42:34 +07:00
										 |  |  |         full_user = unescapeHTML(self._html_search_regex( | 
					
						
							|  |  |  |             r'<a class="nav-image" title="([^"]+)" href="/%s">' % re.escape(user), | 
					
						
							| 
									
										
										
										
											2014-08-28 00:58:24 +02:00
										 |  |  |             webpage, 'user')) | 
					
						
							| 
									
										
										
										
											2013-09-21 12:45:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             '_type': 'playlist', | 
					
						
							|  |  |  |             'id': user, | 
					
						
							|  |  |  |             'title': full_user, | 
					
						
							|  |  |  |             'entries': self._extract_entries(user), | 
					
						
							|  |  |  |         } |