-
-
Notifications
You must be signed in to change notification settings - Fork 5.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[post-processing] Refactor MoveFilesPP to respect non-video files #9774
base: master
Are you sure you want to change the base?
Changes from all commits
c574be8
c9d8184
5d51ddb
fe4a15f
44bb6c2
ea2a085
9c3b227
0a3c5ac
a1ff1d4
28d5051
c3fccc5
dd986a4
3046c17
6c8ede8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3208,7 +3208,6 @@ def replace_info_dict(new_info): | |
# info_dict['_filename'] needs to be set for backward compatibility | ||
info_dict['_filename'] = full_filename = self.prepare_filename(info_dict, warn=True) | ||
temp_filename = self.prepare_filename(info_dict, 'temp') | ||
files_to_move = {} | ||
|
||
# Forced printings | ||
self.__forced_printings(info_dict, full_filename, incomplete=('format' not in info_dict)) | ||
|
@@ -3236,13 +3235,11 @@ def check_max_downloads(): | |
sub_files = self._write_subtitles(info_dict, temp_filename) | ||
if sub_files is None: | ||
return | ||
files_to_move.update(dict(sub_files)) | ||
|
||
thumb_files = self._write_thumbnails( | ||
'video', info_dict, temp_filename, self.prepare_filename(info_dict, 'thumbnail')) | ||
if thumb_files is None: | ||
return | ||
files_to_move.update(dict(thumb_files)) | ||
|
||
infofn = self.prepare_filename(info_dict, 'infojson') | ||
_infojson_written = self._write_info_json('video', info_dict, infofn) | ||
|
@@ -3316,13 +3313,12 @@ def _write_link_file(link_type): | |
for link_type, should_write in write_links.items()): | ||
return | ||
|
||
new_info, files_to_move = self.pre_process(info_dict, 'before_dl', files_to_move) | ||
new_info, _ = self.pre_process(info_dict, 'before_dl') | ||
replace_info_dict(new_info) | ||
|
||
if self.params.get('skip_download'): | ||
info_dict['filepath'] = temp_filename | ||
info_dict['__finaldir'] = os.path.dirname(os.path.abspath(encodeFilename(full_filename))) | ||
info_dict['__files_to_move'] = files_to_move | ||
replace_info_dict(self.run_pp(MoveFilesAfterDownloadPP(self, False), info_dict)) | ||
info_dict['__write_download_archive'] = self.params.get('force_write_download_archive') | ||
else: | ||
|
@@ -3436,9 +3432,6 @@ def correct_ext(filename, ext=new_ext): | |
info_dict['__files_to_merge'] = downloaded | ||
# Even if there were no downloads, it is being merged only now | ||
info_dict['__real_download'] = True | ||
else: | ||
for file in downloaded: | ||
files_to_move[file] = None | ||
else: | ||
# Just a single file | ||
dl_filename = existing_video_file(full_filename, temp_filename) | ||
|
@@ -3452,7 +3445,6 @@ def correct_ext(filename, ext=new_ext): | |
|
||
dl_filename = dl_filename or temp_filename | ||
info_dict['__finaldir'] = os.path.dirname(os.path.abspath(encodeFilename(full_filename))) | ||
|
||
except network_exceptions as err: | ||
self.report_error('unable to download video data: %s' % error_to_compat_str(err)) | ||
return | ||
|
@@ -3523,7 +3515,7 @@ def ffmpeg_fixup(cndn, msg, cls): | |
|
||
fixup() | ||
try: | ||
replace_info_dict(self.post_process(dl_filename, info_dict, files_to_move)) | ||
replace_info_dict(self.post_process(dl_filename, info_dict)) | ||
except PostProcessingError as err: | ||
self.report_error('Postprocessing: %s' % str(err)) | ||
return | ||
|
@@ -3644,8 +3636,6 @@ def _delete_downloaded_files(self, *files_to_delete, info={}, msg=None): | |
os.remove(filename) | ||
except OSError: | ||
self.report_warning(f'Unable to delete file {filename}') | ||
if filename in info.get('__files_to_move', []): # NB: Delete even if None | ||
del info['__files_to_move'][filename] | ||
|
||
@staticmethod | ||
def post_extract(info_dict): | ||
|
@@ -3662,8 +3652,7 @@ def actual_post_extract(info_dict): | |
|
||
def run_pp(self, pp, infodict): | ||
files_to_delete = [] | ||
if '__files_to_move' not in infodict: | ||
infodict['__files_to_move'] = {} | ||
|
||
try: | ||
files_to_delete, infodict = pp.run(infodict) | ||
except PostProcessingError as e: | ||
|
@@ -3675,10 +3664,7 @@ def run_pp(self, pp, infodict): | |
|
||
if not files_to_delete: | ||
return infodict | ||
if self.params.get('keepvideo', False): | ||
for f in files_to_delete: | ||
infodict['__files_to_move'].setdefault(f, '') | ||
else: | ||
if not self.params.get('keepvideo', False): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could I get eyes on this to confirm that this logic inversion works as expected now that I've deleted the |
||
self._delete_downloaded_files( | ||
*files_to_delete, info=infodict, msg='Deleting original file %s (pass -k to keep)') | ||
return infodict | ||
|
@@ -3691,23 +3677,27 @@ def run_all_pps(self, key, info, *, additional_pps=None): | |
return info | ||
|
||
def pre_process(self, ie_info, key='pre_process', files_to_move=None): | ||
if files_to_move is not None: | ||
self.report_warning('[pre_process] "files_to_move" is deprecated and may be removed in a future version') | ||
Comment on lines
+3680
to
+3681
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For viz: wanted to make sure this messaging was on-brand for deprecating a parameter rather than an entire method |
||
|
||
info = dict(ie_info) | ||
info['__files_to_move'] = files_to_move or {} | ||
try: | ||
info = self.run_all_pps(key, info) | ||
except PostProcessingError as err: | ||
msg = f'Preprocessing: {err}' | ||
info.setdefault('__pending_error', msg) | ||
self.report_error(msg, is_error=False) | ||
return info, info.pop('__files_to_move', None) | ||
return info, files_to_move | ||
|
||
def post_process(self, filename, info, files_to_move=None): | ||
"""Run all the postprocessors on the given file.""" | ||
if files_to_move is not None: | ||
self.report_warning('[post_process] "files_to_move" is deprecated and may be removed in a future version') | ||
|
||
info['filepath'] = filename | ||
info['__files_to_move'] = files_to_move or {} | ||
info = self.run_all_pps('post_process', info, additional_pps=info.get('__postprocessors')) | ||
info = self.run_pp(MoveFilesAfterDownloadPP(self), info) | ||
del info['__files_to_move'] | ||
info.pop('__multiple_thumbnails', None) | ||
return self.run_all_pps('after_move', info) | ||
|
||
def _make_archive_id(self, info_dict): | ||
|
@@ -4294,10 +4284,11 @@ def _write_subtitles(self, info_dict, filename): | |
sub_filename = subtitles_filename(filename, sub_lang, sub_format, info_dict.get('ext')) | ||
sub_filename_final = subtitles_filename(sub_filename_base, sub_lang, sub_format, info_dict.get('ext')) | ||
existing_sub = self.existing_file((sub_filename_final, sub_filename)) | ||
|
||
if existing_sub: | ||
self.to_screen(f'[info] Video subtitle {sub_lang}.{sub_format} is already present') | ||
sub_info['filepath'] = existing_sub | ||
ret.append((existing_sub, sub_filename_final)) | ||
ret.append(existing_sub) | ||
continue | ||
|
||
self.to_screen(f'[info] Writing video subtitles to: {sub_filename}') | ||
|
@@ -4308,7 +4299,7 @@ def _write_subtitles(self, info_dict, filename): | |
with open(sub_filename, 'w', encoding='utf-8', newline='') as subfile: | ||
subfile.write(sub_info['data']) | ||
sub_info['filepath'] = sub_filename | ||
ret.append((sub_filename, sub_filename_final)) | ||
ret.append(sub_filename) | ||
continue | ||
except OSError: | ||
self.report_error(f'Cannot write video subtitles file {sub_filename}') | ||
|
@@ -4319,7 +4310,7 @@ def _write_subtitles(self, info_dict, filename): | |
sub_copy.setdefault('http_headers', info_dict.get('http_headers')) | ||
self.dl(sub_filename, sub_copy, subtitle=True) | ||
sub_info['filepath'] = sub_filename | ||
ret.append((sub_filename, sub_filename_final)) | ||
ret.append(sub_filename) | ||
except (DownloadError, ExtractorError, IOError, OSError, ValueError) + network_exceptions as err: | ||
msg = f'Unable to download video subtitles for {sub_lang!r}: {err}' | ||
if self.params.get('ignoreerrors') is not True: # False or 'only_download' | ||
|
@@ -4339,6 +4330,7 @@ def _write_thumbnails(self, label, info_dict, filename, thumb_filename_base=None | |
self.to_screen(f'[info] There are no {label} thumbnails to download') | ||
return ret | ||
multiple = write_all and len(thumbnails) > 1 | ||
info_dict['__multiple_thumbnails'] = multiple | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is how I'm determining whether thumbnails need to use an indexed file "extension". I could use |
||
|
||
if thumb_filename_base is None: | ||
thumb_filename_base = filename | ||
|
@@ -4360,15 +4352,15 @@ def _write_thumbnails(self, label, info_dict, filename, thumb_filename_base=None | |
self.to_screen('[info] %s is already present' % ( | ||
thumb_display_id if multiple else f'{label} thumbnail').capitalize()) | ||
t['filepath'] = existing_thumb | ||
ret.append((existing_thumb, thumb_filename_final)) | ||
ret.append(existing_thumb) | ||
else: | ||
self.to_screen(f'[info] Downloading {thumb_display_id} ...') | ||
try: | ||
uf = self.urlopen(Request(t['url'], headers=t.get('http_headers', {}))) | ||
self.to_screen(f'[info] Writing {thumb_display_id} to: {thumb_filename}') | ||
with open(encodeFilename(thumb_filename), 'wb') as thumbf: | ||
shutil.copyfileobj(uf, thumbf) | ||
ret.append((thumb_filename, thumb_filename_final)) | ||
ret.append(thumb_filename) | ||
t['filepath'] = thumb_filename | ||
except network_exceptions as err: | ||
if isinstance(err, HTTPError) and err.status == 404: | ||
|
@@ -4378,4 +4370,5 @@ def _write_thumbnails(self, label, info_dict, filename, thumb_filename_base=None | |
thumbnails.pop(idx) | ||
if ret and not write_all: | ||
break | ||
|
||
return ret |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -224,4 +224,8 @@ def run(self, info): | |
thumbnail_filename if converted or not self._already_have_thumbnail else None, | ||
original_thumbnail if converted and not self._already_have_thumbnail else None, | ||
info=info) | ||
|
||
if not self._already_have_thumbnail: | ||
info['thumbnails'][idx].pop('filepath', None) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm using the |
||
|
||
return [], info |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Calling this out specifically - these changes necessitated an
outtmpl
(or settingtitle
andid
for the defaultouttmpl
to use). I don't think this is an issue, but I wanted to confirm!There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To expand, the reason is that the old implementation didn't concern itself with outtmpls at all - it just got a list of source/destination filenames and it moved files based on that.
The new implementation uses
prepare_filename
which allows it to keep source/destination logic contained entirely within theMoveFilesPP
module, but the side effect is that it needs to be able to generate a validouttmpl
somehow