From f48137f157c74a48e93d24196e0e59779d787e96 Mon Sep 17 00:00:00 2001 From: remitamine Date: Fri, 15 Jan 2016 01:13:32 +0100 Subject: [PATCH] [multipart] add simple implementation for a multipart downloader --- youtube_dl/downloader/__init__.py | 2 ++ youtube_dl/downloader/multipart.py | 29 +++++++++++++++++++++++++++++ youtube_dl/utils.py | 2 ++ 3 files changed, 33 insertions(+) create mode 100644 youtube_dl/downloader/multipart.py diff --git a/youtube_dl/downloader/__init__.py b/youtube_dl/downloader/__init__.py index dccc59212..d654028d3 100644 --- a/youtube_dl/downloader/__init__.py +++ b/youtube_dl/downloader/__init__.py @@ -9,6 +9,7 @@ from .http import HttpFD from .rtsp import RtspFD from .rtmp import RtmpFD from .dash import DashSegmentsFD +from .multipart import MultiPartFD from ..utils import ( determine_protocol, @@ -22,6 +23,7 @@ PROTOCOL_MAP = { 'rtsp': RtspFD, 'f4m': F4mFD, 'http_dash_segments': DashSegmentsFD, + 'multipart': MultiPartFD, } diff --git a/youtube_dl/downloader/multipart.py b/youtube_dl/downloader/multipart.py new file mode 100644 index 000000000..b955cb14a --- /dev/null +++ b/youtube_dl/downloader/multipart.py @@ -0,0 +1,29 @@ +from __future__ import unicode_literals + +from .common import FileDownloader + +from ..utils import prepend_extension + + +class MultiPartFD(FileDownloader): + + FD_NAME = 'multipart' + + def real_download(self, filename, info_dict): + parts = info_dict['parts'] + self.to_screen('[%s] Total parts: %d' % (self.FD_NAME, len(parts))) + + for i in range(len(parts)): + fd = get_suitable_downloader(parts[i], self.params)(self.ydl, self.params) + frag_filename = prepend_extension(filename, 'part%d' % i) + success = fd.download(frag_filename, parts[i]) + if not success: + return False + # We only download the first fragment during the test + if self.params.get('test', False): + break + + return True + +# workaround circular imports +from .__init__ import get_suitable_downloader diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 9c1c0e0bd..e1a0dd91d 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -1891,6 +1891,8 @@ def determine_protocol(info_dict): if protocol is not None: return protocol + if 'parts' in info_dict: + return 'multipart' url = info_dict['url'] if url.startswith('rtmp'): return 'rtmp'