|
@@ -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)
|
|
|
|