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 |