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': 'https://www.keezmovies.com/video/arab-wife-want-it-so-bad-i-see-she-thirsty-and-has-tiny-money-18070681', 
  24         'md5': '2ac69cdb882055f71d82db4311732a1a', 
  27             'display_id': 'arab-wife-want-it-so-bad-i-see-she-thirsty-and-has-tiny-money', 
  29             'title': 'Arab wife want it so bad I see she thirsty and has tiny money.', 
  35         'url': 'http://www.keezmovies.com/video/18070681', 
  36         'only_matching': True, 
  39     def _extract_info(self
, url
, fatal
=True): 
  40         mobj 
= re
.match(self
._VALID
_URL
, url
) 
  41         video_id 
= mobj
.group('id') 
  42         display_id 
= (mobj
.group('display_id') 
  43                       if 'display_id' in mobj
.groupdict() 
  44                       else None) or mobj
.group('id') 
  46         webpage 
= self
._download
_webpage
( 
  47             url
, display_id
, headers
={'Cookie': 'age_verified=1'}) 
  57         def extract_format(format_url
, height
=None): 
  58             if not isinstance(format_url
, compat_str
) or not format_url
.startswith(('http', '//')): 
  60             if format_url 
in format_urls
: 
  62             format_urls
.add(format_url
) 
  63             tbr 
= int_or_none(self
._search
_regex
( 
  64                 r
'[/_](\d+)[kK][/_]', format_url
, 'tbr', default
=None)) 
  66                 height 
= int_or_none(self
._search
_regex
( 
  67                     r
'[/_](\d+)[pP][/_]', format_url
, 'height', default
=None)) 
  69                 format_url 
= aes_decrypt_text( 
  70                     video_url
, title
, 32).decode('utf-8') 
  73                 'format_id': '%dp' % height 
if height 
else None, 
  78         flashvars 
= self
._parse
_json
( 
  80                 r
'flashvars\s*=\s*({.+?});', webpage
, 
  81                 'flashvars', default
='{}'), 
  82             display_id
, fatal
=False) 
  85             title 
= flashvars
.get('video_title') 
  86             thumbnail 
= flashvars
.get('image_url') 
  87             duration 
= int_or_none(flashvars
.get('video_duration')) 
  88             encrypted 
= flashvars
.get('encrypted') is True 
  89             for key
, value 
in flashvars
.items(): 
  90                 mobj 
= re
.search(r
'quality_(\d+)[pP]', key
) 
  92                     extract_format(value
, int(mobj
.group(1))) 
  93             video_url 
= flashvars
.get('video_url') 
  94             if video_url 
and determine_ext(video_url
, None): 
  95                 extract_format(video_url
) 
  97         video_url 
= self
._html
_search
_regex
( 
  98             r
'flashvars\.video_url\s*=\s*(["\'])(?P
<url
>http
.+?
)\
1', 
  99             webpage, 'video url
', default=None, group='url
') 
 101             extract_format(compat_urllib_parse_unquote(video_url)) 
 104             if 'title
="This video is no longer available"' in webpage: 
 105                 raise ExtractorError( 
 106                     'Video 
%s is no longer available
' % video_id, expected=True) 
 109             self._sort_formats(formats) 
 110         except ExtractorError: 
 115             title = self._html_search_regex( 
 116                 r'<h1
[^
>]*>([^
<]+)', webpage, 'title
') 
 120             'display_id
': display_id, 
 121             'title
': strip_or_none(title), 
 122             'thumbnail
': thumbnail, 
 123             'duration
': duration, 
 128     def _real_extract(self, url): 
 129         webpage, info = self._extract_info(url, fatal=False) 
 130         if not info['formats
']: 
 131             return self.url_result(url, 'Generic
') 
 132         info['view_count
'] = str_to_int(self._search_regex( 
 133             r'<b
>([\d
,.]+)</b
> Views?
', webpage, 'view count
', fatal=False))