RepoDaily · 2026-08-18 · AI model / Agent framework

yt-dlp: the command-line downloader with thousands of supported sites and a strict no-AI policy

#13 AI model / Agent framework Python +276 yt-dlp/yt-dlp Open repository

yt-dlp supports thousands of sites, ships an unusually deep options surface, and bans AI-generated contributions outright. Here is what the README, license, and package metadata actually say.

Repo typeAI model / Agent framework
Best forArchiving video and audio from the terminal with precise format, subtitle, and metadata control
Risk levelMedium: site changes break extractors between releases, so keep the binary current
Time to evaluate30-60 minutes to install, complete one download, and test an output template

Primary question: Does its option depth and site coverage beat a GUI tool for your scripted archiving needs?

90/100

RepoDaily adoption score

RepoDaily rates this as 90/100 (strong) for adoption: evidence, installation path, production risk, differentiation, license clarity, and AI/agent fit are scored from the article sources and adoption notes.

Directional score from RepoDaily sources and adoption notes, not a benchmark.Risk: Medium
100Evidence quality

5 source(s) across 4 source category/categories, plus a RepoDaily-specific evidence module when available.

97Installability

5 workflow step(s), 5 next-action step(s), and 2 command/install signal(s) were detected.

61Maintenance confidence

Trending momentum is +276 stars, with maintenance/release/issue signals counted when present.

93Production readiness

Risk is marked medium, with 5 security note(s) and 4 explicit skip condition(s).

100Differentiation

3 opportunity lens item(s), 4 alternative(s), and 3 type-specific section(s) support differentiation.

82License clarity

License source or license wording is present.

90Agent / AI fit

5 AI/agent-related signal(s) were detected in the article text and metadata.

Project overview

yt-dlp describes itself as a feature-rich command-line audio/video downloader with support for thousands of sites, tracked in its supportedsites.md file. The README is explicit about lineage: it is a fork of youtube-dl built on top of youtube-dlc, which the README calls now inactive. Packaging metadata reinforces the maturity claim - pyproject.toml requires Python 3.10 or newer, lists CPython 3.10 through 3.14 plus PyPy support, and carries the Development Status :: 5 - Production/Stable classifier.

The README's table of contents reads like a reference manual. Beyond General and Network options it documents Geo-restriction, Video Selection, Download, Filesystem, Thumbnail, Internet Shortcut, Verbosity and Simulation, Workarounds, Video Format, Subtitle, Authentication, Post-processing, SponsorBlock, Extractor, and Preset Alias option groups, followed by standalone chapters on configuration, output templates, format selection, metadata modification, extractor arguments, plugins, and embedding yt-dlp from Python.

Governance is unusually blunt. CONTRIBUTING.md opens with a NO AI / NO LLM POLICY that forbids LLMs, agents, or any other AI tools for issues, patches, comments, or translations, and states that violators may be blocked from the organization's repositories without warning. Maintenance rests with named maintainers in pyproject.toml - Grub4K, bashonly, and coletdjnz, with pukkandan listed as author - and the whole project ships under the Unlicense, dedicating the code to the public domain. Despite being filed here under an AI model / agent framework label, yt-dlp contains no model components; it is a downloader that explicitly refuses AI involvement.

Problem it solves

  • youtube-dlc, the direct ancestor the README names, is now inactive, leaving its users needing a maintained successor.
  • GUI downloaders typically hide format sorting, subtitle handling, and metadata rewriting behind limited dialogs.
  • Scripted archiving needs deterministic filenames and directory layout, which browser-based tools do not provide.
  • Post-download cleanup - embedding thumbnails, rewriting metadata, trimming sponsored segments - usually means gluing several scripts together.

How it works

  1. Install a release through one of the channels the README documents: release files on GitHub, PyPI, or the wiki's detailed installation instructions.
  2. Pass a URL; the per-site extractor resolves available formats, which you can filter and sort using the FORMAT SELECTION chapter's expression syntax.
  3. Shape output with an output template - the OUTPUT TEMPLATE chapter documents the available fields with worked examples for filenames and paths.
  4. Layer post-processing: subtitle options, thumbnail options, metadata modification, and SponsorBlock segment handling are separate option groups.
  5. Automate via configuration files (with documented encoding rules, netrc authentication, and environment-variable notes) or embed yt-dlp directly in Python using the EMBEDDING YT-DLP chapter.

Command surface: what the option list actually covers

The options surface is the product. The README groups switches into seventeen categories, from the expected (General, Network, Download) to the specialized: Internet Shortcut Options can write shortcut link files alongside media, Workarounds exists specifically for hostile site behavior, and Preset Aliases bundle common flag combinations. Format handling gets two dedicated chapters on filtering and sorting formats, and configuration gets its own treatment, including configuration file encoding, authentication with netrc, and notes about environment variables.

One flag matters more than the rest for support: -vU. CONTRIBUTING.md instructs every bug reporter to append it to their command line, copy the whole output, and wrap it in a code block; the sample log shown includes the yt-dlp version, build channel, Python version, and OS. In practice the command line doubles as the diagnostic interface, and anyone automating yt-dlp should keep verbose logging switchable.

Maintenance signals: policy, pinned stacks, and optional extras

  • CONTRIBUTING.md's NO AI / NO LLM POLICY blocks LLM-written issues, PRs, comments, and translations, with blocking from the organization's repositories as the stated consequence.
  • pyproject.toml names three maintainers (Grub4K, bashonly, coletdjnz) and pins an exact test stack: pytest ~=9.0, pytest-rerunfailures ~=16.0, and ruff ~=0.16.0 for static analysis.
  • Dependency strategy is opt-in: core dependencies = [], while the default extra pulls brotli, certifi, mutagen, pycryptodomex, requests >=2.32.2,<3, urllib3 >=2.0.2,<3, websockets >=13.0, and yt-dlp-ejs==0.8.0.
  • A pin extra freezes exact versions (requests==2.34.2, urllib3==2.7.0, certifi==2026.7.22, pycryptodomex==3.23.0) for reproducible installs; optional extras add curl-cffi, secretstorage, and deno >=2.6.6.

Integration surface: plugins, embedding, and file-based configuration

Three extension points stand out. The PLUGINS chapter splits into Installing Plugins and Developing Plugins, so new-site support can ship outside the core repository. EMBEDDING YT-DLP documents calling the downloader from Python instead of spawning a subprocess, with its own examples section. EXTRACTOR ARGUMENTS covers passing per-site options, which is how site-specific quirks get configured without code changes.

Configuration is file-first: the README documents configuration file encoding, netrc-based authentication, and environment-variable behavior, so a server-side deployment can be fully specified without wrapper scripts.

Who should pay attention?

Good fit if

  • Archiving playlists or channels where filenames and folder layout must be reproducible.
  • Pipelines that need subtitles, thumbnails, and metadata handled in a single pass.
  • Python services that want to embed the downloader rather than shell out to it.
  • Environments on CPython 3.10-3.14 or PyPy, matching the pyproject.toml classifiers.
  • Cases where geo-restriction and workaround flags decide whether a download succeeds at all.

Skip for now if

  • You want a point-and-click GUI; the project's own classifier is Environment :: Console.
  • You plan to submit AI-drafted issues or PRs - the policy blocks violators without warning.
  • Runtimes pinned below Python 3.10 cannot install it (requires-python >=3.10).
  • One-off downloads where a browser's save dialog is enough.

Risks and cautions

Medium

The code is mature, public-domain, and conservatively packaged, but correctness depends on third-party websites, so breakage between releases is structural.

  • Every bug report must include full -vU verbose output, an acknowledgment that site-driven failures are routine.
  • Defaults intentionally diverge from youtube-dl; the README's Differences in default behavior section lists changes that surprise migrants.
  • Core dependencies = [] means capability varies with which extras you install.
  • The issue checklist screens out piracy-focused sites, narrowing what maintainers will support.
  • Licensing is Unlicense: public domain, dedicated in perpetuity, with the standard no-warranty disclaimer - no support obligations come with the code.
  • Credentials can live in netrc per the README configuration chapter; a secretstorage extra exists for desktop credential storage.
  • Supply-chain pinning is available: the pin extra freezes requests==2.34.2, urllib3==2.7.0, certifi==2026.7.22, and other exact versions for reproducible environments.
  • TLS goes through requests, urllib3, and certifi in the default extra; curl-cffi is an optional swap for impersonation-sensitive sites.
  • Verbose logs disclose environment details - the CONTRIBUTING example prints Python version, build channel, and OS - so sanitize before pasting publicly.

Alternatives to compare

ApproachWhen to useTrade-off
youtube-dl
You want the original upstream project whose changes yt-dlp documents against.Free, open source
yt-dlc
Only if you are stuck on the legacy fork; the README itself calls it now inactive.Free, open source
gallery-dl
Your targets are image galleries and boards rather than video pages.Free, open source
Commercial all-in-one downloaders
You need a supported GUI product with vendor accountability.Paid licenses or subscriptions

What this trend reveals

Deterministic media archives

Output templates plus Filesystem Options let a download land at an exact path with predictable naming, which is what long-term archives require.

Run one playlist with a template from OUTPUT TEMPLATE, delete a file, re-run, and confirm naming and resume behavior.

Embed instead of subprocess

The EMBEDDING YT-DLP chapter documents the Python surface with examples, removing argument-quoting bugs from services.

Port one subprocess call to the embed API and diff the metadata your code receives against the verbose log.

Ship a private extractor as a plugin

The PLUGINS chapter covers both installing and developing plugins, so a niche site can be supported without forking the core.

Follow the Developing Plugins steps for one internal site and confirm it loads in a stock install.

Best next action

Force one verbose run before you script anything

A single -vU run tells you whether your target sites resolve today and produces the exact artifact maintainers demand if one does not.

  1. Install the latest release from PyPI or the README's release files.
  2. Pick your three most-used URLs and run each with -vU appended.
  3. Read the resolved format list, then add one sorting rule from FORMAT SELECTION.
  4. Add an output template and verify the resulting paths.
  5. Archive the verbose logs next to your scripts; they are the required input for any future issue.

RepoDaily verdict

Rank 13 is earned: a public-domain, production-stable CLI whose option depth still embarrasses GUI tools. Adopt it for scripted archiving, pin your dependency extra, and keep updates on a schedule - site breakage, not code quality, is the only real risk.

Sources