aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Hagemeister <phihag@phihag.de>2015-01-23 23:50:31 +0100
committerPhilipp Hagemeister <phihag@phihag.de>2015-01-23 23:50:31 +0100
commita055469fafe088b6aa0e569d989cbf7f70535951 (patch)
tree3975f7661ca6ece379a845dee1f38cc6b1d1c5b4
parentfdaaaaa878c42975936bf7f6ecf39a97436fefe2 (diff)
downloadyoutube-dl-a055469fafe088b6aa0e569d989cbf7f70535951.tar.xz
[downloader] Improve downloader selection
-rwxr-xr-xyoutube_dl/YoutubeDL.py2
-rw-r--r--youtube_dl/downloader/__init__.py33
-rw-r--r--youtube_dl/utils.py22
3 files changed, 39 insertions, 18 deletions
diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py
index 521e4055e..e61e6c2a7 100755
--- a/youtube_dl/YoutubeDL.py
+++ b/youtube_dl/YoutubeDL.py
@@ -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'):
diff --git a/youtube_dl/downloader/__init__.py b/youtube_dl/downloader/__init__.py
index 31e28df58..2aca3cab5 100644
--- a/youtube_dl/downloader/__init__.py
+++ b/youtube_dl/downloader/__init__.py
@@ -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')
-
- 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',
diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py
index 463cc20ff..2970d02a1 100644
--- a/youtube_dl/utils.py
+++ b/youtube_dl/utils.py
@@ -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