| 
									
										
										
										
											2014-04-04 18:48:49 +02:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-27 10:10:28 +01:00
										 |  |  | import re | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from .common import InfoExtractor | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  | from ..aes import aes_decrypt_text | 
					
						
							|  |  |  | from ..compat import ( | 
					
						
							|  |  |  |     compat_str, | 
					
						
							|  |  |  |     compat_urllib_parse_unquote, | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-12-05 17:25:14 +08:00
										 |  |  | from ..utils import ( | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  |     determine_ext, | 
					
						
							|  |  |  |     ExtractorError, | 
					
						
							|  |  |  |     int_or_none, | 
					
						
							|  |  |  |     str_to_int, | 
					
						
							|  |  |  |     strip_or_none, | 
					
						
							| 
									
										
										
										
											2015-12-05 17:25:14 +08:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2013-10-27 10:10:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-04 18:48:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-27 10:10:28 +01:00
										 |  |  | class KeezMoviesIE(InfoExtractor): | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  |     _VALID_URL = r'https?://(?:www\.)?keezmovies\.com/video/(?:(?P<display_id>[^/]+)-)?(?P<id>\d+)' | 
					
						
							|  |  |  |     _TESTS = [{ | 
					
						
							| 
									
										
										
										
											2014-04-04 18:48:49 +02:00
										 |  |  |         'url': 'http://www.keezmovies.com/video/petite-asian-lady-mai-playing-in-bathtub-1214711', | 
					
						
							| 
									
										
										
										
											2015-12-05 17:25:14 +08:00
										 |  |  |         'md5': '1c1e75d22ffa53320f45eeb07bc4cdc0', | 
					
						
							| 
									
										
										
										
											2014-04-04 18:48:49 +02:00
										 |  |  |         'info_dict': { | 
					
						
							| 
									
										
										
										
											2015-02-01 15:13:41 +01:00
										 |  |  |             'id': '1214711', | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  |             'display_id': 'petite-asian-lady-mai-playing-in-bathtub', | 
					
						
							| 
									
										
										
										
											2015-02-01 15:13:41 +01:00
										 |  |  |             'ext': 'mp4', | 
					
						
							| 
									
										
										
										
											2014-04-04 18:48:49 +02:00
										 |  |  |             'title': 'Petite Asian Lady Mai Playing In Bathtub', | 
					
						
							| 
									
										
										
										
											2017-01-02 20:08:07 +08:00
										 |  |  |             'thumbnail': r're:^https?://.*\.jpg$', | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  |             'view_count': int, | 
					
						
							|  |  |  |             'age_limit': 18, | 
					
						
							| 
									
										
										
										
											2013-10-27 10:10:28 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  |     }, { | 
					
						
							|  |  |  |         'url': 'http://www.keezmovies.com/video/1214711', | 
					
						
							|  |  |  |         'only_matching': True, | 
					
						
							|  |  |  |     }] | 
					
						
							| 
									
										
										
										
											2013-10-27 10:10:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  |     def _extract_info(self, url): | 
					
						
							|  |  |  |         mobj = re.match(self._VALID_URL, url) | 
					
						
							|  |  |  |         video_id = mobj.group('id') | 
					
						
							| 
									
										
										
										
											2016-08-18 04:39:31 +07:00
										 |  |  |         display_id = (mobj.group('display_id') | 
					
						
							|  |  |  |                       if 'display_id' in mobj.groupdict() | 
					
						
							|  |  |  |                       else None) or mobj.group('id') | 
					
						
							| 
									
										
										
										
											2013-10-27 10:10:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  |         webpage = self._download_webpage( | 
					
						
							|  |  |  |             url, display_id, headers={'Cookie': 'age_verified=1'}) | 
					
						
							| 
									
										
										
										
											2013-10-27 10:10:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  |         formats = [] | 
					
						
							|  |  |  |         format_urls = set() | 
					
						
							| 
									
										
										
										
											2013-10-27 10:10:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  |         title = None | 
					
						
							|  |  |  |         thumbnail = None | 
					
						
							|  |  |  |         duration = None | 
					
						
							|  |  |  |         encrypted = False | 
					
						
							| 
									
										
										
										
											2015-12-05 17:25:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  |         def extract_format(format_url, height=None): | 
					
						
							|  |  |  |             if not isinstance(format_url, compat_str) or not format_url.startswith('http'): | 
					
						
							|  |  |  |                 return | 
					
						
							|  |  |  |             if format_url in format_urls: | 
					
						
							|  |  |  |                 return | 
					
						
							|  |  |  |             format_urls.add(format_url) | 
					
						
							|  |  |  |             tbr = int_or_none(self._search_regex( | 
					
						
							|  |  |  |                 r'[/_](\d+)[kK][/_]', format_url, 'tbr', default=None)) | 
					
						
							|  |  |  |             if not height: | 
					
						
							|  |  |  |                 height = int_or_none(self._search_regex( | 
					
						
							|  |  |  |                     r'[/_](\d+)[pP][/_]', format_url, 'height', default=None)) | 
					
						
							|  |  |  |             if encrypted: | 
					
						
							|  |  |  |                 format_url = aes_decrypt_text( | 
					
						
							|  |  |  |                     video_url, title, 32).decode('utf-8') | 
					
						
							|  |  |  |             formats.append({ | 
					
						
							|  |  |  |                 'url': format_url, | 
					
						
							|  |  |  |                 'format_id': '%dp' % height if height else None, | 
					
						
							|  |  |  |                 'height': height, | 
					
						
							|  |  |  |                 'tbr': tbr, | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         flashvars = self._parse_json( | 
					
						
							|  |  |  |             self._search_regex( | 
					
						
							|  |  |  |                 r'flashvars\s*=\s*({.+?});', webpage, | 
					
						
							|  |  |  |                 'flashvars', default='{}'), | 
					
						
							|  |  |  |             display_id, fatal=False) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if flashvars: | 
					
						
							|  |  |  |             title = flashvars.get('video_title') | 
					
						
							|  |  |  |             thumbnail = flashvars.get('image_url') | 
					
						
							|  |  |  |             duration = int_or_none(flashvars.get('video_duration')) | 
					
						
							|  |  |  |             encrypted = flashvars.get('encrypted') is True | 
					
						
							|  |  |  |             for key, value in flashvars.items(): | 
					
						
							|  |  |  |                 mobj = re.search(r'quality_(\d+)[pP]', key) | 
					
						
							|  |  |  |                 if mobj: | 
					
						
							|  |  |  |                     extract_format(value, int(mobj.group(1))) | 
					
						
							|  |  |  |             video_url = flashvars.get('video_url') | 
					
						
							|  |  |  |             if video_url and determine_ext(video_url, None): | 
					
						
							|  |  |  |                 extract_format(video_url) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         video_url = self._html_search_regex( | 
					
						
							|  |  |  |             r'flashvars\.video_url\s*=\s*(["\'])(?P<url>http.+?)\1', | 
					
						
							|  |  |  |             webpage, 'video url', default=None, group='url') | 
					
						
							|  |  |  |         if video_url: | 
					
						
							|  |  |  |             extract_format(compat_urllib_parse_unquote(video_url)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not formats: | 
					
						
							|  |  |  |             if 'title="This video is no longer available"' in webpage: | 
					
						
							|  |  |  |                 raise ExtractorError( | 
					
						
							|  |  |  |                     'Video %s is no longer available' % video_id, expected=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self._sort_formats(formats) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not title: | 
					
						
							|  |  |  |             title = self._html_search_regex( | 
					
						
							|  |  |  |                 r'<h1[^>]*>([^<]+)', webpage, 'title') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return webpage, { | 
					
						
							| 
									
										
										
										
											2013-10-27 10:10:28 +01:00
										 |  |  |             'id': video_id, | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  |             'display_id': display_id, | 
					
						
							|  |  |  |             'title': strip_or_none(title), | 
					
						
							|  |  |  |             'thumbnail': thumbnail, | 
					
						
							|  |  |  |             'duration': duration, | 
					
						
							|  |  |  |             'age_limit': 18, | 
					
						
							| 
									
										
										
										
											2015-12-05 17:25:14 +08:00
										 |  |  |             'formats': formats, | 
					
						
							| 
									
										
										
										
											2013-10-27 10:10:28 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-08-17 05:44:46 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _real_extract(self, url): | 
					
						
							|  |  |  |         webpage, info = self._extract_info(url) | 
					
						
							|  |  |  |         info['view_count'] = str_to_int(self._search_regex( | 
					
						
							|  |  |  |             r'<b>([\d,.]+)</b> Views?', webpage, 'view count', fatal=False)) | 
					
						
							|  |  |  |         return info |