3 from .common
import InfoExtractor
11 class RUTVIE(InfoExtractor
):
15 (?:test)?player\.(?:rutv\.ru|vgtrk\.com)/
17 flash\d+v/container\.swf\?id=|
18 iframe/(?P<type>swf|video|live)/id/|
24 r
'<iframe[^>]+?src=(["\'])(?P
<url
>https?
://(?
:test
)?player\
.(?
:rutv\
.ru|vgtrk\
.com
)/(?
:iframe
/(?
:swf|video|live
)/id|index
/iframe
/cast_id
)/.+?
)\
1',
25 r'<meta
[^
>]+?
property=(["\'])og:video\1[^>]+?content=(["\'])(?P
<url
>https?
://(?
:test
)?player\
.(?
:rutv\
.ru|vgtrk\
.com
)/flash\d
+v
/container\
.swf
\?id=.+?\
2)',
30 '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',
34 'title
': 'Монологи на все времена
',
35 'description
': 'md5
:18d8b5e6a41fb1faa53819471852d5d5
',
40 'skip_download
': True,
44 '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',
48 'title
': 'Чужой в семье Сталина
',
54 'skip_download
': True,
58 'url
': 'http
://player
.rutv
.ru
/iframe
/swf
/id/766888/sid
/hitech
/?acc_video_id
=4000',
62 'title
': 'Вести
.net
: интернет
-гиганты начали перетягивание программных
"одеял"',
63 'description
': 'md5
:65ddd47f9830c4f42ed6475f8730c995
',
68 'skip_download
': True,
72 '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',
76 'title
': 'Прямой эфир
. Жертвы загадочной болезни
: смерть от старости в
17 лет
',
77 'description
': 'md5
:b81c8c55247a4bd996b43ce17395b2d8
',
82 'skip_download
': True,
86 'url
': 'http
://player
.rutv
.ru
/iframe
/live
/id/51499/showZoomBtn
/false
/isPlay
/true
/sid
/sochi2014
',
90 'title
': 'Сочи
-2014. Биатлон
. Индивидуальная гонка
. Мужчины
',
91 'description
': 'md5
:9e0ed5c9d2fa1efbfdfed90c9a6d179c
',
93 'skip
': 'Translation has finished
',
96 'url
': 'http
://player
.rutv
.ru
/iframe
/live
/id/21/showZoomBtn
/false
/isPlay
/true
/',
100 'title
': 're
:^Россия
24. Прямой эфир
[0-9]{4}
-[0-9]{2}
-[0-9]{2}
[0-9]{2}
:[0-9]{2}$
',
105 'skip_download
': True,
109 'url
': 'https
://testplayer
.vgtrk
.com
/iframe
/live
/id/19201/showZoomBtn
/false
/isPlay
/true
/',
110 'only_matching
': True,
114 def _real_extract(self, url):
115 mobj = self._match_valid_url(url)
116 video_id = mobj.group('id')
117 video_path = mobj.group('path
')
119 if re.match(r'flash\d
+v
', video_path):
121 elif video_path.startswith('iframe
'):
122 video_type = mobj.group('type')
123 if video_type == 'swf
':
125 elif video_path.startswith('index
/iframe
/cast_id
'):
128 is_live = video_type == 'live
'
130 json_data = self._download_json(
131 'http
://player
.vgtrk
.com
/iframe
/data
%s/id/%s' % ('live
' if is_live else 'video
', video_id),
132 video_id, 'Downloading JSON
')
134 if json_data['errors
']:
135 raise ExtractorError('%s said
: %s' % (self.IE_NAME, json_data['errors
']), expected=True)
137 playlist = json_data['data
']['playlist
']
138 medialist = playlist['medialist
']
142 raise ExtractorError('%s said
: %s' % (self.IE_NAME, media['errors
']), expected=True)
144 view_count = int_or_none(playlist.get('count_views
'))
145 priority_transport = playlist['priority_transport
']
147 thumbnail = media['picture
']
148 width = int_or_none(media['width
'])
149 height = int_or_none(media['height
'])
150 description = media['anons
']
151 title = media['title
']
152 duration = int_or_none(media.get('duration
'))
157 for transport, links in media['sources
'].items():
158 for quality, url in links.items():
159 preference = -1 if priority_transport == transport else -2
160 if transport == 'rtmp
':
161 mobj = re.search(r'^
(?P
<url
>rtmp
://[^
/]+/(?P
<app
>.+))/(?P
<playpath
>.+)$
', url)
165 'url
': mobj.group('url
'),
166 'play_path
': mobj.group('playpath
'),
167 'app
': mobj.group('app
'),
168 'page_url
': 'http
://player
.rutv
.ru
',
169 'player_url
': 'http
://player
.rutv
.ru
/flash3v
/osmf
.swf?i
=22',
172 'vbr
': str_to_int(quality),
174 elif transport == 'm3u8
':
175 fmt, subs = self._extract_m3u8_formats_and_subtitles(
176 url, video_id, 'mp4
', quality=preference, m3u8_id='hls
')
178 self._merge_subtitles(subs, target=subtitles)
185 'width
': int_or_none(quality, default=height, invscale=width, scale=height),
186 'height
': int_or_none(quality, default=height),
187 'format_id
': '%s-%s' % (transport, quality),
188 'source_preference
': preference,
195 'description
': description,
196 'thumbnail
': thumbnail,
197 'view_count
': view_count,
198 'duration
': duration,
200 'subtitles
': subtitles,
202 '_format_sort_fields
': ('source
', ),