[YoutubeDL] Check download targets

This commit is contained in:
Yen Chi Hsuan 2016-06-09 22:41:11 +08:00
parent 3799177bdb
commit 7c640d273c

View File

@ -48,6 +48,7 @@ from .utils import (
determine_ext, determine_ext,
determine_protocol, determine_protocol,
DownloadError, DownloadError,
DownloadTarget,
encode_compat_str, encode_compat_str,
encodeFilename, encodeFilename,
error_to_compat_str, error_to_compat_str,
@ -1462,6 +1463,7 @@ class YoutubeDL(object):
self._num_downloads += 1 self._num_downloads += 1
info_dict['_filename'] = filename = self.prepare_filename(info_dict) info_dict['_filename'] = filename = self.prepare_filename(info_dict)
info_dict['_downloaded_targets'] = []
# Forced printings # Forced printings
if self.params.get('forcetitle', False): if self.params.get('forcetitle', False):
@ -1541,6 +1543,9 @@ class YoutubeDL(object):
# that way it will silently go on when used with unsupporting IE # that way it will silently go on when used with unsupporting IE
subtitles = info_dict['requested_subtitles'] subtitles = info_dict['requested_subtitles']
ie = self.get_info_extractor(info_dict['extractor_key']) ie = self.get_info_extractor(info_dict['extractor_key'])
all_subtitles_ok = True
for sub_lang, sub_info in subtitles.items(): for sub_lang, sub_info in subtitles.items():
sub_format = sub_info['ext'] sub_format = sub_info['ext']
if sub_info.get('data') is not None: if sub_info.get('data') is not None:
@ -1552,6 +1557,7 @@ class YoutubeDL(object):
except ExtractorError as err: except ExtractorError as err:
self.report_warning('Unable to download subtitle for "%s": %s' % self.report_warning('Unable to download subtitle for "%s": %s' %
(sub_lang, error_to_compat_str(err.cause))) (sub_lang, error_to_compat_str(err.cause)))
all_subtitles_ok = False
continue continue
try: try:
sub_filename = subtitles_filename(filename, sub_lang, sub_format) sub_filename = subtitles_filename(filename, sub_lang, sub_format)
@ -1563,8 +1569,12 @@ class YoutubeDL(object):
subfile.write(sub_data) subfile.write(sub_data)
except (OSError, IOError): except (OSError, IOError):
self.report_error('Cannot write subtitles file ' + sub_filename) self.report_error('Cannot write subtitles file ' + sub_filename)
all_subtitles_ok = False
return return
if all_subtitles_ok:
info_dict['_downloaded_targets'].append(DownloadTarget.SUBTITLES)
if self.params.get('writeinfojson', False): if self.params.get('writeinfojson', False):
infofn = replace_extension(filename, 'info.json', info_dict.get('ext')) infofn = replace_extension(filename, 'info.json', info_dict.get('ext'))
if self.params.get('nooverwrites', False) and os.path.exists(encodeFilename(infofn)): if self.params.get('nooverwrites', False) and os.path.exists(encodeFilename(infofn)):
@ -1577,7 +1587,8 @@ class YoutubeDL(object):
self.report_error('Cannot write metadata to JSON file ' + infofn) self.report_error('Cannot write metadata to JSON file ' + infofn)
return return
self._write_thumbnails(info_dict, filename) if self._write_thumbnails(info_dict, filename):
info_dict['_downloaded_targets'].append(DownloadTarget.THUMBNAILS)
if not self.params.get('skip_download', False): if not self.params.get('skip_download', False):
try: try:
@ -1718,12 +1729,16 @@ class YoutubeDL(object):
else: else:
assert fixup_policy in ('ignore', 'never') assert fixup_policy in ('ignore', 'never')
try: info_dict['_downloaded_targets'].append(DownloadTarget.MEDIA)
self.post_process(filename, info_dict)
except (PostProcessingError) as err: try:
self.report_error('postprocessing: %s' % str(err)) self.post_process(filename, info_dict)
return except (PostProcessingError) as err:
self.record_download_archive(info_dict) self.report_error('postprocessing: %s' % str(err))
return
if DownloadTarget.MEDIA in info_dict['_downloaded_targets']:
self.record_download_archive(info_dict)
def download(self, url_list): def download(self, url_list):
"""Download a given list of URLs.""" """Download a given list of URLs."""
@ -1776,11 +1791,15 @@ class YoutubeDL(object):
"""Run all the postprocessors on the given file.""" """Run all the postprocessors on the given file."""
info = dict(ie_info) info = dict(ie_info)
info['filepath'] = filename info['filepath'] = filename
downloaded_targets = set(ie_info['_downloaded_targets'])
pps_chain = [] pps_chain = []
if ie_info.get('__postprocessors') is not None: if ie_info.get('__postprocessors') is not None:
pps_chain.extend(ie_info['__postprocessors']) pps_chain.extend(ie_info['__postprocessors'])
pps_chain.extend(self._pps) pps_chain.extend(self._pps)
for pp in pps_chain: for pp in pps_chain:
if not pp.DEPENDENCY.issubset(downloaded_targets):
continue
files_to_delete = [] files_to_delete = []
try: try:
files_to_delete, info = pp.run(info) files_to_delete, info = pp.run(info)
@ -2093,11 +2112,13 @@ class YoutubeDL(object):
elif self.params.get('write_all_thumbnails', False): elif self.params.get('write_all_thumbnails', False):
thumbnails = info_dict.get('thumbnails') thumbnails = info_dict.get('thumbnails')
else: else:
return return False
if not thumbnails: if not thumbnails:
# No thumbnails present, so return immediately # No thumbnails present, so return immediately
return return False
all_thumbnails_ok = True
for t in thumbnails: for t in thumbnails:
thumb_ext = determine_ext(t['url'], 'jpg') thumb_ext = determine_ext(t['url'], 'jpg')
@ -2120,3 +2141,6 @@ class YoutubeDL(object):
except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err:
self.report_warning('Unable to download thumbnail "%s": %s' % self.report_warning('Unable to download thumbnail "%s": %s' %
(t['url'], error_to_compat_str(err))) (t['url'], error_to_compat_str(err)))
all_thumbnails_ok = False
return all_thumbnails_ok