[rutv] Refactor vgtrk/rutv extractor

pull/2568/merge
Sergey M․ 11 years ago
parent b6c1ceccc2
commit a7515ec265

@ -196,6 +196,7 @@ from .rutube import (
RutubeMovieIE, RutubeMovieIE,
RutubePersonIE, RutubePersonIE,
) )
from .rutv import RUTVIE
from .savefrom import SaveFromIE from .savefrom import SaveFromIE
from .servingsys import ServingSysIE from .servingsys import ServingSysIE
from .sina import SinaIE from .sina import SinaIE
@ -252,7 +253,6 @@ from .vbox7 import Vbox7IE
from .veehd import VeeHDIE from .veehd import VeeHDIE
from .veoh import VeohIE from .veoh import VeohIE
from .vevo import VevoIE from .vevo import VevoIE
from .vgtrk import VGTRKIE
from .vice import ViceIE from .vice import ViceIE
from .viddler import ViddlerIE from .viddler import ViddlerIE
from .videobam import VideoBamIE from .videobam import VideoBamIE

@ -10,33 +10,19 @@ from ..utils import (
) )
class VGTRKIE(InfoExtractor): class RUTVIE(InfoExtractor):
IE_DESC = 'ВГТРК' IE_DESC = 'RUTV.RU'
_VALID_URL = r'http://(?:.+?\.)?(?:vesti\.ru|russia2?\.tv|tvkultura\.ru|rutv\.ru)/(?P<id>.+)' _VALID_URL = r'https?://player\.(?:rutv\.ru|vgtrk\.com)/(?:flash2v/container\.swf\?id=|iframe/(?P<type>swf|video|live)/id/)(?P<id>\d+)'
_TESTS = [ _TESTS = [
{ {
'url': 'http://www.vesti.ru/videos?vid=575582&cid=1', 'url': 'http://player.rutv.ru/flash2v/container.swf?id=774471&sid=kultura&fbv=true&isPlay=true&ssl=false&i=560&acc_video_id=episode_id/972347/video_id/978186/brand_id/31724',
'info_dict': { 'info_dict': {
'id': '765035', 'id': '774471',
'ext': 'mp4',
'title': 'Вести.net: биткоины в России не являются законными',
'description': 'md5:d4bb3859dc1177b28a94c5014c35a36b',
'duration': 302,
},
'params': {
# m3u8 download
'skip_download': True,
},
},
{
'url': 'http://www.vesti.ru/doc.html?id=1349233',
'info_dict': {
'id': '773865',
'ext': 'mp4', 'ext': 'mp4',
'title': 'Участники митинга штурмуют Донецкую областную администрацию', 'title': 'Монологи на все времена',
'description': 'md5:1a160e98b3195379b4c849f2f4958009', 'description': 'md5:18d8b5e6a41fb1faa53819471852d5d5',
'duration': 210, 'duration': 2906,
}, },
'params': { 'params': {
# m3u8 download # m3u8 download
@ -44,13 +30,13 @@ class VGTRKIE(InfoExtractor):
}, },
}, },
{ {
'url': 'http://www.vesti.ru/only_video.html?vid=576180', 'url': 'https://player.vgtrk.com/flash2v/container.swf?id=774016&sid=russiatv&fbv=true&isPlay=true&ssl=false&i=560&acc_video_id=episode_id/972098/video_id/977760/brand_id/57638',
'info_dict': { 'info_dict': {
'id': '766048', 'id': '774016',
'ext': 'mp4', 'ext': 'mp4',
'title': 'США заморозило, Британию затопило', 'title': 'Чужой в семье Сталина',
'description': 'md5:f0ed0695ec05aed27c56a70a58dc4cc1', 'description': '',
'duration': 87, 'duration': 2539,
}, },
'params': { 'params': {
# m3u8 download # m3u8 download
@ -58,7 +44,7 @@ class VGTRKIE(InfoExtractor):
}, },
}, },
{ {
'url': 'http://hitech.vesti.ru/news/view/id/4000', 'url': 'http://player.rutv.ru/iframe/swf/id/766888/sid/hitech/?acc_video_id=4000',
'info_dict': { 'info_dict': {
'id': '766888', 'id': '766888',
'ext': 'mp4', 'ext': 'mp4',
@ -72,22 +58,21 @@ class VGTRKIE(InfoExtractor):
}, },
}, },
{ {
'url': 'http://sochi2014.vesti.ru/video/index/video_id/766403', 'url': 'http://player.rutv.ru/iframe/video/id/771852/start_zoom/true/showZoomBtn/false/sid/russiatv/?acc_video_id=episode_id/970443/video_id/975648/brand_id/5169',
'info_dict': { 'info_dict': {
'id': '766403', 'id': '771852',
'ext': 'mp4', 'ext': 'mp4',
'title': 'XXII зимние Олимпийские игры. Российские хоккеисты стартовали на Олимпиаде с победы', 'title': 'Прямой эфир. Жертвы загадочной болезни: смерть от старости в 17 лет',
'description': 'md5:55805dfd35763a890ff50fa9e35e31b3', 'description': 'md5:b81c8c55247a4bd996b43ce17395b2d8',
'duration': 271, 'duration': 3096,
}, },
'params': { 'params': {
# m3u8 download # m3u8 download
'skip_download': True, 'skip_download': True,
}, },
'skip': 'Blocked outside Russia',
}, },
{ {
'url': 'http://sochi2014.vesti.ru/live/play/live_id/301', 'url': 'http://player.rutv.ru/iframe/live/id/51499/showZoomBtn/false/isPlay/true/sid/sochi2014',
'info_dict': { 'info_dict': {
'id': '51499', 'id': '51499',
'ext': 'flv', 'ext': 'flv',
@ -98,124 +83,44 @@ class VGTRKIE(InfoExtractor):
# rtmp download # rtmp download
'skip_download': True, 'skip_download': True,
}, },
'skip': 'Translation has finished' 'skip': 'Translation has finished',
},
{
'url': 'http://russia.tv/video/show/brand_id/5169/episode_id/970443/video_id/975648',
'info_dict': {
'id': '771852',
'ext': 'mp4',
'title': 'Прямой эфир. Жертвы загадочной болезни: смерть от старости в 17 лет',
'description': 'md5:b81c8c55247a4bd996b43ce17395b2d8',
'duration': 3096,
},
'params': {
# m3u8 download
'skip_download': True,
},
},
{
'url': 'http://russia.tv/brand/show/brand_id/57638',
'info_dict': {
'id': '774016',
'ext': 'mp4',
'title': 'Чужой в семье Сталина',
'description': '',
'duration': 2539,
},
'params': {
# m3u8 download
'skip_download': True,
},
},
{
'url': 'http://2.russia.tv/video/show/brand_id/48863/episode_id/972920/video_id/978667/viewtype/picture',
'info_dict': {
'id': '775081',
'ext': 'mp4',
'title': 'XXII зимние Олимпийские игры. Россияне заняли весь пьедестал в лыжных гонках',
'description': 'md5:15d3741dd8d04b203fbc031c6a47fb0f',
'duration': 101,
},
'params': {
# m3u8 download
'skip_download': True,
},
'skip': 'Blocked outside Russia',
},
{
'url': 'http://tvkultura.ru/video/show/brand_id/31724/episode_id/972347/video_id/978186',
'info_dict': {
'id': '774471',
'ext': 'mp4',
'title': 'Монологи на все времена',
'description': 'md5:18d8b5e6a41fb1faa53819471852d5d5',
'duration': 2906,
},
'params': {
# m3u8 download
'skip_download': True,
},
},
{
'url': 'http://rutv.ru/brand/show/id/6792/channel/75',
'info_dict': {
'id': '125521',
'ext': 'mp4',
'title': 'Грустная дама червей. Х',
'description': '',
'duration': 4882,
},
'params': {
# m3u8 download
'skip_download': True,
},
}, },
] ]
def _real_extract(self, url): @classmethod
mobj = re.match(self._VALID_URL, url) def _extract_url(cls, webpage):
video_id = mobj.group('id')
page = self._download_webpage(url, video_id, 'Downloading page')
mobj = re.search( mobj = re.search(
r'<meta property="og:video" content="http://www\.vesti\.ru/i/flvplayer_videoHost\.swf\?vid=(?P<id>\d+)', r'<iframe[^>]+?src=(["\'])(?P<url>https?://player\.rutv\.ru/iframe/(?:swf|video|live)/id/.+?)\1', webpage)
page)
if mobj: if mobj:
video_id = mobj.group('id') return mobj.group('url')
page = self._download_webpage('http://www.vesti.ru/only_video.html?vid=%s' % video_id, video_id,
'Downloading video page')
mobj = re.search( mobj = re.search(
r'<meta property="og:video" content="http://player\.rutv\.ru/flash2v/container\.swf\?id=(?P<id>\d+)', page) r'<meta[^>]+?property=(["\'])og:video\1[^>]+?content=(["\'])(?P<url>http://player\.(?:rutv\.ru|vgtrk\.com)/flash2v/container\.swf\?id=.+?\2)',
webpage)
if mobj: if mobj:
video_type = 'video' return mobj.group('url')
video_id = mobj.group('id')
else:
mobj = re.search(
r'<iframe.+?src="http://player\.rutv\.ru/iframe/(?P<type>[^/]+)/id/(?P<id>\d+)[^"]*".*?></iframe>',
page)
if not mobj:
raise ExtractorError('No media found', expected=True)
video_type = mobj.group('type') def _real_extract(self, url):
mobj = re.match(self._VALID_URL, url)
video_id = mobj.group('id') video_id = mobj.group('id')
video_type = mobj.group('type')
if not video_type or video_type == 'swf':
video_type = 'video'
json_data = self._download_json( json_data = self._download_json(
'http://player.rutv.ru/iframe/%splay/id/%s' % ('live-' if video_type == 'live' else '', video_id), 'http://player.rutv.ru/iframe/%splay/id/%s' % ('live-' if video_type == 'live' else '', video_id),
video_id, 'Downloading JSON') video_id, 'Downloading JSON')
if json_data['errors']: if json_data['errors']:
raise ExtractorError('vesti returned error: %s' % json_data['errors'], expected=True) raise ExtractorError('%s said: %s' % (self.IE_NAME, json_data['errors']), expected=True)
playlist = json_data['data']['playlist'] playlist = json_data['data']['playlist']
medialist = playlist['medialist'] medialist = playlist['medialist']
media = medialist[0] media = medialist[0]
if media['errors']: if media['errors']:
raise ExtractorError('vesti returned error: %s' % media['errors'], expected=True) raise ExtractorError('%s said: %s' % (self.IE_NAME, media['errors']), expected=True)
view_count = playlist.get('count_views') view_count = playlist.get('count_views')
priority_transport = playlist['priority_transport'] priority_transport = playlist['priority_transport']
Loading…
Cancel
Save