Sort equal usenet releases by age

This commit is contained in:
pcjones 2023-09-30 10:46:10 +02:00
parent 35365665cf
commit ecd25e0caf
1 changed files with 69 additions and 17 deletions

View File

@ -156,28 +156,43 @@ namespace NzbDrone.Core.DecisionEngine
return 0; return 0;
} }
return CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => var sanitizedTitleX = SanitizeReleaseName(x.RemoteEpisode.Release.Title);
var sanitizedTitleY = SanitizeReleaseName(y.RemoteEpisode.Release.Title);
var titlesMatch = string.Equals(sanitizedTitleX, sanitizedTitleY, StringComparison.OrdinalIgnoreCase);
var sizesMatch = GetRoundedSize(x.RemoteEpisode.Release.Size) == GetRoundedSize(y.RemoteEpisode.Release.Size);
if (titlesMatch && sizesMatch)
{ {
var ageHours = remoteEpisode.Release.AgeHours; // Compare by age, as both releases have the same sanitized name and rounded size
var age = remoteEpisode.Release.Age; return CompareByReverse(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.Release.AgeHours);
}
if (ageHours < 1) else
{
// use original sorting logic if the releases are not equal
return CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode =>
{ {
return 1000; var ageHours = remoteEpisode.Release.AgeHours;
} var age = remoteEpisode.Release.Age;
if (ageHours <= 24) if (ageHours < 1)
{ {
return 100; return 1000;
} }
if (age <= 7) if (ageHours <= 24)
{ {
return 10; return 100;
} }
return 1; if (age <= 7)
}); {
return 10;
}
return 1;
});
}
} }
private int CompareSize(DownloadDecision x, DownloadDecision y) private int CompareSize(DownloadDecision x, DownloadDecision y)
@ -202,5 +217,42 @@ namespace NzbDrone.Core.DecisionEngine
return sizeCompare; return sizeCompare;
} }
private long GetRoundedSize(long size)
{
if (size < 1.5.Gigabytes())
{
return size.Round(200.Megabytes());
}
else if (size < 2.5.Gigabytes())
{
return size.Round(300.Megabytes());
}
else if (size < 3.5.Gigabytes())
{
return size.Round(400.Megabytes());
}
else
{
return size.Round(550.Megabytes());
}
}
private string SanitizeReleaseName(string releaseName)
{
// some indexers add strings like -xpost to the release which can be ignored (it's not a release group)
var ignoredStrings = new string[] { "-xpost" };
foreach (var ignoredString in ignoredStrings)
{
if (releaseName.EndsWith(ignoredString, StringComparison.OrdinalIgnoreCase))
{
return releaseName[..^ignoredString.Length].Trim();
}
}
return releaseName.Trim();
}
} }
} }