diff options
| author | Sergey M․ <dstftw@gmail.com> | 2017-02-14 22:56:39 +0700 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2017-02-14 22:57:38 +0700 | 
| commit | 5cb2d36c82abf3b753910afe3013b274e31a247a (patch) | |
| tree | eaf7b3149182b2679657ca0ba6427ec0dbfe70d9 | |
| parent | fcca0d53a8fa47614a39a433a3da7d1ab1d88ed9 (diff) | |
[ceskatelevize] Extract DASH formats (closes #12119, closes #12133)
| -rw-r--r-- | youtube_dl/extractor/ceskatelevize.py | 152 | 
1 files changed, 88 insertions, 64 deletions
| diff --git a/youtube_dl/extractor/ceskatelevize.py b/youtube_dl/extractor/ceskatelevize.py index 0f1453b99..e08bf264c 100644 --- a/youtube_dl/extractor/ceskatelevize.py +++ b/youtube_dl/extractor/ceskatelevize.py @@ -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) | 
