diff options
Diffstat (limited to 'youtube_dl/extractor/ooyala.py')
| -rw-r--r-- | youtube_dl/extractor/ooyala.py | 118 | 
1 files changed, 64 insertions, 54 deletions
| diff --git a/youtube_dl/extractor/ooyala.py b/youtube_dl/extractor/ooyala.py index 95e982897..2038a6ba5 100644 --- a/youtube_dl/extractor/ooyala.py +++ b/youtube_dl/extractor/ooyala.py @@ -8,6 +8,7 @@ from ..utils import (      float_or_none,      ExtractorError,      unsmuggle_url, +    determine_ext,  )  from ..compat import compat_urllib_parse_urlencode @@ -15,71 +16,80 @@ from ..compat import compat_urllib_parse_urlencode  class OoyalaBaseIE(InfoExtractor):      _PLAYER_BASE = 'http://player.ooyala.com/'      _CONTENT_TREE_BASE = _PLAYER_BASE + 'player_api/v1/content_tree/' -    _AUTHORIZATION_URL_TEMPLATE = _PLAYER_BASE + 'sas/player_api/v1/authorization/embed_code/%s/%s?' +    _AUTHORIZATION_URL_TEMPLATE = _PLAYER_BASE + 'sas/player_api/v2/authorization/embed_code/%s/%s?'      def _extract(self, content_tree_url, video_id, domain='example.org'):          content_tree = self._download_json(content_tree_url, video_id)['content_tree']          metadata = content_tree[list(content_tree)[0]]          embed_code = metadata['embed_code']          pcode = metadata.get('asset_pcode') or embed_code -        video_info = { -            'id': embed_code, -            'title': metadata['title'], -            'description': metadata.get('description'), -            'thumbnail': metadata.get('thumbnail_image') or metadata.get('promo_image'), -            'duration': float_or_none(metadata.get('duration'), 1000), -        } +        title = metadata['title'] + +        auth_data = self._download_json( +            self._AUTHORIZATION_URL_TEMPLATE % (pcode, embed_code) + +            compat_urllib_parse_urlencode({ +                'domain': domain, +                'supportedFormats': 'mp4,rtmp,m3u8,hds', +            }), video_id) + +        cur_auth_data = auth_data['authorization_data'][embed_code]          urls = []          formats = [] -        for supported_format in ('mp4', 'm3u8', 'hds', 'rtmp'): -            auth_data = self._download_json( -                self._AUTHORIZATION_URL_TEMPLATE % (pcode, embed_code) + -                compat_urllib_parse_urlencode({ -                    'domain': domain, -                    'supportedFormats': supported_format -                }), -                video_id, 'Downloading %s JSON' % supported_format) - -            cur_auth_data = auth_data['authorization_data'][embed_code] - -            if cur_auth_data['authorized']: -                for stream in cur_auth_data['streams']: -                    url = base64.b64decode( -                        stream['url']['data'].encode('ascii')).decode('utf-8') -                    if url in urls: -                        continue -                    urls.append(url) -                    delivery_type = stream['delivery_type'] -                    if delivery_type == 'hls' or '.m3u8' in url: -                        formats.extend(self._extract_m3u8_formats( -                            url, embed_code, 'mp4', 'm3u8_native', -                            m3u8_id='hls', fatal=False)) -                    elif delivery_type == 'hds' or '.f4m' in url: -                        formats.extend(self._extract_f4m_formats( -                            url + '?hdcore=3.7.0', embed_code, f4m_id='hds', fatal=False)) -                    elif '.smil' in url: -                        formats.extend(self._extract_smil_formats( -                            url, embed_code, fatal=False)) -                    else: -                        formats.append({ -                            'url': url, -                            'ext': stream.get('delivery_type'), -                            'vcodec': stream.get('video_codec'), -                            'format_id': delivery_type, -                            'width': int_or_none(stream.get('width')), -                            'height': int_or_none(stream.get('height')), -                            'abr': int_or_none(stream.get('audio_bitrate')), -                            'vbr': int_or_none(stream.get('video_bitrate')), -                            'fps': float_or_none(stream.get('framerate')), -                        }) -            else: -                raise ExtractorError('%s said: %s' % ( -                    self.IE_NAME, cur_auth_data['message']), expected=True) +        if cur_auth_data['authorized']: +            for stream in cur_auth_data['streams']: +                s_url = base64.b64decode( +                    stream['url']['data'].encode('ascii')).decode('utf-8') +                if s_url in urls: +                    continue +                urls.append(s_url) +                ext = determine_ext(s_url, None) +                delivery_type = stream['delivery_type'] +                if delivery_type == 'hls' or ext == 'm3u8': +                    formats.extend(self._extract_m3u8_formats( +                        s_url, embed_code, 'mp4', 'm3u8_native', +                        m3u8_id='hls', fatal=False)) +                elif delivery_type == 'hds' or ext == 'f4m': +                    formats.extend(self._extract_f4m_formats( +                        s_url + '?hdcore=3.7.0', embed_code, f4m_id='hds', fatal=False)) +                elif ext == 'smil': +                    formats.extend(self._extract_smil_formats( +                        s_url, embed_code, fatal=False)) +                else: +                    formats.append({ +                        'url': s_url, +                        'ext': ext or stream.get('delivery_type'), +                        'vcodec': stream.get('video_codec'), +                        'format_id': delivery_type, +                        'width': int_or_none(stream.get('width')), +                        'height': int_or_none(stream.get('height')), +                        'abr': int_or_none(stream.get('audio_bitrate')), +                        'vbr': int_or_none(stream.get('video_bitrate')), +                        'fps': float_or_none(stream.get('framerate')), +                    }) +        else: +            raise ExtractorError('%s said: %s' % ( +                self.IE_NAME, cur_auth_data['message']), expected=True)          self._sort_formats(formats) -        video_info['formats'] = formats -        return video_info +        subtitles = {} +        for lang, sub in metadata.get('closed_captions_vtt', {}).get('captions', {}).items(): +            sub_url = sub.get('url') +            if not sub_url: +                continue +            subtitles[lang] = [{ +                'url': sub_url, +            }] + +        return { +            'id': embed_code, +            'title': title, +            'description': metadata.get('description'), +            'thumbnail': metadata.get('thumbnail_image') or metadata.get('promo_image'), +            'duration': float_or_none(metadata.get('duration'), 1000), +            'subtitles': subtitles, +            'formats': formats, +        }  class OoyalaIE(OoyalaBaseIE): | 
