id = "yt-dlp"
name = "yt-dlp"
homepage = "https://github.com/yt-dlp/yt-dlp"
description = "A feature-rich command-line audio/video downloader."
executables = ["yt-dlp"]
since = "2023.01.02"
version_from = { command = ["yt-dlp", "--ignore-config", "--version"] }
[dotfiles]
paths = [
"[configHome]/yt-dlp.conf",
"[configHome]/yt-dlp/config",
"[configHome]/yt-dlp/config.txt",
"%APPDATA%/yt-dlp.conf",
"%APPDATA%/yt-dlp/config",
"%APPDATA%/yt-dlp/config.txt",
"~/yt-dlp.conf",
"~/yt-dlp.conf.txt",
"~/.yt-dlp/config",
"~/.yt-dlp/config.txt",
]
secret = []
[commands]
format = 1
label = "Download one URL"
description = "Only form settings are used: --ignore-config and --no-playlist are always included. Playlist/channel extraction, cookies/login, updates and --exec are outside this form. Format queries run only when explicitly requested."
quality = "curated"
required_capabilities = ["yt-dlp.single-json"]
parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = true, short_bundles = true }
[[commands.source]]
id = "yt-dlp-readme"
kind = "curated"
url = "https://github.com/yt-dlp/yt-dlp#usage-and-options"
revision = "2026-10-27"
evidence = "--ignore-config, --no-playlist, --paths, --output, --format, --extract-audio, --audio-format, subtitle options and --skip-download --dump-single-json. Extracting audio requires FFmpeg and FFprobe."
[[commands.field]]
id = "isolation"
label = "Only form settings / one video"
fixed = ["--ignore-config", "--no-playlist"]
sources = ["yt-dlp-readme"]
[[commands.field]]
id = "paths"
label = "Download directory"
type = "path"
option = ["--paths", "-P"]
path = { kind = "directory", role = "output", must_exist = true }
sources = ["yt-dlp-readme"]
[[commands.field]]
id = "output"
label = "Output filename template"
description = "A yt-dlp template, not shell code; the directory is selected separately."
type = "string"
option = ["--output", "-o"]
effect = "overwrite"
sources = ["yt-dlp-readme"]
[[commands.field]]
id = "format"
label = "Media format"
type = "string"
option = ["--format", "-f"]
provider = "builtin:yt-dlp.formats"
suggestions = [{ value = "best", label = "Combined video + audio" }, { value = "bv*+ba/b", label = "Best streams (FFmpeg merge may be required)" }, { value = "bestaudio/best", label = "Best audio stream" }]
sources = ["yt-dlp-readme"]
[[commands.field]]
id = "extract_audio"
label = "Extract audio"
description = "Requires FFmpeg and FFprobe on the caller PATH."
type = "boolean"
option = ["--extract-audio", "-x"]
sources = ["yt-dlp-readme"]
[[commands.field]]
id = "audio_format"
label = "Audio format"
type = "enum"
option = ["--audio-format"]
choices = [{ value = "best", label = "Keep best audio format" }, { value = "aac", label = "AAC" }, { value = "alac", label = "ALAC" }, { value = "flac", label = "FLAC" }, { value = "m4a", label = "M4A" }, { value = "mp3", label = "MP3" }, { value = "opus", label = "Opus" }, { value = "vorbis", label = "Vorbis" }, { value = "wav", label = "WAV" }]
enabled_when = { field = "extract_audio", op = "is_set" }
sources = ["yt-dlp-readme"]
[[commands.field]]
id = "write_subs"
label = "Write subtitles"
type = "boolean"
option = ["--write-subs"]
sources = ["yt-dlp-readme"]
[[commands.field]]
id = "write_auto_subs"
label = "Write auto-generated subtitles"
type = "boolean"
option = ["--write-auto-subs"]
sources = ["yt-dlp-readme"]
[[commands.field]]
id = "sub_langs"
label = "Subtitle languages"
description = "Comma-separated language patterns interpreted by yt-dlp; Otty does not expand them."
type = "string"
option = ["--sub-langs"]
enabled_when = { any = [{ field = "write_subs", op = "is_set" }, { field = "write_auto_subs", op = "is_set" }] }
sources = ["yt-dlp-readme"]
[[commands.field]]
id = "url"
label = "Video URL (http/https)"
type = "url"
position = 0
min = 1
sources = ["yt-dlp-readme"]
[[commands.task]]
id = "video"
label = "Download video"
set = { format = ["best"] }
lock = ["format"]
fields = ["url", "paths", "format", "write_subs", "write_auto_subs", "sub_langs"]
required = ["url", "paths"]
[[commands.task]]
id = "audio"
label = "Audio only"
set = { format = ["bestaudio/best"], extract_audio = [true], audio_format = ["mp3"] }
lock = ["extract_audio"]
fields = ["url", "paths", "audio_format", "format"]
required = ["url", "paths"]
[[commands.group]]
id = "basic"
label = "Download"
fields = ["url", "paths", "format", "extract_audio", "audio_format"]
[[commands.group]]
id = "advanced"
label = "Advanced"
fields = ["output", "write_subs", "write_auto_subs", "sub_langs", "isolation"]