On 19 August every new video we tried to fetch failed. Not some — every one. If you run anything that downloads YouTube, you probably hit this too, so here is the whole diagnosis including the parts where we were wrong.
Wrong turn one: the warning
The downloader printed a warning saying no JavaScript runtime could be found and pointing at a specific one to install. That looked like the answer, and we spent real time on it. It was not: a container with no JS runtime at all returned the full format list and downloaded fine once two other things were fixed. The warning was true and irrelevant.
Wrong turn two: our own cache
Midway through, one run completed successfully and we concluded production was fine. It was not fine — that run reused an already-downloaded source. The download stage took 1.5 seconds and moved no bytes. A cache hit looks exactly like a working pipeline, which is the most expensive kind of false signal there is.
What was actually wrong
- The downloader was picking a YouTube client whose media URLs had started returning 403. The fix existed only in nightly builds — the newest stable release still had it.
- After upgrading, a second error appeared: progressive (muxed) formats no longer exist. All 31 video formats are now "video only", so a selector written to prefer progressive matched nothing.
- Then our own throttle guard rejected the working download: it required 100 KB/s, and the healthy DASH download ran at 58.8 KB/s.
The number worth keeping
With progressive gone, long section downloads get throttled hard. A 20-minute window pulled from a 3-hour-49-minute source took 759 seconds at 58.8 KB/s. The same pipeline downloads a 4-minute video in 3 seconds at 10 MB/s. If you plan around "clipping takes seconds", plan again — the AI step in that run took 2.5 seconds and the download took twelve and a half minutes.
What to take from it
- Verify a download fix on a source you have never fetched. A cached success proves nothing about the network path.
- Check your throttle thresholds after any format change — a guard tuned for progressive will reject healthy DASH.
- Prefer shorter windows. Clip count per run usually does not depend on window length, but download time very much does.
Full write-up with every measurement: clipember.com/guides/youtube-download-fails-ffmpeg-code-8
Two of these a week, to everyone with a ClipEmber account. Make a clip or read the rest of the archive.