Skip to content

Commit

Permalink
Add more post-processing stages
Browse files Browse the repository at this point in the history
playlist = After entire playlist
after_video = After downloading all formats of a video
  • Loading branch information
pukkandan committed Jan 3, 2022
1 parent 1e43a6f commit ebed8b3
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 9 deletions.
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -948,10 +948,12 @@ You can also fork the project on github and run your fork's [build workflow](.gi
"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,
Expand Down
8 changes: 8 additions & 0 deletions yt_dlp/YoutubeDL.py
Original file line number Diff line number Diff line change
Expand Up @@ -1766,6 +1766,10 @@ def get_entry(i):

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

Expand Down Expand Up @@ -2564,6 +2568,10 @@ def is_wellformed(f):
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])
Expand Down
6 changes: 4 additions & 2 deletions yt_dlp/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -1482,8 +1482,10 @@ def _dict_from_options_callback(
'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=(
Expand Down
2 changes: 1 addition & 1 deletion yt_dlp/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3036,7 +3036,7 @@ def q(qid):
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 = {
Expand Down
6 changes: 4 additions & 2 deletions ytdlp_plugins/postprocessor/sample.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ def __init__(self, downloader=None, **kwargs):

# ℹ️ 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')
Expand Down

0 comments on commit ebed8b3

Please sign in to comment.