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

  1. Retry the download; the failure is often transient server/network slowness
  2. Use a different server/CDN mirror if the URL supports it
  3. Lower --max-concurrent-download or -x connections so each connection gets bandwidth
  4. Check local network, proxy, or VPN throughput
  5. 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

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)