2 from __future__ 
import unicode_literals
 
   4 from .common 
import InfoExtractor
 
   5 from ..compat 
import compat_urllib_parse_unquote
 
  15 class OdnoklassnikiIE(InfoExtractor
): 
  16     _VALID_URL 
= r
'https?://(?:www\.)?(?:odnoklassniki|ok)\.ru/(?:video(?:embed)?|web-api/video/moviePlayer)/(?P<id>[\d-]+)' 
  19         'url': 'http://ok.ru/video/20079905452', 
  20         'md5': '6ba728d85d60aa2e6dd37c9e70fdc6bc', 
  24             'title': 'Культура меняет нас (прекрасный ролик!))', 
  26             'upload_date': '20141207', 
  27             'uploader_id': '330537914540', 
  28             'uploader': 'Виталий Добровольский', 
  32         'skip': 'Video has been blocked', 
  35         'url': 'http://ok.ru/video/63567059965189-0', 
  36         'md5': '9676cf86eff5391d35dea675d224e131', 
  38             'id': '63567059965189-0', 
  40             'title': 'Девушка без комплексов ...', 
  42             'upload_date': '20150518', 
  43             'uploader_id': '534380003155', 
  44             'uploader': '☭ Андрей Мещанинов ☭', 
  49         # YouTube embed (metadataUrl, provider == USER_YOUTUBE) 
  50         'url': 'http://ok.ru/video/64211978996595-1', 
  51         'md5': '5d7475d428845cd2e13bae6f1a992278', 
  53             'id': '64211978996595-1', 
  55             'title': 'Космическая среда от 26 августа 2015', 
  56             'description': 'md5:848eb8b85e5e3471a3a803dae1343ed0', 
  58             'upload_date': '20150826', 
  59             'uploader_id': '750099571', 
  60             'uploader': 'Алина П', 
  64         'url': 'http://ok.ru/web-api/video/moviePlayer/20079905452', 
  65         'only_matching': True, 
  67         'url': 'http://www.ok.ru/video/20648036891', 
  68         'only_matching': True, 
  70         'url': 'http://www.ok.ru/videoembed/20648036891', 
  71         'only_matching': True, 
  74     def _real_extract(self
, url
): 
  75         video_id 
= self
._match
_id
(url
) 
  77         webpage 
= self
._download
_webpage
( 
  78             'http://ok.ru/video/%s' % video_id
, video_id
) 
  80         error 
= self
._search
_regex
( 
  81             r
'[^>]+class="vp_video_stub_txt"[^>]*>([^<]+)<', 
  82             webpage
, 'error', default
=None) 
  84             raise ExtractorError(error
, expected
=True) 
  86         player 
= self
._parse
_json
( 
  87             unescapeHTML(self
._search
_regex
( 
  88                 r
'data-options=(?P<quote>["\'])(?P
<player
>{.+?
%s.+?
})(?P
=quote
)' % video_id, 
  89                 webpage, 'player
', group='player
')), 
  92         flashvars = player['flashvars
'] 
  94         metadata = flashvars.get('metadata
') 
  96             metadata = self._parse_json(metadata, video_id) 
  98             metadata = self._download_json( 
  99                 compat_urllib_parse_unquote(flashvars['metadataUrl
']), 
 100                 video_id, 'Downloading metadata JSON
') 
 102         movie = metadata['movie
'] 
 103         title = movie['title
'] 
 104         thumbnail = movie.get('poster
') 
 105         duration = int_or_none(movie.get('duration
')) 
 107         author = metadata.get('author
', {}) 
 108         uploader_id = author.get('id') 
 109         uploader = author.get('name
') 
 111         upload_date = unified_strdate(self._html_search_meta( 
 112             'ya
:ovs
:upload_date
', webpage, 'upload date
', default=None)) 
 115         adult = self._html_search_meta( 
 116             'ya
:ovs
:adult
', webpage, 'age limit
', default=None) 
 118             age_limit = 18 if adult == 'true
' else 0 
 120         like_count = int_or_none(metadata.get('likeCount
')) 
 125             'thumbnail
': thumbnail, 
 126             'duration
': duration, 
 127             'upload_date
': upload_date, 
 128             'uploader
': uploader, 
 129             'uploader_id
': uploader_id, 
 130             'like_count
': like_count, 
 131             'age_limit
': age_limit, 
 134         if metadata.get('provider
') == 'USER_YOUTUBE
': 
 136                 '_type
': 'url_transparent
', 
 137                 'url
': movie['contentId
'], 
 141         quality = qualities(('mobile
', 'lowest
', 'low
', 'sd
', 'hd
')) 
 146             'format_id
': f['name
'], 
 147             'quality
': quality(f['name
']), 
 148         } for f in metadata['videos
']] 
 149         self._sort_formats(formats) 
 151         info['formats
'] = formats