1 from __future__ 
import unicode_literals
 
   5 from .common 
import InfoExtractor
 
   6 from ..aes 
import aes_decrypt_text
 
   9     compat_urllib_parse_unquote
, 
  20 class KeezMoviesIE(InfoExtractor
): 
  21     _VALID_URL 
= r
'https?://(?:www\.)?keezmovies\.com/video/(?:(?P<display_id>[^/]+)-)?(?P<id>\d+)' 
  23         'url': 'http://www.keezmovies.com/video/petite-asian-lady-mai-playing-in-bathtub-1214711', 
  24         'md5': '1c1e75d22ffa53320f45eeb07bc4cdc0', 
  27             'display_id': 'petite-asian-lady-mai-playing-in-bathtub', 
  29             'title': 'Petite Asian Lady Mai Playing In Bathtub', 
  30             'thumbnail': 're:^https?://.*\.jpg$', 
  35         'url': 'http://www.keezmovies.com/video/1214711', 
  36         'only_matching': True, 
  39     def _extract_info(self
, url
): 
  40         mobj 
= re
.match(self
._VALID
_URL
, url
) 
  41         video_id 
= mobj
.group('id') 
  42         display_id 
= mobj
.group('display_id') or video_id
 
  44         webpage 
= self
._download
_webpage
( 
  45             url
, display_id
, headers
={'Cookie': 'age_verified=1'}) 
  55         def extract_format(format_url
, height
=None): 
  56             if not isinstance(format_url
, compat_str
) or not format_url
.startswith('http'): 
  58             if format_url 
in format_urls
: 
  60             format_urls
.add(format_url
) 
  61             tbr 
= int_or_none(self
._search
_regex
( 
  62                 r
'[/_](\d+)[kK][/_]', format_url
, 'tbr', default
=None)) 
  64                 height 
= int_or_none(self
._search
_regex
( 
  65                     r
'[/_](\d+)[pP][/_]', format_url
, 'height', default
=None)) 
  67                 format_url 
= aes_decrypt_text( 
  68                     video_url
, title
, 32).decode('utf-8') 
  71                 'format_id': '%dp' % height 
if height 
else None, 
  76         flashvars 
= self
._parse
_json
( 
  78                 r
'flashvars\s*=\s*({.+?});', webpage
, 
  79                 'flashvars', default
='{}'), 
  80             display_id
, fatal
=False) 
  83             title 
= flashvars
.get('video_title') 
  84             thumbnail 
= flashvars
.get('image_url') 
  85             duration 
= int_or_none(flashvars
.get('video_duration')) 
  86             encrypted 
= flashvars
.get('encrypted') is True 
  87             for key
, value 
in flashvars
.items(): 
  88                 mobj 
= re
.search(r
'quality_(\d+)[pP]', key
) 
  90                     extract_format(value
, int(mobj
.group(1))) 
  91             video_url 
= flashvars
.get('video_url') 
  92             if video_url 
and determine_ext(video_url
, None): 
  93                 extract_format(video_url
) 
  95         video_url 
= self
._html
_search
_regex
( 
  96             r
'flashvars\.video_url\s*=\s*(["\'])(?P
<url
>http
.+?
)\
1', 
  97             webpage, 'video url
', default=None, group='url
') 
  99             extract_format(compat_urllib_parse_unquote(video_url)) 
 102             if 'title
="This video is no longer available"' in webpage: 
 103                 raise ExtractorError( 
 104                     'Video 
%s is no longer available
' % video_id, expected=True) 
 106         self._sort_formats(formats) 
 109             title = self._html_search_regex( 
 110                 r'<h1
[^
>]*>([^
<]+)', webpage, 'title
') 
 114             'display_id
': display_id, 
 115             'title
': strip_or_none(title), 
 116             'thumbnail
': thumbnail, 
 117             'duration
': duration, 
 122     def _real_extract(self, url): 
 123         webpage, info = self._extract_info(url) 
 124         info['view_count
'] = str_to_int(self._search_regex( 
 125             r'<b
>([\d
,.]+)</b
> Views?
', webpage, 'view count
', fatal=False))