[downloader] Improve downloader selection
This commit is contained in:
parent
fdaaaaa878
commit
a055469faf
3 changed files with 38 additions and 17 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue