|
|
@ -13,6 +13,7 @@ from ..utils import ( |
|
|
|
float_or_none, |
|
|
|
sanitized_Request, |
|
|
|
urlencode_postdata, |
|
|
|
USER_AGENTS, |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
@ -114,71 +115,94 @@ class CeskaTelevizeIE(InfoExtractor): |
|
|
|
'requestSource': 'iVysilani', |
|
|
|
} |
|
|
|
|
|
|
|
req = sanitized_Request( |
|
|
|
'http://www.ceskatelevize.cz/ivysilani/ajax/get-client-playlist', |
|
|
|
data=urlencode_postdata(data)) |
|
|
|
|
|
|
|
req.add_header('Content-type', 'application/x-www-form-urlencoded') |
|
|
|
req.add_header('x-addr', '127.0.0.1') |
|
|
|
req.add_header('X-Requested-With', 'XMLHttpRequest') |
|
|
|
req.add_header('User-agent', 'Mozilla/5.0') |
|
|
|
req.add_header('Referer', url) |
|
|
|
|
|
|
|
playlistpage = self._download_json(req, playlist_id) |
|
|
|
|
|
|
|
playlist_url = playlistpage['url'] |
|
|
|
if playlist_url == 'error_region': |
|
|
|
raise ExtractorError(NOT_AVAILABLE_STRING, expected=True) |
|
|
|
|
|
|
|
req = sanitized_Request(compat_urllib_parse_unquote(playlist_url)) |
|
|
|
req.add_header('Referer', url) |
|
|
|
|
|
|
|
playlist_title = self._og_search_title(webpage, default=None) |
|
|
|
playlist_description = self._og_search_description(webpage, default=None) |
|
|
|
|
|
|
|
playlist = self._download_json(req, playlist_id)['playlist'] |
|
|
|
playlist_len = len(playlist) |
|
|
|
|
|
|
|
entries = [] |
|
|
|
for item in playlist: |
|
|
|
is_live = item.get('type') == 'LIVE' |
|
|
|
formats = [] |
|
|
|
for format_id, stream_url in item['streamUrls'].items(): |
|
|
|
formats.extend(self._extract_m3u8_formats( |
|
|
|
stream_url, playlist_id, 'mp4', |
|
|
|
entry_protocol='m3u8' if is_live else 'm3u8_native', |
|
|
|
fatal=False)) |
|
|
|
self._sort_formats(formats) |
|
|
|
|
|
|
|
item_id = item.get('id') or item['assetId'] |
|
|
|
title = item['title'] |
|
|
|
|
|
|
|
duration = float_or_none(item.get('duration')) |
|
|
|
thumbnail = item.get('previewImageUrl') |
|
|
|
|
|
|
|
subtitles = {} |
|
|
|
if item.get('type') == 'VOD': |
|
|
|
subs = item.get('subtitles') |
|
|
|
if subs: |
|
|
|
subtitles = self.extract_subtitles(episode_id, subs) |
|
|
|
|
|
|
|
if playlist_len == 1: |
|
|
|
final_title = playlist_title or title |
|
|
|
if is_live: |
|
|
|
final_title = self._live_title(final_title) |
|
|
|
else: |
|
|
|
final_title = '%s (%s)' % (playlist_title, title) |
|
|
|
|
|
|
|
entries.append({ |
|
|
|
'id': item_id, |
|
|
|
'title': final_title, |
|
|
|
'description': playlist_description if playlist_len == 1 else None, |
|
|
|
'thumbnail': thumbnail, |
|
|
|
'duration': duration, |
|
|
|
'formats': formats, |
|
|
|
'subtitles': subtitles, |
|
|
|
'is_live': is_live, |
|
|
|
}) |
|
|
|
|
|
|
|
for user_agent in (None, USER_AGENTS['Safari']): |
|
|
|
req = sanitized_Request( |
|
|
|
'http://www.ceskatelevize.cz/ivysilani/ajax/get-client-playlist', |
|
|
|
data=urlencode_postdata(data)) |
|
|
|
|
|
|
|
req.add_header('Content-type', 'application/x-www-form-urlencoded') |
|
|
|
req.add_header('x-addr', '127.0.0.1') |
|
|
|
req.add_header('X-Requested-With', 'XMLHttpRequest') |
|
|
|
if user_agent: |
|
|
|
req.add_header('User-Agent', user_agent) |
|
|
|
req.add_header('Referer', url) |
|
|
|
|
|
|
|
playlistpage = self._download_json(req, playlist_id, fatal=False) |
|
|
|
|
|
|
|
if not playlistpage: |
|
|
|
continue |
|
|
|
|
|
|
|
playlist_url = playlistpage['url'] |
|
|
|
if playlist_url == 'error_region': |
|
|
|
raise ExtractorError(NOT_AVAILABLE_STRING, expected=True) |
|
|
|
|
|
|
|
req = sanitized_Request(compat_urllib_parse_unquote(playlist_url)) |
|
|
|
req.add_header('Referer', url) |
|
|
|
|
|
|
|
playlist_title = self._og_search_title(webpage, default=None) |
|
|
|
playlist_description = self._og_search_description(webpage, default=None) |
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
for num, item in enumerate(playlist): |
|
|
|
is_live = item.get('type') == 'LIVE' |
|
|
|
formats = [] |
|
|
|
for format_id, stream_url in item.get('streamUrls', {}).items(): |
|
|
|
if 'playerType=flash' in stream_url: |
|
|
|
formats.extend(self._extract_m3u8_formats( |
|
|
|
stream_url, playlist_id, 'mp4', |
|
|
|
entry_protocol='m3u8' if is_live else 'm3u8_native', |
|
|
|
fatal=False)) |
|
|
|
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'] |
|
|
|
title = item['title'] |
|
|
|
|
|
|
|
duration = float_or_none(item.get('duration')) |
|
|
|
thumbnail = item.get('previewImageUrl') |
|
|
|
|
|
|
|
subtitles = {} |
|
|
|
if item.get('type') == 'VOD': |
|
|
|
subs = item.get('subtitles') |
|
|
|
if subs: |
|
|
|
subtitles = self.extract_subtitles(episode_id, subs) |
|
|
|
|
|
|
|
if playlist_len == 1: |
|
|
|
final_title = playlist_title or title |
|
|
|
if is_live: |
|
|
|
final_title = self._live_title(final_title) |
|
|
|
else: |
|
|
|
final_title = '%s (%s)' % (playlist_title, title) |
|
|
|
|
|
|
|
entries.append({ |
|
|
|
'id': item_id, |
|
|
|
'title': final_title, |
|
|
|
'description': playlist_description if playlist_len == 1 else None, |
|
|
|
'thumbnail': thumbnail, |
|
|
|
'duration': duration, |
|
|
|
'formats': formats, |
|
|
|
'subtitles': subtitles, |
|
|
|
'is_live': is_live, |
|
|
|
}) |
|
|
|
|
|
|
|
for e in entries: |
|
|
|
self._sort_formats(e['formats']) |
|
|
|
|
|
|
|
return self.playlist_result(entries, playlist_id, playlist_title, playlist_description) |
|
|
|
|
|
|
|