diff options
| -rw-r--r-- | youtube_dl/extractor/common.py | 106 | 
1 files changed, 56 insertions, 50 deletions
| diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index eb3c091aa..9b73a948c 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -2198,56 +2198,7 @@ class InfoExtractor(object):              this_video_id = video_id or video_data['mediaid'] -            formats = [] -            for source in video_data['sources']: -                source_url = self._proto_relative_url(source['file']) -                if base_url: -                    source_url = compat_urlparse.urljoin(base_url, source_url) -                source_type = source.get('type') or '' -                ext = mimetype2ext(source_type) or determine_ext(source_url) -                if source_type == 'hls' or ext == 'm3u8': -                    formats.extend(self._extract_m3u8_formats( -                        source_url, this_video_id, 'mp4', 'm3u8_native', m3u8_id=m3u8_id, fatal=False)) -                elif ext == 'mpd': -                    formats.extend(self._extract_mpd_formats( -                        source_url, this_video_id, mpd_id=mpd_id, fatal=False)) -                # https://github.com/jwplayer/jwplayer/blob/master/src/js/providers/default.js#L67 -                elif source_type.startswith('audio') or ext in ('oga', 'aac', 'mp3', 'mpeg', 'vorbis'): -                    formats.append({ -                        'url': source_url, -                        'vcodec': 'none', -                        'ext': ext, -                    }) -                else: -                    height = int_or_none(source.get('height')) -                    if height is None: -                        # Often no height is provided but there is a label in -                        # format like 1080p. -                        height = int_or_none(self._search_regex( -                            r'^(\d{3,})[pP]$', source.get('label') or '', -                            'height', default=None)) -                    a_format = { -                        'url': source_url, -                        'width': int_or_none(source.get('width')), -                        'height': height, -                        'ext': ext, -                    } -                    if source_url.startswith('rtmp'): -                        a_format['ext'] = 'flv' - -                        # See com/longtailvideo/jwplayer/media/RTMPMediaProvider.as -                        # of jwplayer.flash.swf -                        rtmp_url_parts = re.split( -                            r'((?:mp4|mp3|flv):)', source_url, 1) -                        if len(rtmp_url_parts) == 3: -                            rtmp_url, prefix, play_path = rtmp_url_parts -                            a_format.update({ -                                'url': rtmp_url, -                                'play_path': prefix + play_path, -                            }) -                        if rtmp_params: -                            a_format.update(rtmp_params) -                    formats.append(a_format) +            formats = self._parse_jwplayer_formats(video_data['sources'], this_video_id)              self._sort_formats(formats)              subtitles = {} @@ -2278,6 +2229,61 @@ class InfoExtractor(object):          else:              return self.playlist_result(entries) +    def _parse_jwplayer_formats(self, jwplayer_sources_data, video_id=None, +                                m3u8_id=None, mpd_id=None, rtmp_params=None, base_url=None): +        formats = [] +        for source in jwplayer_sources_data : +            source_url = self._proto_relative_url(source['file']) +            if base_url: +                source_url = compat_urlparse.urljoin(base_url, source_url) +            source_type = source.get('type') or '' +            ext = mimetype2ext(source_type) or determine_ext(source_url) +            if source_type == 'hls' or ext == 'm3u8': +                formats.extend(self._extract_m3u8_formats( +                    source_url, video_id, 'mp4', 'm3u8_native', m3u8_id=m3u8_id, fatal=False)) +            elif ext == 'mpd': +                formats.extend(self._extract_mpd_formats( +                    source_url, video_id, mpd_id=mpd_id, fatal=False)) +            # https://github.com/jwplayer/jwplayer/blob/master/src/js/providers/default.js#L67 +            elif source_type.startswith('audio') or ext in ('oga', 'aac', 'mp3', 'mpeg', 'vorbis'): +                formats.append({ +                    'url': source_url, +                    'vcodec': 'none', +                    'ext': ext, +                }) +            else: +                height = int_or_none(source.get('height')) +                if height is None: +                    # Often no height is provided but there is a label in +                    # format like 1080p. +                    height = int_or_none(self._search_regex( +                        r'^(\d{3,})[pP]$', source.get('label') or '', +                        'height', default=None)) +                a_format = { +                    'url': source_url, +                    'width': int_or_none(source.get('width')), +                    'height': height, +                    'ext': ext, +                } +                if source_url.startswith('rtmp'): +                    a_format['ext'] = 'flv' + +                    # See com/longtailvideo/jwplayer/media/RTMPMediaProvider.as +                    # of jwplayer.flash.swf +                    rtmp_url_parts = re.split( +                        r'((?:mp4|mp3|flv):)', source_url, 1) +                    if len(rtmp_url_parts) == 3: +                        rtmp_url, prefix, play_path = rtmp_url_parts +                        a_format.update({ +                            'url': rtmp_url, +                            'play_path': prefix + play_path, +                        }) +                    if rtmp_params: +                        a_format.update(rtmp_params) +                formats.append(a_format) +        return formats + +      def _live_title(self, name):          """ Generate the title for a live video """          now = datetime.datetime.now() | 
