Skip to content

Notes

yt-dlp: "nsig extraction failed: Some formats may be missing"

What the warning means, why it comes and goes on its own, and the one install that fixes it for good — plus how to check whether you are actually affected before changing anything.

Your download works, but this went past on the way:

WARNING: [youtube] player 4fcd6e4a: nsig extraction failed: Some formats may be missing

It is a warning, not an error, so most people scroll past it. Sometimes that is the right call and sometimes it costs you the high-resolution formats and most of your download speed. This page is about telling those two cases apart before you change anything, because nearly every answer online skips that step and sends you installing things you may not need.

What nsig is

Every YouTube media URL carries a parameter called n. Before that URL will serve at full speed, the value has to be transformed by a function living inside YouTube’s player JavaScript — a different, deliberately obfuscated function every few weeks.

Solve it and you get the stream at full speed. Fail to solve it and YouTube either throttles the transfer to roughly the video’s own playback rate, or never lists the better formats at all. This is the mechanism behind most “why did yt-dlp get so slow” questions.

So the transformation has to run, and running it means running JavaScript.

The part that changed, and the part that did not

yt-dlp used to ship a miniature JavaScript interpreter and translate YouTube’s player code itself. As the code got harder to interpret, yt-dlp gained the ability to hand the job to a real JavaScript runtime instead:

yt-dlp --help | grep -A6 'js-runtimes'

On 2026.07.04 that prints, in priority order:

Supported runtimes are (in order of priority, from highest to lowest):
deno, node, quickjs, bun. Only "deno" is enabled by default.

Two details there cause most of the confusion:

  • Deno is the only one enabled by default. Having Node installed is not enough; yt-dlp will not reach for it unless told.
  • A runtime must be both enabled and available — enabled in that list, and present on your PATH.

What did not change is that the built-in interpreter is still there and still handles many player builds on its own. That is the piece the dramatic answers leave out.

Measured, rather than assumed

On 2026-07-31, with yt-dlp 2026.07.04, I listed the formats for the same video twice — once normally, once with every runtime disabled:

yt-dlp -F "URL"
yt-dlp --no-js-runtimes -F "URL"

Identical: 33 formats both times, up to 2160p60, and no warning either way. On that day’s player build, yt-dlp needed no external runtime at all.

That is the honest state of things. nsig failures are player-build specific: a new build lands, the interpreter loses on that one, warnings appear across a dozen GitHub issues, yt-dlp adapts, and it goes quiet again. Which is also why so many unrelated “fixes” get credited — people change something during the window and the window closes on its own.

Check whether you are actually affected

Before installing anything, ask for the format list:

yt-dlp -F "URL"

Do you see 1440p and 2160p entries? On a video published in 4K, a healthy list runs to 2160p60 with three codecs at most sizes. If yours stops at 1080p on a video you know is 4K, the challenge went unsolved.

The other tell is speed. A throttled download runs at roughly playback rate — a ten-minute video taking about ten minutes. That is not your connection.

If the list is complete and the speed is normal, the warning cost you nothing on that video. Note it and move on.

The fix, in order

1. Update yt-dlp

The genuine fix most of the time, and the one people skip because it sounds too easy. Fixes for a broken player build ship within days.

yt-dlp --version

Update it the way you installed it:

brew upgrade yt-dlp                          # Homebrew
yt-dlp -U                                    # standalone binary
python3 -m pip install -U "yt-dlp[default]"  # pip

2. Install Deno

This is what actually ends the recurring version of the problem: with a real runtime available, yt-dlp stops depending on its interpreter keeping pace.

brew install deno
deno --version

No configuration. yt-dlp finds it on the PATH by itself. Confirm it is being used by checking that -F and --no-js-runtimes -F now disagree on a video where the warning appears.

3. If you already have Node

Node works but is not enabled by default:

yt-dlp --js-runtimes node "URL"

If Deno is also installed and you want Node used anyway, clear the list first — priority beats preference:

yt-dlp --no-js-runtimes --js-runtimes node "URL"

Permanently, in ~/.config/yt-dlp/config:

--js-runtimes node

What does not fix it

PhantomJS. It appears in nearly every thread on this. It has been unmaintained since 2018, it is not in yt-dlp’s runtime list, and installing it today does nothing whatsoever.

A VPN or a proxy. nsig is a computation, not a permission. Changing where the request comes from cannot change the result of a maths problem, and a datacentre address makes every other YouTube check harder to pass.

--extractor-args "youtube:player_client=...". It sometimes moves the problem, because different clients are offered different format ladders. It does not solve the challenge, and it often costs you the high-resolution formats you were trying to recover in the first place.

Waiting. It works, which is the trouble. The warning names one player build; a new one arrives every few weeks. Waiting fixes it and teaches you nothing, and it is why so many wrong answers look right.

Why this never really ends

None of this is a bug slowly being fixed. YouTube changes the challenge, yt-dlp adapts, and that cycle is the steady state. It is the real reason a downloader that has not updated in two months has quietly stopped being a downloader.

Which is the one thing worth saying about the app I build: it updates yt-dlp on its own, once a day. It does not bundle a JavaScript runtime — if you hit a player build that needs one, brew install deno is the answer there too. What it removes is the failure mode where the engine silently goes stale, which is the common case by a wide margin.

The short version

Symptom What it means What to do
Warning, full format list, normal speed Cost you nothing on this video Nothing
-F stops at 1080p on a 4K video Challenge unsolved Update yt-dlp, then install Deno
Download runs at playback speed Throttled Same
Fixed itself yesterday, back today New player build Update yt-dlp; install Deno to stop the cycle