- def _extract_formats(self, assets):
- vformats = []
- for asset in assets.findall("asset"):
- if asset.find("downloadUrl") is None:
- continue
- vformat = {}
- vformat["url"] = asset.find("downloadUrl").text
- vformat["ext"] = asset.find("mediaType").text
- vformat["format_id"] = asset.get("type")
- vformat["width"] = int(asset.find("frameWidth").text)
- vformat["height"] = int(asset.find("frameHeight").text)
- vformat["resolution"] = "%ix%i" % (vformat["width"], vformat["height"])
- vformat["tbr"] = int(asset.find("bitrateVideo").text)
- vformat["abr"] = int(asset.find("bitrateAudio").text)
- vformat["vcodec"] = asset.find("codecVideo").text
- vformat["container"] = vformat["ext"]
- vformat["filesize"] = int(asset.find("size").text)
- vformat["preference"] = vformat["quality"] = -1
- vformat["format"] = "%s container with %i Kbps %s" % (vformat["container"], vformat["tbr"], vformat["vcodec"])
- vformats.append(vformat)
- self._sort_formats(vformats)
- return vformats
+ def _extract_formats(self, assets, media_id):
+ formats = []
+ for asset in assets.findall('asset'):
+ format_url = xpath_text(asset, ['downloadUrl', 'url'])
+ asset_type = asset.get('type')
+ if asset_type == 'HDS':
+ f4m_formats = self._extract_f4m_formats(
+ format_url + '?hdcore=3.2.0', media_id, f4m_id='hds', fatal=False)
+ if f4m_formats:
+ formats.extend(f4m_formats)
+ elif asset_type == 'HLS':
+ m3u8_formats = self._extract_m3u8_formats(
+ format_url, media_id, 'mp4', 'm3u8_native', m3u8_id='hds', fatal=False)
+ if m3u8_formats:
+ formats.extend(m3u8_formats)
+ else:
+ format_info = {
+ 'ext': xpath_text(asset, 'mediaType'),
+ 'width': int_or_none(xpath_text(asset, 'frameWidth')),
+ 'height': int_or_none(xpath_text(asset, 'frameHeight')),
+ 'tbr': int_or_none(xpath_text(asset, 'bitrateVideo')),
+ 'abr': int_or_none(xpath_text(asset, 'bitrateAudio')),
+ 'vcodec': xpath_text(asset, 'codecVideo'),
+ 'acodec': xpath_text(asset, 'codecAudio'),
+ 'container': xpath_text(asset, 'mediaType'),
+ 'filesize': int_or_none(xpath_text(asset, 'size')),
+ }
+ format_url = self._proto_relative_url(format_url)
+ if format_url:
+ http_format_info = format_info.copy()
+ http_format_info.update({
+ 'url': format_url,
+ 'format_id': 'http-%s' % asset_type,
+ })
+ formats.append(http_format_info)
+ server_prefix = xpath_text(asset, 'serverPrefix')
+ if server_prefix:
+ rtmp_format_info = format_info.copy()
+ rtmp_format_info.update({
+ 'url': server_prefix,
+ 'play_path': xpath_text(asset, 'fileName'),
+ 'format_id': 'rtmp-%s' % asset_type,
+ })
+ formats.append(rtmp_format_info)
+ self._sort_formats(formats)
+ return formats