Add --extractor-args to pass extractor-specific arguments

This commit is contained in:
pukkandan 2021-06-25 19:35:41 +05:30
parent 125728b038
commit 5d3a0e794b
No known key found for this signature in database
GPG key ID: 0F00D95A001F4698
6 changed files with 70 additions and 38 deletions

View file

@ -53,6 +53,7 @@ # YT-DLP
* [Format Selection examples](#format-selection-examples) * [Format Selection examples](#format-selection-examples)
* [MODIFYING METADATA](#modifying-metadata) * [MODIFYING METADATA](#modifying-metadata)
* [Modifying metadata examples](#modifying-metadata-examples) * [Modifying metadata examples](#modifying-metadata-examples)
* [EXTRACTOR ARGUMENTS](#extractor-arguments)
* [PLUGINS](#plugins) * [PLUGINS](#plugins)
* [DEPRECATED OPTIONS](#deprecated-options) * [DEPRECATED OPTIONS](#deprecated-options)
* [MORE](#more) * [MORE](#more)
@ -433,7 +434,8 @@ ## Download Options:
--downloader-args NAME:ARGS Give these arguments to the external --downloader-args NAME:ARGS Give these arguments to the external
downloader. Specify the downloader name and downloader. Specify the downloader name and
the arguments separated by a colon ":". You the arguments separated by a colon ":". You
can use this option multiple times can use this option multiple times to give
different arguments to different downloaders
(Alias: --external-downloader-args) (Alias: --external-downloader-args)
## Filesystem Options: ## Filesystem Options:
@ -816,18 +818,10 @@ ## Extractor Options:
--no-hls-split-discontinuity Do not split HLS playlists to different --no-hls-split-discontinuity Do not split HLS playlists to different
formats at discontinuities such as ad formats at discontinuities such as ad
breaks (default) breaks (default)
--youtube-include-dash-manifest Download the DASH manifests and related --extractor-args KEY:ARGS Pass these arguments to the extractor. See
data on YouTube videos (default) "EXTRACTOR ARGUMENTS" for details. You can
(Alias: --no-youtube-skip-dash-manifest) use this option multiple times to give
--youtube-skip-dash-manifest Do not download the DASH manifests and different arguments to different extractors
related data on YouTube videos
(Alias: --no-youtube-include-dash-manifest)
--youtube-include-hls-manifest Download the HLS manifests and related data
on YouTube videos (default)
(Alias: --no-youtube-skip-hls-manifest)
--youtube-skip-hls-manifest Do not download the HLS manifests and
related data on YouTube videos
(Alias: --no-youtube-include-hls-manifest)
# CONFIGURATION # CONFIGURATION
@ -1331,6 +1325,14 @@ # Set "comment" field in video metadata using description instead of webpage_url
``` ```
# EXTRACTOR ARGUMENTS
Some extractors accept additional arguments which can be passed using `--extractor-args KEY:ARGS`. `ARGS` is a `;` (colon) seperated string of `ARG=VAL1,VAL2`. Eg: `--extractor-args youtube:skip=dash,hls`
The following extractors use this feature:
* **youtube**
* `skip`: `hls` or `dash` (or both) to skip download of the respective manifests
# PLUGINS # PLUGINS
Plugins are loaded from `<root-dir>/ytdlp_plugins/<type>/__init__.py`. Currently only `extractor` plugins are supported. Support for `downloader` and `postprocessor` plugins may be added in the future. See [ytdlp_plugins](ytdlp_plugins) for example. Plugins are loaded from `<root-dir>/ytdlp_plugins/<type>/__init__.py`. Currently only `extractor` plugins are supported. Support for `downloader` and `postprocessor` plugins may be added in the future. See [ytdlp_plugins](ytdlp_plugins) for example.
@ -1362,6 +1364,10 @@ #### Not recommended
--list-formats-old --compat-options list-formats (Alias: --no-list-formats-as-table) --list-formats-old --compat-options list-formats (Alias: --no-list-formats-as-table)
--list-formats-as-table --compat-options -list-formats [Default] (Alias: --no-list-formats-old) --list-formats-as-table --compat-options -list-formats [Default] (Alias: --no-list-formats-old)
--sponskrub-args ARGS --ppa "sponskrub:ARGS" --sponskrub-args ARGS --ppa "sponskrub:ARGS"
--youtube-skip-dash-manifest --extractor-args "youtube:skip=dash" (Alias: --no-youtube-include-dash-manifest)
--youtube-skip-hls-manifest --extractor-args "youtube:skip=hls" (Alias: --no-youtube-include-hls-manifest)
--youtube-include-dash-manifest Default (Alias: --no-youtube-skip-dash-manifest)
--youtube-include-hls-manifest Default (Alias: --no-youtube-skip-hls-manifest)
--test Used by developers for testing extractors. Not intended for the end user --test Used by developers for testing extractors. Not intended for the end user
--youtube-print-sig-code Used for testing youtube signatures --youtube-print-sig-code Used for testing youtube signatures

View file

@ -420,11 +420,16 @@ class YoutubeDL(object):
dynamic_mpd: Whether to process dynamic DASH manifests (default: True) dynamic_mpd: Whether to process dynamic DASH manifests (default: True)
hls_split_discontinuity: Split HLS playlists to different formats at hls_split_discontinuity: Split HLS playlists to different formats at
discontinuities such as ad breaks (default: False) discontinuities such as ad breaks (default: False)
youtube_include_dash_manifest: If True (default), DASH manifests and related extractor_args: A dictionary of arguments to be passed to the extractors.
See "EXTRACTOR ARGUMENTS" for details.
Eg: {'youtube': {'skip': ['dash', 'hls']}}
youtube_include_dash_manifest: Deprecated - Use extractor_args instead.
If True (default), DASH manifests and related
data will be downloaded and processed by extractor. data will be downloaded and processed by extractor.
You can reduce network I/O by disabling it if you don't You can reduce network I/O by disabling it if you don't
care about DASH. (only for youtube) care about DASH. (only for youtube)
youtube_include_hls_manifest: If True (default), HLS manifests and related youtube_include_hls_manifest: Deprecated - Use extractor_args instead.
If True (default), HLS manifests and related
data will be downloaded and processed by extractor. data will be downloaded and processed by extractor.
You can reduce network I/O by disabling it if you don't You can reduce network I/O by disabling it if you don't
care about HLS. (only for youtube) care about HLS. (only for youtube)

View file

@ -631,6 +631,7 @@ def report_args_compat(arg, name):
'include_ads': opts.include_ads, 'include_ads': opts.include_ads,
'default_search': opts.default_search, 'default_search': opts.default_search,
'dynamic_mpd': opts.dynamic_mpd, 'dynamic_mpd': opts.dynamic_mpd,
'extractor_args': opts.extractor_args,
'youtube_include_dash_manifest': opts.youtube_include_dash_manifest, 'youtube_include_dash_manifest': opts.youtube_include_dash_manifest,
'youtube_include_hls_manifest': opts.youtube_include_hls_manifest, 'youtube_include_hls_manifest': opts.youtube_include_hls_manifest,
'encoding': opts.encoding, 'encoding': opts.encoding,

View file

@ -70,6 +70,7 @@
str_or_none, str_or_none,
str_to_int, str_to_int,
strip_or_none, strip_or_none,
traverse_obj,
unescapeHTML, unescapeHTML,
unified_strdate, unified_strdate,
unified_timestamp, unified_timestamp,
@ -3567,6 +3568,10 @@ def _availability(is_private=None, needs_premium=None, needs_subscription=None,
else 'public' if all_known else 'public' if all_known
else None) else None)
def _configuration_arg(self, key):
return traverse_obj(
self._downloader.params, ('extractor_args', self.ie_key().lower(), key))
class SearchInfoExtractor(InfoExtractor): class SearchInfoExtractor(InfoExtractor):
""" """

View file

@ -2119,8 +2119,12 @@ def feed_entry(name):
dct['container'] = dct['ext'] + '_dash' dct['container'] = dct['ext'] + '_dash'
formats.append(dct) formats.append(dct)
skip_manifests = self._configuration_arg('skip') or []
get_dash = 'dash' not in skip_manifests and self.get_param('youtube_include_dash_manifest', True)
get_hls = 'hls' not in skip_manifests and self.get_param('youtube_include_hls_manifest', True)
for sd in (streaming_data, ytm_streaming_data): for sd in (streaming_data, ytm_streaming_data):
hls_manifest_url = sd.get('hlsManifestUrl') hls_manifest_url = get_hls and sd.get('hlsManifestUrl')
if hls_manifest_url: if hls_manifest_url:
for f in self._extract_m3u8_formats( for f in self._extract_m3u8_formats(
hls_manifest_url, video_id, 'mp4', fatal=False): hls_manifest_url, video_id, 'mp4', fatal=False):
@ -2130,23 +2134,21 @@ def feed_entry(name):
f['format_id'] = itag f['format_id'] = itag
formats.append(f) formats.append(f)
if self.get_param('youtube_include_dash_manifest', True): dash_manifest_url = get_dash and sd.get('dashManifestUrl')
for sd in (streaming_data, ytm_streaming_data): if dash_manifest_url:
dash_manifest_url = sd.get('dashManifestUrl') for f in self._extract_mpd_formats(
if dash_manifest_url: dash_manifest_url, video_id, fatal=False):
for f in self._extract_mpd_formats( itag = f['format_id']
dash_manifest_url, video_id, fatal=False): if itag in itags:
itag = f['format_id'] continue
if itag in itags: if itag in itag_qualities:
continue f['quality'] = q(itag_qualities[itag])
if itag in itag_qualities: filesize = int_or_none(self._search_regex(
f['quality'] = q(itag_qualities[itag]) r'/clen/(\d+)', f.get('fragment_base_url')
filesize = int_or_none(self._search_regex( or f['url'], 'file size', default=None))
r'/clen/(\d+)', f.get('fragment_base_url') if filesize:
or f['url'], 'file size', default=None)) f['filesize'] = filesize
if filesize: formats.append(f)
f['filesize'] = filesize
formats.append(f)
if not formats: if not formats:
if not self.get_param('allow_unplayable_formats') and streaming_data.get('licenseInfos'): if not self.get_param('allow_unplayable_formats') and streaming_data.get('licenseInfos'):

View file

@ -716,7 +716,8 @@ def _dict_from_options_callback(
help=( help=(
'Give these arguments to the external downloader. ' 'Give these arguments to the external downloader. '
'Specify the downloader name and the arguments separated by a colon ":". ' 'Specify the downloader name and the arguments separated by a colon ":". '
'You can use this option multiple times (Alias: --external-downloader-args)')) 'You can use this option multiple times to give different arguments to different downloaders '
'(Alias: --external-downloader-args)'))
workarounds = optparse.OptionGroup(parser, 'Workarounds') workarounds = optparse.OptionGroup(parser, 'Workarounds')
workarounds.add_option( workarounds.add_option(
@ -1343,22 +1344,34 @@ def _dict_from_options_callback(
'--no-hls-split-discontinuity', '--no-hls-split-discontinuity',
dest='hls_split_discontinuity', action='store_false', dest='hls_split_discontinuity', action='store_false',
help='Do not split HLS playlists to different formats at discontinuities such as ad breaks (default)') help='Do not split HLS playlists to different formats at discontinuities such as ad breaks (default)')
extractor.add_option(
'--extractor-args',
metavar='KEY:ARGS', dest='extractor_args', default={}, type='str',
action='callback', callback=_dict_from_options_callback,
callback_kwargs={
'multiple_keys': False,
'process': lambda val: dict(
(lambda x: (x[0], x[1].split(',')))(arg.split('=', 1) + ['', '']) for arg in val.split(';'))
},
help=(
'Pass these arguments to the extractor. See "EXTRACTOR ARGUMENTS" for details. '
'You can use this option multiple times to give different arguments to different extractors'))
extractor.add_option( extractor.add_option(
'--youtube-include-dash-manifest', '--no-youtube-skip-dash-manifest', '--youtube-include-dash-manifest', '--no-youtube-skip-dash-manifest',
action='store_true', dest='youtube_include_dash_manifest', default=True, action='store_true', dest='youtube_include_dash_manifest', default=True,
help='Download the DASH manifests and related data on YouTube videos (default) (Alias: --no-youtube-skip-dash-manifest)') help=optparse.SUPPRESS_HELP)
extractor.add_option( extractor.add_option(
'--youtube-skip-dash-manifest', '--no-youtube-include-dash-manifest', '--youtube-skip-dash-manifest', '--no-youtube-include-dash-manifest',
action='store_false', dest='youtube_include_dash_manifest', action='store_false', dest='youtube_include_dash_manifest',
help='Do not download the DASH manifests and related data on YouTube videos (Alias: --no-youtube-include-dash-manifest)') help=optparse.SUPPRESS_HELP)
extractor.add_option( extractor.add_option(
'--youtube-include-hls-manifest', '--no-youtube-skip-hls-manifest', '--youtube-include-hls-manifest', '--no-youtube-skip-hls-manifest',
action='store_true', dest='youtube_include_hls_manifest', default=True, action='store_true', dest='youtube_include_hls_manifest', default=True,
help='Download the HLS manifests and related data on YouTube videos (default) (Alias: --no-youtube-skip-hls-manifest)') help=optparse.SUPPRESS_HELP)
extractor.add_option( extractor.add_option(
'--youtube-skip-hls-manifest', '--no-youtube-include-hls-manifest', '--youtube-skip-hls-manifest', '--no-youtube-include-hls-manifest',
action='store_false', dest='youtube_include_hls_manifest', action='store_false', dest='youtube_include_hls_manifest',
help='Do not download the HLS manifests and related data on YouTube videos (Alias: --no-youtube-include-hls-manifest)') help=optparse.SUPPRESS_HELP)
parser.add_option_group(general) parser.add_option_group(general)
parser.add_option_group(network) parser.add_option_group(network)