diff --git a/yt_dlp/__init__.py b/yt_dlp/__init__.py index c76fe2748..e3c34dbf9 100644 --- a/yt_dlp/__init__.py +++ b/yt_dlp/__init__.py @@ -941,6 +941,7 @@ def parse_options(argv=None): 'sleep_interval': opts.sleep_interval, 'max_sleep_interval': opts.max_sleep_interval, 'sleep_interval_subtitles': opts.sleep_interval_subtitles, + 'jsi_preference': opts.jsi_preference, 'external_downloader': opts.external_downloader, 'download_ranges': opts.download_ranges, 'force_keyframes_at_cuts': opts.force_keyframes_at_cuts, diff --git a/yt_dlp/jsinterp/common.py b/yt_dlp/jsinterp/common.py index e1b77fb13..552f12ee5 100644 --- a/yt_dlp/jsinterp/common.py +++ b/yt_dlp/jsinterp/common.py @@ -107,6 +107,11 @@ def __init__( if unsupported_features := self._features - _ALL_FEATURES: raise ExtractorError(f'Unsupported features: {unsupported_features}, allowed features: {_ALL_FEATURES}') + user_prefs = self._downloader.params.get('jsi_preference', []) + for invalid_key in [jsi_key for jsi_key in user_prefs if jsi_key not in _JSI_HANDLERS]: + self.report_warning(f'`{invalid_key}` is not a valid JSI, ignoring preference setting') + user_prefs.remove(invalid_key) + jsi_keys = [key for key in get_jsi_keys(only_include or _JSI_HANDLERS) if key not in get_jsi_keys(exclude)] self.write_debug(f'Allowed JSI keys: {jsi_keys}') handler_classes = [_JSI_HANDLERS[key] for key in jsi_keys @@ -120,7 +125,10 @@ def __init__( self._downloader, url=self._url, timeout=timeout, features=self._features, user_agent=user_agent, **jsi_params.get(cls.JSI_KEY, {}), ) for cls in handler_classes} - self.preferences: set[JSIPreference] = {order_to_pref(preferred_order, 100)} | _JSI_PREFERENCES + + self.preferences: set[JSIPreference] = { + order_to_pref(user_prefs, 10000), order_to_pref(preferred_order, 100)} | _JSI_PREFERENCES + self._fallback_jsi = get_jsi_keys(handler_classes) if fallback_jsi == 'all' else get_jsi_keys(fallback_jsi) self._is_test = self._downloader.params.get('test', False) diff --git a/yt_dlp/options.py b/yt_dlp/options.py index a673c024f..a0d72a664 100644 --- a/yt_dlp/options.py +++ b/yt_dlp/options.py @@ -1142,9 +1142,7 @@ def _alias_callback(option, opt_str, value, parser, opts, nargs): '--jsi-preference', metavar='JSI', dest='jsi_preference', default=[], type='str', action='callback', callback=_list_from_options_callback, - help=( - 'Preferred JS interpreters to use during extraction. Can be given as comma-separated values.') - ) + help='Preferred JS interpreters to use during extraction. Can be given as comma-separated values.') verbosity = optparse.OptionGroup(parser, 'Verbosity and Simulation Options') verbosity.add_option(