mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 22:55:18 +00:00 
			
		
		
		
	[downloader/dash] Implement dashsegments fd in terms of fragment fd
This commit is contained in:
		| @@ -1,67 +1,58 @@ | |||||||
| from __future__ import unicode_literals | from __future__ import unicode_literals | ||||||
|  |  | ||||||
|  | import os | ||||||
| import re | import re | ||||||
|  |  | ||||||
| from .common import FileDownloader | from .fragment import FragmentFD | ||||||
| from ..utils import sanitized_Request | from ..utils import ( | ||||||
|  |     sanitize_open, | ||||||
|  |     encodeFilename, | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
| class DashSegmentsFD(FileDownloader): | class DashSegmentsFD(FragmentFD): | ||||||
|     """ |     """ | ||||||
|     Download segments in a DASH manifest |     Download segments in a DASH manifest | ||||||
|     """ |     """ | ||||||
|  |  | ||||||
|  |     FD_NAME = 'dashsegments' | ||||||
|  |  | ||||||
|     def real_download(self, filename, info_dict): |     def real_download(self, filename, info_dict): | ||||||
|         self.report_destination(filename) |  | ||||||
|         tmpfilename = self.temp_name(filename) |  | ||||||
|         base_url = info_dict['url'] |         base_url = info_dict['url'] | ||||||
|         segment_urls = info_dict['segment_urls'] |         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') | ||||||
|  |  | ||||||
|         is_test = self.params.get('test', False) |         ctx = { | ||||||
|         remaining_bytes = self._TEST_FILE_SIZE if is_test else None |             'filename': filename, | ||||||
|         byte_counter = 0 |             'total_frags': len(segment_urls) + (1 if initialization_url else 0), | ||||||
|  |         } | ||||||
|  |  | ||||||
|         def append_url_to_file(outf, target_url, target_name, remaining_bytes=None): |         self._prepare_and_start_frag_download(ctx) | ||||||
|             self.to_screen('[DashSegments] %s: Downloading %s' % (info_dict['id'], target_name)) |  | ||||||
|             req = sanitized_Request(target_url) |  | ||||||
|             if remaining_bytes is not None: |  | ||||||
|                 req.add_header('Range', 'bytes=0-%d' % (remaining_bytes - 1)) |  | ||||||
|  |  | ||||||
|             data = self.ydl.urlopen(req).read() |  | ||||||
|  |  | ||||||
|             if remaining_bytes is not None: |  | ||||||
|                 data = data[:remaining_bytes] |  | ||||||
|  |  | ||||||
|             outf.write(data) |  | ||||||
|             return len(data) |  | ||||||
|  |  | ||||||
|         def combine_url(base_url, target_url): |         def combine_url(base_url, target_url): | ||||||
|             if re.match(r'^https?://', target_url): |             if re.match(r'^https?://', target_url): | ||||||
|                 return target_url |                 return target_url | ||||||
|             return '%s%s%s' % (base_url, '' if base_url.endswith('/') else '/', target_url) |             return '%s%s%s' % (base_url, '' if base_url.endswith('/') else '/', target_url) | ||||||
|  |  | ||||||
|         with open(tmpfilename, 'wb') as outf: |         segments_filenames = [] | ||||||
|             if info_dict.get('initialization_url'): |         def append_url_to_file(target_url, target_filename): | ||||||
|                 append_url_to_file( |             success = ctx['dl'].download(target_filename, {'url': combine_url(base_url, target_url)}) | ||||||
|                     outf, combine_url(base_url, info_dict['initialization_url']), |             if not success: | ||||||
|                     'initialization segment') |                 return False | ||||||
|             for i, segment_url in enumerate(segment_urls): |             down, target_sanitized = sanitize_open(target_filename, 'rb') | ||||||
|                 segment_len = append_url_to_file( |             ctx['dest_stream'].write(down.read()) | ||||||
|                     outf, combine_url(base_url, segment_url), |             down.close() | ||||||
|                     'segment %d / %d' % (i + 1, len(segment_urls)), |             segments_filenames.append(target_sanitized) | ||||||
|                     remaining_bytes) |  | ||||||
|                 byte_counter += segment_len |  | ||||||
|                 if remaining_bytes is not None: |  | ||||||
|                     remaining_bytes -= segment_len |  | ||||||
|                     if remaining_bytes <= 0: |  | ||||||
|                         break |  | ||||||
|  |  | ||||||
|         self.try_rename(tmpfilename, filename) |         if initialization_url: | ||||||
|  |             append_url_to_file(initialization_url, ctx['tmpfilename'] + '-Init') | ||||||
|  |         for i, segment_url in enumerate(segment_urls): | ||||||
|  |             segment_filename = '%s-Seg%d' % (ctx['tmpfilename'], i) | ||||||
|  |             append_url_to_file(segment_url, segment_filename) | ||||||
|  |  | ||||||
|         self._hook_progress({ |         self._finish_frag_download(ctx) | ||||||
|             'downloaded_bytes': byte_counter, |  | ||||||
|             'total_bytes': byte_counter, |         for segment_file in segments_filenames: | ||||||
|             'filename': filename, |             os.remove(encodeFilename(segment_file)) | ||||||
|             'status': 'finished', |  | ||||||
|         }) |  | ||||||
|  |  | ||||||
|         return True |         return True | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 remitamine
					remitamine