[downloader] Improve downloader selection
This commit is contained in:
		| @@ -1179,7 +1179,7 @@ class YoutubeDL(object): | |||||||
|         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'): | ||||||
|   | |||||||
| @@ -9,27 +9,26 @@ from .rtmp import RtmpFD | |||||||
| 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', | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Philipp Hagemeister
					Philipp Hagemeister