aboutsummaryrefslogtreecommitdiff
path: root/youtube_dl/downloader/dash.py
diff options
context:
space:
mode:
authorSergey M․ <dstftw@gmail.com>2016-09-17 20:35:22 +0700
committerSergey M․ <dstftw@gmail.com>2016-09-17 20:35:22 +0700
commit86f4d14f817acaee1f1f544cd9b06d47bc2a5180 (patch)
treeb23d9675e275116ee8df932e18c52f3aacbbac70 /youtube_dl/downloader/dash.py
parent21d21b0c72a731d4ff5affa2182fbe1687c031a0 (diff)
Refactor fragments interface and dash segments downloader
- Eliminate segment_urls and initialization_url + Introduce manifest_url (manifest may contain unfragmented data in this case url will be used for direct media URL and manifest_url for manifest itself correspondingly) * Rewrite dashsegments downloader to use fragments data * Improve generic mpd extraction
Diffstat (limited to 'youtube_dl/downloader/dash.py')
-rw-r--r--youtube_dl/downloader/dash.py35
1 files changed, 12 insertions, 23 deletions
diff --git a/youtube_dl/downloader/dash.py b/youtube_dl/downloader/dash.py
index 41fc9cfc2..8437dde30 100644
--- a/youtube_dl/downloader/dash.py
+++ b/youtube_dl/downloader/dash.py
@@ -1,7 +1,6 @@
from __future__ import unicode_literals
import os
-import re
from .fragment import FragmentFD
from ..compat import compat_urllib_error
@@ -19,34 +18,32 @@ class DashSegmentsFD(FragmentFD):
FD_NAME = 'dashsegments'
def real_download(self, filename, info_dict):
- base_url = info_dict['url']
- segment_urls = [info_dict['segment_urls'][0]] if self.params.get('test', False) else info_dict['segment_urls']
- initialization_url = info_dict.get('initialization_url')
+ segments = info_dict['fragments'][:1] if self.params.get(
+ 'test', False) else info_dict['fragments']
ctx = {
'filename': filename,
- 'total_frags': len(segment_urls) + (1 if initialization_url else 0),
+ 'total_frags': len(segments),
}
self._prepare_and_start_frag_download(ctx)
- def combine_url(base_url, target_url):
- if re.match(r'^https?://', target_url):
- return target_url
- return '%s%s%s' % (base_url, '' if base_url.endswith('/') else '/', target_url)
-
segments_filenames = []
fragment_retries = self.params.get('fragment_retries', 0)
skip_unavailable_fragments = self.params.get('skip_unavailable_fragments', True)
- def process_segment(segment, tmp_filename, fatal):
- target_url, segment_name = segment
+ def process_segment(segment, tmp_filename, num):
+ segment_url = segment['url']
+ segment_name = 'Frag%d' % num
target_filename = '%s-%s' % (tmp_filename, segment_name)
+ # In DASH, the first segment contains necessary headers to
+ # generate a valid MP4 file, so always abort for the first segment
+ fatal = num == 0 or not skip_unavailable_fragments
count = 0
while count <= fragment_retries:
try:
- success = ctx['dl'].download(target_filename, {'url': combine_url(base_url, target_url)})
+ success = ctx['dl'].download(target_filename, {'url': segment_url})
if not success:
return False
down, target_sanitized = sanitize_open(target_filename, 'rb')
@@ -72,16 +69,8 @@ class DashSegmentsFD(FragmentFD):
return False
return True
- segments_to_download = [(initialization_url, 'Init')] if initialization_url else []
- segments_to_download.extend([
- (segment_url, 'Seg%d' % i)
- for i, segment_url in enumerate(segment_urls)])
-
- for i, segment in enumerate(segments_to_download):
- # In DASH, the first segment contains necessary headers to
- # generate a valid MP4 file, so always abort for the first segment
- fatal = i == 0 or not skip_unavailable_fragments
- if not process_segment(segment, ctx['tmpfilename'], fatal):
+ for i, segment in enumerate(segments):
+ if not process_segment(segment, ctx['tmpfilename'], i):
return False
self._finish_frag_download(ctx)