mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-30 22:25:19 +00:00 
			
		
		
		
	Split video by chapters (#158)
* New options `--split-chapters` and `--no-split-chapters` * The output/path of the split files can be given using the key `chapter` * Additional keys `section_title`, `section_number`, `section_start`, `section_end` are available in the output template * Alias `--split-tracks` for parity with animelover/youtube-dl * `--sponskrub-cut` and `--split-chapter` cannot work together Closes: https://github.com/blackjack4494/yt-dlc/issues/277 https://github.com/ytdl-org/youtube-dl/issues/28438 https://github.com/ytdl-org/youtube-dl/issues/12907 https://github.com/ytdl-org/youtube-dl/issues/6480 https://github.com/ytdl-org/youtube-dl/pull/25005 Rewritten from the implementation by: femaref and Wattux https://github.com/Wattux/youtube-dl/tree/split-at-timestamps https://github.com/ytdl-org/youtube-dl/pull/25005 https://github.com/femaref/youtube-dl/tree/split-track
This commit is contained in:
		| @@ -10,6 +10,7 @@ import json | ||||
|  | ||||
| from .common import AudioConversionError, PostProcessor | ||||
|  | ||||
| from ..compat import compat_str | ||||
| from ..utils import ( | ||||
|     encodeArgument, | ||||
|     encodeFilename, | ||||
| @@ -769,3 +770,40 @@ class FFmpegSubtitlesConvertorPP(FFmpegPostProcessor): | ||||
|                 } | ||||
|  | ||||
|         return sub_filenames, info | ||||
|  | ||||
|  | ||||
| class FFmpegSplitChaptersPP(FFmpegPostProcessor): | ||||
|  | ||||
|     def _prepare_filename(self, number, chapter, info): | ||||
|         info = info.copy() | ||||
|         info.update({ | ||||
|             'section_number': number, | ||||
|             'section_title': chapter.get('title'), | ||||
|             'section_start': chapter.get('start_time'), | ||||
|             'section_end': chapter.get('end_time'), | ||||
|         }) | ||||
|         return self._downloader.prepare_filename(info, 'chapter') | ||||
|  | ||||
|     def _ffmpeg_args_for_chapter(self, number, chapter, info): | ||||
|         destination = self._prepare_filename(number, chapter, info) | ||||
|         if not self._downloader._ensure_dir_exists(encodeFilename(destination)): | ||||
|             return | ||||
|  | ||||
|         chapter['_filename'] = destination | ||||
|         self.to_screen('Chapter %03d; Destination: %s' % (number, destination)) | ||||
|         return ( | ||||
|             destination, | ||||
|             ['-ss', compat_str(chapter['start_time']), | ||||
|              '-to', compat_str(chapter['end_time'])]) | ||||
|  | ||||
|     def run(self, info): | ||||
|         chapters = info.get('chapters') or [] | ||||
|         if not chapters: | ||||
|             self.report_warning('There are no tracks to extract') | ||||
|             return [], info | ||||
|  | ||||
|         self.to_screen('Splitting video by chapters; %d chapters found' % len(chapters)) | ||||
|         for idx, chapter in enumerate(chapters): | ||||
|             destination, opts = self._ffmpeg_args_for_chapter(idx + 1, chapter, info) | ||||
|             self.real_run_ffmpeg([(info['filepath'], opts)], [(destination, ['-c', 'copy'])]) | ||||
|         return [], info | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 pukkandan
					pukkandan