From 4ec82a72bbf7ff0066edb50dcad20aa77ac2fe09 Mon Sep 17 00:00:00 2001 From: pukkandan Date: Tue, 18 May 2021 23:55:32 +0530 Subject: [PATCH] Ensure `post_extract` and `pre_process` only run once Previously, they ran once for each format requested --- yt_dlp/YoutubeDL.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/yt_dlp/YoutubeDL.py b/yt_dlp/YoutubeDL.py index 3f4885cfd..ada783bf2 100644 --- a/yt_dlp/YoutubeDL.py +++ b/yt_dlp/YoutubeDL.py @@ -2089,6 +2089,9 @@ def is_wellformed(f): # element in the 'formats' field in info_dict is info_dict itself, # which can't be exported to json info_dict['formats'] = formats + + info_dict, _ = self.pre_process(info_dict) + if self.params.get('listformats'): if not info_dict.get('formats'): raise ExtractorError('No video formats found', expected=True) @@ -2141,6 +2144,8 @@ def is_wellformed(f): ", ".join([f['format_id'] for f in formats_to_download]))) for fmt in formats_to_download: new_info = dict(info_dict) + # Save a reference to the original info_dict so that it can be modified in process_info if needed + new_info['__original_infodict'] = info_dict new_info.update(fmt) self.process_info(new_info) # We update the info dict with the best quality format (backwards compatibility) @@ -2304,8 +2309,6 @@ def process_info(self, info_dict): self.post_extract(info_dict) self._num_downloads += 1 - info_dict, _ = self.pre_process(info_dict) - # 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') @@ -2743,6 +2746,7 @@ def download_with_info_file(self, info_filename): @staticmethod def filter_requested_info(info_dict, actually_filter=True): + info_dict.pop('__original_infodict', None) # Always remove this if not actually_filter: info_dict['epoch'] = int(time.time()) return info_dict @@ -2788,9 +2792,14 @@ def actual_post_extract(info_dict): return post_extractor = info_dict.get('__post_extractor') or (lambda: {}) - info_dict.update(post_extractor().items()) + extra = post_extractor().items() + info_dict.update(extra) info_dict.pop('__post_extractor', None) + original_infodict = info_dict.get('__original_infodict') or {} + original_infodict.update(extra) + original_infodict.pop('__post_extractor', None) + actual_post_extract(info_dict or {}) def pre_process(self, ie_info, key='pre_process', files_to_move=None):