[downloader/http] Remove gruesome import
[youtube-dl] / youtube_dl / downloader / __init__.py
index 31e28df58e828f8c5434390ff18a63358215924a..9fb66e2f7f680a71c05fdd866c72b0db2dd91a77 100644 (file)
@@ -1,35 +1,44 @@
 from __future__ import unicode_literals
 
 from .common import FileDownloader
 from __future__ import unicode_literals
 
 from .common import FileDownloader
+from .external import get_external_downloader
+from .f4m import F4mFD
 from .hls import HlsFD
 from .hls import NativeHlsFD
 from .http import HttpFD
 from .mplayer import MplayerFD
 from .rtmp import RtmpFD
 from .hls import HlsFD
 from .hls import NativeHlsFD
 from .http import HttpFD
 from .mplayer import MplayerFD
 from .rtmp import RtmpFD
-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 = info_dict.get('protocol')
+    protocol = determine_protocol(info_dict)
+    info_dict['protocol'] = protocol
 
 
-    if url.startswith('rtmp'):
-        return RtmpFD
-    if protocol == 'm3u8_native':
+    external_downloader = params.get('external_downloader')
+    if external_downloader is not None:
+        ed = get_external_downloader(external_downloader)
+        if ed.supports(info_dict):
+            return ed
+
+    if protocol == 'm3u8' and params.get('hls_prefer_native'):
         return NativeHlsFD
         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
+
+    return PROTOCOL_MAP.get(protocol, HttpFD)
+
 
 __all__ = [
     'get_suitable_downloader',
 
 __all__ = [
     'get_suitable_downloader',