[downloader] Improve downloader selection
This commit is contained in:
		| @@ -1179,7 +1179,7 @@ class YoutubeDL(object): | ||||
|         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'): | ||||
|   | ||||
| @@ -9,27 +9,26 @@ from .rtmp import RtmpFD | ||||
| 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') | ||||
|     protocol = determine_protocol(info_dict) | ||||
|     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__ = [ | ||||
|     'get_suitable_downloader', | ||||
|   | ||||
| @@ -1642,3 +1642,25 @@ def is_html(first_bytes): | ||||
|         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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Philipp Hagemeister
					Philipp Hagemeister