[ceskatelevize] Extract DASH formats (closes #12119, closes #12133)

This commit is contained in:
Sergey M․ 2017-02-14 22:56:39 +07:00
parent fcca0d53a8
commit 5cb2d36c82
No known key found for this signature in database
GPG Key ID: 2C393E0F18A9236D

View File

@ -13,6 +13,7 @@
float_or_none, float_or_none,
sanitized_Request, sanitized_Request,
urlencode_postdata, urlencode_postdata,
USER_AGENTS,
) )
@ -114,6 +115,9 @@ def _real_extract(self, url):
'requestSource': 'iVysilani', 'requestSource': 'iVysilani',
} }
entries = []
for user_agent in (None, USER_AGENTS['Safari']):
req = sanitized_Request( req = sanitized_Request(
'http://www.ceskatelevize.cz/ivysilani/ajax/get-client-playlist', 'http://www.ceskatelevize.cz/ivysilani/ajax/get-client-playlist',
data=urlencode_postdata(data)) data=urlencode_postdata(data))
@ -121,10 +125,14 @@ def _real_extract(self, url):
req.add_header('Content-type', 'application/x-www-form-urlencoded') req.add_header('Content-type', 'application/x-www-form-urlencoded')
req.add_header('x-addr', '127.0.0.1') req.add_header('x-addr', '127.0.0.1')
req.add_header('X-Requested-With', 'XMLHttpRequest') req.add_header('X-Requested-With', 'XMLHttpRequest')
req.add_header('User-agent', 'Mozilla/5.0') if user_agent:
req.add_header('User-Agent', user_agent)
req.add_header('Referer', url) req.add_header('Referer', url)
playlistpage = self._download_json(req, playlist_id) playlistpage = self._download_json(req, playlist_id, fatal=False)
if not playlistpage:
continue
playlist_url = playlistpage['url'] playlist_url = playlistpage['url']
if playlist_url == 'error_region': if playlist_url == 'error_region':
@ -136,19 +144,32 @@ def _real_extract(self, url):
playlist_title = self._og_search_title(webpage, default=None) playlist_title = self._og_search_title(webpage, default=None)
playlist_description = self._og_search_description(webpage, default=None) playlist_description = self._og_search_description(webpage, default=None)
playlist = self._download_json(req, playlist_id)['playlist'] playlist = self._download_json(req, playlist_id, fatal=False)
if not playlist:
continue
playlist = playlist.get('playlist')
if not isinstance(playlist, list):
continue
playlist_len = len(playlist) playlist_len = len(playlist)
entries = [] for num, item in enumerate(playlist):
for item in playlist:
is_live = item.get('type') == 'LIVE' is_live = item.get('type') == 'LIVE'
formats = [] formats = []
for format_id, stream_url in item['streamUrls'].items(): for format_id, stream_url in item.get('streamUrls', {}).items():
if 'playerType=flash' in stream_url:
formats.extend(self._extract_m3u8_formats( formats.extend(self._extract_m3u8_formats(
stream_url, playlist_id, 'mp4', stream_url, playlist_id, 'mp4',
entry_protocol='m3u8' if is_live else 'm3u8_native', entry_protocol='m3u8' if is_live else 'm3u8_native',
fatal=False)) fatal=False))
self._sort_formats(formats) else:
formats.extend(self._extract_mpd_formats(
stream_url, playlist_id, fatal=False))
if user_agent and len(entries) == playlist_len:
entries[num]['formats'].extend(formats)
continue
item_id = item.get('id') or item['assetId'] item_id = item.get('id') or item['assetId']
title = item['title'] title = item['title']
@ -180,6 +201,9 @@ def _real_extract(self, url):
'is_live': is_live, 'is_live': is_live,
}) })
for e in entries:
self._sort_formats(e['formats'])
return self.playlist_result(entries, playlist_id, playlist_title, playlist_description) return self.playlist_result(entries, playlist_id, playlist_title, playlist_description)
def _get_subtitles(self, episode_id, subs): def _get_subtitles(self, episode_id, subs):