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] # README.md, CONFIGURATION (official repository): # https://github.com/yt-dlp/yt-dlp#configuration # User configuration supports the XDG config directory, its config.txt alias, # the Windows APPDATA directory, and the legacy home-directory spellings. 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", ] # The user config is a command-line option file. yt-dlp's documented netrc # credentials live in the shared ~/.netrc file rather than this tool's file; # no tool-specific whole-file credential path is claimed here. 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"]