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|m|mobile)\.)?(?: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, 
  73         'url': 'http://m.ok.ru/video/20079905452', 
  74         'only_matching': True, 
  76         'url': 'http://mobile.ok.ru/video/20079905452', 
  77         'only_matching': True, 
  80     def _real_extract(self
, url
): 
  81         video_id 
= self
._match
_id
(url
) 
  83         webpage 
= self
._download
_webpage
( 
  84             'http://ok.ru/video/%s' % video_id
, video_id
) 
  86         error 
= self
._search
_regex
( 
  87             r
'[^>]+class="vp_video_stub_txt"[^>]*>([^<]+)<', 
  88             webpage
, 'error', default
=None) 
  90             raise ExtractorError(error
, expected
=True) 
  92         player 
= self
._parse
_json
( 
  93             unescapeHTML(self
._search
_regex
( 
  94                 r
'data-options=(?P<quote>["\'])(?P
<player
>{.+?
%s.+?
})(?P
=quote
)' % video_id, 
  95                 webpage, 'player
', group='player
')), 
  98         flashvars = player['flashvars
'] 
 100         metadata = flashvars.get('metadata
') 
 102             metadata = self._parse_json(metadata, video_id) 
 104             metadata = self._download_json( 
 105                 compat_urllib_parse_unquote(flashvars['metadataUrl
']), 
 106                 video_id, 'Downloading metadata JSON
') 
 108         movie = metadata['movie
'] 
 109         title = movie['title
'] 
 110         thumbnail = movie.get('poster
') 
 111         duration = int_or_none(movie.get('duration
')) 
 113         author = metadata.get('author
', {}) 
 114         uploader_id = author.get('id') 
 115         uploader = author.get('name
') 
 117         upload_date = unified_strdate(self._html_search_meta( 
 118             'ya
:ovs
:upload_date
', webpage, 'upload date
', default=None)) 
 121         adult = self._html_search_meta( 
 122             'ya
:ovs
:adult
', webpage, 'age limit
', default=None) 
 124             age_limit = 18 if adult == 'true
' else 0 
 126         like_count = int_or_none(metadata.get('likeCount
')) 
 131             'thumbnail
': thumbnail, 
 132             'duration
': duration, 
 133             'upload_date
': upload_date, 
 134             'uploader
': uploader, 
 135             'uploader_id
': uploader_id, 
 136             'like_count
': like_count, 
 137             'age_limit
': age_limit, 
 140         if metadata.get('provider
') == 'USER_YOUTUBE
': 
 142                 '_type
': 'url_transparent
', 
 143                 'url
': movie['contentId
'], 
 147         quality = qualities(('mobile
', 'lowest
', 'low
', 'sd
', 'hd
')) 
 152             'format_id
': f['name
'], 
 153             'quality
': quality(f['name
']), 
 154         } for f in metadata['videos
']] 
 155         self._sort_formats(formats) 
 157         info['formats
'] = formats