2 from __future__ import unicode_literals
6 from .common import InfoExtractor
13 class VestiIE(InfoExtractor):
16 _VALID_URL = r'http://(?:.+?\.)?vesti\.ru/(?P<id>.+)'
20 'url': 'http://www.vesti.ru/videos?vid=575582&cid=1',
24 'title': 'Вести.net: биткоины в России не являются законными',
25 'description': 'md5:d4bb3859dc1177b28a94c5014c35a36b',
30 'skip_download': True,
34 'url': 'http://www.vesti.ru/only_video.html?vid=576180',
38 'title': 'США заморозило, Британию затопило',
39 'description': 'md5:f0ed0695ec05aed27c56a70a58dc4cc1',
44 'skip_download': True,
48 'url': 'http://sochi2014.vesti.ru/video/index/video_id/766403',
52 'title': 'XXII зимние Олимпийские игры. Российские хоккеисты стартовали на Олимпиаде с победы',
53 'description': 'md5:55805dfd35763a890ff50fa9e35e31b3',
58 'skip_download': True,
60 'skip': 'Blocked outside Russia'
63 'url': 'http://sochi2014.vesti.ru/live/play/live_id/301',
67 'title': 'Сочи-2014. Биатлон. Индивидуальная гонка. Мужчины ',
68 'description': 'md5:9e0ed5c9d2fa1efbfdfed90c9a6d179c',
72 'skip_download': True,
74 'skip': 'Translation has finished'
78 def _real_extract(self, url):
79 mobj = re.match(self._VALID_URL, url)
80 video_id = mobj.group('id')
82 page = self._download_webpage(url, video_id, 'Downloading page')
84 mobj = re.search(r'<meta property="og:video" content=".+?\.swf\?v?id=(?P<id>\d+).*?" />', page)
87 video_id = mobj.group('id')
90 r'<div.+?id="current-video-holder".*?>\s*<iframe src="http://player\.rutv\.ru/iframe/(?P<type>[^/]+)/id/(?P<id>\d+)[^"]*"',
94 raise ExtractorError('No media found')
96 video_type = mobj.group('type')
97 video_id = mobj.group('id')
99 json_data = self._download_json(
100 'http://player.rutv.ru/iframe/%splay/id/%s' % ('live-' if video_type == 'live' else '', video_id),
101 video_id, 'Downloading JSON')
103 if json_data['errors']:
104 raise ExtractorError('vesti returned error: %s' % json_data['errors'], expected=True)
106 playlist = json_data['data']['playlist']
107 medialist = playlist['medialist']
111 raise ExtractorError('vesti returned error: %s' % media['errors'], expected=True)
113 view_count = playlist.get('count_views')
114 priority_transport = playlist['priority_transport']
116 thumbnail = media['picture']
117 width = media['width']
118 height = media['height']
119 description = media['anons']
120 title = media['title']
121 duration = int_or_none(media.get('duration'))
125 for transport, links in media['sources'].items():
126 for quality, url in links.items():
127 if transport == 'rtmp':
128 mobj = re.search(r'^(?P<url>rtmp://[^/]+/(?P<app>.+))/(?P<playpath>.+)$', url)
132 'url': mobj.group('url'),
133 'play_path': mobj.group('playpath'),
134 'app': mobj.group('app'),
135 'page_url': 'http://player.rutv.ru',
136 'player_url': 'http://player.rutv.ru/flash2v/osmf.swf?i=22',
141 elif transport == 'm3u8':
153 'format_id': '%s-%s' % (transport, quality),
154 'preference': -1 if priority_transport == transport else -2,
159 raise ExtractorError('No media links available for %s' % video_id)
161 self._sort_formats(formats)
166 'description': description,
167 'thumbnail': thumbnail,
168 'view_count': view_count,
169 'duration': duration,