diff options
Diffstat (limited to 'yt_dlp/downloader')
-rw-r--r-- | yt_dlp/downloader/__init__.py | 17 | ||||
-rw-r--r-- | yt_dlp/downloader/dash.py | 10 | ||||
-rw-r--r-- | yt_dlp/downloader/external.py | 10 | ||||
-rw-r--r-- | yt_dlp/downloader/hls.py | 7 | ||||
-rw-r--r-- | yt_dlp/downloader/niconico.py | 4 |
5 files changed, 29 insertions, 19 deletions
diff --git a/yt_dlp/downloader/__init__.py b/yt_dlp/downloader/__init__.py index 6769cf8e6..53393e89f 100644 --- a/yt_dlp/downloader/__init__.py +++ b/yt_dlp/downloader/__init__.py @@ -3,17 +3,19 @@ from __future__ import unicode_literals from ..compat import compat_str from ..utils import ( determine_protocol, + NO_DEFAULT ) -def _get_real_downloader(info_dict, protocol=None, *args, **kwargs): +def get_suitable_downloader(info_dict, params={}, default=NO_DEFAULT, protocol=None): + info_dict['protocol'] = determine_protocol(info_dict) info_copy = info_dict.copy() if protocol: info_copy['protocol'] = protocol - return get_suitable_downloader(info_copy, *args, **kwargs) + return _get_suitable_downloader(info_copy, params, default) -# Some of these require _get_real_downloader +# Some of these require get_suitable_downloader from .common import FileDownloader from .dash import DashSegmentsFD from .f4m import F4mFD @@ -69,14 +71,15 @@ def shorten_protocol_name(proto, simplify=False): return short_protocol_names.get(proto, proto) -def get_suitable_downloader(info_dict, params={}, default=HttpFD): +def _get_suitable_downloader(info_dict, params, default): """Get the downloader class that can handle the info dict.""" - protocol = determine_protocol(info_dict) - info_dict['protocol'] = protocol + if default is NO_DEFAULT: + default = HttpFD # if (info_dict.get('start_time') or info_dict.get('end_time')) and not info_dict.get('requested_formats') and FFmpegFD.can_download(info_dict): # return FFmpegFD + protocol = info_dict['protocol'] downloaders = params.get('external_downloader') external_downloader = ( downloaders if isinstance(downloaders, compat_str) or downloaders is None @@ -94,7 +97,7 @@ def get_suitable_downloader(info_dict, params={}, default=HttpFD): return FFmpegFD elif external_downloader == 'native': return HlsFD - elif _get_real_downloader(info_dict, 'm3u8_frag_urls', params, None): + elif get_suitable_downloader(info_dict, params, None, protocol='m3u8_frag_urls'): return HlsFD elif params.get('hls_prefer_native') is True: return HlsFD diff --git a/yt_dlp/downloader/dash.py b/yt_dlp/downloader/dash.py index 9dae6b9bd..ccc41e158 100644 --- a/yt_dlp/downloader/dash.py +++ b/yt_dlp/downloader/dash.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals -from ..downloader import _get_real_downloader +from ..downloader import get_suitable_downloader from .fragment import FragmentFD from ..utils import urljoin @@ -15,11 +15,14 @@ class DashSegmentsFD(FragmentFD): FD_NAME = 'dashsegments' def real_download(self, filename, info_dict): + if info_dict.get('is_live'): + self.report_error('Live DASH videos are not supported') + fragment_base_url = info_dict.get('fragment_base_url') fragments = info_dict['fragments'][:1] if self.params.get( 'test', False) else info_dict['fragments'] - real_downloader = _get_real_downloader(info_dict, 'dash_frag_urls', self.params, None) + real_downloader = get_suitable_downloader(info_dict, self.params, None, protocol='dash_frag_urls') ctx = { 'filename': filename, @@ -54,9 +57,6 @@ class DashSegmentsFD(FragmentFD): info_copy = info_dict.copy() info_copy['fragments'] = fragments_to_download fd = real_downloader(self.ydl, self.params) - # TODO: Make progress updates work without hooking twice - # for ph in self._progress_hooks: - # fd.add_progress_hook(ph) return fd.real_download(filename, info_copy) return self.download_and_append_fragments(ctx, fragments_to_download, info_dict) diff --git a/yt_dlp/downloader/external.py b/yt_dlp/downloader/external.py index d0ee745b3..b2a605458 100644 --- a/yt_dlp/downloader/external.py +++ b/yt_dlp/downloader/external.py @@ -345,12 +345,22 @@ class FFmpegFD(ExternalFD): @classmethod def available(cls, path=None): # TODO: Fix path for ffmpeg + # Fixme: This may be wrong when --ffmpeg-location is used return FFmpegPostProcessor().available def on_process_started(self, proc, stdin): """ Override this in subclasses """ pass + @classmethod + def can_merge_formats(cls, info_dict, params={}): + return ( + info_dict.get('requested_formats') + and info_dict.get('protocol') + and not params.get('allow_unplayable_formats') + and 'no-direct-merge' not in params.get('compat_opts', []) + and cls.can_download(info_dict)) + def _call_downloader(self, tmpfilename, info_dict): urls = [f['url'] for f in info_dict.get('requested_formats', [])] or [info_dict['url']] ffpp = FFmpegPostProcessor(downloader=self) diff --git a/yt_dlp/downloader/hls.py b/yt_dlp/downloader/hls.py index 64637badf..79d4ad5e9 100644 --- a/yt_dlp/downloader/hls.py +++ b/yt_dlp/downloader/hls.py @@ -4,7 +4,7 @@ import re import io import binascii -from ..downloader import _get_real_downloader +from ..downloader import get_suitable_downloader from .fragment import FragmentFD, can_decrypt_frag from .external import FFmpegFD @@ -80,16 +80,13 @@ class HlsFD(FragmentFD): fd = FFmpegFD(self.ydl, self.params) self.report_warning( '%s detected unsupported features; extraction will be delegated to %s' % (self.FD_NAME, fd.get_basename())) - # TODO: Make progress updates work without hooking twice - # for ph in self._progress_hooks: - # fd.add_progress_hook(ph) return fd.real_download(filename, info_dict) is_webvtt = info_dict['ext'] == 'vtt' if is_webvtt: real_downloader = None # Packing the fragments is not currently supported for external downloader else: - real_downloader = _get_real_downloader(info_dict, 'm3u8_frag_urls', self.params, None) + real_downloader = get_suitable_downloader(info_dict, self.params, None, protocol='m3u8_frag_urls') if real_downloader and not real_downloader.supports_manifest(s): real_downloader = None if real_downloader: diff --git a/yt_dlp/downloader/niconico.py b/yt_dlp/downloader/niconico.py index c5a3587a4..256840d68 100644 --- a/yt_dlp/downloader/niconico.py +++ b/yt_dlp/downloader/niconico.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import threading from .common import FileDownloader -from ..downloader import _get_real_downloader +from ..downloader import get_suitable_downloader from ..extractor.niconico import NiconicoIE from ..compat import compat_urllib_request @@ -20,7 +20,7 @@ class NiconicoDmcFD(FileDownloader): ie = NiconicoIE(self.ydl) info_dict, heartbeat_info_dict = ie._get_heartbeat_info(info_dict) - fd = _get_real_downloader(info_dict, params=self.params)(self.ydl, self.params) + fd = get_suitable_downloader(info_dict, params=self.params)(self.ydl, self.params) success = download_complete = False timer = [None] |