diff options
| -rw-r--r-- | youtube_dl/extractor/common.py | 28 | 
1 files changed, 22 insertions, 6 deletions
| diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index 0029c3694..57793537b 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -1035,6 +1035,10 @@ class InfoExtractor(object):              'bootstrap info', default=None)          for i, media_el in enumerate(media_nodes): +            tbr = int_or_none(media_el.attrib.get('bitrate')) +            width = int_or_none(media_el.attrib.get('width')) +            height = int_or_none(media_el.attrib.get('height')) +            format_id = '-'.join(filter(None, [f4m_id, compat_str(i if tbr is None else tbr)]))              # If <bootstrapInfo> is present, the specified f4m is a              # stream-level manifest, and only set-level manifests may refer to              # external resources.  See section 11.4 and section 4 of F4M spec @@ -1056,23 +1060,35 @@ class InfoExtractor(object):                  # bitrate in f4m downloader                  ext = determine_ext(manifest_url)                  if ext == 'f4m': -                    formats.extend(self._extract_f4m_formats( +                    f4m_formats = self._extract_f4m_formats(                          manifest_url, video_id, preference=preference, f4m_id=f4m_id, -                        transform_source=transform_source, fatal=fatal)) +                        transform_source=transform_source, fatal=fatal) +                    # Sometimes stream-level manifest contains single media entry that +                    # does not contain any quality metadata (e.g. http://matchtv.ru/#live-player). +                    # At the same time parent's media entry in set-level manifest may +                    # contain it. We will copy it from parent in such cases. +                    if len(f4m_formats) == 1: +                        f = f4m_formats[0] +                        f.update({ +                            'tbr': f.get('tbr') or tbr, +                            'width': f.get('width') or width, +                            'height': f.get('height') or height, +                            'format_id': f.get('format_id') if not tbr else format_id, +                        }) +                    formats.extend(f4m_formats)                      continue                  elif ext == 'm3u8':                      formats.extend(self._extract_m3u8_formats(                          manifest_url, video_id, 'mp4', preference=preference,                          m3u8_id=m3u8_id, fatal=fatal))                      continue -            tbr = int_or_none(media_el.attrib.get('bitrate'))              formats.append({ -                'format_id': '-'.join(filter(None, [f4m_id, compat_str(i if tbr is None else tbr)])), +                'format_id': format_id,                  'url': manifest_url,                  'ext': 'flv' if bootstrap_info else None,                  'tbr': tbr, -                'width': int_or_none(media_el.attrib.get('width')), -                'height': int_or_none(media_el.attrib.get('height')), +                'width': width, +                'height': height,                  'preference': preference,              })          return formats | 
