diff options
Diffstat (limited to 'youtube_dlc/downloader/__init__.py')
-rw-r--r-- | youtube_dlc/downloader/__init__.py | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/youtube_dlc/downloader/__init__.py b/youtube_dlc/downloader/__init__.py index 4ae81f516..0af65890b 100644 --- a/youtube_dlc/downloader/__init__.py +++ b/youtube_dlc/downloader/__init__.py @@ -1,11 +1,24 @@ from __future__ import unicode_literals +from ..utils import ( + determine_protocol, +) + + +def _get_real_downloader(info_dict, protocol=None, *args, **kwargs): + info_copy = info_dict.copy() + if protocol: + info_copy['protocol'] = protocol + return get_suitable_downloader(info_copy, *args, **kwargs) + + +# Some of these require _get_real_downloader from .common import FileDownloader +from .dash import DashSegmentsFD from .f4m import F4mFD from .hls import HlsFD from .http import HttpFD from .rtmp import RtmpFD -from .dash import DashSegmentsFD from .rtsp import RtspFD from .ism import IsmFD from .youtube_live_chat import YoutubeLiveChatReplayFD @@ -14,10 +27,6 @@ from .external import ( FFmpegFD, ) -from ..utils import ( - determine_protocol, -) - PROTOCOL_MAP = { 'rtmp': RtmpFD, 'm3u8_native': HlsFD, @@ -31,7 +40,7 @@ PROTOCOL_MAP = { } -def get_suitable_downloader(info_dict, params={}): +def get_suitable_downloader(info_dict, params={}, default=HttpFD): """Get the downloader class that can handle the info dict.""" protocol = determine_protocol(info_dict) info_dict['protocol'] = protocol @@ -45,16 +54,17 @@ def get_suitable_downloader(info_dict, params={}): if ed.can_download(info_dict): return ed - if protocol.startswith('m3u8') and info_dict.get('is_live'): - return FFmpegFD - - if protocol == 'm3u8' and params.get('hls_prefer_native') is True: - return HlsFD - - if protocol == 'm3u8_native' and params.get('hls_prefer_native') is False: - return FFmpegFD + if protocol.startswith('m3u8'): + if info_dict.get('is_live'): + return FFmpegFD + elif _get_real_downloader(info_dict, 'frag_urls', params, None): + return HlsFD + elif params.get('hls_prefer_native') is True: + return HlsFD + elif params.get('hls_prefer_native') is False: + return FFmpegFD - return PROTOCOL_MAP.get(protocol, HttpFD) + return PROTOCOL_MAP.get(protocol, default) __all__ = [ |