[downloader] Improve downloader selection

This commit is contained in:
Philipp Hagemeister 2015-01-23 23:50:31 +01:00
parent fdaaaaa878
commit a055469faf
3 changed files with 38 additions and 17 deletions

View file

@ -1179,7 +1179,7 @@ def process_info(self, info_dict):
if not self.params.get('skip_download', False): if not self.params.get('skip_download', False):
try: try:
def dl(name, info): 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: for ph in self._progress_hooks:
fd.add_progress_hook(ph) fd.add_progress_hook(ph)
if self.params.get('verbose'): if self.params.get('verbose'):

View file

@ -9,27 +9,26 @@
from .f4m import F4mFD from .f4m import F4mFD
from ..utils import ( 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.""" """Get the downloader class that can handle the info dict."""
url = info_dict['url'] protocol = determine_protocol(info_dict)
protocol = info_dict.get('protocol') info_dict['protocol'] = protocol
return PROTOCOL_MAP.get(protocol, HttpFD)
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
__all__ = [ __all__ = [
'get_suitable_downloader', 'get_suitable_downloader',

View file

@ -1642,3 +1642,25 @@ def is_html(first_bytes):
s = first_bytes.decode('utf-8', 'replace') s = first_bytes.decode('utf-8', 'replace')
return re.match(r'^\s*<', s) 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