Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
yt-dlp(1)							     yt-dlp(1)

NAME
       yt-dlp -	A feature-rich command-line audio/video	downloader

SYNOPSIS
       yt-dlp [OPTIONS]	URL [URL...]

DESCRIPTION
       yt-dlp  is a feature-rich command-line audio/video downloader with sup-
       port for	thousands of sites.  The  project  is  a  fork	of  youtube-dl
       (https://github.com/ytdl-org/youtube-dl)	 based	on  the	 now  inactive
       youtube-dlc (https://github.com/blackjack4494/yt-dlc).

OPTIONS
   General Options:
       -h, --help
	      Print this help text and exit

       --version
	      Print program version and	exit

       -U, --update
	      Update this program to the latest	version

       --no-update
	      Do not check for updates (default)

       --update-to [CHANNEL]@[TAG]
	      Upgrade/downgrade	to a  specific	version.   CHANNEL  can	 be  a
	      repository  as  well.   CHANNEL  and TAG default to "stable" and
	      "latest" respectively if	omitted;  See  "UPDATE"	 for  details.
	      Supported	channels: stable, nightly, master

       -i, --ignore-errors
	      Ignore download and postprocessing errors.  The download will be
	      considered successful even if the	postprocessing fails

       --no-abort-on-error
	      Continue	with  next video on download errors; e.g.  to skip un-
	      available	videos in a playlist (default)

       --abort-on-error
	      Abort downloading	of further videos if an	error  occurs  (Alias:
	      --no-ignore-errors)

       --dump-user-agent
	      Display the current user-agent and exit

       --list-extractors
	      List all supported extractors and	exit

       --extractor-descriptions
	      Output descriptions of all supported extractors and exit

       --use-extractors	NAMES
	      Extractor	 names	to  use	separated by commas.  You can also use
	      regexes, "all", "default"	and "end"  (end	 URL  matching);  e.g.
	      --ies  "holodex.*,end,youtube".	Prefix	the name with a	"-" to
	      exclude it, e.g.	--ies default,-generic.	 Use --list-extractors
	      for a list of extractor names.  (Alias: --ies)

       --default-search	PREFIX
	      Use this prefix for unqualified URLs.  E.g.   "gvsearch2:python"
	      downloads	 two  videos  from  google  videos for the search term
	      "python".	 Use the value "auto" to let yt-dlp guess ("auto_warn-
	      ing" to emit a warning when guessing).  "error" just  throws  an
	      error.  The default value	"fixup_error" repairs broken URLs, but
	      emits an error if	this is	not possible instead of	searching

       --ignore-config
	      Don't  load  any	more configuration files except	those given to
	      --config-locations.  For backward	compatibility, if this	option
	      is found inside the system configuration file, the user configu-
	      ration is	not loaded.  (Alias: --no-config)

       --no-config-locations
	      Do not load any custom configuration files (default).  When giv-
	      en inside	a configuration	file, ignore all previous --config-lo-
	      cations defined in the current file

       --config-locations PATH
	      Location	of the main configuration file;	either the path	to the
	      config or	its containing directory ("-" for stdin).  Can be used
	      multiple times and inside	other configuration files

       --plugin-dirs PATH
	      Path to an additional directory to search	for plugins.  This op-
	      tion can be used multiple	times  to  add	multiple  directories.
	      Use "default" to search the default plugin directories (default)

       --no-plugin-dirs
	      Clear plugin directories to search, including defaults and those
	      provided by previous --plugin-dirs

       --flat-playlist
	      Do not extract a playlist's URL result entries; some entry meta-
	      data may be missing and downloading may be bypassed

       --no-flat-playlist
	      Fully extract the	videos of a playlist (default)

       --live-from-start
	      Download	livestreams  from the start.  Currently	only supported
	      for YouTube (Experimental)

       --no-live-from-start
	      Download livestreams from	the current time (default)

       --wait-for-video	MIN[-MAX]
	      Wait for scheduled streams to become available.  Pass the	 mini-
	      mum number of seconds (or	range) to wait between retries

       --no-wait-for-video
	      Do not wait for scheduled	streams	(default)

       --mark-watched
	      Mark videos watched (even	with --simulate)

       --no-mark-watched
	      Do not mark videos watched (default)

       --color [STREAM:]POLICY
	      Whether  to  emit	 color codes in	output,	optionally prefixed by
	      the STREAM (stdout or stderr) to apply the setting to.   Can  be
	      one  of  "always", "auto"	(default), "never", or "no_color" (use
	      non color	terminal sequences).  Use "auto-tty" or	"no_color-tty"
	      to decide	based on terminal support only.	 Can be	used  multiple
	      times

       --compat-options	OPTS
	      Options  that  can  help	keep  compatibility with youtube-dl or
	      youtube-dlc configurations by reverting some of the changes made
	      in yt-dlp.  See "Differences in default behavior"	for details

       --alias ALIASES OPTIONS
	      Create aliases for an option string.   Unless  an	 alias	starts
	      with a dash "-", it is prefixed with "--".  Arguments are	parsed
	      according	 to  the Python	string formatting mini-language.  E.g.
	      --alias get-audio,-X  "-S=aext:{0},abr  -x  --audio-format  {0}"
	      creates  options	"--get-audio"  and "-X"	that takes an argument
	      (ARG0) and expands to "-S=aext:ARG0,abr -x --audio-format	ARG0".
	      All defined aliases are listed in	the --help output.  Alias  op-
	      tions  can trigger more aliases; so be careful to	avoid defining
	      recursive	options.  As a safety measure, each alias may be trig-
	      gered a maximum of 100 times.  This option can be	used  multiple
	      times

   Network Options:
       --proxy URL
	      Use  the	specified  HTTP/HTTPS/SOCKS  proxy.   To  enable SOCKS
	      proxy,	  specify      a       proper	    scheme,	  e.g.
	      socks5://user:pass@127.0.0.1:1080/.   Pass  in  an  empty	string
	      (--proxy "") for direct connection

       --socket-timeout	SECONDS
	      Time to wait before giving up, in	seconds

       --source-address	IP
	      Client-side IP address to	bind to

       --impersonate CLIENT[:OS]
	      Client to	impersonate for	requests.  E.g.	  chrome,  chrome-110,
	      chrome:windows-10.   Pass	 --impersonate=""  to  impersonate any
	      client.  Note that forcing impersonation for  all	 requests  may
	      have a detrimental impact	on download speed and stability

       --list-impersonate-targets
	      List available clients to	impersonate.

       -4, --force-ipv4
	      Make all connections via IPv4

       -6, --force-ipv6
	      Make all connections via IPv6

       --enable-file-urls
	      Enable  file://  URLs.  This is disabled by default for security
	      reasons.

   Geo-restriction:
       --geo-verification-proxy	URL
	      Use this proxy to	verify the IP address for some	geo-restricted
	      sites.   The default proxy specified by --proxy (or none,	if the
	      option is	not present) is	used for the actual downloading

       --xff VALUE
	      How to fake X-Forwarded-For HTTP header to  try  bypassing  geo-
	      graphic  restriction.   One  of "default"	(only when known to be
	      useful), "never",	an IP block in CIDR notation, or a  two-letter
	      ISO 3166-2 country code

   Video Selection:
       -I, --playlist-items ITEM_SPEC
	      Comma  separated	playlist_index	of the items to	download.  You
	      can specify a range using	"[START]:[STOP][:STEP]".  For backward
	      compatibility, START-STOP	is also	supported.  Use	 negative  in-
	      dices  to	 count from the	right and negative STEP	to download in
	      reverse order.  E.g.  "-I	1:3,7,-5::2" used  on  a  playlist  of
	      size 15 will download the	items at index 1,2,3,7,11,13,15

       --min-filesize SIZE
	      Abort  download  if  filesize is smaller than SIZE, e.g.	50k or
	      44.6M

       --max-filesize SIZE
	      Abort download if	filesize is larger than	 SIZE,	e.g.   50k  or
	      44.6M

       --date DATE
	      Download	only  videos  uploaded	on this	date.  The date	can be
	      "YYYYMMDD"    or	  in	 the	 format	    [now|today|yester-
	      day][-N[day|week|month|year]].	E.g.	"--date	 today-2weeks"
	      downloads	only videos uploaded on	the same day two weeks ago

       --datebefore DATE
	      Download only videos uploaded on or before this date.  The  date
	      formats accepted are the same as --date

       --dateafter DATE
	      Download	only  videos uploaded on or after this date.  The date
	      formats accepted are the same as --date

       --match-filters FILTER
	      Generic video filter.  Any "OUTPUT TEMPLATE" field can  be  com-
	      pared  with  a number or a string	using the operators defined in
	      "Filtering Formats".  You	can also simply	 specify  a  field  to
	      match  if	 the  field  is	 present, use "!field" to check	if the
	      field is not present, and	"&" to check multiple conditions.  Use
	      a	"" to escape "&" or quotes if needed.  If used multiple	times,
	      the filter matches if at least one of  the  conditions  is  met.
	      E.g.   --match-filters !is_live --match-filters "like_count>?100
	      &	description~='(?i)& dogs" matches only	videos	that  are  not
	      live  OR those that have a like count more than 100 (or the like
	      field is not available) and also has a description that contains
	      the phrase "cats & dogs" (caseless).  Use	"--match-filters -" to
	      interactively ask	whether	to download each video

       --no-match-filters
	      Do not use any --match-filters (default)

       --break-match-filters FILTER
	      Same as "--match-filters"	but stops the download process when  a
	      video is rejected

       --no-break-match-filters
	      Do not use any --break-match-filters (default)

       --no-playlist
	      Download	only  the  video,  if  the URL refers to a video and a
	      playlist

       --yes-playlist
	      Download the playlist, if	the  URL  refers  to  a	 video	and  a
	      playlist

       --age-limit YEARS
	      Download only videos suitable for	the given age

       --download-archive FILE
	      Download only videos not listed in the archive file.  Record the
	      IDs of all downloaded videos in it

       --no-download-archive
	      Do not use archive file (default)

       --max-downloads NUMBER
	      Abort after downloading NUMBER files

       --break-on-existing
	      Stop  the	 download  process when	encountering a file that is in
	      the archive supplied with	the --download-archive option

       --no-break-on-existing
	      Do not stop the download process when encountering a  file  that
	      is in the	archive	(default)

       --break-per-input
	      Alters  --max-downloads, --break-on-existing, --break-match-fil-
	      ters, and	autonumber to reset per	input URL

       --no-break-per-input
	      --break-on-existing and similar options  terminates  the	entire
	      download queue

       --skip-playlist-after-errors N
	      Number  of  allowed  failures  until the rest of the playlist is
	      skipped

   Download Options:
       -N, --concurrent-fragments N
	      Number of	fragments of a dash/hlsnative  video  that  should  be
	      downloaded concurrently (default is 1)

       -r, --limit-rate	RATE
	      Maximum download rate in bytes per second, e.g.  50K or 4.2M

       --throttled-rate	RATE
	      Minimum download rate in bytes per second	below which throttling
	      is assumed and the video data is re-extracted, e.g.  100K

       -R, --retries RETRIES
	      Number of	retries	(default is 10), or "infinite"

       --file-access-retries RETRIES
	      Number of	times to retry on file access error (default is	3), or
	      "infinite"

       --fragment-retries RETRIES
	      Number  of retries for a fragment	(default is 10), or "infinite"
	      (DASH, hlsnative and ISM)

       --retry-sleep [TYPE:]EXPR
	      Time to sleep between retries in seconds	(optionally)  prefixed
	      by the type of retry (http (default), fragment, file_access, ex-
	      tractor)	to  apply  the	sleep  to.  EXPR can be	a number, lin-
	      ear=START[:END[:STEP=1]] or exp=START[:END[:BASE=2]].  This  op-
	      tion can be used multiple	times to set the sleep for the differ-
	      ent  retry  types, e.g.  --retry-sleep linear=1::2 --retry-sleep
	      fragment:exp=1:20

       --skip-unavailable-fragments
	      Skip unavailable fragments for DASH, hlsnative and ISM downloads
	      (default)	(Alias:	--no-abort-on-unavailable-fragments)

       --abort-on-unavailable-fragments
	      Abort download if	a fragment is unavailable  (Alias:  --no-skip-
	      unavailable-fragments)

       --keep-fragments
	      Keep downloaded fragments	on disk	after downloading is finished

       --no-keep-fragments
	      Delete  downloaded  fragments after downloading is finished (de-
	      fault)

       --buffer-size SIZE
	      Size of download buffer, e.g.  1024 or 16K (default is 1024)

       --resize-buffer
	      The buffer size is automatically resized from an	initial	 value
	      of --buffer-size (default)

       --no-resize-buffer
	      Do not automatically adjust the buffer size

       --http-chunk-size SIZE
	      Size of a	chunk for chunk-based HTTP downloading,	e.g.  10485760
	      or 10M (default is disabled).  May be useful for bypassing band-
	      width throttling imposed by a webserver (experimental)

       --playlist-random
	      Download playlist	videos in random order

       --lazy-playlist
	      Process entries in the playlist as they are received.  This dis-
	      ables n_entries, --playlist-random and --playlist-reverse

       --no-lazy-playlist
	      Process videos in	the playlist only after	the entire playlist is
	      parsed (default)

       --xattr-set-filesize
	      Set file xattribute ytdl.filesize	with expected file size

       --hls-use-mpegts
	      Use  the	mpegts container for HLS videos; allowing some players
	      to play the video	while downloading, and reducing	the chance  of
	      file  corruption if download is interrupted.  This is enabled by
	      default for live streams

       --no-hls-use-mpegts
	      Do not use the mpegts container for HLS videos.  This is default
	      when not downloading live	streams

       --download-sections REGEX
	      Download only chapters that match	the regular expression.	 A "*"
	      prefix denotes time-range	instead	of  chapter.   Negative	 time-
	      stamps  are calculated from the end.  "*from-url"	can be used to
	      download between the "start_time"	and "end_time" extracted  from
	      the  URL.	 Needs ffmpeg.	This option can	be used	multiple times
	      to  download  multiple   sections,   e.g.	   --download-sections
	      "*10:15-inf" --download-sections "intro"

       --downloader [PROTO:]NAME
	      Name or path of the external downloader to use (optionally) pre-
	      fixed  by	the protocols (http, ftp, m3u8,	dash, rstp, rtmp, mms)
	      to use it	for.  Currently	supports native, aria2c, avconv, axel,
	      curl, ffmpeg, httpie, wget.  You can use	this  option  multiple
	      times  to	 set  different	 downloaders  for different protocols.
	      E.g.  --downloader aria2c	--downloader  "dash,m3u8:native"  will
	      use aria2c for http/ftp downloads, and the native	downloader for
	      dash/m3u8	downloads (Alias: --external-downloader)

       --downloader-args NAME:ARGS
	      Give  these  arguments  to the external downloader.  Specify the
	      downloader name and the arguments	separated by a colon ":".  For
	      ffmpeg, arguments	can be passed to different positions using the
	      same syntax as --postprocessor-args.  You	can  use  this	option
	      multiple	times  to  give	different arguments to different down-
	      loaders (Alias: --external-downloader-args)

   Filesystem Options:
       -a, --batch-file	FILE
	      File containing URLs to download ("-" for	stdin),	 one  URL  per
	      line.   Lines  starting  with  "#", ";" or "]" are considered as
	      comments and ignored

       --no-batch-file
	      Do not read URLs from batch file (default)

       -P, --paths [TYPES:]PATH
	      The paths	where the files	should	be  downloaded.	  Specify  the
	      type  of	file  and  the path separated by a colon ":".  All the
	      same TYPES as --output are supported.  Additionally, you can al-
	      so provide "home"	(default) and "temp" paths.  All  intermediary
	      files  are  first	downloaded to the temp path and	then the final
	      files are	moved over to the home path  after  download  is  fin-
	      ished.  This option is ignored if	--output is an absolute	path

       -o, --output [TYPES:]TEMPLATE
	      Output filename template;	see "OUTPUT TEMPLATE" for details

       --output-na-placeholder TEXT
	      Placeholder for unavailable fields in --output (default: "NA")

       --restrict-filenames
	      Restrict	filenames  to only ASCII characters, and avoid "&" and
	      spaces in	filenames

       --no-restrict-filenames
	      Allow Unicode characters,	"&" and	spaces in filenames (default)

       --windows-filenames
	      Force filenames to be Windows-compatible

       --no-windows-filenames
	      Sanitize filenames only minimally

       --trim-filenames	LENGTH
	      Limit the	filename length	(excluding extension) to the specified
	      number of	characters

       -w, --no-overwrites
	      Do not overwrite any files

       --force-overwrites
	      Overwrite	all video and metadata files.	This  option  includes
	      --no-continue

       --no-force-overwrites
	      Do  not  overwrite  the  video, but overwrite related files (de-
	      fault)

       -c, --continue
	      Resume partially downloaded files/fragments (default)

       --no-continue
	      Do not resume partially downloaded fragments.  If	 the  file  is
	      not fragmented, restart download of the entire file

       --part Use  .part  files	 instead  of writing directly into output file
	      (default)

       --no-part
	      Do not use .part files - write directly into output file

       --mtime
	      Use the Last-modified header to set the file  modification  time
	      (default)

       --no-mtime
	      Do not use the Last-modified header to set the file modification
	      time

       --write-description
	      Write video description to a .description	file

       --no-write-description
	      Do not write video description (default)

       --write-info-json
	      Write video metadata to a	.info.json file	(this may contain per-
	      sonal information)

       --no-write-info-json
	      Do not write video metadata (default)

       --write-playlist-metafiles
	      Write  playlist  metadata	in addition to the video metadata when
	      using --write-info-json, --write-description etc.	 (default)

       --no-write-playlist-metafiles
	      Do not write playlist  metadata  when  using  --write-info-json,
	      --write-description etc.

       --clean-info-json
	      Remove  some internal metadata such as filenames from the	infoj-
	      son (default)

       --no-clean-info-json
	      Write all	fields to the infojson

       --write-comments
	      Retrieve video comments to be placed in the infojson.  The  com-
	      ments  are fetched even without this option if the extraction is
	      known to be quick	(Alias:	--get-comments)

       --no-write-comments
	      Do not retrieve video comments unless the	extraction is known to
	      be quick (Alias: --no-get-comments)

       --load-info-json	FILE
	      JSON file	containing the video  information  (created  with  the
	      "--write-info-json" option)

       --cookies FILE
	      Netscape formatted file to read cookies from and dump cookie jar
	      in

       --no-cookies
	      Do not read/dump cookies from/to file (default)

       --cookies-from-browser BROWSER[+KEYRING][:PROFILE][::CONTAINER]
	      The  name	 of  the browser to load cookies from.	Currently sup-
	      ported browsers are: brave,  chrome,  chromium,  edge,  firefox,
	      opera, safari, vivaldi, whale.  Optionally, the KEYRING used for
	      decrypting  Chromium cookies on Linux, the name/path of the PRO-
	      FILE to load cookies from, and the CONTAINER name	 (if  Firefox)
	      ("none"  for  no	container)  can	be given with their respective
	      separators.  By default, all containers of the most recently ac-
	      cessed profile are used.	Currently supported keyrings are:  ba-
	      sictext, gnomekeyring, kwallet, kwallet5,	kwallet6

       --no-cookies-from-browser
	      Do not load cookies from browser (default)

       --cache-dir DIR
	      Location	in  the	 filesystem  where yt-dlp can store some down-
	      loaded information (such as client ids  and  signatures)	perma-
	      nently.  By default ${XDG_CACHE_HOME}/yt-dlp

       --no-cache-dir
	      Disable filesystem caching

       --rm-cache-dir
	      Delete all filesystem cache files

   Thumbnail Options:
       --write-thumbnail
	      Write thumbnail image to disk

       --no-write-thumbnail
	      Do not write thumbnail image to disk (default)

       --write-all-thumbnails
	      Write all	thumbnail image	formats	to disk

       --list-thumbnails
	      List  available thumbnails of each video.	 Simulate unless --no-
	      simulate is used

   Internet Shortcut Options:
       --write-link
	      Write an internet	shortcut file, depending on the	current	 plat-
	      form  (.url, .webloc or .desktop).  The URL may be cached	by the
	      OS

       --write-url-link
	      Write a .url Windows internet shortcut.  The OS caches  the  URL
	      based on the file	path

       --write-webloc-link
	      Write a .webloc macOS internet shortcut

       --write-desktop-link
	      Write a .desktop Linux internet shortcut

   Verbosity and Simulation Options:
       -q, --quiet
	      Activate	quiet  mode.  If used with --verbose, print the	log to
	      stderr

       --no-quiet
	      Deactivate quiet mode.  (Default)

       --no-warnings
	      Ignore warnings

       -s, --simulate
	      Do not download the video	and do not write anything to disk

       --no-simulate
	      Download the video even if printing/listing options are used

       --ignore-no-formats-error
	      Ignore "No video formats"	error.	Useful for extracting metadata
	      even if the videos are not actually available for	download  (ex-
	      perimental)

       --no-ignore-no-formats-error
	      Throw  error  when  no downloadable video	formats	are found (de-
	      fault)

       --skip-download
	      Do not download the video	but write all  related	files  (Alias:
	      --no-download)

       -O, --print [WHEN:]TEMPLATE
	      Field  name  or  output  template	to print to screen, optionally
	      prefixed with when to print it, separated	by a  ":".   Supported
	      values  of  "WHEN"  are  the same	as that	of --use-postprocessor
	      (default:	video).	 Implies --quiet.  Implies  --simulate	unless
	      --no-simulate or later stages of WHEN are	used.  This option can
	      be used multiple times

       --print-to-file [WHEN:]TEMPLATE FILE
	      Append  given template to	the file.  The values of WHEN and TEM-
	      PLATE are	the same as that of --print.  FILE uses	the same  syn-
	      tax  as  the  output template.  This option can be used multiple
	      times

       -j, --dump-json
	      Quiet, but print JSON information	for each video.	 Simulate  un-
	      less  --no-simulate  is  used.   See "OUTPUT TEMPLATE" for a de-
	      scription	of available keys

       -J, --dump-single-json
	      Quiet, but print JSON  information  for  each  URL  or  infojson
	      passed.	Simulate  unless  --no-simulate	 is  used.  If the URL
	      refers to	a playlist, the	whole playlist information  is	dumped
	      in a single line

       --force-write-archive
	      Force download archive entries to	be written as far as no	errors
	      occur,  even  if -s or another simulation	option is used (Alias:
	      --force-download-archive)

       --newline
	      Output progress bar as new lines

       --no-progress
	      Do not print progress bar

       --progress
	      Show progress bar, even if in quiet mode

       --console-title
	      Display progress in console titlebar

       --progress-template [TYPES:]TEMPLATE
	      Template for progress outputs, optionally	prefixed with  one  of
	      "download:"  (default),  "download-title:"  (the console title),
	      "postprocess:", or "postprocess-title:".	The video's fields are
	      accessible under the "info" key and the progress attributes  are
	      accessible   under   "progress"	key.	E.g.   --console-title
	      --progress-template			 "download-title:%(in-
	      fo.id)s-%(progress.eta)s"

       --progress-delta	SECONDS
	      Time between progress output (default: 0)

       -v, --verbose
	      Print various debugging information

       --dump-pages
	      Print  downloaded	 pages	encoded	using base64 to	debug problems
	      (very verbose)

       --write-pages
	      Write downloaded intermediary pages to files in the current  di-
	      rectory to debug problems

       --print-traffic
	      Display sent and read HTTP traffic

   Workarounds:
       --encoding ENCODING
	      Force the	specified encoding (experimental)

       --legacy-server-connect
	      Explicitly allow HTTPS connection	to servers that	do not support
	      RFC 5746 secure renegotiation

       --no-check-certificates
	      Suppress HTTPS certificate validation

       --prefer-insecure
	      Use  an unencrypted connection to	retrieve information about the
	      video (Currently supported only for YouTube)

       --add-headers FIELD:VALUE
	      Specify a	custom HTTP header and its value, separated by a colon
	      ":".  You	can use	this option multiple times

       --bidi-workaround
	      Work around terminals that lack bidirectional text support.  Re-
	      quires bidiv or fribidi executable in PATH

       --sleep-requests	SECONDS
	      Number of	seconds	to sleep between requests during data  extrac-
	      tion

       --sleep-interval	SECONDS
	      Number  of  seconds  to sleep before each	download.  This	is the
	      minimum time to sleep when used along with  --max-sleep-interval
	      (Alias: --min-sleep-interval)

       --max-sleep-interval SECONDS
	      Maximum number of	seconds	to sleep.  Can only be used along with
	      --min-sleep-interval

       --sleep-subtitles SECONDS
	      Number of	seconds	to sleep before	each subtitle download

   Video Format	Options:
       -f, --format FORMAT
	      Video format code, see "FORMAT SELECTION"	for more details

       -S, --format-sort SORTORDER
	      Sort  the	formats	by the fields given, see "Sorting Formats" for
	      more details

       --format-sort-force
	      Force user specified sort	order  to  have	 precedence  over  all
	      fields,  see  "Sorting  Formats"	for  more details (Alias: --S-
	      force)

       --no-format-sort-force
	      Some fields have precedence over the user	specified  sort	 order
	      (default)

       --video-multistreams
	      Allow multiple video streams to be merged	into a single file

       --no-video-multistreams
	      Only  one	 video	stream is downloaded for each output file (de-
	      fault)

       --audio-multistreams
	      Allow multiple audio streams to be merged	into a single file

       --no-audio-multistreams
	      Only one audio stream is downloaded for each  output  file  (de-
	      fault)

       --prefer-free-formats
	      Prefer  video formats with free containers over non-free ones of
	      the same quality.	 Use with "-S ext"  to	strictly  prefer  free
	      containers irrespective of quality

       --no-prefer-free-formats
	      Don't give any special preference	to free	containers (default)

       --check-formats
	      Make sure	formats	are selected only from those that are actually
	      downloadable

       --check-all-formats
	      Check all	formats	for whether they are actually downloadable

       --no-check-formats
	      Do not check that	the formats are	actually downloadable

       -F, --list-formats
	      List available formats of	each video.  Simulate unless --no-sim-
	      ulate is used

       --merge-output-format FORMAT
	      Containers  that	may be used when merging formats, separated by
	      "/", e.g.	 "mp4/mkv".  Ignored if	no merge is  required.	 (cur-
	      rently supported:	avi, flv, mkv, mov, mp4, webm)

   Subtitle Options:
       --write-subs
	      Write subtitle file

       --no-write-subs
	      Do not write subtitle file (default)

       --write-auto-subs
	      Write  automatically generated subtitle file (Alias: --write-au-
	      tomatic-subs)

       --no-write-auto-subs
	      Do not write auto-generated subtitles  (default)	(Alias:	 --no-
	      write-automatic-subs)

       --list-subs
	      List  available  subtitles of each video.	 Simulate unless --no-
	      simulate is used

       --sub-format FORMAT
	      Subtitle format; accepts formats preference  separated  by  "/",
	      e.g.  "srt" or "ass/srt/best"

       --sub-langs LANGS
	      Languages	 of  the subtitles to download (can be regex) or "all"
	      separated	by commas, e.g.	 --sub-langs "en.*,ja"	(where	"en.*"
	      is  a  regex  pattern that matches "en" followed by 0 or more of
	      any character).  You can prefix the language code	with a "-"  to
	      exclude  it  from	 the  requested	 languages, e.g.  --sub- langs
	      all,-live_chat.  Use --list-subs for a list  of  available  lan-
	      guage tags

   Authentication Options:
       -u, --username USERNAME
	      Login with this account ID

       -p, --password PASSWORD
	      Account  password.   If this option is left out, yt-dlp will ask
	      interactively

       -2, --twofactor TWOFACTOR
	      Two-factor authentication	code

       -n, --netrc
	      Use .netrc authentication	data

       --netrc-location	PATH
	      Location of .netrc authentication	data; either the path  or  its
	      containing directory.  Defaults to ~/.netrc

       --netrc-cmd NETRC_CMD
	      Command to execute to get	the credentials	for an extractor.

       --video-password	PASSWORD
	      Video-specific password

       --ap-mso	MSO
	      Adobe  Pass  multiple-system  operator (TV provider) identifier,
	      use --ap-list-mso	for a list of available	MSOs

       --ap-username USERNAME
	      Multiple-system operator account login

       --ap-password PASSWORD
	      Multiple-system operator account password.  If  this  option  is
	      left out,	yt-dlp will ask	interactively

       --ap-list-mso
	      List all supported multiple-system operators

       --client-certificate CERTFILE
	      Path  to client certificate file in PEM format.  May include the
	      private key

       --client-certificate-key	KEYFILE
	      Path to private key file for client certificate

       --client-certificate-password PASSWORD
	      Password for client certificate private key, if  encrypted.   If
	      not provided, and	the key	is encrypted, yt-dlp will ask interac-
	      tively

   Post-Processing Options:
       -x, --extract-audio
	      Convert video files to audio-only	files (requires	ffmpeg and ff-
	      probe)

       --audio-format FORMAT
	      Format to	convert	the audio to when -x is	used.  (currently sup-
	      ported: best (default), aac, alac, flac, m4a, mp3, opus, vorbis,
	      wav).   You  can	specify	multiple rules using similar syntax as
	      --remux-video

       --audio-quality QUALITY
	      Specify ffmpeg audio quality to use when	converting  the	 audio
	      with -x.	Insert a value between 0 (best)	and 10 (worst) for VBR
	      or a specific bitrate like 128K (default 5)

       --remux-video FORMAT
	      Remux  the  video	into another container if necessary (currently
	      supported: avi, flv, gif,	mkv, mov, mp4, webm, aac, aiff,	 alac,
	      flac,  m4a,  mka,	 mp3,  ogg, opus, vorbis, wav).	 If the	target
	      container	does not support the video/audio codec,	remuxing  will
	      fail.	 You	 can	 specify    multiple	rules;	  e.g.
	      "aac>m4a/mov>mp4/mkv" will remux aac to m4a, mov to mp4 and any-
	      thing else to mkv

       --recode-video FORMAT
	      Re-encode	the video into another format if necessary.  The  syn-
	      tax and supported	formats	are the	same as	--remux-video

       --postprocessor-args NAME:ARGS
	      Give  these  arguments to	the postprocessors.  Specify the post-
	      processor/executable name	and the	arguments separated by a colon
	      ":" to give the argument	to  the	 specified  postprocessor/exe-
	      cutable.	 Supported  PP are: Merger, ModifyChapters, SplitChap-
	      ters, ExtractAudio, VideoRemuxer,	VideoConvertor,	Metadata,  Em-
	      bedSubtitle,  EmbedThumbnail, SubtitlesConvertor,	ThumbnailsCon-
	      vertor, FixupStretched, FixupM4a,	FixupM3u8, FixupTimestamp  and
	      FixupDuration.   The  supported  executables are:	AtomicParsley,
	      FFmpeg and FFprobe.  You can also	specify	"PP+EXE:ARGS" to  give
	      the  arguments  to the specified executable only when being used
	      by the specified postprocessor.	Additionally,  for  ffmpeg/ff-
	      probe,  "_i"/"_o"	 can be	appended to the	prefix optionally fol-
	      lowed by a number	to pass	the argument before the	specified  in-
	      put/output  file,	 e.g.  --ppa "Merger+ffmpeg_i1:-v quiet".  You
	      can use this option multiple times to give  different  arguments
	      to different postprocessors.  (Alias: --ppa)

       -k, --keep-video
	      Keep the intermediate video file on disk after post-processing

       --no-keep-video
	      Delete  the  intermediate	 video file after post-processing (de-
	      fault)

       --post-overwrites
	      Overwrite	post-processed files (default)

       --no-post-overwrites
	      Do not overwrite post-processed files

       --embed-subs
	      Embed subtitles in the video (only for mp4, webm and mkv videos)

       --no-embed-subs
	      Do not embed subtitles (default)

       --embed-thumbnail
	      Embed thumbnail in the video as cover art

       --no-embed-thumbnail
	      Do not embed thumbnail (default)

       --embed-metadata
	      Embed metadata to	the video file.	 Also embeds chapters/infojson
	      if present unless	 --no-embed-chapters/--no-embed-info-json  are
	      used (Alias: --add-metadata)

       --no-embed-metadata
	      Do not add metadata to file (default) (Alias: --no-add-metadata)

       --embed-chapters
	      Add chapter markers to the video file (Alias: --add-chapters)

       --no-embed-chapters
	      Do not add chapter markers (default) (Alias: --no-add-chapters)

       --embed-info-json
	      Embed the	infojson as an attachment to mkv/mka video files

       --no-embed-info-json
	      Do not embed the infojson	as an attachment to the	video file

       --parse-metadata	[WHEN:]FROM:TO
	      Parse  additional	 metadata like title/artist from other fields;
	      see "MODIFYING  METADATA"	 for  details.	 Supported  values  of
	      "WHEN"  are  the	same  as that of --use-postprocessor (default:
	      pre_process)

       --replace-in-metadata [WHEN:]FIELDS REGEX REPLACE
	      Replace text in a	metadata field using the  given	 regex.	  This
	      option  can  be used multiple times.  Supported values of	"WHEN"
	      are  the	same  as   that	  of   --use-postprocessor   (default:
	      pre_process)

       --xattrs
	      Write metadata to	the video file's xattrs	(using Dublin Core and
	      XDG standards)

       --concat-playlist POLICY
	      Concatenate  videos in a playlist.  One of "never", "always", or
	      "multi_video" (default; only  when  the  videos  form  a	single
	      show).  All the video files must have the	same codecs and	number
	      of  streams  to  be concatenable.	 The "pl_video:" prefix	can be
	      used with	"--paths" and "--output" to set	 the  output  filename
	      for the concatenated files.  See "OUTPUT TEMPLATE" for details

       --fixup POLICY
	      Automatically  correct  known  faults of the file.  One of never
	      (do nothing), warn (only emit a  warning),  detect_or_warn  (the
	      default;	fix  the  file	if we can, warn	otherwise), force (try
	      fixing even if the file already exists)

       --ffmpeg-location PATH
	      Location of the ffmpeg binary; either the	path to	the binary  or
	      its containing directory

       --exec [WHEN:]CMD
	      Execute  a command, optionally prefixed with when	to execute it,
	      separated	by a ":".  Supported values of "WHEN" are the same  as
	      that  of	--use-postprocessor  (default:	after_move).  The same
	      syntax as	the output template can	be used	to pass	any  field  as
	      arguments	  to   the   command.	 If   no  fields  are  passed,
	      %(filepath,_filename|)q is appended to the end of	 the  command.
	      This option can be used multiple times

       --no-exec
	      Remove any previously defined --exec

       --convert-subs FORMAT
	      Convert  the  subtitles  to another format (currently supported:
	      ass, lrc,	srt, vtt).  Use	"--convert-subs	none" to disable  con-
	      version (default)	(Alias:	--convert- subtitles)

       --convert-thumbnails FORMAT
	      Convert  the  thumbnails to another format (currently supported:
	      jpg, png,	webp).	You can	specify	multiple rules	using  similar
	      syntax  as "--remux-video".  Use "--convert- thumbnails none" to
	      disable conversion (default)

       --split-chapters
	      Split video into multiple	files based on internal	chapters.  The
	      "chapter:" prefix	can be used with "--paths" and	"--output"  to
	      set  the	output filename	for the	split files.  See "OUTPUT TEM-
	      PLATE" for details

       --no-split-chapters
	      Do not split video based on chapters (default)

       --remove-chapters REGEX
	      Remove chapters whose title matches the  given  regular  expres-
	      sion.   The syntax is the	same as	--download-sections.  This op-
	      tion can be used multiple	times

       --no-remove-chapters
	      Do not remove any	chapters from the file (default)

       --force-keyframes-at-cuts
	      Force keyframes at cuts when downloading/splitting/removing sec-
	      tions.  This is slow due to needing a re-encode, but the result-
	      ing video	may have fewer artifacts around	the cuts

       --no-force-keyframes-at-cuts
	      Do not force keyframes around the	chapters  when	cutting/split-
	      ting (default)

       --use-postprocessor NAME[:ARGS]
	      The  (case-sensitive)  name  of  plugin postprocessors to	be en-
	      abled, and (optionally) arguments	to be passed to	it,  separated
	      by  a  colon  ":".   ARGS	 are a semicolon ";" delimited list of
	      NAME=VALUE.  The "when" argument determines when the postproces-
	      sor is invoked.  It can be one of	"pre_process" (after video ex-
	      traction), "after_filter"	(after video passes  filter),  "video"
	      (after  --format;	 before	--print/--output), "before_dl" (before
	      each video download), "post_process" (after each video download;
	      default),	"after_move" (after moving the video file to its final
	      location), "after_video" (after downloading and  processing  all
	      formats  of  a video), or	"playlist" (at end of playlist).  This
	      option can be used multiple times	to add	different  postproces-
	      sors

   SponsorBlock	Options:
       Make  chapter  entries for, or remove various segments (sponsor,	intro-
       ductions, etc.)	from downloaded	YouTube	videos using the  SponsorBlock
       API (https://sponsor.ajay.app)

       --sponsorblock-mark CATS
	      SponsorBlock  categories	to  create  chapters for, separated by
	      commas.  Available categories are	sponsor, intro,	 outro,	 self-
	      promo,  preview,	filler,	interaction, music_offtopic, poi_high-
	      light, chapter, all and default (=all).  You can prefix the cat-
	      egory with a "-" to exclude it.  See [1] for descriptions	of the
	      categories.    E.g.    --sponsorblock-mark   all,-preview	   [1]
	      https://wiki.sponsor.ajay.app/w/Segment_Categories

       --sponsorblock-remove CATS
	      SponsorBlock categories to be removed from the video file, sepa-
	      rated  by	commas.	 If a category is present in both mark and re-
	      move, remove takes precedence.  The syntax and  available	 cate-
	      gories  are the same as for --sponsorblock-mark except that "de-
	      fault" refers to "all,-filler" and  poi_highlight,  chapter  are
	      not available

       --sponsorblock-chapter-title TEMPLATE
	      An  output  template  for	the title of the SponsorBlock chapters
	      created by --sponsorblock-mark.  The only	available  fields  are
	      start_time,   end_time,	category,  categories,	name,  catego-
	      ry_names.	 Defaults to "[SponsorBlock]: %(category_names)l"

       --no-sponsorblock
	      Disable both --sponsorblock-mark and --sponsorblock-remove

       --sponsorblock-api URL
	      SponsorBlock API location, defaults to https://sponsor.ajay.app

   Extractor Options:
       --extractor-retries RETRIES
	      Number of	retries	for known extractor errors (default is 3),  or
	      "infinite"

       --allow-dynamic-mpd
	      Process dynamic DASH manifests (default) (Alias: --no-ignore-dy-
	      namic-mpd)

       --ignore-dynamic-mpd
	      Do  not process dynamic DASH manifests (Alias: --no-allow-dynam-
	      ic-mpd)

       --hls-split-discontinuity
	      Split HLS	playlists to different formats at discontinuities such
	      as ad breaks

       --no-hls-split-discontinuity
	      Do not split HLS playlists into different	formats	at discontinu-
	      ities such as ad breaks (default)

       --extractor-args	IE_KEY:ARGS
	      Pass ARGS	arguments to the IE_KEY	extractor.  See	"EXTRACTOR AR-
	      GUMENTS" for details.  You can use this option multiple times to
	      give arguments for different extractors

CONFIGURATION
       You can configure yt-dlp	by placing any supported command  line	option
       in  a configuration file.  The configuration is loaded from the follow-
       ing locations:

       1. Main Configuration:

	    The file given to --config-location

       2. Portable Configuration: (Recommended for portable installations)

	    If	using a	binary,	yt-dlp.conf in the same	directory as the bina-
	     ry

	    If	running	from source-code, yt-dlp.conf in the parent  directory
	     of	yt_dlp

       3. Home Configuration:

	    yt-dlp.conf in the	home path given	to -P

	    If	-P is not given, the current directory is searched

       4. User Configuration:

	    ${XDG_CONFIG_HOME}/yt-dlp.conf

	    ${XDG_CONFIG_HOME}/yt-dlp/config (recommended on Linux/macOS)

	    ${XDG_CONFIG_HOME}/yt-dlp/config.txt

	    ${APPDATA}/yt-dlp.conf

	    ${APPDATA}/yt-dlp/config (recommended on Windows)

	    ${APPDATA}/yt-dlp/config.txt

	    ~/yt-dlp.conf

	    ~/yt-dlp.conf.txt

	    ~/.yt-dlp/config

	    ~/.yt-dlp/config.txt See also: Notes about	environment variables

       5. System Configuration:

	    /etc/yt-dlp.conf

	    /etc/yt-dlp/config

	    /etc/yt-dlp/config.txt

       E.g.  with the following	configuration file, yt-dlp will	always extract
       the  audio,  not	 copy the mtime, use a proxy and save all videos under
       YouTube directory in your home directory:

	      #	Lines starting with # are comments

	      #	Always extract audio
	      -x

	      #	Do not copy the	mtime
	      --no-mtime

	      #	Use this proxy
	      --proxy 127.0.0.1:3128

	      #	Save all videos	under YouTube directory	in your	home directory
	      -o ~/YouTube/%(title)s.%(ext)s

       Note: Options in	a configuration	file are just  the  same  options  aka
       switches	 used  in  regular  command  line calls; thus there must be no
       whitespace after	- or --, e.g.  -o or --proxy but not - o or --	proxy.
       They must also be quoted	when necessary,	as if it were a	UNIX shell.

       You  can	 use  --ignore-config if you want to disable all configuration
       files for a particular yt-dlp run.  If --ignore-config is found	inside
       any  configuration  file, no further configuration will be loaded.  For
       example,	having the option in the portable configuration	file  prevents
       loading	of  home, user,	and system configurations.  Additionally, (for
       backward	compatibility) if --ignore-config is found inside  the	system
       configuration file, the user configuration is not loaded.

   Configuration file encoding
       The  configuration  files  are  decoded	according  to  the  UTF	BOM if
       present,	and in the encoding from system	locale otherwise.

       If you want your	file to	be decoded differently,	add # coding: ENCODING
       to the beginning	of the file (e.g.  # coding: shift-jis).   There  must
       be no characters	before that, even spaces or BOM.

   Authentication with netrc
       You  may	 also  want to configure automatic credentials storage for ex-
       tractors	that support authentication (by	providing login	 and  password
       with  --username	 and  --password)  in order not	to pass	credentials as
       command line arguments on every yt-dlp execution	and  prevent  tracking
       plain  text  passwords  in  the shell command history.  You can achieve
       this using a .netrc  file  (https://stackoverflow.com/tags/.netrc/info)
       on  a  per-extractor basis.  For	that, you will need to create a	.netrc
       file in --netrc-location	and restrict permissions to read/write by only
       you:

	      touch ${HOME}/.netrc
	      chmod a-rwx,u+rw ${HOME}/.netrc

       After that, you can add credentials for an extractor in	the  following
       format, where extractor is the name of the extractor in lowercase:

	      machine <extractor> login	<username> password <password>

       E.g.

	      machine youtube login myaccount@gmail.com	password my_youtube_password
	      machine twitch login my_twitch_account_name password my_twitch_password

       To activate authentication with the .netrc file you should pass --netrc
       to yt-dlp or place it in	the configuration file.

       The default location of the .netrc file is ~ (see below).

       As  an alternative to using the .netrc file, which has the disadvantage
       of keeping your passwords in a plain text file,	you  can  configure  a
       custom shell command to provide the credentials for an extractor.  This
       is  done	 by  providing	the --netrc-cmd	parameter, it shall output the
       credentials in the netrc	format and return 0 on success,	 other	values
       will be treated as an error.  {}	in the command will be replaced	by the
       name of the extractor to	make it	possible to select the credentials for
       the right extractor.

       E.g.  To	use an encrypted .netrc	file stored as .authinfo.gpg

	      yt-dlp --netrc-cmd 'gpg --decrypt	~/.authinfo.gpg' 'https://www.youtube.com/watch?v=BaW_jenozKc'

   Notes about environment variables
        Environment variables are normally specified as ${VARIABLE}/$VARIABLE
	 on UNIX and %VARIABLE%	on Windows; but	is always shown	as ${VARIABLE}
	 in this documentation

        yt-dlp	 also  allows  using UNIX-style	variables on Windows for path-
	 like options; e.g.  --output, --config-location

        If   unset,   ${XDG_CONFIG_HOME}   defaults	to    ~/.config	   and
	 ${XDG_CACHE_HOME} to ~/.cache

        On  Windows,  ~  points  to ${HOME} if	present; or, ${USERPROFILE} or
	 ${HOMEDRIVE}${HOMEPATH} otherwise

        On Windows, ${USERPROFILE} generally points to	 C:\Users\<user	 name>
	 and ${APPDATA}	to ${USERPROFILE}\AppData\Roaming

OUTPUT TEMPLATE
       The  -o option is used to indicate a template for the output file names
       while -P	option is used to specify the path each	type of	file should be
       saved to.

       The simplest usage of -o	is not to  set	any  template  arguments  when
       downloading   a	 single	  file,	 like  in  yt-dlp  -o  funny_video.flv
       "https://some/video" (hard-coding file extension	like this is not  rec-
       ommended	and could break	some post-processing).

       It  may	however	 also  contain special sequences that will be replaced
       when downloading	each video.  The special sequences  may	 be  formatted
       according      to      Python	  string     formatting	    operations
       (https://docs.python.org/3/library/stdtypes.html#printf-style-string-
       formatting), e.g.  %(NAME)s or %(NAME)05d.  To clarify, that is a  per-
       cent  symbol  followed by a name	in parentheses,	followed by formatting
       operations.

       The field names themselves (the part inside the parenthesis)  can  also
       have some special formatting:

       1. Object  traversal:  The dictionaries and lists available in metadata
	  can be traversed by using  a	dot  .	separator;  e.g.   %(tags.0)s,
	  %(subtitles.en.-1.ext)s.   You  can  do Python slicing with colon :;
	  E.g.	 %(id.3:7)s,  %(id.6:2:-1)s,  %(formats.:.format_id)s.	 Curly
	  braces {} can	be used	to build dictionaries with only	specific keys;
	  e.g.	 %(formats.:.{format_id,height})#j.   An empty field name %()s
	  refers to the	entire infodict; e.g.  %(.{id,title})s.	 Note that all
	  the fields that become available using this method  are  not	listed
	  below.  Use -j to see	such fields

       2. Arithmetic: Simple arithmetic	can be done on numeric fields using +,
	  -  and *.  E.g.  %(playlist_index+10)03d, %(n_entries+1-playlist_in-
	  dex)d

       3. Date/time Formatting:	Date/time fields can be	formatted according to
	  strftime     formatting     (https://docs.python.org/3/library/date-
	  time.html#strftime-and-strptime-format-codes)	by specifying it sepa-
	  rated	 from  the field name using a >.  E.g.	%(duration>%H-%M-%S)s,
	  %(upload_date>%Y-%m-%d)s, %(epoch-3600>%H-%M-%S)s

       4. Alternatives:	Alternate fields can be	specified separated with a  ,.
	  E.g.	%(release_date>%Y,upload_date>%Y|Unknown)s

       5. Replacement:	A replacement value can	be specified using a & separa-
	  tor	  according	to	the	 str.format	 mini-language
	  (https://docs.python.org/3/library/string.html#format-specification-
	  mini-language).   If	the field is not empty,	this replacement value
	  will be used instead of the actual field content.  This is done  af-
	  ter alternate	fields are considered; thus the	replacement is used if
	  any  of  the	alternative fields is not empty.  E.g.	%(chapters&has
	  chapters|no chapters)s, %(title&TITLE={:>20}|NO TITLE)s

       6. Default: A literal default value can be specified for	when the field
	  is empty using a | separator.	 This overrides	--output-na-placehold-
	  er.  E.g.  %(uploader|Unknown)s

       7. More Conversions: In addition	to the normal format types  diouxXeEf-
	  FgGcrs,  yt-dlp  additionally	 supports converting to	B = Bytes, j =
	  json (flag # for pretty-printing, + for Unicode), h =	HTML escaping,
	  l = a	comma separated	list (flag # for \n newline-separated),	q =  a
	  string  quoted for the terminal (flag	# to split a list into differ-
	  ent arguments), D = add Decimal suffixes (e.g.  10M) (flag # to  use
	  1024	as factor), and	S = Sanitize as	filename (flag # for restrict-
	  ed)

       8. Unicode normalization: The format type U can be used for NFC Unicode
	  normalization		 (https://docs.python.org/3/library/unicodeda-
	  ta.html#unicodedata.normalize).  The alternate form flag (#) changes
	  the  normalization  to NFD and the conversion	flag + can be used for
	  NFKC/NFKD  compatibility  equivalence	 normalization.	  E.g.	 %(ti-
	  tle)+.100U is	NFKC

       To summarize, the general syntax	for a field is:

	      %(name[.keys][addition][>strf][,alternate][&replacement][|default])[flags][width][.precision][length]type

       Additionally,  you  can	set different output templates for the various
       metadata	files separately from the general output template by  specify-
       ing  the	 type of file followed by the template separated by a colon :.
       The different file types	supported are  subtitle,  thumbnail,  descrip-
       tion,  annotation  (deprecated),	 infojson,  link, pl_thumbnail,	pl_de-
       scription,   pl_infojson,   chapter,   pl_video.	   E.g.	   -o	"%(ti-
       tle)s.%(ext)s"  -o "thumbnail:%(title)s\%(title)s.%(ext)s" will put the
       thumbnails in a folder with the same name as the	video.	If any of  the
       templates  is  empty,  that  type  of  file  will not be	written.  E.g.
       --write-thumbnail  -o  "thumbnail:"  will  write	 thumbnails  only  for
       playlists and not for video.

       Note:  Due  to  post-processing (i.e.  merging etc.), the actual	output
       filename	might differ.  Use --print after_move:filepath to get the name
       after all post-processing is complete.

       The available fields are:

        id (string): Video identifier

        title (string): Video title

        fulltitle (string): Video title ignoring live timestamp  and  generic
	 title

        ext (string): Video filename extension

        alt_title (string): A secondary title of the video

        description (string): The description of the video

        display_id (string): An alternative identifier	for the	video

        uploader (string): Full name of the video uploader

        uploader_id (string): Nickname	or id of the video uploader

        uploader_url (string):	URL to the video uploader's profile

        license (string): License name	the video is licensed under

        creators (list): The creators of the video

        creator (string): The creators	of the video; comma-separated

        timestamp  (numeric):	UNIX  timestamp	of the moment the video	became
	 available

        upload_date (string): Video upload date in UTC	(YYYYMMDD)

        release_timestamp (numeric): UNIX timestamp of	the moment  the	 video
	 was released

        release_date  (string):  The  date  (YYYYMMDD)	when the video was re-
	 leased	in UTC

        release_year (numeric): Year (YYYY) when the video or album  was  re-
	 leased

        modified_timestamp  (numeric):	UNIX timestamp of the moment the video
	 was last modified

        modified_date (string): The date (YYYYMMDD) when the video  was  last
	 modified in UTC

        channel (string): Full	name of	the channel the	video is uploaded on

        channel_id (string): Id of the	channel

        channel_url (string): URL of the channel

        channel_follower_count	(numeric): Number of followers of the channel

        channel_is_verified (boolean):	Whether	the channel is verified	on the
	 platform

        location (string): Physical location where the	video was filmed

        duration (numeric): Length of the video in seconds

        duration_string (string): Length of the video (HH:mm:ss)

        view_count  (numeric):	 How  many users have watched the video	on the
	 platform

        concurrent_view_count (numeric): How many users are currently	watch-
	 ing the video on the platform.

        like_count (numeric): Number of positive ratings of the video

        dislike_count (numeric): Number of negative ratings of	the video

        repost_count (numeric): Number	of reposts of the video

        average_rating	 (numeric):  Average  rating given by users, the scale
	 used depends on the webpage

        comment_count (numeric): Number of comments on	the  video  (For  some
	 extractors,  comments	are  only  downloaded  at the end, and so this
	 field cannot be used)

        age_limit (numeric): Age restriction for the video (years)

        live_status (string): One of  "not_live",  "is_live",	"is_upcoming",
	 "was_live", "post_live" (was live, but	VOD is not yet processed)

        is_live  (boolean):  Whether  this video is a live stream or a	fixed-
	 length	video

        was_live (boolean): Whether this video	was originally a live stream

        playable_in_embed (string): Whether this video	is allowed to play  in
	 embedded players on other sites

        availability  (string):  Whether the video is "private", "premium_on-
	 ly", "subscriber_only", "needs_auth", "unlisted" or "public"

        media_type (string): The type of media	as  classified	by  the	 site,
	 e.g.  "episode", "clip", "trailer"

        start_time  (numeric):	 Time in seconds where the reproduction	should
	 start,	as specified in	the URL

        end_time (numeric): Time in seconds  where  the  reproduction	should
	 end, as specified in the URL

        extractor (string): Name of the extractor

        extractor_key (string): Key name of the extractor

        epoch	(numeric):  Unix  epoch	of when	the information	extraction was
	 completed

        autonumber (numeric): Number that will	be increased with  each	 down-
	 load,	starting at --autonumber-start,	padded with leading zeros to 5
	 digits

        video_autonumber (numeric): Number that will be increased  with  each
	 video

        n_entries (numeric): Total number of extracted	items in the playlist

        playlist_id  (string):	 Identifier  of	the playlist that contains the
	 video

        playlist_title	(string): Name of the playlist that contains the video

        playlist (string): playlist_title if available	or else	playlist_id

        playlist_count	(numeric): Total number	of items in the	playlist.  May
	 not be	known if entire	playlist is not	extracted

        playlist_index	(numeric): Index of the	video in the  playlist	padded
	 with leading zeros according the final	index

        playlist_autonumber  (numeric): Position of the video in the playlist
	 download queue	padded with  leading  zeros  according	to  the	 total
	 length	of the playlist

        playlist_uploader (string): Full name of the playlist uploader

        playlist_uploader_id  (string):  Nickname  or	id of the playlist up-
	 loader

        playlist_channel (string): Display name of the	channel	that  uploaded
	 the playlist

        playlist_channel_id (string): Identifier of the channel that uploaded
	 the playlist

        playlist_webpage_url (string):	URL of the playlist webpage

        webpage_url  (string):	 A URL to the video webpage which, if given to
	 yt-dlp, should	yield the same result again

        webpage_url_basename (string):	The basename of	the webpage URL

        webpage_url_domain (string): The domain of the	webpage	URL

        original_url (string):	The URL	given by the user (or the same as web-
	 page_url for playlist entries)

        categories (list): List of categories the video belongs to

        tags (list): List of tags assigned to the video

        cast (list): List of cast members

       All the fields in Filtering Formats can also be used

       Available for the video that belongs to some logical  chapter  or  sec-
       tion:

        chapter (string): Name	or title of the	chapter	the video belongs to

        chapter_number	(numeric): Number of the chapter the video belongs to

        chapter_id (string): Id of the	chapter	the video belongs to

       Available for the video that is an episode of some series or program:

        series	(string): Title	of the series or program the video episode be-
	 longs to

        series_id (string): Id	of the series or program the video episode be-
	 longs to

        season	(string): Title	of the season the video	episode	belongs	to

        season_number	(numeric):  Number of the season the video episode be-
	 longs to

        season_id (string): Id	of the season the video	episode	belongs	to

        episode (string): Title of the	video episode

        episode_number	(numeric): Number of the video episode within a	season

        episode_id (string): Id of the	video episode

       Available for the media that is a track or a part of a music album:

        track (string): Title of the track

        track_number (numeric): Number	of the track within an album or	a disc

        track_id (string): Id of the track

        artists (list): Artist(s) of the track

        artist	(string): Artist(s) of the track; comma-separated

        genres	(list):	Genre(s) of the	track

        genre (string): Genre(s) of the track;	comma-separated

        composers (list): Composer(s) of the piece

        composer (string): Composer(s)	of the piece; comma-separated

        album (string): Title of the album the	track belongs to

        album_type (string): Type of the album

        album_artists (list): All artists appeared on the album

        album_artist (string):	All artists appeared on	the album; comma-sepa-
	 rated

        disc_number (numeric):	Number of the disc or  other  physical	medium
	 the track belongs to

       Available  only	when using --download-sections and for chapter:	prefix
       when using --split-chapters for videos with internal chapters:

        section_title (string): Title of the chapter

        section_number	(numeric): Number of the chapter within	the file

        section_start (numeric): Start	time of	the chapter in seconds

        section_end (numeric):	End time of the	chapter	in seconds

       Available only when used	in --print:

        urls (string):	The URLs of all	requested formats, one in each line

        filename (string): Name of the	video  file.   Note  that  the	actual
	 filename may differ

        formats_table	(table):  The video format table as printed by --list-
	 formats

        thumbnails_table (table): The thumbnail format	table  as  printed  by
	 --list-thumbnails

        subtitles_table  (table):  The	 subtitle  format  table as printed by
	 --list-subs

        automatic_captions_table (table): The automatic subtitle format table
	 as printed by --list-subs

       Available only after the	video is downloaded (post_process/after_move):

        filepath: Actual path of downloaded video file

       Available only in --sponsorblock-chapter-title:

        start_time (numeric): Start time of the chapter in seconds

        end_time (numeric): End time of the chapter in	seconds

        categories (list): The	 SponsorBlock  categories  (https://wiki.spon-
	 sor.ajay.app/w/Types#Category)	the chapter belongs to

        category (string): The	smallest SponsorBlock category the chapter be-
	 longs to

        category_names	(list):	Friendly names of the categories

        name (string):	Friendly name of the smallest category

        type  (string):  The  SponsorBlock  action  type  (https://wiki.spon-
	 sor.ajay.app/w/Types#Action_Type) of the chapter

       Each aforementioned sequence when referenced in an output template will
       be replaced by the actual value corresponding  to  the  sequence	 name.
       E.g.   for  -o %(title)s-%(id)s.%(ext)s and an mp4 video	with title yt-
       dlp test	video and id BaW_jenozKc, this will result in  a  yt-dlp  test
       video-BaW_jenozKc.mp4 file created in the current directory.

       Note:  Some  of	the  sequences are not guaranteed to be	present, since
       they depend on the metadata obtained by a particular  extractor.	  Such
       sequences  will be replaced with	placeholder value provided with	--out-
       put-na-placeholder (NA by default).

       Tip: Look at the	-j output to identify which fields are	available  for
       the particular URL

       For   numeric   sequences,  you	can  use  numeric  related  formatting
       (https://docs.python.org/3/library/stdtypes.html#printf-style-string-
       formatting); e.g.  %(view_count)05d will	result in a string  with  view
       count padded with zeros up to 5 characters, like	in 00042.

       Output templates	can also contain arbitrary hierarchical	path, e.g.  -o
       "%(playlist)s/%(playlist_index)s	- %(title)s.%(ext)s" which will	result
       in  downloading	each  video  in	a directory corresponding to this path
       template.  Any missing directory	will be	automatically created for you.

       To use percent literals in an output template use  %%.	To  output  to
       stdout use -o -.

       The current default template is %(title)s [%(id)s].%(ext)s.

       In  some	 cases,	you don't want special characters such as , spaces, or
       &, such as when transferring the	downloaded filename to a Windows  sys-
       tem  or	the  filename through an 8bit-unsafe channel.  In these	cases,
       add the --restrict-filenames flag to get	a shorter title.

   Output template examples
	      $	yt-dlp --print filename	-o "test video.%(ext)s"	BaW_jenozKc
	      test video.webm	 # Literal name	with correct extension

	      $	yt-dlp --print filename	-o "%(title)s.%(ext)s" BaW_jenozKc
	      youtube-dl test video ''_.webm	# All kinds of weird characters

	      $	yt-dlp --print filename	-o "%(title)s.%(ext)s" BaW_jenozKc --restrict-filenames
	      youtube-dl_test_video_.webm    # Restricted file name

	      #	Download YouTube playlist videos in separate directory indexed by video	order in a playlist
	      $	yt-dlp -o "%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s"	"https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"

	      #	Download YouTube playlist videos in separate directories according to their uploaded year
	      $	yt-dlp -o "%(upload_date>%Y)s/%(title)s.%(ext)s" "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"

	      #	Prefix playlist	index with " - " separator, but	only if	it is available
	      $	yt-dlp -o "%(playlist_index&{} - |)s%(title)s.%(ext)s" BaW_jenozKc "https://www.youtube.com/user/TheLinuxFoundation/playlists"

	      #	Download all playlists of YouTube channel/user keeping each playlist in	separate directory:
	      $	yt-dlp -o "%(uploader)s/%(playlist)s/%(playlist_index)s	- %(title)s.%(ext)s" "https://www.youtube.com/user/TheLinuxFoundation/playlists"

	      #	Download Udemy course keeping each chapter in separate directory under MyVideos	directory in your home
	      $	yt-dlp -u user -p password -P "~/MyVideos" -o "%(playlist)s/%(chapter_number)s - %(chapter)s/%(title)s.%(ext)s"	"https://www.udemy.com/java-tutorial"

	      #	Download entire	series season keeping each series and each season in separate directory	under C:/MyVideos
	      $	yt-dlp -P "C:/MyVideos"	-o "%(series)s/%(season_number)s - %(season)s/%(episode_number)s - %(episode)s.%(ext)s"	"https://videomore.ru/kino_v_detalayah/5_sezon/367617"

	      #	Download video as "C:\MyVideos\uploader\title.ext", subtitles as "C:\MyVideos\subs\uploader\title.ext"
	      #	and put	all temporary files in "C:\MyVideos\tmp"
	      $	yt-dlp -P "C:/MyVideos"	-P "temp:tmp" -P "subtitle:subs" -o "%(uploader)s/%(title)s.%(ext)s" BaW_jenozKc --write-subs

	      #	Download video as "C:\MyVideos\uploader\title.ext" and subtitles as "C:\MyVideos\uploader\subs\title.ext"
	      $	yt-dlp -P "C:/MyVideos"	-o "%(uploader)s/%(title)s.%(ext)s" -o "subtitle:%(uploader)s/subs/%(title)s.%(ext)s" BaW_jenozKc --write-subs

	      #	Stream the video being downloaded to stdout
	      $	yt-dlp -o - BaW_jenozKc

FORMAT SELECTION
       By default, yt-dlp tries	to download the	best available quality if  you
       don't  pass  any	 options.   This  is  generally	equivalent to using -f
       bestvideo*+bestaudio/best.  However, if multiple	 audiostreams  is  en-
       abled   (--audio-multistreams),	 the  default  format  changes	to  -f
       bestvideo+bestaudio/best.  Similarly, if	ffmpeg is unavailable,	or  if
       you  use	 yt-dlp	 to  stream  to	 stdout	(-o -),	the default becomes -f
       best/bestvideo+bestaudio.

       Deprecation warning: Latest versions of yt-dlp can stream multiple for-
       mats to the stdout simultaneously using ffmpeg.	 So,  in  future  ver-
       sions,  the default for this will be set	to -f bv*+ba/b similar to nor-
       mal downloads.  If you want to preserve the -f b/bv+ba setting,	it  is
       recommended to explicitly specify it in the configuration options.

       The  general syntax for format selection	is -f FORMAT (or --format FOR-
       MAT) where FORMAT is a selector expression, i.e.	  an  expression  that
       describes format	or formats you would like to download.

       The simplest case is requesting a specific format; e.g.	with -f	22 you
       can  download the format	with format code equal to 22.  You can get the
       list of available format	codes for particular video  using  --list-for-
       mats or -F.  Note that these format codes are extractor specific.

       You  can	 also use a file extension (currently 3gp, aac,	flv, m4a, mp3,
       mp4, ogg, wav, webm are supported) to download the best quality	format
       of  a  particular file extension	served as a single file, e.g.  -f webm
       will download the best quality format with the webm extension served as
       a single	file.

       You can use -f -	to interactively provide the format selector for  each
       video

       You can also use	special	names to select	particular edge	case formats:

        all: Select all formats separately

        mergeall:  Select  and	 merge all formats (Must be used with --audio-
	 multistreams, --video-multistreams or both)

        b*, best*: Select the best quality  format  that  contains  either  a
	 video or an audio or both (i.e.; vcodec!=none or acodec!=none)

        b,  best: Select the best quality format that contains	both video and
	 audio.	 Equivalent to best*[vcodec!=none][acodec!=none]

        bv, bestvideo:	Select the best	quality	video-only format.  Equivalent
	 to best*[acodec=none]

        bv*, bestvideo*: Select the best quality format that contains	video.
	 It may	also contain audio.  Equivalent	to best*[vcodec!=none]

        ba, bestaudio:	Select the best	quality	audio-only format.  Equivalent
	 to best*[vcodec=none]

        ba*,  bestaudio*: Select the best quality format that contains	audio.
	 It may	also contain video.  Equivalent	to best*[acodec!=none] (Do not
	 use!		(https://github.com/yt-dlp/yt-dlp/issues/979#issuecom-
	 ment-919629354))

        w*,  worst*:  Select  the worst quality format	that contains either a
	 video or an audio

        w, worst: Select the worst quality format that	 contains  both	 video
	 and audio.  Equivalent	to worst*[vcodec!=none][acodec!=none]

        wv,  worstvideo: Select the worst quality video-only format.  Equiva-
	 lent to worst*[acodec=none]

        wv*, worstvideo*: Select  the	worst  quality	format	that  contains
	 video.	    It	  may	 also	 contain    audio.     Equivalent   to
	 worst*[vcodec!=none]

        wa, worstaudio: Select	the worst quality audio-only format.   Equiva-
	 lent to worst*[vcodec=none]

        wa*,  worstaudio*:  Select the	worst quality format that contains au-
	 dio.  It may also contain video.  Equivalent to worst*[acodec!=none]

       For example, to download	the worst quality video-only  format  you  can
       use  -f	worstvideo.   It is, however, recommended not to use worst and
       related options.	 When your format selector is worst, the format	 which
       is worst	in all respects	is selected.  Most of the time,	what you actu-
       ally  want  is  the video with the smallest filesize instead.  So it is
       generally  better  to   use   -S	  +size	  or   more   rigorously,   -S
       +size,+br,+res,+fps  instead of -f worst.  See Sorting Formats for more
       details.

       You can select the n'th best format of a	type by	using  best<type>.<n>.
       For example, best.2 will	select the 2nd best combined format.  Similar-
       ly, bv*.3 will select the 3rd best format that contains a video stream.

       If  you	want to	download multiple videos, and they don't have the same
       formats available, you can specify the order of preference using	slash-
       es.  Note that formats on the left hand side are	 preferred;  e.g.   -f
       22/17/18	 will  download	format 22 if it's available, otherwise it will
       download	format 17 if it's available, otherwise it will download	format
       18 if it's available, otherwise it will complain	that no	suitable  for-
       mats are	available for download.

       If  you	want to	download several formats of the	same video use a comma
       as a separator, e.g.  -f	22,17,18 will download all  these  three  for-
       mats, of	course if they are available.  Or a more sophisticated example
       combined	       with	  the	    precedence	     feature:	    -f
       136/137/mp4/bestvideo,140/m4a/bestaudio.

       You can merge the video and audio of multiple  formats  into  a	single
       file using -f <format1>+<format2>+... (requires ffmpeg installed); e.g.
       -f  bestvideo+bestaudio	will  download the best	video-only format, the
       best audio-only format and mux them together with ffmpeg.

       Deprecation warning: Since the below described behavior is complex  and
       counter-intuitive,  this	 will  be removed and multistreams will	be en-
       abled by	default	in the future.	A new operator will be	instead	 added
       to limit	formats	to single audio/video

       Unless  --video-multistreams  is	 used, all formats with	a video	stream
       except the first	one are	 ignored.   Similarly,	unless	--audio-multi-
       streams	is used, all formats with an audio stream except the first one
       are ignored.  E.g.   -f	bestvideo+best+bestaudio  --video-multistreams
       --audio-multistreams  will download and merge all 3 given formats.  The
       resulting file will have	2 video	streams	and 2 audio streams.   But  -f
       bestvideo+best+bestaudio	  --no-video-multistreams  will	 download  and
       merge only bestvideo and	bestaudio.  best is ignored since another for-
       mat containing a	video stream (bestvideo) has  already  been  selected.
       The  order  of  the  formats is therefore important.  -f	best+bestaudio
       --no-audio-multistreams will download only best while -f	bestaudio+best
       --no-audio-multistreams will ignore best	and download only bestaudio.

   Filtering Formats
       You can also filter the video formats by	putting	a condition in	brack-
       ets,  as	in -f "best[height=720]" (or -f	"[filesize>10M]" since filters
       without a selector are interpreted as best).

       The following numeric meta fields can be	used with comparisons  <,  <=,
       >, >=, =	(equals), != (not equals):

        filesize: The number of bytes,	if known in advance

        filesize_approx: An estimate for the number of	bytes

        width:	Width of the video, if known

        height: Height	of the video, if known

        aspect_ratio: Aspect ratio of the video, if known

        tbr: Average bitrate of audio and video in kbps

        abr: Average audio bitrate in kbps

        vbr: Average video bitrate in kbps

        asr: Audio sampling rate in Hertz

        fps: Frame rate

        audio_channels: The number of audio channels

        stretched_ratio: width:height of the video's pixels, if not square

       Also  filtering	work  for comparisons =	(equals), ^= (starts with), $=
       (ends with), *= (contains), ~= (matches	regex)	and  following	string
       meta fields:

        url: Video URL

        ext: File extension

        acodec: Name of the audio codec in use

        vcodec: Name of the video codec in use

        container: Name of the	container format

        protocol:  The	 protocol  that	 will be used for the actual download,
	 lower-case  (http,  https,  rtsp,  rtmp,  rtmpe,   mms,   f4m,	  ism,
	 http_dash_segments, m3u8, or m3u8_native)

        language: Language code

        dynamic_range:	The dynamic range of the video

        format_id: A short description	of the format

        format: A human-readable description of the format

        format_note: Additional info about the	format

        resolution: Textual description of width and height

       Any  string comparison may be prefixed with negation ! in order to pro-
       duce an opposite	comparison, e.g.  !*= (does not	 contain).   The  com-
       parand  of a string comparison needs to be quoted with either double or
       single quotes if	it contains spaces or special  characters  other  than
       ._-.

       Note:  None  of	the  aforementioned  meta  fields are guaranteed to be
       present since this solely depends on the	metadata obtained by the  par-
       ticular extractor, i.e.	the metadata offered by	the website.  Any oth-
       er  field  made available by the	extractor can also be used for filter-
       ing.

       Formats for which the value is not known	are excluded unless you	put  a
       question	 mark (?) after	the operator.  You can combine format filters,
       so -f "bv[height<=?720][tbr>500]" selects up to 720p videos (or	videos
       where  the  height  is  not known) with a bitrate of at least 500 kbps.
       You can also use	the filters with all to	download all formats that sat-
       isfy the	filter,	e.g.  -f  "all[vcodec=none]"  selects  all  audio-only
       formats.

       Format  selectors  can  also  be	 grouped  using	 parentheses; e.g.  -f
       "(mp4,webm)[height<480]"	will download the best pre-merged mp4 and webm
       formats with a height lower than	480.

   Sorting Formats
       You can change the criteria for being considered	the best by  using  -S
       (--format-sort).	   The	 general  format  for  this  is	 --format-sort
       field1,field2....

       The available fields are:

        hasvid: Gives priority	to formats that	have a video stream

        hasaud: Gives priority	to formats that	have an	audio stream

        ie_pref: The format preference

        lang: The language preference as determined by	 the  extractor	 (e.g.
	 original language preferred over audio	description)

        quality: The quality of the format

        source: The preference	of the source

        proto:	 Protocol  used	for download (https/ftps > http/ftp > m3u8_na-
	 tive/m3u8 > http_dash_segments> websocket_frag	> mms/rtsp > f4f/f4m)

        vcodec: Video Codec (av01 > vp9.2 > vp9 > h265	> h264 > vp8 > h263  >
	 theora	> other)

        acodec:  Audio	 Codec	(flac/alac  > wav/aiff > opus >	vorbis > aac >
	 mp4a >	mp3 > ac4 > eac3 > ac3 > dts > other)

        codec:	Equivalent to vcodec,acodec

        vext: Video Extension (mp4 > mov > webm > flv > other).  If --prefer-
	 free-formats is used, webm is preferred.

        aext: Audio Extension (m4a > aac > mp3	> ogg >	opus > webm >  other).
	 If  --prefer-free-formats  is used, the order changes to ogg >	opus >
	 webm >	mp3 > m4a > aac

        ext: Equivalent to vext,aext

        filesize: Exact filesize, if known in advance

        fs_approx: Approximate	filesize

        size: Exact filesize if available, otherwise approximate filesize

        height: Height	of video

        width:	Width of video

        res: Video resolution,	calculated as the smallest dimension.

        fps: Framerate	of video

        hdr: The dynamic range	of the video (DV > HDR12 > HDR10+  >  HDR10  >
	 HLG > SDR)

        channels: The number of audio channels

        tbr: Total average bitrate in kbps

        vbr: Average video bitrate in kbps

        abr: Average audio bitrate in kbps

        br: Average bitrate in	kbps, tbr/vbr/abr

        asr: Audio sample rate	in Hz

       Deprecation warning: Many of these fields have (currently undocumented)
       aliases,	that may be removed in a future	version.  It is	recommended to
       use only	the documented field names.

       All fields, unless specified otherwise, are sorted in descending	order.
       To  reverse this, prefix	the field with a +.  E.g.  +res	prefers	format
       with the	smallest resolution.  Additionally, you	can suffix a preferred
       value for the fields, separated by a :.	E.g.  res:720  prefers	larger
       videos,	but no larger than 720p	and the	smallest video if there	are no
       videos less than	720p.  For codec and ext, you  can  provide  two  pre-
       ferred  values,	the  first  for	 video and the second for audio.  E.g.
       +codec:avc:m4a (equivalent to +vcodec:avc,+acodec:m4a) sets  the	 video
       codec  preference  to  h264  > h265 > vp9 > vp9.2 > av01	> vp8 >	h263 >
       theora and audio	codec preference to mp4a > aac > vorbis	> opus > mp3 >
       ac3 > dts.  You can also	make the sorting prefer	the nearest values  to
       the  provided  by  using	~ as the delimiter.  E.g.  filesize~1G prefers
       the format with filesize	closest	to 1 GiB.

       The fields hasvid and ie_pref are  always  given	 highest  priority  in
       sorting,	 irrespective of the user-defined order.  This behavior	can be
       changed by using	--format-sort-force.  Apart from  these,  the  default
       order	   used	     is:      lang,quality,res,fps,hdr:12,vcodec,chan-
       nels,acodec,size,br,asr,proto,ext,hasaud,source,id.  The	extractors may
       override	this default order, but	they cannot override the user-provided
       order.

       Note that the default for hdr is	hdr:12;	i.e.  Dolby Vision is not pre-
       ferred.	This choice was	made since DV formats are not yet  fully  com-
       patible with most devices.  This	may be changed in the future.

       If your format selector is worst, the last item is selected after sort-
       ing.   This  means  it  will select the format that is worst in all re-
       spects.	Most of	the time, what you actually want is the	video with the
       smallest	filesize instead.  So it is generally better to	use -f best -S
       +size,+br,+res,+fps.

       Tip: You	can use	the -v -F to see how  the  formats  have  been	sorted
       (worst to best).

   Format Selection examples
	      #	Download and merge the best video-only format and the best audio-only format,
	      #	or download the	best combined format if	video-only format is not available
	      $	yt-dlp -f "bv+ba/b"

	      #	Download best format that contains video,
	      #	and if it doesn't already have an audio	stream,	merge it with best audio-only format
	      $	yt-dlp -f "bv*+ba/b"

	      #	Same as	above
	      $	yt-dlp

	      #	Download the best video-only format and	the best audio-only format without merging them
	      #	For this case, an output template should be used since
	      #	by default, bestvideo and bestaudio will have the same file name.
	      $	yt-dlp -f "bv,ba" -o "%(title)s.f%(format_id)s.%(ext)s"

	      #	Download and merge the best format that	has a video stream,
	      #	and all	audio-only formats into	one file
	      $	yt-dlp -f "bv*+mergeall[vcodec=none]" --audio-multistreams

	      #	Download and merge the best format that	has a video stream,
	      #	and the	best 2 audio-only formats into one file
	      $	yt-dlp -f "bv*+ba+ba.2"	--audio-multistreams

	      #	The following examples show the	old method (without -S)	of format selection
	      #	and how	to use -S to achieve a similar but (generally) better result

	      #	Download the worst video available (old	method)
	      $	yt-dlp -f "wv*+wa/w"

	      #	Download the best video	available but with the smallest	resolution
	      $	yt-dlp -S "+res"

	      #	Download the smallest video available
	      $	yt-dlp -S "+size,+br"

	      #	Download the best mp4 video available, or the best video if no mp4 available
	      $	yt-dlp -f "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b"

	      #	Download the best video	with the best extension
	      #	(For video, mp4	> mov >	webm > flv. For	audio, m4a > aac > mp3 ...)
	      $	yt-dlp -S "ext"

	      #	Download the best video	available but no better	than 480p,
	      #	or the worst video if there is no video	under 480p
	      $	yt-dlp -f "bv*[height<=480]+ba/b[height<=480] /	wv*+ba/w"

	      #	Download the best video	available with the largest height but no better	than 480p,
	      #	or the best video with the smallest resolution if there	is no video under 480p
	      $	yt-dlp -S "height:480"

	      #	Download the best video	available with the largest resolution but no better than 480p,
	      #	or the best video with the smallest resolution if there	is no video under 480p
	      #	Resolution is determined by using the smallest dimension.
	      #	So this	works correctly	for vertical videos as well
	      $	yt-dlp -S "res:480"

	      #	Download the best video	(that also has audio) but no bigger than 50 MB,
	      #	or the worst video (that also has audio) if there is no	video under 50 MB
	      $	yt-dlp -f "b[filesize<50M] / w"

	      #	Download the largest video (that also has audio) but no	bigger than 50 MB,
	      #	or the smallest	video (that also has audio) if there is	no video under 50 MB
	      $	yt-dlp -f "b" -S "filesize:50M"

	      #	Download the best video	(that also has audio) that is closest in size to 50 MB
	      $	yt-dlp -f "b" -S "filesize~50M"

	      #	Download best video available via direct link over HTTP/HTTPS protocol,
	      #	or the best video available via	any protocol if	there is no such video
	      $	yt-dlp -f "(bv*+ba/b)[protocol^=http][protocol!*=dash] / (bv*+ba/b)"

	      #	Download best video available via the best protocol
	      #	(https/ftps > http/ftp > m3u8_native > m3u8 > http_dash_segments ...)
	      $	yt-dlp -S "proto"

	      #	Download the best video	with either h264 or h265 codec,
	      #	or the best video if there is no such video
	      $	yt-dlp -f "(bv*[vcodec~='^((he|a)vc|h26[45])']+ba) / (bv*+ba/b)"

	      #	Download the best video	with best codec	no better than h264,
	      #	or the best video with worst codec if there is no such video
	      $	yt-dlp -S "codec:h264"

	      #	Download the best video	with worst codec no worse than h264,
	      #	or the best video with best codec if there is no such video
	      $	yt-dlp -S "+codec:h264"

	      #	More complex examples

	      #	Download the best video	no better than 720p preferring framerate greater than 30,
	      #	or the worst video (still preferring framerate greater than 30)	if there is no such video
	      $	yt-dlp -f "((bv*[fps>30]/bv*)[height<=720]/(wv*[fps>30]/wv*)) +	ba / (b[fps>30]/b)[height<=720]/(w[fps>30]/w)"

	      #	Download the video with	the largest resolution no better than 720p,
	      #	or the video with the smallest resolution available if there is	no such	video,
	      #	preferring larger framerate for	formats	with the same resolution
	      $	yt-dlp -S "res:720,fps"

	      #	Download the video with	smallest resolution no worse than 480p,
	      #	or the video with the largest resolution available if there is no such video,
	      #	preferring better codec	and then larger	total bitrate for the same resolution
	      $	yt-dlp -S "+res:480,codec,br"

MODIFYING METADATA
       The  metadata  obtained	by  the	 extractors  can  be modified by using
       --parse-metadata	and --replace-in-metadata

       --replace-in-metadata FIELDS REGEX REPLACE is used to replace  text  in
       any     metadata	    field     using    Python	 regular    expression
       (https://docs.python.org/3/library/re.html#regular-expression-syntax).
       Backreferences	      (https://docs.python.org/3/library/re.html?high-
       light=backreferences#re.sub)  can be used in the	replace	string for ad-
       vanced use.

       The general syntax of --parse-metadata FROM:TO is to give the name of a
       field or	an output template to extract data from, and the format	to in-
       terpret it as, separated	by a colon :.  Either a	Python regular expres-
       sion (https://docs.python.org/3/library/re.html#regular-expression-syn-
       tax) with named capture groups, a single	field name, or a similar  syn-
       tax to the output template (only	%(field)s formatting is	supported) can
       be  used	 for  TO.   The	option can be used multiple times to parse and
       modify various fields.

       Note that these options preserve	their  relative	 order,	 allowing  re-
       placements to be	made in	parsed fields and vice versa.  Also, any field
       thus  created  can  be used in the output template and will also	affect
       the media file's	metadata added when using --embed-metadata.

       This option also	has a few special uses:

        You can download an additional	URL based on the metadata of the  cur-
	 rently	 downloaded  video.  To	do this, set the field additional_urls
	 to the	URL that you want to download.	 E.g.	--parse-metadata  "de-
	 scription:(?P<additional_urls>https?://www\.vimeo\.com/\d+)"	  will
	 download the first vimeo video	found in the description

        You can use this to change the	metadata that is embedded in the media
	 file.	To do this, set	the value of the corresponding	field  with  a
	 meta_	prefix.	  For  example,	 any value you set to meta_description
	 field will be added to	the description	field in the file  -  you  can
	 use  this to set a different "description" and	"synopsis".  To	modify
	 the metadata of individual streams, use  the  meta<n>_	 prefix	 (e.g.
	 meta1_language).  Any value set to the	meta_ field will overwrite all
	 default values.

       Note:  Metadata	modification happens before format selection, post-ex-
       traction	and other post-processing  operations.	 Some  fields  may  be
       added or	changed	during these steps, overriding your changes.

       For  reference, these are the fields yt-dlp adds	by default to the file
       metadata:

       Metadata	fields		   From
       --------------------------------------------------------------------------
       title			   track or title
       date			   upload_date
       description, synopsis	   description
       purl, comment		   webpage_url
       track			   track_number
       artist			   artist, artists, creator, creators,	uploader
				   or uploader_id
       composer			   composer or composers
       genre			   genre or genres
       album			   album
       album_artist		   album_artist	or album_artists
       disc			   disc_number
       show			   series
       season_number		   season_number
       episode_id		   episode or episode_id
       episode_sort		   episode_number
       language	of each	stream	   the format's	language

       Note: The file format may not support some of these fields

   Modifying metadata examples
	      #	Interpret the title as "Artist - Title"
	      $	yt-dlp --parse-metadata	"title:%(artist)s - %(title)s"

	      #	Regex example
	      $	yt-dlp --parse-metadata	"description:Artist - (?P<artist>.+)"

	      #	Set title as "Series name S01E05"
	      $	yt-dlp --parse-metadata	"%(series)s S%(season_number)02dE%(episode_number)02d:%(title)s"

	      #	Prioritize uploader as the "artist" field in video metadata
	      $	yt-dlp --parse-metadata	"%(uploader|)s:%(meta_artist)s"	--embed-metadata

	      #	Set "comment" field in video metadata using description	instead	of webpage_url,
	      #	handling multiple lines	correctly
	      $	yt-dlp --parse-metadata	"description:(?s)(?P<meta_comment>.+)" --embed-metadata

	      #	Do not set any "synopsis" in the video metadata
	      $	yt-dlp --parse-metadata	":(?P<meta_synopsis>)"

	      #	Remove "formats" field from the	infojson by setting it to an empty string
	      $	yt-dlp --parse-metadata	"video::(?P<formats>)" --write-info-json

	      #	Replace	all spaces and "_" in title and	uploader with a	`-`
	      $	yt-dlp --replace-in-metadata "title,uploader" "[ _]" "-"

EXTRACTOR ARGUMENTS
       Some  extractors	 accept	additional arguments which can be passed using
       --extractor-args	KEY:ARGS.  ARGS	is a ; (semicolon) separated string of
       ARG=VAL1,VAL2.	    E.g.       --extractor-args	      "youtube:player-
       client=tv,mweb;formats=incomplete" --extractor-args "twitter:api=syndi-
       cation"

       Note:  In CLI, ARG can use - instead of _; e.g.	youtube:player-client"
       becomes youtube:player_client"

       The following extractors	use this feature:

   youtube
        lang: Prefer translated metadata (title,  description	etc)  of  this
	 language  code	 (case-sensitive).  By default,	the video primary lan-
	 guage metadata	is preferred, with a fallback to en  translated.   See
	 youtube.py				(https://github.com/yt-dlp/yt-
	 dlp/blob/c26f9b991a0681fd3ea548d535919cec1fbbd430/yt_dlp/extrac-
	 tor/youtube.py#L381-L390) for	list  of  supported  content  language
	 codes

        skip:	One or more of hls, dash or translated_subs to skip extraction
	 of the	m3u8 manifests,	dash manifests and  auto-translated  subtitles
	 (https://github.com/yt-dlp/yt-dlp/issues/4090#issuecom-
	 ment-1158102032) respectively

        player_client:	 Clients  to  extract  video data from.	 The currently
	 available  clients  are  web,	web_safari,  web_embedded,  web_music,
	 web_creator,  mweb, ios, android, android_vr, tv and tv_embedded.  By
	 default, tv,ios,web is	used, or tv,web	is  used  when	authenticating
	 with  cookies.	  The  web_music client	is added for music.youtube.com
	 URLs when logged-in cookies are used.	The tv_embedded	 and  web_cre-
	 ator clients are added	for age-restricted videos if account age-veri-
	 fication  is  required.  Some clients,	such as	web and	web_music, re-
	 quire a po_token for their formats to be downloadable.	 Some clients,
	 such as web_creator, will only	work  with  authentication.   Not  all
	 clients  support authentication via cookies.  You can use default for
	 the default clients, or you can use all for all clients  (not	recom-
	 mended).   You	 can  prefix  a	 client	 with  -  to  exclude it, e.g.
	 youtube:player_client=default,-ios

        player_skip: Skip some	network	requests that are generally needed for
	 robust	extraction.  One or more of  configs  (skip  client  configs),
	 webpage (skip initial webpage), js (skip js player).  While these op-
	 tions	can  help  reduce  the number of requests needed or avoid some
	 rate-limiting,	  they	 could	 cause	 some	issues.	   See	  #860
	 (https://github.com/yt-dlp/yt-dlp/pull/860) for more details

        player_params:	 YouTube player	parameters to use for player requests.
	 Will overwrite	any default ones set by	yt-dlp.

        comment_sort: top or new (default) - choose comment sorting mode  (on
	 YouTube's side)

        max_comments: Limit the amount	of comments to gather.	Comma-separat-
	 ed   list   of	 integers  representing	 max-comments,max-parents,max-
	 replies,max-replies-per-thread.  Default is all,all,all,all

	  E.g.	 all,all,1000,10 will get a maximum  of	 1000  replies	total,
	   with	 up to 10 replies per thread.  1000,all,100 will get a maximum
	   of 1000 comments, with a maximum of 100 replies total

        formats: Change the types of formats to return.  dashy	(convert  HTTP
	 to  DASH),  duplicate (identical content but different	URLs or	proto-
	 col; includes dashy), incomplete (cannot be downloaded	 completely  -
	 live  dash and	post-live m3u8), missing_pot (include formats that re-
	 quire a PO Token but are missing one)

        innertube_host: Innertube API host to use for all API requests;  e.g.
	 studio.youtube.com,  youtubei.googleapis.com.	 Note that cookies ex-
	 ported	from one subdomain will	not work on others

        innertube_key:	Innertube API key to use for all API requests.	By de-
	 fault,	no API key is used

        raise_incomplete_data:	Incomplete Data	Received raises	an  error  in-
	 stead of reporting a warning

        data_sync_id:	Overrides  the	account	Data Sync ID used in Innertube
	 API requests.	This may be needed if you are using  an	 account  with
	 youtube:player_skip=webpage,configs or	youtubetab:skip=webpage

        visitor_data:	Overrides  the	Visitor	Data used in Innertube API re-
	 quests.  This should be  used	with  player_skip=webpage,configs  and
	 without cookies.  Note: this may have adverse effects if used improp-
	 erly.	If a session from a browser is wanted, you should pass cookies
	 instead (which	contain	the Visitor ID)

        po_token: Proof of Origin (PO)	Token(s) to use.  Comma	seperated list
	 of   PO   Tokens   in	 the   format	CLIENT.CONTEXT+PO_TOKEN,  e.g.
	 youtube:po_token=web.gvs+XXX,web.player=XXX,web_safari.gvs+YYY.  Con-
	 text can be either gvs	(Google	Video Server URLs) or  player  (Inner-
	 tube player request)

        player_js_variant: The	player javascript variant to use for signature
	 and nsig deciphering.	The known variants are:	main, tce, tv, tv_es6,
	 phone,	 tablet.   Only	 main is recommended as	a possible workaround;
	 the others are	for debugging purposes.	 The default is	to use what is
	 prescribed by the site, and can be selected with actual

   youtubetab (YouTube playlists, channels, feeds, etc.)
        skip: One or more of webpage (skip  initial  webpage  download),  au-
	 thcheck  (allow  the  download	 of playlists requiring	authentication
	 when no initial webpage is downloaded.	 This may cause	 unwanted  be-
	 havior,  see  #1122  (https://github.com/yt-dlp/yt-dlp/pull/1122) for
	 more details)

        approximate_date: Extract approximate upload_date  and	 timestamp  in
	 flat-playlist.	 This may cause	date-based filters to be slightly off

   generic
        fragment_query:  Passthrough  any  query in mpd/m3u8 manifest URLs to
	 their fragments if no value is	provided,  or  else  apply  the	 query
	 string	given as fragment_query=VALUE.	Note that if the stream	has an
	 HLS  AES-128 key, then	the query parameters will be passed to the key
	 URI as	well, unless the key_query extractor-arg is passed, or	unless
	 an  external key URI is provided via the hls_key extractor-arg.  Does
	 not apply to ffmpeg

        variant_query:	Passthrough the	master m3u8 URL	query to  its  variant
	 playlist URLs if no value is provided,	or else	apply the query	string
	 given as variant_query=VALUE

        key_query:  Passthrough  the master m3u8 URL query to its HLS AES-128
	 decryption key	URI if no value	is provided, or	else apply  the	 query
	 string	 given as key_query=VALUE.  Note that this will	have no	effect
	 if the	key URI	is provided via	the hls_key extractor-arg.   Does  not
	 apply to ffmpeg

        hls_key:  An  HLS AES-128 key URI or key (as hex), and	optionally the
	 IV  (as  hex),	 in  the  form	 of   (URI|KEY)[,IV];	e.g.	gener-
	 ic:hls_key=ABCDEF1234567980,0xFEDCBA0987654321.  Passing any of these
	 values	will force usage of the	native HLS downloader and override the
	 corresponding values found in the m3u8	playlist

        is_live:  Bypass  live	HLS detection and manually set live_status - a
	 value of false	will set not_live, any other value (or no value)  will
	 set is_live

        impersonate:  Target(s)  to try and impersonate with the initial web-
	 page  request;	 e.g.	 generic:impersonate=safari,chrome-110.	   Use
	 generic:impersonate  to  impersonate  any  available  target, and use
	 generic:impersonate=false to disable impersonation (default)

   vikichannel
        video_types: Types of videos to download - one	or more	 of  episodes,
	 movies, clips,	trailers

   niconico
        segment_duration:  Segment  duration in milliseconds for HLS-DMC for-
	 mats.	Use it at your own risk	since this feature may result in  your
	 account termination.

   youtubewebarchive
        check_all:  Try  to  check more at the	cost of	more requests.	One or
	 more of thumbnails, captures

   gamejolt
        comment_sort: hot (default), you (cookies needed), top, new -	choose
	 comment sorting mode (on GameJolt's side)

   hotstar
        res: resolution to ignore - one or more of sd,	hd, fhd

        vcodec: vcodec	to ignore - one	or more	of h264, h265, dvh265

        dr: dynamic range to ignore - one or more of sdr, hdr10, dv

   instagram
        app_id:  The  value  of the X-IG-App-ID header	used for API requests.
	 Default is the	web app	ID, 936619743392459

   niconicochannelplus
        max_comments: Maximum number of comments to extract - default is 120

   tiktok
        api_hostname: Hostname	to use for mobile API calls, e.g.   api22-nor-
	 mal-c-alisg.tiktokv.com

        app_name: Default app name to use with	mobile API calls, e.g.	trill

        app_version:  Default	app  version  to  use  with mobile API calls -
	 should	be set along with manifest_app_version,	e.g.  34.1.2

        manifest_app_version: Default numeric app version to use with	mobile
	 API calls, e.g.  2023401020

        aid: Default app ID to	use with mobile	API calls, e.g.	 1180

        app_info:  Enable  mobile  API	 extraction  with one or more app info
	 strings  in  the  format   of	 <iid>/[app_name]/[app_version]/[mani-
	 fest_app_version]/[aid], where	iid is the unique app install ID.  iid
	 is  the  only required	value; all other values	and their / separators
	 can be	omitted,  e.g.	 tiktok:app_info=1234567890123456789  or  tik-
	 tok:app_info=123,456/trill///1180,789//34.0.1/340001

        device_id:  Enable  mobile API	extraction with	a genuine device ID to
	 be used with mobile API calls.	 Default is a random 19-digit string

   rokfinchannel
        tab: Which tab	to download -  one  of	new,  top,  videos,  podcasts,
	 streams, stacks

   twitter
        api:  Select  one  of graphql (default), legacy or syndication	as the
	 API for tweet extraction.  Has	no effect if logged in

   stacommu, wrestleuniverse
        device_id: UUID value assigned	by the website and used	to enforce de-
	 vice limits for paid livestream content.  Can be found	in browser lo-
	 cal storage

   twitch
        client_id: Client ID value to be sent	with  GraphQL  requests,  e.g.
	 twitch:client_id=kimne78kx3ncx6brgo4mv6wki5h1ko

   nhkradirulive (NHK  LIVE)
        area: Which regional variation	to extract.  Valid areas are: sapporo,
	 sendai,  tokyo,  nagoya,  osaka,  hiroshima, matsuyama, fukuoka.  De-
	 faults	to tokyo

   nflplusreplay
        type:	Type(s)	 of  game  replays  to	extract.   Valid  types	  are:
	 full_game, full_game_spanish, condensed_game and all_22.  You can use
	 all to	extract	all available replay types, which is the default

   jiocinema
        refresh_token:	 The  refreshToken UUID	from browser local storage can
	 be passed to extend the life of your login session  when  logging  in
	 with token as username	and the	accessToken from browser local storage
	 as password

   jiosaavn
        bitrate:  Audio bitrates to request.  One or more of 16, 32, 64, 128,
	 320.  Default is 128,320

   afreecatvlive
        cdn: One or more CDN IDs to use with the API call  for	 stream	 URLs,
	 e.g.  gcp_cdn,	gs_cdn_pc_app, gs_cdn_mobile_web, gs_cdn_pc_web

   soundcloud
        formats: Formats to request from the API.  Requested values should be
	 in  the format	of {protocol}_{codec}, e.g.  hls_opus,http_aac.	 The *
	 character functions as	a wildcard, e.g.  *_mp3, and can be passed  by
	 itself	to request all formats.	 Known protocols include http, hls and
	 hls-aes;  known  codecs include aac, opus and mp3.  Original download
	 formats      are      always	    extracted.	      Default	    is
	 http_aac,hls_aac,http_opus,hls_opus,http_mp3,hls_mp3

   orfon (orf:on)
        prefer_segments_playlist:  Prefer  a playlist of program segments in-
	 stead of a single complete video when available.  If individual  seg-
	 ments	are desired, use --concat-playlist never --extractor-args "or-
	 fon:prefer_segments_playlist"

   bilibili
        prefer_multi_flv: Prefer extracting flv formats over  mp4  for	 older
	 videos	that still provide legacy formats

   sonylivseries
        sort_order:  Episode  sort  order  for	series extraction - one	of asc
	 (ascending, oldest first) or desc (descending,	 newest	 first).   De-
	 fault is asc

   tver
        backend: Backend API to use for extraction - one of streaks (default)
	 or brightcove (deprecated)

       Note:  These  options may be changed/removed in the future without con-
       cern for	backward compatibility

INSTALLATION
       You    can    install	yt-dlp	   using     the     binaries,	   pip
       (https://pypi.org/project/yt-dlp)  or  one  using a third-party package
       manager.	 See the wiki (https://github.com/yt-dlp/yt-dlp/wiki/Installa-
       tion) for detailed instructions

       Note: The manpages, shell completion  (autocomplete)  files  etc.   are
       available  inside  the  source  tarball	(https://github.com/yt-dlp/yt-
       dlp/releases/latest/download/yt-dlp.tar.gz)

   UPDATE
       You can use yt-dlp -U to	update if you are using	the release binaries

       If you installed	 with  pip  (https://github.com/yt-dlp/yt-dlp/wiki/In-
       stallation#with-pip),  simply  re-run the same command that was used to
       install the program

       For   other   third-party    package    managers,    see	   the	  wiki
       (https://github.com/yt-dlp/yt-dlp/wiki/Installation#third-party-pack-
       age-managers) or	refer to their documentation

       There are currently three release channels for binaries:	stable,	night-
       ly and master.

        stable	 is  the  default  channel,  and many of its changes have been
	 tested	by users of the	nightly	and master channels.

        The nightly channel has releases scheduled to build every day	around
	 midnight  UTC,	 for  a	 snapshot  of  the  project's  new patches and
	 changes.  This	is the recommended channel for regular	users  of  yt-
	 dlp.	The nightly releases are available from	yt-dlp/yt-dlp-nightly-
	 builds	(https://github.com/yt-dlp/yt-dlp-nightly-builds/releases)  or
	 as  development releases of the yt-dlp	PyPI package (which can	be in-
	 stalled with pip's --pre flag).

        The master channel features releases that are built after  each  push
	 to  the  master branch, and these will	have the very latest fixes and
	 additions, but	may also be  more  prone  to  regressions.   They  are
	 available  from  yt-dlp/yt-dlp-master-builds  (https://github.com/yt-
	 dlp/yt-dlp-master-builds/releases).

       When using --update/-U, a release binary	will only update to  its  cur-
       rent channel.  --update-to CHANNEL can be used to switch	to a different
       channel	when  a	newer version is available.  --update-to [CHANNEL@]TAG
       can also	be used	to upgrade or downgrade	to specific tags from a	 chan-
       nel.

       You may also use	--update-to <repository> (<owner>/<repository>)	to up-
       date  to	 a  channel  on	a completely different repository.  Be careful
       with what repository you	are updating to	though,	there is no  verifica-
       tion done for binaries from different repositories.

       Example usage:

        yt-dlp	 --update-to master switch to the master channel and update to
	 its latest release

        yt-dlp	--update-to stable@2023.07.06 upgrade/downgrade	to release  to
	 stable	channel	tag 2023.07.06

        yt-dlp	 --update-to 2023.10.07	upgrade/downgrade to tag 2023.10.07 if
	 it exists on the current channel

        yt-dlp	--update-to example/yt-dlp@2023.09.24 upgrade/downgrade	to the
	 release from the example/yt-dlp repository, tag 2023.09.24

       Important: Any user experiencing	 an  issue  with  the  stable  release
       should install or update	to the nightly release before submitting a bug
       report:

	      #	To update to nightly from stable executable/binary:
	      yt-dlp --update-to nightly

	      #	To install nightly with	pip:
	      python3 -m pip install -U	--pre "yt-dlp[default]"

   DEPENDENCIES
       Python  versions	 3.9+ (CPython)	and 3.10+ (PyPy) are supported.	 Other
       versions	and implementations may	or may not work	correctly.

       While all the other dependencies	are optional, ffmpeg and  ffprobe  are
       highly recommended

   Strongly recommended
        ffmpeg	 and  ffprobe  (https://www.ffmpeg.org)	- Required for merging
	 separate video	and audio files, as well as for	various	 post-process-
	 ing  tasks.  License depends on the build (https://www.ffmpeg.org/le-
	 gal.html)

	 There are bugs	in ffmpeg that cause various issues when  used	along-
	 side  yt-dlp.	 Since ffmpeg is such an important dependency, we pro-
	 vide custom  builds  (https://github.com/yt-dlp/FFmpeg-Builds#ffmpeg-
	 static-auto-builds)  with  patches  for  some	of these issues	at yt-
	 dlp/FFmpeg-Builds (https://github.com/yt-dlp/FFmpeg-Builds).  See the
	 readme	(https://github.com/yt-dlp/FFmpeg-Builds#patches-applied)  for
	 details on the	specific issues	solved by these	builds

	 Important:  What you need is ffmpeg binary, NOT the Python package of
	 the same name (https://pypi.org/project/ffmpeg)

   Networking
        certifi   (https://github.com/certifi/python-certifi)*	  -   Provides
	 Mozilla's    root   certificate   bundle.    Licensed	 under	 MPLv2
	 (https://github.com/certifi/python-certifi/blob/master/LICENSE)

        brotli	    (https://github.com/google/brotli)*	    or	    brotlicffi
	 (https://github.com/python-hyper/brotlicffi)	      -		Brotli
	 (https://en.wikipedia.org/wiki/Brotli)	 content   encoding   support.
	 Both licensed under MIT 1 (https://github.com/google/brotli/blob/mas-
	 ter/LICENSE)  2 (https://github.com/python-hyper/brotlicffi/blob/mas-
	 ter/LICENSE)

        websockets (https://github.com/aaugustin/websockets)* - For download-
	 ing	 over	  websocket.	  Licensed     under	  BSD-3-Clause
	 (https://github.com/aaugustin/websockets/blob/main/LICENSE)

        requests  (https://github.com/psf/requests)*  -  HTTP	library.   For
	 HTTPS proxy  and  persistent  connections  support.   Licensed	 under
	 Apache-2.0 (https://github.com/psf/requests/blob/main/LICENSE)

   Impersonation
       The following provide support for impersonating browser requests.  This
       may be required for some	sites that employ TLS fingerprinting.

        curl_cffi  (https://github.com/lexiforest/curl_cffi)  (recommended) -
	 Python	 binding  for  curl-impersonate	  (https://github.com/lexifor-
	 est/curl-impersonate).	  Provides  impersonation  targets for Chrome,
	 Edge and Safari.   Licensed  under  MIT  (https://github.com/lexifor-
	 est/curl_cffi/blob/main/LICENSE)

	  Can	be  installed with the curl-cffi group,	e.g.  pip install "yt-
	   dlp[default,curl-cffi]"

	  Currently included in  yt-dlp.exe,  yt-dlp_linux  and  yt-dlp_macos
	   builds

   Metadata
        mutagen  (https://github.com/quodlibet/mutagen)* - For	--embed-thumb-
	 nail	 in    certain	   formats.	 Licensed     under	GPLv2+
	 (https://github.com/quodlibet/mutagen/blob/master/COPYING)

        AtomicParsley	(https://github.com/wez/atomicparsley)	- For --embed-
	 thumbnail in mp4/m4a files when mutagen/ffmpeg	cannot.	 Licensed  un-
	 der GPLv2+ (https://github.com/wez/atomicparsley/blob/master/COPYING)

        xattr		  (https://github.com/xattr/xattr),	       pyxattr
	 (https://github.com/iustin/pyxattr)   or   setfattr	(http://savan-
	 nah.nongnu.org/projects/attr)	- For writing xattr metadata (--xattr)
	 on Mac	and BSD.  Licensed  under  MIT	(https://github.com/xattr/xat-
	 tr/blob/master/LICENSE.txt),  LGPL2.1 (https://github.com/iustin/pyx-
	 attr/blob/master/COPYING)     and	GPLv2+	    (http://git.savan-
	 nah.nongnu.org/cgit/attr.git/tree/doc/COPYING)	respectively

   Misc
        pycryptodomex	(https://github.com/Legrandin/pycryptodome)* - For de-
	 crypting AES-128 HLS streams and various other	data.  Licensed	 under
	 BSD-2-Clause	  (https://github.com/Legrandin/pycryptodome/blob/mas-
	 ter/LICENSE.rst)

        phantomjs (https://github.com/ariya/phantomjs)	- Used	in  extractors
	 where	javascript  needs  to  be  run.	  Licensed  under BSD-3-Clause
	 (https://github.com/ariya/phantomjs/blob/master/LICENSE.BSD)

        secretstorage	 (https://github.com/mitya57/secretstorage)*   -   For
	 --cookies-from-browser	 to  access the	Gnome keyring while decrypting
	 cookies  of  Chromium-based  browsers	on  Linux.    Licensed	 under
	 BSD-3-Clause	   (https://github.com/mitya57/secretstorage/blob/mas-
	 ter/LICENSE)

        Any external downloader that you want to use with --downloader

   Deprecated
        avconv	and avprobe (https://www.libav.org) - Now deprecated  alterna-
	 tive  to ffmpeg.  License depends on the build	(https://libav.org/le-
	 gal)

        sponskrub (https://github.com/faissaloo/SponSkrub) -  For  using  the
	 now	deprecated   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.  Li-
	 censed	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)

       To  use	or  redistribute the dependencies, you must agree to their re-
       spective	licensing terms.

       The standalone release binaries are built with the  Python  interpreter
       and the packages	marked with * included.

       If  you	do  not	have the necessary dependencies	for a task you are at-
       tempting, yt-dlp	will warn you.	All the	currently available  dependen-
       cies are	visible	at the top of the --verbose output

   COMPILE
   Standalone PyInstaller Builds
       To  build  the  standalone  executable,	you must have Python and pyin-
       staller (plus any of yt-dlp's optional dependencies  if	needed).   The
       executable  will	 be  built for the same	CPU architecture as the	Python
       used.

       You can run the following commands:

	      python3 devscripts/install_deps.py --include pyinstaller
	      python3 devscripts/make_lazy_extractors.py
	      python3 -m bundle.pyinstaller

       On some systems,	you may	need to	use py or python instead of python3.

       python -m bundle.pyinstaller accepts any	arguments that can  be	passed
       to  pyinstaller,	 such as --onefile/-F or --onedir/-D, which is further
       documented here	(https://pyinstaller.org/en/stable/usage.html#what-to-
       generate).

       Note:	Pyinstaller    versions	   below    4.4	   do	 not   support
       (https://github.com/pyinstaller/pyinstaller#requirements-and-tested-
       platforms) Python installed from	the Windows store without using	a vir-
       tual environment.

       Important: Running pyinstaller directly instead of using	python -m bun-
       dle.pyinstaller is not officially supported.  This may or may not  work
       correctly.

   Platform-independent	Binary (UNIX)
       You  will  need the build tools python (3.9+), zip, make	(GNU), pandoc*
       and pytest*.

       After installing	these, simply run make.

       You can also run	make yt-dlp instead to compile only the	binary without
       updating	any of the additional files.  (The build tools marked  with  *
       are not needed for this)

   Related scripts
        devscripts/install_deps.py - Install dependencies for yt-dlp.

        devscripts/update-version.py -	Update the version number based	on the
	 current date.

        devscripts/set-variant.py - Set the build variant of the executable.

        devscripts/make_changelog.py  -  Create  a  markdown  changelog using
	 short commit messages and update CONTRIBUTORS file.

        devscripts/make_lazy_extractors.py - Create lazy extractors.  Running
	 this before building the binaries (any	variant)  will	improve	 their
	 startup  performance.	Set the	environment variable YTDLP_NO_LAZY_EX-
	 TRACTORS to something nonempty	to forcefully disable  lazy  extractor
	 loading.

       Note: See their --help for more info.

   Forking the project
       If  you fork the	project	on GitHub, you can run your fork's build work-
       flow to automatically build the selected	version(s) as artifacts.   Al-
       ternatively,  you  can  run  the	release	workflow or enable the nightly
       workflow	to create full (pre-)releases.

PLUGINS
       Note that all plugins are imported even if not invoked, and that	 there
       are  no	checks performed on plugin code.  Use plugins at your own risk
       and only	if you trust the code!

       Plugins can be of <type>s extractor or postprocessor.  -	Extractor plu-
       gins do not need	to be enabled from the CLI and are  automatically  in-
       voked  when the input URL is suitable for it.  -	Extractor plugins take
       priority	over built-in extractors.  - Postprocessor plugins can be  in-
       voked using --use-postprocessor NAME.

       Plugins are loaded from the namespace packages yt_dlp_plugins.extractor
       and yt_dlp_plugins.postprocessor.

       In other	words, the file	structure on the disk looks something like:

		  yt_dlp_plugins/
		      extractor/
			  myplugin.py
		      postprocessor/
			  myplugin.py

       yt-dlp  looks  for these	yt_dlp_plugins namespace folders in many loca-
       tions (see below) and loads in plugins from all of them.	 Set the envi-
       ronment variable	YTDLP_NO_PLUGINS  to  something	 nonempty  to  disable
       loading plugins entirely.

       See  the	 wiki  for  some  known	plugins	(https://github.com/yt-dlp/yt-
       dlp/wiki/Plugins)

   Installing Plugins
       Plugins can be installed	using various methods and locations.

       1. Configuration	directories: Plugin packages (containing a yt_dlp_plu-
	  gins namespace folder) can be	dropped	into  the  following  standard
	  configuration	locations:

	    User Plugins

	      ${XDG_CONFIG_HOME}/yt-dlp/plugins/<package   name>/yt_dlp_plug-
	       ins/ (recommended on Linux/macOS)

	      ${XDG_CONFIG_HOME}/yt-dlp-plugins/<package   name>/yt_dlp_plug-
	       ins/

	      ${APPDATA}/yt-dlp/plugins/<package  name>/yt_dlp_plugins/ (rec-
	       ommended	on Windows)

	      ${APPDATA}/yt-dlp-plugins/<package name>/yt_dlp_plugins/

	      ~/.yt-dlp/plugins/<package name>/yt_dlp_plugins/

	      ~/yt-dlp-plugins/<package name>/yt_dlp_plugins/

	    System Plugins

	      /etc/yt-dlp/plugins/<package name>/yt_dlp_plugins/

	      /etc/yt-dlp-plugins/<package name>/yt_dlp_plugins/

       2. Executable location: Plugin packages can similarly be	installed in a
	  yt-dlp-plugins directory under the executable	location  (recommended
	  for portable installations):

	    Binary:   where   <root-dir>/yt-dlp.exe,  <root-dir>/yt-dlp-plug-
	     ins/<package name>/yt_dlp_plugins/

	    Source: where  <root-dir>/yt_dlp/__main__.py,  <root-dir>/yt-dlp-
	     plugins/<package name>/yt_dlp_plugins/

       3. pip and other	locations in PYTHONPATH

	    Plugin  packages can be installed and managed using pip.  See yt-
	     dlp-sample-plugins	(https://github.com/yt-dlp/yt-dlp-sample-plug-
	     ins) for an example.

	      Note: plugin files between plugin packages installed  with  pip
	       must have unique	filenames.

	    Any  path	in  PYTHONPATH	is  searched in	for the	yt_dlp_plugins
	     namespace folder.

	      Note: This does not apply for Pyinstaller builds.

       .zip, .egg and .whl  archives  containing  a  yt_dlp_plugins  namespace
       folder in their root are	also supported as plugin packages.

        e.g.  ${XDG_CONFIG_HOME}/yt-dlp/plugins/mypluginpkg.zip where myplug-
	 inpkg.zip contains yt_dlp_plugins/<type>/myplugin.py

       Run yt-dlp with --verbose to check if the plugin	has been loaded.

   Developing Plugins
       See the yt-dlp-sample-plugins (https://github.com/yt-dlp/yt-dlp-sample-
       plugins)	 repo for a template plugin package and	the Plugin Development
       (https://github.com/yt-dlp/yt-dlp/wiki/Plugin-Development)  section  of
       the wiki	for a plugin development guide.

       All  public  classes with a name	ending in IE/PP	are imported from each
       file for	extractors and postprocessors respectively.  This respects un-
       derscore	prefix (e.g.  _MyBasePluginIE is private) and  __all__.	  Mod-
       ules can	similarly be excluded by prefixing the module name with	an un-
       derscore	(e.g.  _myplugin.py).

       To  replace an existing extractor with a	subclass of one, set the plug-
       in_name class keyword argument (e.g.  class MyPluginIE(ABuiltInIE, plu-
       gin_name='myplugin') will replace ABuiltInIE with  MyPluginIE).	 Since
       the  extractor replaces the parent, you should exclude the subclass ex-
       tractor from being imported separately by making	it private  using  one
       of the methods described	above.

       If you are a plugin author, add yt-dlp-plugins (https://github.com/top-
       ics/yt-dlp-plugins) as a	topic to your repository for discoverability.

       See    the    Developer	 Instructions	(https://github.com/yt-dlp/yt-
       dlp/blob/master/CONTRIBUTING.md#developer-instructions) on how to write
       and test	an extractor.

EMBEDDING YT-DLP
       yt-dlp makes the	best effort to be a  good  command-line	 program,  and
       thus should be callable from any	programming language.

       Your  program  should  avoid  parsing  the normal stdout	since they may
       change in future	versions.  Instead, they should	use  options  such  as
       -J,  --print,  --progress-template, --exec etc to create	console	output
       that you	can reliably reproduce and parse.

       From a Python program, you can embed yt-dlp in a	more powerful fashion,
       like this:

	      from yt_dlp import YoutubeDL

	      URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
	      with YoutubeDL() as ydl:
		  ydl.download(URLS)

       Most likely, you'll want	to use various options.	 For a list of options
       available, have a look at yt_dlp/YoutubeDL.py or	help(yt_dlp.YoutubeDL)
       in a Python shell.  If you are already familiar with the	CLI,  you  can
       use	 devscripts/cli_to_api.py	(https://github.com/yt-dlp/yt-
       dlp/blob/master/devscripts/cli_to_api.py) to translate any CLI switches
       to YoutubeDL params.

       Tip: If you are porting your code from youtube-dl to yt-dlp, one	impor-
       tant point to look out for is that we do	not guarantee the return value
       of YoutubeDL.extract_info to be json serializable, or even be a dictio-
       nary.  It will be dictionary-like, but if you want to ensure  it	 is  a
       serializable  dictionary,  pass	it  through YoutubeDL.sanitize_info as
       shown in	the example below

   Embedding examples
   Extracting information
	      import json
	      import yt_dlp

	      URL = 'https://www.youtube.com/watch?v=BaW_jenozKc'

	      #	 See help(yt_dlp.YoutubeDL) for	a list of available options and	public functions
	      ydl_opts = {}
	      with yt_dlp.YoutubeDL(ydl_opts) as ydl:
		  info = ydl.extract_info(URL, download=False)

		  #  ydl.sanitize_info makes the info json-serializable
		  print(json.dumps(ydl.sanitize_info(info)))

   Download using an info-json
	      import yt_dlp

	      INFO_FILE	= 'path/to/video.info.json'

	      with yt_dlp.YoutubeDL() as ydl:
		  error_code = ydl.download_with_info_file(INFO_FILE)

	      print('Some videos failed	to download' if	error_code
		    else 'All videos successfully downloaded')

   Extract audio
	      import yt_dlp

	      URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']

	      ydl_opts = {
		  'format': 'm4a/bestaudio/best',
		  #  See help(yt_dlp.postprocessor) for	a list of available Postprocessors and their arguments
		  'postprocessors': [{	# Extract audio	using ffmpeg
		      'key': 'FFmpegExtractAudio',
		      'preferredcodec':	'm4a',
		  }]
	      }

	      with yt_dlp.YoutubeDL(ydl_opts) as ydl:
		  error_code = ydl.download(URLS)

   Filter videos
	      import yt_dlp

	      URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']

	      def longer_than_a_minute(info, *,	incomplete):
		  """Download only videos longer than a	minute (or with	unknown	duration)"""
		  duration = info.get('duration')
		  if duration and duration < 60:
		      return 'The video	is too short'

	      ydl_opts = {
		  'match_filter': longer_than_a_minute,
	      }

	      with yt_dlp.YoutubeDL(ydl_opts) as ydl:
		  error_code = ydl.download(URLS)

   Adding logger and progress hook
	      import yt_dlp

	      URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']

	      class MyLogger:
		  def debug(self, msg):
		      #	For compatibility with youtube-dl, both	debug and info are passed into debug
		      #	You can	distinguish them by the	prefix '[debug]	'
		      if msg.startswith('[debug] '):
			  pass
		      else:
			  self.info(msg)

		  def info(self, msg):
		      pass

		  def warning(self, msg):
		      pass

		  def error(self, msg):
		      print(msg)

	      #	 See "progress_hooks" in help(yt_dlp.YoutubeDL)
	      def my_hook(d):
		  if d['status'] == 'finished':
		      print('Done downloading, now post-processing ...')

	      ydl_opts = {
		  'logger': MyLogger(),
		  'progress_hooks': [my_hook],
	      }

	      with yt_dlp.YoutubeDL(ydl_opts) as ydl:
		  ydl.download(URLS)

   Add a custom	PostProcessor
	      import yt_dlp

	      URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']

	      #	 See help(yt_dlp.postprocessor.PostProcessor)
	      class MyCustomPP(yt_dlp.postprocessor.PostProcessor):
		  def run(self,	info):
		      self.to_screen('Doing stuff')
		      return [], info

	      with yt_dlp.YoutubeDL() as ydl:
		  #  "when" can	take any value in yt_dlp.utils.POSTPROCESS_WHEN
		  ydl.add_post_processor(MyCustomPP(), when='pre_process')
		  ydl.download(URLS)

   Use a custom	format selector
	      import yt_dlp

	      URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']

	      def format_selector(ctx):
		  """ Select the best video and	the best audio that won't result in an mkv.
		  NOTE:	This is	just an	example	and does not handle all	cases """

		  # formats are	already	sorted worst to	best
		  formats = ctx.get('formats')[::-1]

		  # acodec='none' means	there is no audio
		  best_video = next(f for f in formats
				    if f['vcodec'] != 'none' and f['acodec'] ==	'none')

		  # find compatible audio extension
		  audio_ext = {'mp4': 'm4a', 'webm': 'webm'}[best_video['ext']]
		  # vcodec='none' means	there is no video
		  best_audio = next(f for f in formats if (
		      f['acodec'] != 'none' and	f['vcodec'] == 'none' and f['ext'] == audio_ext))

		  # These are the minimum required fields for a	merged format
		  yield	{
		      'format_id': f'{best_video["format_id"]}+{best_audio["format_id"]}',
		      'ext': best_video['ext'],
		      'requested_formats': [best_video,	best_audio],
		      #	Must be	+ separated list of protocols
		      'protocol': f'{best_video["protocol"]}+{best_audio["protocol"]}'
		  }

	      ydl_opts = {
		  'format': format_selector,
	      }

	      with yt_dlp.YoutubeDL(ydl_opts) as ydl:
		  ydl.download(URLS)

CHANGES	FROM YOUTUBE-DL
   New features
        Forked	 from	yt-dlc@f9401f2	 (https://github.com/blackjack4494/yt-
	 dlc/commit/f9401f2a91987068139c5f757b12fc711d4c0cee)  and merged with
	 youtube-dl@a08f2b7	  (https://github.com/ytdl-org/youtube-dl/com-
	 mit/a08f2b7e4567cdc50c0614ee0a4ffdff49b8b6e6)		   (exceptions
	 (https://github.com/yt-dlp/yt-dlp/issues/21))

        SponsorBlock Integration: You can  mark/remove	 sponsor  sections  in
	 YouTube   videos   by	 utilizing   the  SponsorBlock	(https://spon-
	 sor.ajay.app) API

        Format	Sorting: The default format sorting options have been  changed
	 so that higher	resolution and better codecs will be now preferred in-
	 stead of simply using larger bitrate.	Furthermore, you can now spec-
	 ify  the sort order using -S.	This allows for	much easier format se-
	 lection than what is possible by simply using --format	(examples)

        Merged	with animelover1984/youtube-dl:	You get	most of	 the  features
	 and	     improvements	 from	     animelover1984/youtube-dl
	 (https://github.com/animelover1984/youtube-dl)	including --write-com-
	 ments,	 BiliBiliSearch,  BilibiliChannel,  Embedding	thumbnail   in
	 mp4/ogg/opus,	playlist infojson etc.	Note that NicoNico livestreams
	 are   not   available.	   See	 #31	(https://github.com/yt-dlp/yt-
	 dlp/pull/31) for details.

        YouTube improvements:

	  Supports Clips, Stories (ytstories:<channel UCID>), Search (includ-
	   ing	filters)*,  YouTube  Music  Search,  Channel-specific  search,
	   Search prefixes (ytsearch:, ytsearchdate:)*,	Mixes, and Feeds (:yt-
	   fav,	:ytwatchlater, :ytsubs,	:ythistory, :ytrec, :ytnotif)

	  Fix	 for   n-sig   based   throttling    (https://github.com/ytdl-
	   org/youtube-dl/issues/29326)	*

	  Download livestreams	from the start using --live-from-start (exper-
	   imental)

	  Channel  URLs download all uploads of the channel, including	shorts
	   and live

	  Support for logging in  with	 OAuth	(https://github.com/yt-dlp/yt-
	   dlp/wiki/Extractors#logging-in-with-oauth)

        Cookies from browser: Cookies can be automatically extracted from all
	 major	  web	 browsers    using    --cookies-from-browser	BROWS-
	 ER[+KEYRING][:PROFILE][::CONTAINER]

        Download time range: Videos can be downloaded partially based on  ei-
	 ther timestamps or chapters using --download-sections

        Split	video  by  chapters:  Videos  can be split into	multiple files
	 based on chapters using --split-chapters

        Multi-threaded	fragment downloads:  Download  multiple	 fragments  of
	 m3u8/mpd  videos in parallel.	Use --concurrent-fragments (-N)	option
	 to set	the number of threads used

        Aria2c	with HLS/DASH: You can use aria2c as the  external  downloader
	 for DASH(mpd) and HLS(m3u8) formats

        New  and  fixed extractors: Many new extractors have been added and a
	 lot of	existing ones have been	fixed.	See the	changelog or the  list
	 of supported sites

        New MSOs: Philo, Spectrum, SlingTV, Cablevision, RCN etc.

        Subtitle  extraction  from manifests: Subtitles can be	extracted from
	 streaming	media	    manifests.	      See	commit/be6202f
	 (https://github.com/yt-dlp/yt-dlp/com-
	 mit/be6202f12b97858b9d716e608394b51065d0419f) for details

        Multiple  paths  and  output templates: You can give different	output
	 templates and download	paths for different types of files.   You  can
	 also  set a temporary path where intermediary files are downloaded to
	 using --paths (-P)

        Portable Configuration: Configuration files are automatically	loaded
	 from the home and root	directories.  See CONFIGURATION	for details

        Output	template improvements: Output templates	can now	have date-time
	 formatting,  numeric  offsets,	object traversal etc.  See output tem-
	 plate for details.  Even more advanced	operations can	also  be  done
	 with the help of --parse-metadata and --replace-in-metadata

        Other	new options: Many new options have been	added such as --alias,
	 --print, --concat-playlist, --wait-for-video, --retry-sleep, --sleep-
	 requests,  --convert-thumbnails,  --force-download-archive,  --force-
	 overwrites, --break-match-filters etc

        Improvements:	Regex and other	operators in --format/--match-filters,
	 multiple --postprocessor-args and --downloader-args,  faster  archive
	 checking,  more  format  selection  options, merge multi-video/audio,
	 multiple --config-locations, --exec at	different stages, etc

        Plugins: Extractors and PostProcessors	can be loaded from an external
	 file.	See plugins for	details

        Self updater: The releases can	be updated using yt-dlp	-U, and	 down-
	 graded	using --update-to if required

        Automated  builds: Nightly/master builds can be used with --update-to
	 nightly and --update-to master

       See changelog or	commits	(https://github.com/yt-dlp/yt-dlp/commits) for
       the full	list of	changes

       Features	marked with a *	have been back-ported to youtube-dl

   Differences in default behavior
       Some of yt-dlp's	default	options	are different from that	of  youtube-dl
       and youtube-dlc:

        yt-dlp	 supports  only	 Python	3.9+, and will remove support for more
	 versions  as  they   become   EOL   (https://devguide.python.org/ver-
	 sions/#python-release-cycle);	while youtube-dl still supports	Python
	 2.6+	  and	  3.2+	   (https://github.com/ytdl-org/youtube-dl/is-
	 sues/30568#issue-1118238743)

        The  options  --auto-number (-A), --title (-t)	and --literal (-l), no
	 longer	work.  See removed options for details

        avconv	is not supported as an alternative to ffmpeg

        yt-dlp	 stores	 config	 files	in  slightly  different	 locations  to
	 youtube-dl.  See CONFIGURATION	for a list of correct locations

        The  default output template is %(title)s [%(id)s].%(ext)s.  There is
	 no real reason	for this change.  This was changed before  yt-dlp  was
	 ever  made  public  and  now  there are no plans to change it back to
	 %(title)s-%(id)s.%(ext)s.   Instead,  you  may	 use  --compat-options
	 filename

        The  default  format sorting is different from	youtube-dl and prefers
	 higher	resolution and better codecs rather than higher	bitrates.  You
	 can use the --format-sort option to change this to any	order you pre-
	 fer, or use --compat-options format-sort to use youtube-dl's  sorting
	 order.	  Older	 versions  of  yt-dlp preferred	VP9 due	to its broader
	 compatibility;	you can	use --compat-options prefer-vp9-sort to	revert
	 to that format	sorting	preference.  These two compat  options	cannot
	 be used together

        The  default  format selector is bv*+ba/b.  This means	that if	a com-
	 bined video + audio format that is better than	 the  best  video-only
	 format	 is  found,  the  former will be preferred.  Use -f bv+ba/b or
	 --compat-options format-spec to revert	this

        Unlike	youtube-dlc,  yt-dlp  does  not	 allow	merging	 multiple  au-
	 dio/video streams into	one file by default (since this	conflicts with
	 the use of -f bv*+ba).	 If needed, this feature must be enabled using
	 --audio-multistreams  and  --video-multistreams.   You	 can  also use
	 --compat-options multistreams to enable both

        --no-abort-on-error is	enabled	by default.  Use  --abort-on-error  or
	 --compat-options abort-on-error to abort on errors instead

        When writing metadata files such as thumbnails, description or	infoj-
	 son,  the  same  information  (if  available)	is  also  written  for
	 playlists.  Use --no-write-playlist-metafiles or --compat-options no-
	 playlist-metafiles to not write these files

        --add-metadata	attaches the infojson to  mkv  files  in  addition  to
	 writing  the metadata when used with --write-info-json.  Use --no-em-
	 bed-info-json or --compat-options no-attach-info-json to revert this

        Some metadata are embedded into different fields  when	 using	--add-
	 metadata as compared to youtube-dl.  Most notably, comment field con-
	 tains the webpage_url and synopsis contains the description.  You can
	 use  --parse-metadata	to modify this to your liking or use --compat-
	 options embed-metadata	to revert this

        playlist_index	 behaves  differently  when  used  with	 options  like
	 --playlist-reverse	 and	  --playlist-items.	  See	  #302
	 (https://github.com/yt-dlp/yt-dlp/issues/302) for details.   You  can
	 use  --compat-options	playlist-index if you want to keep the earlier
	 behavior

        The output of -F is listed in a  new  format.	 Use  --compat-options
	 list-formats to revert	this

        Live  chats  (if  available) are considered as	subtitles.  Use	--sub-
	 langs all,-live_chat to download all subtitles	except live chat.  You
	 can also  use	--compat-options  no-live-chat	to  prevent  any  live
	 chat/danmaku from downloading

        YouTube  channel  URLs	download all uploads of	the channel.  To down-
	 load only the videos in a specific tab, pass the tab's	URL.   If  the
	 channel  does	not  show  the requested tab, an error will be raised.
	 Also, /live URLs raise	an error if there are no live  videos  instead
	 of silently downloading the entire channel.  You may use --compat-op-
	 tions no-youtube-channel-redirect to revert all these redirections

        Unavailable videos are	also listed for	YouTube	playlists.  Use	--com-
	 pat-options no-youtube-unavailable-videos to remove this

        The upload dates extracted from YouTube are in	UTC.

        If  ffmpeg  is	used as	the downloader,	the downloading	and merging of
	 formats happen	in a single step when possible.	 Use  --compat-options
	 no-direct-merge to revert this

        Thumbnail  embedding  in  mp4	is done	with mutagen if	possible.  Use
	 --compat-options embed-thumbnail-atomicparsley	to force  the  use  of
	 AtomicParsley instead

        Some  internal	metadata such as filenames are removed by default from
	 the infojson.	Use --no-clean-infojson	or --compat-options  no-clean-
	 infojson to revert this

        When  --embed-subs  and --write-subs are used together, the subtitles
	 are written to	disk and also embedded in the media file.  You can use
	 just --embed-subs to embed the	subs and automatically delete the sep-
	 arate file.  See #630 (comment) (https://github.com/yt-dlp/yt-dlp/is-
	 sues/630#issuecomment-893659460) for more info.  --compat-options no-
	 keep-subs can be used to revert this

        certifi will be used for SSL root certificates, if installed.	If you
	 want to use system certificates (e.g.	self-signed), use --compat-op-
	 tions no-certifi

        yt-dlp's sanitization of invalid characters in	filenames  is  differ-
	 ent/smarter  than  in youtube-dl.  You	can use	--compat-options file-
	 name-sanitization to revert to	youtube-dl's behavior

        [STRIKEOUT:yt-dlp tries to parse the external downloader outputs into
	 the standard progress	output	if  possible  (Currently  implemented:
	 aria2c	 (https://github.com/yt-dlp/yt-dlp/issues/5931)).  You can use
	 --compat-options no-external-downloader-progress  to  get  the	 down-
	 loader	output as-is]

        yt-dlp	 versions  between  2021.09.01 and 2023.01.02 applies --match-
	 filters to nested playlists.  This was	an  unintentional  side-effect
	 of	       8f18ac		(https://github.com/yt-dlp/yt-dlp/com-
	 mit/8f18aca8717bb0dd49054555af8d386e5eda3a88) and is fixed in	d7b460
	 (https://github.com/yt-dlp/yt-dlp/com-
	 mit/d7b460d0e5fc710950582baed2e3fc616ed98a80).	  Use --compat-options
	 playlist-match-filter to revert this

        yt-dlp	versions between 2021.11.10  and  2023.06.21  estimated	 file-
	 size_approx  values  for fragmented/manifest formats.	This was added
	 for  convenience  in  f2fe69	(https://github.com/yt-dlp/yt-dlp/com-
	 mit/f2fe69c7b0d208bdb1f6292b4ae92bc1e1a7444a),	 but  was  reverted in
	 0dff8e				(https://github.com/yt-dlp/yt-dlp/com-
	 mit/0dff8e4d1e6e9fb938f4256ea9af7d81f42fd54f)	due to the potentially
	 extreme inaccuracy of the  estimated  values.	 Use  --compat-options
	 manifest-filesize-approx to keep extracting the estimated values

        yt-dlp	uses modern http client	backends such as requests.  Use	--com-
	 pat-options prefer-legacy-http-handler	to prefer the legacy http han-
	 dler (urllib) to be used for standard http requests.

        The sub-modules swfinterp, casefold are removed.

        Passing  --simulate  (or calling extract_info with download=False) no
	 longer	  alters   the	 default   format   selection.	  See	 #9843
	 (https://github.com/yt-dlp/yt-dlp/issues/9843)	for details.

       For ease	of use,	a few more compat options are available:

        --compat-options all: Use all compat options (Do NOT use this!)

        --compat-options  youtube-dl:	Same  as  --compat-options all,-multi-
	 streams,-playlist-match-filter,-manifest-filesize-approx,-allow-un-
	 safe-ext,-prefer-vp9-sort

        --compat-options youtube-dlc: Same as --compat-options	 all,-no-live-
	 chat,-no-youtube-channel-redirect,-playlist-match-filter,-manifest-
	 filesize-approx,-allow-unsafe-ext,-prefer-vp9-sort

        --compat-options 2021:	Same as	--compat-options 2022,no-certifi,file-
	 name-sanitization

        --compat-options  2022: Same as --compat-options 2023,playlist-match-
	 filter,no-external-downloader-progress,prefer-legacy-http-han-
	 dler,manifest-filesize-approx

        --compat-options 2023:	Same as	--compat-options 2024,prefer-vp9-sort

        --compat-options 2024:	Currently does nothing.	 Use  this  to	enable
	 all future compat options

       The  following  compat  options restore vulnerable behavior from	before
       security	patches:

        --compat-options allow-unsafe-ext: Allow  files  with	any  extension
	 (including   unsafe   ones)  to  be  downloaded  (GHSA-79w7-vh3h-8g4j
	 (https://github.com/yt-dlp/yt-dlp/security/advisories/GH-
	 SA-79w7-vh3h-8g4j))

		:warning: Only use if a	valid file download  is	 rejected  be-
		cause its extension is detected	as uncommon

		This  option can enable	remote code execution!	Consider open-
		ing	an     issue	 (https://github.com/yt-dlp/yt-dlp/is-
		sues/new/choose) instead!

   Deprecated options
       These  are  all	the  deprecated	options	and the	current	alternative to
       achieve the same	effect

   Almost redundant options
       While these options are almost the  same	 as  their  new	 counterparts,
       there are some differences that prevents	them being redundant

	      -j, --dump-json		       --print "%()j"
	      -F, --list-formats	       --print formats_table
	      --list-thumbnails		       --print thumbnails_table	--print	playlist:thumbnails_table
	      --list-subs		       --print automatic_captions_table	--print	subtitles_table

   Redundant options
       While  these  options are redundant, they are still expected to be used
       due to their ease of use

	      --get-description		       --print description
	      --get-duration		       --print duration_string
	      --get-filename		       --print filename
	      --get-format		       --print format
	      --get-id			       --print id
	      --get-thumbnail		       --print thumbnail
	      -e, --get-title		       --print title
	      -g, --get-url		       --print urls
	      --match-title REGEX	       --match-filters "title ~= (?i)REGEX"
	      --reject-title REGEX	       --match-filters "title !~= (?i)REGEX"
	      --min-views COUNT		       --match-filters "view_count >=? COUNT"
	      --max-views COUNT		       --match-filters "view_count <=? COUNT"
	      --break-on-reject		       Use --break-match-filters
	      --user-agent UA		       --add-headers "User-Agent:UA"
	      --referer	URL		       --add-headers "Referer:URL"
	      --playlist-start NUMBER	       -I NUMBER:
	      --playlist-end NUMBER	       -I :NUMBER
	      --playlist-reverse	       -I ::-1
	      --no-playlist-reverse	       Default
	      --no-colors		       --color no_color

   Not recommended
       While these options still work, their  use  is  not  recommended	 since
       there are other alternatives to achieve the same

	      --force-generic-extractor	       --ies generic,default
	      --exec-before-download CMD       --exec "before_dl:CMD"
	      --no-exec-before-download	       --no-exec
	      --all-formats		       -f all
	      --all-subs		       --sub-langs all --write-subs
	      --print-json		       -j --no-simulate
	      --autonumber-size	NUMBER	       Use string formatting, e.g. %(autonumber)03d
	      --autonumber-start NUMBER	       Use internal field formatting like %(autonumber+NUMBER)s
	      --id			       -o "%(id)s.%(ext)s"
	      --metadata-from-title FORMAT     --parse-metadata	"%(title)s:FORMAT"
	      --hls-prefer-native	       --downloader "m3u8:native"
	      --hls-prefer-ffmpeg	       --downloader "m3u8:ffmpeg"
	      --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)
	      --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)
	      --geo-bypass		       --xff "default"
	      --no-geo-bypass		       --xff "never"
	      --geo-bypass-country CODE	       --xff CODE
	      --geo-bypass-ip-block IP_BLOCK   --xff IP_BLOCK

   Developer options
       These options are not intended to be used by the	end-user

	      --test			       Download	only part of video for testing extractors
	      --load-pages		       Load pages dumped by --write-pages
	      --youtube-print-sig-code	       For testing youtube signatures
	      --allow-unplayable-formats       List unplayable formats also
	      --no-allow-unplayable-formats    Default

   Old aliases
       These are aliases that are no longer documented for various reasons

	      --avconv-location		       --ffmpeg-location
	      --clean-infojson		       --clean-info-json
	      --cn-verification-proxy URL      --geo-verification-proxy	URL
	      --dump-headers		       --print-traffic
	      --dump-intermediate-pages	       --dump-pages
	      --force-write-download-archive   --force-write-archive
	      --load-info		       --load-info-json
	      --no-clean-infojson	       --no-clean-info-json
	      --no-split-tracks		       --no-split-chapters
	      --no-write-srt		       --no-write-subs
	      --prefer-unsecure		       --prefer-insecure
	      --rate-limit RATE		       --limit-rate RATE
	      --split-tracks		       --split-chapters
	      --srt-lang LANGS		       --sub-langs LANGS
	      --trim-file-names	LENGTH	       --trim-filenames	LENGTH
	      --write-srt		       --write-subs
	      --yes-overwrites		       --force-overwrites

   Sponskrub Options
       Support for SponSkrub (https://github.com/faissaloo/SponSkrub) has been
       deprecated in favor of the --sponsorblock options

	      --sponskrub		       --sponsorblock-mark all
	      --no-sponskrub		       --no-sponsorblock
	      --sponskrub-cut		       --sponsorblock-remove all
	      --no-sponskrub-cut	       --sponsorblock-remove -all
	      --sponskrub-force		       Not applicable
	      --no-sponskrub-force	       Not applicable
	      --sponskrub-location	       Not applicable
	      --sponskrub-args		       Not applicable

   No longer supported
       These options may no longer work	as intended

	      --prefer-avconv		       avconv is not officially	supported by yt-dlp (Alias: --no-prefer-ffmpeg)
	      --prefer-ffmpeg		       Default (Alias: --no-prefer-avconv)
	      -C, --call-home		       Not implemented
	      --no-call-home		       Default
	      --include-ads		       No longer supported
	      --no-include-ads		       Default
	      --write-annotations	       No supported site has annotations now
	      --no-write-annotations	       Default
	      --compat-options seperate-video-versions	No longer needed
	      --compat-options no-youtube-prefer-utc-upload-date  No longer supported

   Removed
       These options were deprecated since 2014	and have now been entirely re-
       moved

	      -A, --auto-number		       -o "%(autonumber)s-%(id)s.%(ext)s"
	      -t, -l, --title, --literal       -o "%(title)s-%(id)s.%(ext)s"

CONTRIBUTING
       See CONTRIBUTING.md for instructions on Opening an Issue	and Contribut-
       ing code	to the project

WIKI
       See  the	Wiki (https://github.com/yt-dlp/yt-dlp/wiki) for more informa-
       tion

								     yt-dlp(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=yt-dlp&sektion=1&manpath=FreeBSD+Ports+14.3.quarterly>

home | help