Radarr/Radarr · warning · UnsupportedFeedException
Failed to find a valid download url in the feed.
Error message
Failed to find a valid download url in the feed.
What it means
TorrentRssSettingsDetector.ValidateReleases throws an UnsupportedFeedException when any release's DownloadUrl fails IsValidDownloadUrl. IsValidDownloadUrl rejects null/whitespace and any URL that does not start with magnet:, http:, or https:. Without a usable download URL a release cannot be fetched, so the feed is rejected during detection.
Source
Thrown at src/NzbDrone.Core/Indexers/TorrentRss/TorrentRssSettingsDetector.cs:265
private void ValidateReleases(TorrentInfo[] releases, TorrentRssIndexerSettings indexerSettings)
{
if (releases == null || releases.Empty())
{
throw new UnsupportedFeedException("Empty feed, cannot check if feed is parsable.");
}
var torrentInfo = releases.First();
_logger.Trace("TorrentInfo: \n{0}", torrentInfo.ToString("L"));
if (releases.Any(r => r.Title.IsNullOrWhiteSpace()))
{
throw new UnsupportedFeedException("Feed contains releases without title.");
}
if (releases.Any(r => !IsValidDownloadUrl(r.DownloadUrl)))
{
throw new UnsupportedFeedException("Failed to find a valid download url in the feed.");
}
var total = releases.Where(v => v.Guid != null).Select(v => v.Guid).ToArray();
var distinct = total.Distinct().ToArray();
if (distinct.Length != total.Length)
{
throw new UnsupportedFeedException("Feed contains releases with same guid, rejecting malformed rss feed.");
}
}
private void ValidateReleaseSize(TorrentInfo[] releases, TorrentRssIndexerSettings indexerSettings)
{
if (!indexerSettings.AllowZeroSize && releases.Any(r => r.Size == 0))
{
throw new UnsupportedFeedException("Feed doesn't contain the release content size.");
}
View on GitHub (pinned to ca451608dc)
Solutions
- Inspect the failing item's enclosure/link element in the raw feed to see the exact URL.
- If the URL is relative, the parser must resolve it against the feed BaseUrl - ensure UseEnclosureUrl/GetDownloadUrl produces an absolute URL.
- If the scheme is unsupported (ftp), switch the feed to provide magnet/http links.
- Use a Torznab endpoint via Jackett which normalizes download URLs.
- Report the malformed feed to the indexer operator.
Defensive patterns
Strategy: validation
Validate before calling
// Pre-check download URL validity per release
foreach (var r in releases)
if (!IsValidDownloadUrl(r.DownloadUrl))
logger.Warn("Release '{0}' has invalid download URL: {1}", r.Title, r.DownloadUrl); Type guard
// Type guard for absolute http(s)/magnet URLs
static bool IsValidDownloadUrl(string url) =>
!string.IsNullOrWhiteSpace(url) &&
(url.StartsWith("magnet:", StringComparison.OrdinalIgnoreCase) ||
url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ||
url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)); Try / catch
try { ValidateReleases(releases, indexerSettings); }
catch (UnsupportedFeedException ex) when (ex.Message.Contains("download url"))
{ logger.Warn("Feed has releases with invalid download URLs; resolve relative URLs in the parser."); } Prevention
- Ensure the parser emits absolute magnet/http(s) URLs
- Resolve relative download paths against the feed BaseUrl
- Use Torznab via Jackett which normalizes URLs
When it happens
Trigger: At least one TorrentInfo has a DownloadUrl that is null/empty or does not begin with magnet:, http:, or https: (e.g. a relative path like '/download/123', an ftp: link, or a javascript: link).
Common situations: The feed provides only a relative download path without a base; the enclosure URL is malformed; the feed requires login and the download link is a session-bound relative URL; a non-standard link scheme is used.
Related errors
- Could not parse feed from {0}
- Empty feed, cannot check if feed is parsable.
- Could not parse IndexerResponse into XML.
- Unable to parse indexer: {ex.Message}
- Feed contains releases without title.
AI-assisted analysis of Radarr/Radarr@ca451608dc (2026-08-13).
Data as JSON: /api/errors/bc777459e6446dd8.
Report an issue: GitHub.