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

New: Loads of Backend Updates to Clients and Indexers

This commit is contained in:
Qstick
2019-06-13 23:54:25 -04:00
parent c48838e5b6
commit 8a9e2dc90d
345 changed files with 5859 additions and 2669 deletions
+86 -24
View File
@@ -19,6 +19,11 @@ namespace NzbDrone.Core.Indexers
public class RssParser : IParseIndexerResponse
{
private static readonly Regex ReplaceEntities = new Regex("&[a-z]+;", RegexOptions.Compiled | RegexOptions.IgnoreCase);
public const string NzbEnclosureMimeType = "application/x-nzb";
public const string TorrentEnclosureMimeType = "application/x-bittorrent";
public const string MagnetEnclosureMimeType = "application/x-bittorrent;x-scheme-handler/magnet";
public static readonly string[] UsenetEnclosureMimeTypes = new[] { NzbEnclosureMimeType };
public static readonly string[] TorrentEnclosureMimeTypes = new[] { TorrentEnclosureMimeType, MagnetEnclosureMimeType };
protected readonly Logger _logger;
@@ -32,7 +37,7 @@ 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; }
public string[] PreferredEnclosureMimeTypes { get; set; }
private IndexerResponse _indexerResponse;
@@ -53,7 +58,7 @@ namespace NzbDrone.Core.Indexers
}
var document = LoadXmlDocument(indexerResponse);
var items = GetItems(document);
var items = GetItems(document).ToList();
foreach (var item in items)
{
@@ -63,13 +68,25 @@ namespace NzbDrone.Core.Indexers
releases.AddIfNotNull(reportInfo);
}
catch (UnsupportedFeedException itemEx)
{
itemEx.WithData("FeedUrl", indexerResponse.Request.Url);
itemEx.WithData("ItemTitle", item.Title());
throw;
}
catch (Exception itemEx)
{
itemEx.Data.Add("Item", item.Title());
_logger.Error(itemEx, "An error occurred while processing feed item from " + indexerResponse.Request.Url);
itemEx.WithData("FeedUrl", indexerResponse.Request.Url);
itemEx.WithData("ItemTitle", item.Title());
_logger.Error(itemEx, "An error occurred while processing feed item from {0}", indexerResponse.Request.Url);
}
}
if (!PostProcess(indexerResponse, items, releases))
{
return new List<ReleaseInfo>();
}
return releases;
}
@@ -92,8 +109,7 @@ namespace NzbDrone.Core.Indexers
var contentSample = indexerResponse.Content.Substring(0, Math.Min(indexerResponse.Content.Length, 512));
_logger.Debug("Truncated response content (originally {0} characters): {1}", indexerResponse.Content.Length, contentSample);
ex.Data.Add("ContentLength", indexerResponse.Content.Length);
ex.Data.Add("ContentSample", contentSample);
ex.WithData(indexerResponse.HttpResponse);
throw;
}
@@ -120,6 +136,11 @@ namespace NzbDrone.Core.Indexers
return true;
}
protected virtual bool PostProcess(IndexerResponse indexerResponse, List<XElement> elements, List<ReleaseInfo> releases)
{
return true;
}
protected ReleaseInfo ProcessItem(XElement item)
{
var releaseInfo = CreateNewReleaseInfo();
@@ -128,7 +149,7 @@ namespace NzbDrone.Core.Indexers
_logger.Trace("Parsed: {0}", releaseInfo.Title);
return PostProcess(item, releaseInfo);
return PostProcessItem(item, releaseInfo);
}
protected virtual ReleaseInfo ProcessItem(XElement item, ReleaseInfo releaseInfo)
@@ -152,7 +173,7 @@ namespace NzbDrone.Core.Indexers
return releaseInfo;
}
protected virtual ReleaseInfo PostProcess(XElement item, ReleaseInfo releaseInfo)
protected virtual ReleaseInfo PostProcessItem(XElement item, ReleaseInfo releaseInfo)
{
return releaseInfo;
}
@@ -183,7 +204,8 @@ namespace NzbDrone.Core.Indexers
{
if (UseEnclosureUrl)
{
return ParseUrl((string)GetEnclosure(item).Attribute("url"));
var enclosure = GetEnclosure(item);
return enclosure != null ? ParseUrl(enclosure.Url) : null;
}
return ParseUrl((string)item.Element("link"));
@@ -224,37 +246,72 @@ namespace NzbDrone.Core.Indexers
if (enclosure != null)
{
return (long)enclosure.Attribute("length");
return enclosure.Length;
}
return 0;
}
protected virtual XElement GetEnclosure(XElement item)
protected virtual RssEnclosure[] GetEnclosures(XElement item)
{
var enclosures = item.Elements("enclosure").ToArray();
var enclosures = item.Elements("enclosure")
.Select(v =>
{
try
{
return new RssEnclosure
{
Url = v.Attribute("url").Value,
Type = v.Attribute("type").Value,
Length = (long)v.Attribute("length")
};
}
catch (Exception e)
{
_logger.Warn(e, "Failed to get enclosure for: {0}", item.Title());
}
return null;
})
.Where(v => v != null)
.ToArray();
return enclosures;
}
protected RssEnclosure GetEnclosure(XElement item, bool enforceMimeType = true)
{
var enclosures = GetEnclosures(item);
return GetEnclosure(enclosures, enforceMimeType);
}
protected virtual RssEnclosure GetEnclosure(RssEnclosure[] enclosures, bool enforceMimeType = true)
{
if (enclosures.Length == 0)
{
return null;
}
if (enclosures.Length == 1)
if (PreferredEnclosureMimeTypes != null)
{
return enclosures.First();
}
if (PreferredEnclosureMimeType != null)
{
var preferredEnclosure = enclosures.FirstOrDefault(v => v.Attribute("type").Value == PreferredEnclosureMimeType);
if (preferredEnclosure != null)
foreach (var preferredEnclosureType in PreferredEnclosureMimeTypes)
{
return preferredEnclosure;
var preferredEnclosure = enclosures.FirstOrDefault(v => v.Type == preferredEnclosureType);
if (preferredEnclosure != null)
{
return preferredEnclosure;
}
}
if (enforceMimeType)
{
return null;
}
}
return item.Elements("enclosure").SingleOrDefault();
return enclosures.SingleOrDefault();
}
protected IEnumerable<XElement> GetItems(XDocument document)
@@ -301,7 +358,12 @@ namespace NzbDrone.Core.Indexers
public static long ParseSize(string sizeString, bool defaultToBinaryPrefix)
{
if (sizeString.Length > 0 && sizeString.All(char.IsDigit))
if (sizeString.IsNullOrWhiteSpace())
{
return 0;
}
if (sizeString.All(char.IsDigit))
{
return long.Parse(sizeString);
}