diff --git a/README.md b/README.md index aa8b1d4f24..7a6175ae4d 100644 --- a/README.md +++ b/README.md @@ -222,7 +222,6 @@ The following provide support for impersonating browser requests. This may be re ### Deprecated * [**avconv** and **avprobe**](https://www.libav.org) - Now **deprecated** alternative to ffmpeg. License [depends on the build](https://libav.org/legal) -* [**sponskrub**](https://github.com/faissaloo/SponSkrub) - For using the now **deprecated** [sponskrub options](#sponskrub-options). Licensed under [GPLv3+](https://github.com/faissaloo/SponSkrub/blob/master/LICENCE.md) * [**rtmpdump**](http://rtmpdump.mplayerhq.hu) - For downloading `rtmp` streams. ffmpeg can be used instead with `--downloader ffmpeg`. Licensed under [GPLv2+](http://rtmpdump.mplayerhq.hu) * [**mplayer**](http://mplayerhq.hu/design7/info.html) or [**mpv**](https://mpv.io) - For downloading `rstp`/`mms` streams. ffmpeg can be used instead with `--downloader ffmpeg`. Licensed under [GPLv2+](https://github.com/mpv-player/mpv/blob/master/Copyright) @@ -2381,7 +2380,7 @@ These are aliases that are no longer documented for various reasons --yes-overwrites --force-overwrites #### Sponskrub Options -Support for [SponSkrub](https://github.com/faissaloo/SponSkrub) has been deprecated in favor of the `--sponsorblock` options +Support for [SponSkrub](https://github.com/faissaloo/SponSkrub) has been removed in favor of the `--sponsorblock` options --sponskrub --sponsorblock-mark all --no-sponskrub --no-sponsorblock diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py index bc9384b085..dd0c0d6b7f 100644 --- a/yt_dlp/__init__.py +++ b/yt_dlp/__init__.py @@ -515,7 +515,6 @@ def validate_options(opts): if report_args_compat('post-processor', opts.postprocessor_args, 'default-compat', 'default'): opts.postprocessor_args['default'] = opts.postprocessor_args.pop('default-compat') - opts.postprocessor_args.setdefault('sponskrub', []) def report_conflict(arg1, opt1, arg2='--allow-unplayable-formats', opt2='allow_unplayable_formats', val1=NO_DEFAULT, val2=NO_DEFAULT, default=False): @@ -540,11 +539,6 @@ def validate_options(opts): '"--exec before_dl:"', 'exec_cmd', val2=opts.exec_cmd.get('before_dl')) report_conflict('--id', 'useid', '--output', 'outtmpl', val2=opts.outtmpl.get('default')) report_conflict('--remux-video', 'remuxvideo', '--recode-video', 'recodevideo') - report_conflict('--sponskrub', 'sponskrub', '--remove-chapters', 'remove_chapters') - report_conflict('--sponskrub', 'sponskrub', '--sponsorblock-mark', 'sponsorblock_mark') - report_conflict('--sponskrub', 'sponskrub', '--sponsorblock-remove', 'sponsorblock_remove') - report_conflict('--sponskrub-cut', 'sponskrub_cut', '--split-chapter', 'split_chapters', - val1=opts.sponskrub and opts.sponskrub_cut) # Conflicts with --allow-unplayable-formats report_conflict('--embed-metadata', 'addmetadata') @@ -557,7 +551,6 @@ def validate_options(opts): report_conflict('--recode-video', 'recodevideo') report_conflict('--remove-chapters', 'remove_chapters', default=[]) report_conflict('--remux-video', 'remuxvideo') - report_conflict('--sponskrub', 'sponskrub') report_conflict('--sponsorblock-remove', 'sponsorblock_remove', default=set()) report_conflict('--xattrs', 'xattrs') @@ -569,7 +562,14 @@ def validate_options(opts): f'{old} is deprecated and may be removed in a future version. Use {new} instead' if new else f'{old} is deprecated and may not work as expected') - report_deprecation(opts.sponskrub, '--sponskrub', '--sponsorblock-mark or --sponsorblock-remove') + if hasattr(opts, 'sponskrub_options'): + for opt_str in opts.sponskrub_options: + deprecation_warnings.append( + f'SponSkrub support has been removed from yt-dlp, but "{opt_str}" was passed.\n' + 'Please use SponsorBlock instead and remove all SponSkrub-related options from your commands and config files.\n' + 'These options will be removed in a future version, which will cause errors if not updated.') + del opts.sponskrub_options + report_deprecation(not opts.prefer_ffmpeg, '--prefer-avconv', 'ffmpeg') # report_deprecation(opts.include_ads, '--include-ads') # We may re-implement this in future # report_deprecation(opts.call_home, '--call-home') # We may re-implement this in future @@ -704,21 +704,6 @@ def get_postprocessors(opts): 'add_metadata': opts.addmetadata, 'add_infojson': opts.embed_infojson, } - # Deprecated - # This should be above EmbedThumbnail since sponskrub removes the thumbnail attachment - # but must be below EmbedSubtitle and FFmpegMetadata - # See https://github.com/yt-dlp/yt-dlp/issues/204 , https://github.com/faissaloo/SponSkrub/issues/29 - # If opts.sponskrub is None, sponskrub is used, but it silently fails if the executable can't be found - if opts.sponskrub is not False: - yield { - 'key': 'SponSkrub', - 'path': opts.sponskrub_path, - 'args': opts.sponskrub_args, - 'cut': opts.sponskrub_cut, - 'force': opts.sponskrub_force, - 'ignoreerror': opts.sponskrub is None, - '_from_cli': True, - } if opts.embedthumbnail: yield { 'key': 'EmbedThumbnail', diff --git a/yt_dlp/options.py b/yt_dlp/options.py index 29b37b4255..d4506e73c2 100644 --- a/yt_dlp/options.py +++ b/yt_dlp/options.py @@ -1900,37 +1900,21 @@ def create_parser(): default='https://sponsor.ajay.app', dest='sponsorblock_api', help='SponsorBlock API location, defaults to %default') - sponsorblock.add_option( - '--sponskrub', - action='store_true', dest='sponskrub', default=False, - help=optparse.SUPPRESS_HELP) - sponsorblock.add_option( - '--no-sponskrub', - action='store_false', dest='sponskrub', - help=optparse.SUPPRESS_HELP) - sponsorblock.add_option( - '--sponskrub-cut', default=False, - action='store_true', dest='sponskrub_cut', - help=optparse.SUPPRESS_HELP) - sponsorblock.add_option( - '--no-sponskrub-cut', - action='store_false', dest='sponskrub_cut', - help=optparse.SUPPRESS_HELP) - sponsorblock.add_option( - '--sponskrub-force', default=False, - action='store_true', dest='sponskrub_force', - help=optparse.SUPPRESS_HELP) - sponsorblock.add_option( - '--no-sponskrub-force', - action='store_true', dest='sponskrub_force', - help=optparse.SUPPRESS_HELP) - sponsorblock.add_option( - '--sponskrub-location', metavar='PATH', - dest='sponskrub_path', default='', - help=optparse.SUPPRESS_HELP) - sponsorblock.add_option( - '--sponskrub-args', dest='sponskrub_args', metavar='ARGS', - help=optparse.SUPPRESS_HELP) + sponskrub_switches = [ + '--sponskrub', '--no-sponskrub', '--sponskrub-cut', '--no-sponskrub-cut', + '--sponskrub-force', '--no-sponskrub-force'] + sponskrub_arguments = ['--sponskrub-location', '--sponskrub-args'] + + def _sponskrub_deprecation(option, opt_str, value, parser): + current = getattr(parser.values, 'sponskrub_options', []) + parser.values.sponskrub_options = [*current, opt_str] + + for switch in sponskrub_switches: + sponsorblock.add_option( + switch, action='callback', callback=_sponskrub_deprecation, help=optparse.SUPPRESS_HELP) + for opt in sponskrub_arguments: + sponsorblock.add_option( + opt, action='callback', type='str', callback=_sponskrub_deprecation, help=optparse.SUPPRESS_HELP) extractor = optparse.OptionGroup(parser, 'Extractor Options') extractor.add_option( diff --git a/yt_dlp/postprocessor/__init__.py b/yt_dlp/postprocessor/__init__.py index 20e8b14b21..4bcc726494 100644 --- a/yt_dlp/postprocessor/__init__.py +++ b/yt_dlp/postprocessor/__init__.py @@ -30,7 +30,6 @@ from .metadataparser import ( ) from .modify_chapters import ModifyChaptersPP from .movefilesafterdownload import MoveFilesAfterDownloadPP -from .sponskrub import SponSkrubPP from .sponsorblock import SponsorBlockPP from .xattrpp import XAttrMetadataPP from ..globals import plugin_pps, postprocessors diff --git a/yt_dlp/postprocessor/sponskrub.py b/yt_dlp/postprocessor/sponskrub.py deleted file mode 100644 index ac6db1bc7b..0000000000 --- a/yt_dlp/postprocessor/sponskrub.py +++ /dev/null @@ -1,97 +0,0 @@ -import os -import shlex -import subprocess - -from .common import PostProcessor -from ..utils import ( - Popen, - PostProcessingError, - check_executable, - cli_option, - encodeArgument, - prepend_extension, - shell_quote, - str_or_none, -) - - -# Deprecated in favor of the native implementation -class SponSkrubPP(PostProcessor): - _temp_ext = 'spons' - _exe_name = 'sponskrub' - - def __init__(self, downloader, path='', args=None, ignoreerror=False, cut=False, force=False, _from_cli=False): - PostProcessor.__init__(self, downloader) - self.force = force - self.cutout = cut - self.args = str_or_none(args) or '' # For backward compatibility - self.path = self.get_exe(path) - - if not _from_cli: - self.deprecation_warning( - 'yt_dlp.postprocessor.SponSkrubPP support is deprecated and may be removed in a future version. ' - 'Use yt_dlp.postprocessor.SponsorBlock and yt_dlp.postprocessor.ModifyChaptersPP instead') - - if not ignoreerror and self.path is None: - if path: - raise PostProcessingError(f'sponskrub not found in "{path}"') - else: - raise PostProcessingError('sponskrub not found. Please install or provide the path using --sponskrub-path') - - def get_exe(self, path=''): - if not path or not check_executable(path, ['-h']): - path = os.path.join(path, self._exe_name) - if not check_executable(path, ['-h']): - return None - return path - - @PostProcessor._restrict_to(images=False) - def run(self, information): - if self.path is None: - return [], information - - filename = information['filepath'] - if not os.path.exists(filename): # no download - return [], information - - if information['extractor_key'].lower() != 'youtube': - self.to_screen('Skipping sponskrub since it is not a YouTube video') - return [], information - if self.cutout and not self.force and not information.get('__real_download', False): - self.report_warning( - 'Skipping sponskrub since the video was already downloaded. ' - 'Use --sponskrub-force to run sponskrub anyway') - return [], information - - self.to_screen('Trying to %s sponsor sections' % ('remove' if self.cutout else 'mark')) - if self.cutout: - self.report_warning('Cutting out sponsor segments will cause the subtitles to go out of sync.') - if not information.get('__real_download', False): - self.report_warning('If sponskrub is run multiple times, unintended parts of the video could be cut out.') - - temp_filename = prepend_extension(filename, self._temp_ext) - if os.path.exists(temp_filename): - os.remove(temp_filename) - - cmd = [self.path] - if not self.cutout: - cmd += ['-chapter'] - cmd += cli_option(self._downloader.params, '-proxy', 'proxy') - cmd += shlex.split(self.args) # For backward compatibility - cmd += self._configuration_args(self._exe_name, use_compat=False) - cmd += ['--', information['id'], filename, temp_filename] - cmd = [encodeArgument(i) for i in cmd] - - self.write_debug(f'sponskrub command line: {shell_quote(cmd)}') - stdout, _, returncode = Popen.run(cmd, text=True, stdout=None if self.get_param('verbose') else subprocess.PIPE) - - if not returncode: - os.replace(temp_filename, filename) - self.to_screen('Sponsor sections have been %s' % ('removed' if self.cutout else 'marked')) - elif returncode == 3: - self.to_screen('No segments in the SponsorBlock database') - else: - raise PostProcessingError( - stdout.strip().splitlines()[0 if stdout.strip().lower().startswith('unrecognised') else -1] - or f'sponskrub failed with error code {returncode}') - return [], information