1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-04-25 22:37:27 -04:00

Fixed: AnimoTosho RSS feed size parsing.

Also added handling for multiple enclosure elements.

ref #1384
This commit is contained in:
Taloth Saldono
2016-08-02 17:41:00 +02:00
parent b80d6c74ad
commit 2b1c97ffa4
8 changed files with 151 additions and 6 deletions
@@ -11,6 +11,11 @@ namespace NzbDrone.Core.Indexers.Newznab
{
public const string ns = "{http://www.newznab.com/DTD/2010/feeds/attributes/}";
public NewznabRssParser()
{
PreferredEnclosureMimeType = "application/x-nzb";
}
protected override bool PreProcess(IndexerResponse indexerResponse)
{
var xdoc = LoadXmlDocument(indexerResponse);
@@ -52,7 +57,7 @@ namespace NzbDrone.Core.Indexers.Newznab
protected override ReleaseInfo PostProcess(XElement item, ReleaseInfo releaseInfo)
{
var enclosureType = item.Element("enclosure").Attribute("type").Value;
var enclosureType = GetEnclosure(item).Attribute("type").Value;
if (enclosureType.Contains("application/x-bittorrent"))
{
throw new UnsupportedFeedException("Feed contains {0}, did you intend to add a Torznab indexer?", enclosureType);
+32 -3
View File
@@ -32,6 +32,8 @@ namespace NzbDrone.Core.Indexers
// Parse "Size: 1.3 GB" or "1.3 GB" parts in the description element and use that as Size.
public bool ParseSizeInDescription { get; set; }
public string PreferredEnclosureMimeType { get; set; }
private IndexerResponse _indexerResponse;
public RssParser()
@@ -192,7 +194,7 @@ namespace NzbDrone.Core.Indexers
{
if (UseEnclosureUrl)
{
return ParseUrl((string)item.Element("enclosure").Attribute("url"));
return ParseUrl((string)GetEnclosure(item).Attribute("url"));
}
return ParseUrl((string)item.Element("link"));
@@ -229,7 +231,7 @@ namespace NzbDrone.Core.Indexers
protected virtual long GetEnclosureLength(XElement item)
{
var enclosure = item.Element("enclosure");
var enclosure = GetEnclosure(item);
if (enclosure != null)
{
@@ -239,6 +241,33 @@ namespace NzbDrone.Core.Indexers
return 0;
}
protected virtual XElement GetEnclosure(XElement item)
{
var enclosures = item.Elements("enclosure").ToArray();
if (enclosures.Length == 0)
{
return null;
}
if (enclosures.Length == 1)
{
return enclosures.First();
}
if (PreferredEnclosureMimeType != null)
{
var preferredEnclosure = enclosures.FirstOrDefault(v => v.Attribute("type").Value == PreferredEnclosureMimeType);
if (preferredEnclosure != null)
{
return preferredEnclosure;
}
}
return item.Elements("enclosure").SingleOrDefault();
}
protected IEnumerable<XElement> GetItems(XDocument document)
{
var root = document.Root;
@@ -278,7 +307,7 @@ namespace NzbDrone.Core.Indexers
}
}
private static readonly Regex ParseSizeRegex = new Regex(@"(?<value>(?:\d+,)*\d+(?:\.\d{1,2})?)\W?(?<unit>[KMG]i?B)(?![\w/])",
private static readonly Regex ParseSizeRegex = new Regex(@"(?<value>(?<!\.\d*)(?:\d+,)*\d+(?:\.\d{1,3})?)\W?(?<unit>[KMG]i?B)(?![\w/])",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
public static long ParseSize(string sizeString, bool defaultToBinaryPrefix)
@@ -169,8 +169,12 @@ namespace NzbDrone.Core.Indexers.TorrentRss
releases = ParseResponse(parser, response);
ValidateReleases(releases, indexerSettings);
if (!releases.Any(r => r.Size < ValidSizeThreshold))
if (releases.Count(r => r.Size >= ValidSizeThreshold) > releases.Count() / 2)
{
if (releases.Any(r => r.Size < ValidSizeThreshold))
{
_logger.Debug("Feed {0} contains very small releases.", response.Request.Url);
}
_logger.Trace("Feed has valid size in description.");
return settings;
}
@@ -17,7 +17,7 @@ namespace NzbDrone.Core.Indexers
public TorrentRssParser()
{
PreferredEnclosureMimeType = "application/x-bittorrent";
}
public IEnumerable<XElement> GetItems(IndexerResponse indexerResponse)