nilaoda/N_m3u8DL-RE · error · Exception
Download speed too slow!
Error message
Download speed too slow!
What it means
DownloadUtil.DownloadToFileAsync monitors transfer speed via a SpeedContainer that counts a 'low speed' condition; when detected it triggers the cancellation token, and the catch block converts the resulting OperationCanceledException into this error. It means the HTTP download of a segment/file fell below the acceptable speed threshold (e.g. ~10KB/s for 15s) and was deliberately aborted, not a network protocol failure.
Solutions
- Retry the download; the failure is often transient server/network slowness
- Use a different server/CDN mirror if the URL supports it
- Lower --max-concurrent-download or -x connections so each connection gets bandwidth
- Check local network, proxy, or VPN throughput
- Increase the slow-speed tolerance if the tool exposes related options
Example fix
Re-run the same command; if it recurs, reduce concurrency (e.g. --max-concurrent-download 4) or switch network/proxy so per-connection speed stays above the low-speed threshold.
Defensive patterns
Strategy: retry
Prevention
- Keep concurrency within available bandwidth
- Avoid unreliable proxies/VPNs for large downloads
- Ensure stable wired connection for long batch downloads
When it happens
Trigger: Remote host throttles the connection (rate-limited CDN), heavy network congestion, or too many parallel downloads starving each connection so throughput stays under the low-speed threshold long enough to trip the watchdog.
Common situations: Downloading many segments concurrently from a throttling server; VPN/proxy bottlenecks; Wi-Fi dropouts during a long segment download.
AI-assisted analysis of nilaoda/N_m3u8DL-RE@e113dee70c (2026-09-13).
Data as JSON: /api/errors/2cf403a6c1d6e7a5.
Report an issue: GitHub.
Appendix: source
Thrown at src/N_m3u8DL-RE/Util/DownloadUtil.cs:140
while ((size = await responseStream.ReadAsync(buffer, cancellationTokenSource.Token)) > 0)
{
speedContainer.Add(size);
await stream.WriteAsync(buffer.AsMemory(0, size));
// 限速策略
while (speedContainer.Downloaded > speedContainer.SpeedLimit)
{
await Task.Delay(1);
}
}
return new DownloadResult()
{
ActualContentLength = stream.Length,
RespContentLength = contentLength,
ActualFilePath = path,
ImageHeader= imageHeader,
GzipHeader = gZipHeader
};
}
catch (OperationCanceledException oce) when (oce.CancellationToken == cancellationTokenSource.Token)
{
speedContainer.ResetLowSpeedCount();
throw new Exception("Download speed too slow!");
}View on GitHub (pinned to e113dee70c)