|
@@ -793,6 +793,49 @@ class InfoExtractor(object):
|
|
|
self._sort_formats(formats)
|
|
|
return formats
|
|
|
|
|
|
+ # TODO: improve extraction
|
|
|
+ def _extract_smil_formats(self, smil_url, video_id):
|
|
|
+ smil = self._download_xml(
|
|
|
+ smil_url, video_id, 'Downloading SMIL file',
|
|
|
+ 'Unable to download SMIL file')
|
|
|
+
|
|
|
+ base = smil.find('./head/meta').get('base')
|
|
|
+
|
|
|
+ formats = []
|
|
|
+ rtmp_count = 0
|
|
|
+ for video in smil.findall('./body/switch/video'):
|
|
|
+ src = video.get('src')
|
|
|
+ if not src:
|
|
|
+ continue
|
|
|
+ bitrate = int_or_none(video.get('system-bitrate') or video.get('systemBitrate'), 1000)
|
|
|
+ width = int_or_none(video.get('width'))
|
|
|
+ height = int_or_none(video.get('height'))
|
|
|
+ proto = video.get('proto')
|
|
|
+ if not proto:
|
|
|
+ if base:
|
|
|
+ if base.startswith('rtmp'):
|
|
|
+ proto = 'rtmp'
|
|
|
+ elif base.startswith('http'):
|
|
|
+ proto = 'http'
|
|
|
+ ext = video.get('ext')
|
|
|
+ if proto == 'm3u8':
|
|
|
+ formats.extend(self._extract_m3u8_formats(src, video_id, ext))
|
|
|
+ elif proto == 'rtmp':
|
|
|
+ rtmp_count += 1
|
|
|
+ streamer = video.get('streamer') or base
|
|
|
+ formats.append({
|
|
|
+ 'url': streamer,
|
|
|
+ 'play_path': src,
|
|
|
+ 'ext': 'flv',
|
|
|
+ 'format_id': 'rtmp-%d' % (rtmp_count if bitrate is None else bitrate),
|
|
|
+ 'tbr': bitrate,
|
|
|
+ 'width': width,
|
|
|
+ 'height': height,
|
|
|
+ })
|
|
|
+ self._sort_formats(formats)
|
|
|
+
|
|
|
+ return formats
|
|
|
+
|
|
|
def _live_title(self, name):
|
|
|
""" Generate the title for a live video """
|
|
|
now = datetime.datetime.now()
|