if not self.params.get('skip_download', False):
try:
def dl(name, info):
- fd = get_suitable_downloader(info)(self, self.params)
+ fd = get_suitable_downloader(info, self.params)(self, self.params)
for ph in self._progress_hooks:
fd.add_progress_hook(ph)
if self.params.get('verbose'):
from .f4m import F4mFD
from ..utils import (
- determine_ext,
+ determine_protocol,
)
+PROTOCOL_MAP = {
+ 'rtmp': RtmpFD,
+ 'm3u8_native': NativeHlsFD,
+ 'm3u8': HlsFD,
+ 'mms': MplayerFD,
+ 'rtsp': MplayerFD,
+ 'f4m': F4mFD,
+}
-def get_suitable_downloader(info_dict):
+
+def get_suitable_downloader(info_dict, params={}):
"""Get the downloader class that can handle the info dict."""
- url = info_dict['url']
- protocol = info_dict.get('protocol')
-
- if url.startswith('rtmp'):
- return RtmpFD
- if protocol == 'm3u8_native':
- return NativeHlsFD
- if (protocol == 'm3u8') or (protocol is None and determine_ext(url) == 'm3u8'):
- return HlsFD
- if url.startswith('mms') or url.startswith('rtsp'):
- return MplayerFD
- if determine_ext(url) == 'f4m':
- return F4mFD
- else:
- return HttpFD
+ protocol = determine_protocol(info_dict)
+ info_dict['protocol'] = protocol
+
+ return PROTOCOL_MAP.get(protocol, HttpFD)
+
__all__ = [
'get_suitable_downloader',
s = first_bytes.decode('utf-8', 'replace')
return re.match(r'^\s*<', s)
+
+
+def determine_protocol(info_dict):
+ protocol = info_dict.get('protocol')
+ if protocol is not None:
+ return protocol
+
+ url = info_dict['url']
+ if url.startswith('rtmp'):
+ return 'rtmp'
+ elif url.startswith('mms'):
+ return 'mms'
+ elif url.startswith('rtsp'):
+ return 'rtsp'
+
+ ext = determine_ext(url)
+ if ext == 'm3u8':
+ return 'm3u8'
+ elif ext == 'f4m':
+ return 'f4m'
+
+ return compat_urllib_parse_urlparse(url).scheme