diff --git a/yt_dlp/downloader/fragment.py b/yt_dlp/downloader/fragment.py index b4b680dae..7c4284d2c 100644 --- a/yt_dlp/downloader/fragment.py +++ b/yt_dlp/downloader/fragment.py @@ -121,12 +121,21 @@ def _download_fragment(self, ctx, frag_url, info_dict, headers=None, request_dat frag_resume_len = self.filesize_or_none(self.temp_name(fragment_filename)) fragment_info_dict['frag_resume_len'] = ctx['frag_resume_len'] = frag_resume_len + execute_before_frag_dl = info_dict.get('_fragment_hook_before_dl') + if execute_before_frag_dl is not None and callable(execute_before_frag_dl): + execute_before_frag_dl(fragment_filename, fragment_info_dict, ctx) + success, _ = ctx['dl'].download(fragment_filename, fragment_info_dict) if not success: return False if fragment_info_dict.get('filetime'): ctx['fragment_filetime'] = fragment_info_dict.get('filetime') ctx['fragment_filename_sanitized'] = fragment_filename + + execute_after_frag_dl = info_dict.get('_fragment_hook_after_dl') + if execute_after_frag_dl is not None and callable(execute_after_frag_dl): + execute_after_frag_dl(fragment_filename, fragment_info_dict, ctx) + return True def _read_fragment(self, ctx): diff --git a/yt_dlp/extractor/common.py b/yt_dlp/extractor/common.py index 7deab995c..501d28c9c 100644 --- a/yt_dlp/extractor/common.py +++ b/yt_dlp/extractor/common.py @@ -389,6 +389,16 @@ class InfoExtractor: extracted will not be available to output template and match_filter. So, only "comments" and "comment_count" are currently allowed to be extracted via this method. + _fragment_hook_before_dl: A function to be called just before fragment is + downloaded. It should take three positional arguments: + 'fragment_filename', 'fragment_info_dict' and 'ctx'. + This is useful for special sites that need to change + access cookies on every fragment/every few seconds. + _fragment_hook_after_dl: A function to be called right after fragment is + downloaded. It should take three positional arguments: + 'fragment_filename', 'fragment_info_dict' and 'ctx'. + This is useful for special sites that need to change + access cookies on every fragment/every few seconds. The following fields should only be used when the video belongs to some logical chapter or section: