Fix "nsig extraction failed" and 50 KiB/s Downloads in yt-dlp
WARNING: [youtube] dQw4w9WgXcQ: nsig extraction failed: Some formats may be missing
Install PhantomJS to workaround the issue. Please download it from https://phantomjs.org/download.html
n = xk3PqR9vLm2wQzT ; player = https://www.youtube.com/s/player/a1b2c3d4/player_ias.vflset/en_US/base.js
Quick answer
This warning is why a download crawls at 50 KiB/s instead of failing outright. yt-dlp could not solve YouTube's throttling parameter, so the request goes out unsigned and YouTube serves it slowly on purpose. An update fixes it more often than any flag:
yt-dlp -U && yt-dlp --rm-cache-dir
What the n parameter does
Every YouTube media URL carries a parameter called n. Before the URL can be used at
full speed, that value has to be transformed by a JavaScript function inside YouTube's player,
and the result sent back. Get it right and you download at line speed. Get it wrong, or omit it,
and YouTube serves the file at a deliberately throttled rate.
So this is not a signature check in the security sense. It is a speed control, and that explains the symptom precisely: nothing fails, nothing is blocked, and a 200 MB video takes an hour.
yt-dlp handles it by downloading the player script, locating the function, and re-implementing it in Python. YouTube changes that function regularly — sometimes to fix bugs, sometimes specifically to break tools that read it. When the new shape defeats yt-dlp's parser, you get this warning.
The fixes, in the order worth trying
1. Update
A player change is usually handled within a day or two of appearing. If your build predates the fix, nothing local will help:
yt-dlp --version
yt-dlp -U
2. Clear the cached player
yt-dlp caches its analysis of the player. If the cache holds a parse of an older player while YouTube is serving a newer one, the mismatch produces exactly this:
yt-dlp --rm-cache-dir
3. Install a JavaScript runtime
When the function is too convoluted to re-implement, yt-dlp can execute it instead — if there is something on the machine able to run JavaScript. Deno is the lightest option:
curl -fsSL https://deno.land/install.sh | sh
winget install DenoLand.Deno
Node.js works equally well and is probably already installed if you do any web development. yt-dlp finds either automatically — there is no flag to set.
4. Switch to the nightly channel
Player changes are exactly the class of problem the nightly builds exist for. The fix typically lands there days before it reaches a numbered release:
yt-dlp --update-to nightly
5. Use a client that skips the check
The television client is not subject to the same throttling parameter:
yt-dlp --extractor-args "youtube:player_client=tv" "URL"
Occasionally faster than waiting for a parser fix, and the same flag helps with the PO token problem, which frequently appears alongside this one.
Confirming it worked
Two things to look for. First, that the warning is gone. Second — and this is the one that matters — that the speed is back:
yt-dlp -f "bv*[height<=720]+ba/b" --newline "URL"
Anything in MiB/s is healthy. Anything in double-digit KiB/s means the throttle is still on, even if nothing was printed about it.
If it still fails
-
Warning gone, speed still awful. Then it was never the n parameter. Try
--concurrent-fragments 4, and check whether your ISP throttles video CDN traffic — testing at a different time of day usually settles that question. - Warning persists on a fresh nightly with Deno installed. YouTube has shipped something new and the fix is not written yet. Check the issue tracker — when this breaks it breaks for everyone at once, and there will already be a thread.
- Only some videos. YouTube A/B tests players. Retrying an hour later often hits a different one.
- Formats missing entirely rather than slow. Different problem wearing similar words — see PO tokens and stuck at 360p.
Frequently asked
Why is the download slow rather than failing?
Does a faster connection help?
Why does yt-dlp need a JavaScript interpreter for this?
Is installing Deno or Node safe?
Related
- Why yt-dlp Only Downloads 360p — and How to Get 1080p or 4K yt-dlp defaulting to 360p is a symptom, not a setting. The four causes — no ffmpeg, a PO token gate, a wrong f...
- yt-dlp: pip, pipx, Binary or Nightly — Which to Install The install method decides how fast you get extractor fixes, and extractor fixes are the whole game. A straigh...
- Fix "PO Token required" and Missing Formats in yt-dlp PO tokens are YouTube's proof-of-origin check, and without one yt-dlp silently loses every high-quality format...