"pre_process" (after extraction),
"before_dl" (before video download),
"post_process" (after video download;
- default) or "after_move" (after moving file
- to their final locations). This option can
- be used multiple times to add different
- postprocessors
+ default), "after_move" (after moving file
+ to their final locations), "after_video"
+ (after downloading and processing all
+ formats of a video), or "playlist" (end of
+ playlist). This option can be used multiple
+ times to add different postprocessors
## SponsorBlock Options:
Make chapter entries for, or remove various segments (sponsor,
for tmpl in self.params['forceprint'].get('playlist', []):
self._forceprint(tmpl, ie_result)
+
+ for pp in self._pps['playlist']:
+ ie_result = self.run_pp(pp, ie_result)
+
self.to_screen('[download] Finished downloading playlist: %s' % playlist)
return ie_result
new_info['__original_infodict'] = info_dict
new_info.update(fmt)
self.process_info(new_info)
+
+ for pp in self._pps['after_video']:
+ info_dict = self.run_pp(pp, info_dict)
+
# We update the info dict with the selected best quality format (backwards compatibility)
if formats_to_download:
info_dict.update(formats_to_download[-1])
'ARGS are a semicolon ";" delimited list of NAME=VALUE. '
'The "when" argument determines when the postprocessor is invoked. '
'It can be one of "pre_process" (after extraction), '
- '"before_dl" (before video download), "post_process" (after video download; default) '
- 'or "after_move" (after moving file to their final locations). '
+ '"before_dl" (before video download), "post_process" (after video download; default), '
+ '"after_move" (after moving file to their final locations), '
+ '"after_video" (after downloading and processing all formats of a video), '
+ 'or "playlist" (end of playlist). '
'This option can be used multiple times to add different postprocessors'))
sponsorblock = optparse.OptionGroup(parser, 'SponsorBlock Options', description=(
return q
-POSTPROCESS_WHEN = {'pre_process', 'before_dl', 'after_move', 'post_process'}
+POSTPROCESS_WHEN = {'pre_process', 'before_dl', 'after_move', 'post_process', 'after_video', 'playlist'}
DEFAULT_OUTTMPL = {
# ℹ️ See docstring of yt_dlp.postprocessor.common.PostProcessor.run
def run(self, info):
- filepath = info.get('filepath')
- if filepath: # PP was called after download (default)
+ if info.get('_type', 'video') != 'video': # PP was called for playlist
+ self.to_screen(f'Post-processing playlist {info.get("id")!r} with {self._kwargs}')
+ elif info.get('filepath'): # PP was called after download (default)
+ filepath = info.get('filepath')
self.to_screen(f'Post-processed {filepath!r} with {self._kwargs}')
else: # PP was called before actual download
filepath = info.get('_filename')