| 
									
										
										
										
											2014-01-22 19:02:48 +01:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-23 21:11:47 +02:00
										 |  |  | import re | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2015-11-21 22:18:17 +06:00
										 |  |  | from ..compat import compat_urllib_parse_unquote | 
					
						
							| 
									
										
										
										
											2014-12-13 12:24:42 +01:00
										 |  |  | from ..utils import ( | 
					
						
							| 
									
										
										
										
											2014-06-06 21:15:06 +07:00
										 |  |  |     clean_html, | 
					
						
							| 
									
										
										
										
											2015-06-21 03:12:17 +08:00
										 |  |  |     determine_ext, | 
					
						
							| 
									
										
										
										
											2017-04-30 18:11:29 +07:00
										 |  |  |     ExtractorError, | 
					
						
							|  |  |  |     int_or_none, | 
					
						
							| 
									
										
										
										
											2017-04-23 23:49:41 +02:00
										 |  |  |     parse_duration, | 
					
						
							| 
									
										
										
										
											2013-06-23 21:11:47 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class XVideosIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2017-10-05 00:27:24 +07:00
										 |  |  |     _VALID_URL = r'''(?x)
 | 
					
						
							|  |  |  |                     https?:// | 
					
						
							|  |  |  |                         (?: | 
					
						
							|  |  |  |                             (?:www\.)?xvideos\.com/video| | 
					
						
							|  |  |  |                             flashservice\.xvideos\.com/embedframe/| | 
					
						
							|  |  |  |                             static-hw\.xvideos\.com/swf/xv-player\.swf\?.*?\bid_video= | 
					
						
							|  |  |  |                         ) | 
					
						
							|  |  |  |                         (?P<id>[0-9]+) | 
					
						
							|  |  |  |                     '''
 | 
					
						
							|  |  |  |     _TESTS = [{ | 
					
						
							| 
									
										
										
										
											2014-06-06 21:23:36 +07:00
										 |  |  |         'url': 'http://www.xvideos.com/video4588838/biker_takes_his_girl', | 
					
						
							| 
									
										
										
										
											2016-08-16 21:20:15 +07:00
										 |  |  |         'md5': '14cea69fcb84db54293b1e971466c2e1', | 
					
						
							| 
									
										
										
										
											2014-01-22 19:02:48 +01:00
										 |  |  |         'info_dict': { | 
					
						
							| 
									
										
										
										
											2014-06-06 21:23:36 +07:00
										 |  |  |             'id': '4588838', | 
					
						
							| 
									
										
										
										
											2016-08-16 21:20:15 +07:00
										 |  |  |             'ext': 'mp4', | 
					
						
							| 
									
										
										
										
											2014-06-06 21:23:36 +07:00
										 |  |  |             'title': 'Biker Takes his Girl', | 
					
						
							| 
									
										
										
										
											2017-04-30 18:11:29 +07:00
										 |  |  |             'duration': 108, | 
					
						
							| 
									
										
										
										
											2014-06-06 21:23:36 +07:00
										 |  |  |             'age_limit': 18, | 
					
						
							| 
									
										
										
										
											2013-06-27 20:46:46 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-10-05 00:27:24 +07:00
										 |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'https://flashservice.xvideos.com/embedframe/4588838', | 
					
						
							|  |  |  |         'only_matching': True, | 
					
						
							|  |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'http://static-hw.xvideos.com/swf/xv-player.swf?id_video=4588838', | 
					
						
							|  |  |  |         'only_matching': True, | 
					
						
							|  |  |  |     }] | 
					
						
							| 
									
										
										
										
											2013-06-23 21:11:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							| 
									
										
										
										
											2014-12-13 12:24:42 +01:00
										 |  |  |         video_id = self._match_id(url) | 
					
						
							| 
									
										
										
										
											2017-10-05 00:27:24 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         webpage = self._download_webpage( | 
					
						
							| 
									
										
										
										
											2018-12-06 15:36:08 -05:00
										 |  |  |             'https://www.xvideos.com/video%s/' % video_id, video_id) | 
					
						
							| 
									
										
										
										
											2013-06-23 21:11:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-06 21:15:06 +07:00
										 |  |  |         mobj = re.search(r'<h1 class="inlineError">(.+?)</h1>', webpage) | 
					
						
							|  |  |  |         if mobj: | 
					
						
							|  |  |  |             raise ExtractorError('%s said: %s' % (self.IE_NAME, clean_html(mobj.group(1))), expected=True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-05 00:27:24 +07:00
										 |  |  |         title = self._html_search_regex( | 
					
						
							|  |  |  |             (r'<title>(?P<title>.+?)\s+-\s+XVID', | 
					
						
							|  |  |  |              r'setVideoTitle\s*\(\s*(["\'])(?P<title>(?:(?!\1).)+)\1'), | 
					
						
							|  |  |  |             webpage, 'title', default=None, | 
					
						
							|  |  |  |             group='title') or self._og_search_title(webpage) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         thumbnail = self._search_regex( | 
					
						
							| 
									
										
										
										
											2018-03-31 11:46:08 -05:00
										 |  |  |             (r'setThumbUrl\(\s*(["\'])(?P<thumbnail>(?:(?!\1).)+)\1', | 
					
						
							|  |  |  |              r'url_bigthumb=(?P<thumbnail>.+?)&'), | 
					
						
							|  |  |  |             webpage, 'thumbnail', fatal=False, group='thumbnail') | 
					
						
							| 
									
										
										
										
											2017-10-05 00:27:24 +07:00
										 |  |  |         duration = int_or_none(self._og_search_property( | 
					
						
							| 
									
										
										
										
											2017-04-30 18:11:29 +07:00
										 |  |  |             'duration', webpage, default=None)) or parse_duration( | 
					
						
							|  |  |  |             self._search_regex( | 
					
						
							|  |  |  |                 r'<span[^>]+class=["\']duration["\'][^>]*>.*?(\d[^<]+)', | 
					
						
							|  |  |  |                 webpage, 'duration', fatal=False)) | 
					
						
							| 
									
										
										
										
											2013-06-23 21:11:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-15 03:38:04 +06:00
										 |  |  |         formats = [] | 
					
						
							| 
									
										
										
										
											2015-06-21 03:12:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-15 03:38:04 +06:00
										 |  |  |         video_url = compat_urllib_parse_unquote(self._search_regex( | 
					
						
							|  |  |  |             r'flv_url=(.+?)&', webpage, 'video URL', default='')) | 
					
						
							|  |  |  |         if video_url: | 
					
						
							| 
									
										
										
										
											2016-08-16 21:17:52 +07:00
										 |  |  |             formats.append({ | 
					
						
							|  |  |  |                 'url': video_url, | 
					
						
							|  |  |  |                 'format_id': 'flv', | 
					
						
							|  |  |  |             }) | 
					
						
							| 
									
										
										
										
											2015-06-21 03:12:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-16 21:17:52 +07:00
										 |  |  |         for kind, _, format_url in re.findall( | 
					
						
							|  |  |  |                 r'setVideo([^(]+)\((["\'])(http.+?)\2\)', webpage): | 
					
						
							|  |  |  |             format_id = kind.lower() | 
					
						
							|  |  |  |             if format_id == 'hls': | 
					
						
							|  |  |  |                 formats.extend(self._extract_m3u8_formats( | 
					
						
							|  |  |  |                     format_url, video_id, 'mp4', | 
					
						
							|  |  |  |                     entry_protocol='m3u8_native', m3u8_id='hls', fatal=False)) | 
					
						
							|  |  |  |             elif format_id in ('urllow', 'urlhigh'): | 
					
						
							|  |  |  |                 formats.append({ | 
					
						
							|  |  |  |                     'url': format_url, | 
					
						
							|  |  |  |                     'format_id': '%s-%s' % (determine_ext(format_url, 'mp4'), format_id[3:]), | 
					
						
							|  |  |  |                     'quality': -2 if format_id.endswith('low') else None, | 
					
						
							|  |  |  |                 }) | 
					
						
							| 
									
										
										
										
											2015-06-21 03:12:17 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self._sort_formats(formats) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-22 19:02:48 +01:00
										 |  |  |         return { | 
					
						
							| 
									
										
										
										
											2013-06-23 21:11:47 +02:00
										 |  |  |             'id': video_id, | 
					
						
							| 
									
										
										
										
											2015-06-21 03:12:17 +08:00
										 |  |  |             'formats': formats, | 
					
						
							| 
									
										
										
										
											2017-10-05 00:27:24 +07:00
										 |  |  |             'title': title, | 
					
						
							|  |  |  |             'duration': duration, | 
					
						
							|  |  |  |             'thumbnail': thumbnail, | 
					
						
							| 
									
										
										
										
											2013-10-18 19:32:37 -03:00
										 |  |  |             'age_limit': 18, | 
					
						
							| 
									
										
										
										
											2013-06-23 21:11:47 +02:00
										 |  |  |         } |