|
|
@ -24,8 +24,6 @@ namespace NzbDrone.Core.DecisionEngine
|
|
|
|
{
|
|
|
|
{
|
|
|
|
CompareQuality,
|
|
|
|
CompareQuality,
|
|
|
|
CompareProtocol,
|
|
|
|
CompareProtocol,
|
|
|
|
CompareEpisodeCount,
|
|
|
|
|
|
|
|
CompareEpisodeNumber,
|
|
|
|
|
|
|
|
ComparePeersIfTorrent,
|
|
|
|
ComparePeersIfTorrent,
|
|
|
|
CompareAgeIfUsenet,
|
|
|
|
CompareAgeIfUsenet,
|
|
|
|
CompareSize
|
|
|
|
CompareSize
|
|
|
@ -56,6 +54,12 @@ namespace NzbDrone.Core.DecisionEngine
|
|
|
|
|
|
|
|
|
|
|
|
private int CompareQuality(DownloadDecision x, DownloadDecision y)
|
|
|
|
private int CompareQuality(DownloadDecision x, DownloadDecision y)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
if (x.IsForMovie && y.IsForMovie)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return CompareAll(CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode => remoteEpisode.Movie.Profile.Value.Items.FindIndex(v => v.Quality == remoteEpisode.ParsedMovieInfo.Quality.Quality)),
|
|
|
|
|
|
|
|
CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode => remoteEpisode.ParsedMovieInfo.Quality.Revision.Real),
|
|
|
|
|
|
|
|
CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode => remoteEpisode.ParsedMovieInfo.Quality.Revision.Version));
|
|
|
|
|
|
|
|
}
|
|
|
|
return CompareAll(CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.Series.Profile.Value.Items.FindIndex(v => v.Quality == remoteEpisode.ParsedEpisodeInfo.Quality.Quality)),
|
|
|
|
return CompareAll(CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.Series.Profile.Value.Items.FindIndex(v => v.Quality == remoteEpisode.ParsedEpisodeInfo.Quality.Quality)),
|
|
|
|
CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.ParsedEpisodeInfo.Quality.Revision.Real),
|
|
|
|
CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.ParsedEpisodeInfo.Quality.Revision.Real),
|
|
|
|
CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.ParsedEpisodeInfo.Quality.Revision.Version));
|
|
|
|
CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.ParsedEpisodeInfo.Quality.Revision.Version));
|
|
|
@ -63,6 +67,7 @@ namespace NzbDrone.Core.DecisionEngine
|
|
|
|
|
|
|
|
|
|
|
|
private int CompareProtocol(DownloadDecision x, DownloadDecision y)
|
|
|
|
private int CompareProtocol(DownloadDecision x, DownloadDecision y)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
var result = CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode =>
|
|
|
|
var result = CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var delayProfile = _delayProfileService.BestForTags(remoteEpisode.Series.Tags);
|
|
|
|
var delayProfile = _delayProfileService.BestForTags(remoteEpisode.Series.Tags);
|
|
|
@ -70,13 +75,22 @@ namespace NzbDrone.Core.DecisionEngine
|
|
|
|
return downloadProtocol == delayProfile.PreferredProtocol;
|
|
|
|
return downloadProtocol == delayProfile.PreferredProtocol;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (x.IsForMovie)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
result = CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var delayProfile = _delayProfileService.BestForTags(remoteEpisode.Movie.Tags);
|
|
|
|
|
|
|
|
var downloadProtocol = remoteEpisode.Release.DownloadProtocol;
|
|
|
|
|
|
|
|
return downloadProtocol == delayProfile.PreferredProtocol;
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private int CompareEpisodeCount(DownloadDecision x, DownloadDecision y)
|
|
|
|
private int CompareEpisodeCount(DownloadDecision x, DownloadDecision y)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return CompareAll(CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.ParsedEpisodeInfo.FullSeason),
|
|
|
|
return 0;
|
|
|
|
CompareByReverse(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.Episodes.Count));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private int CompareEpisodeNumber(DownloadDecision x, DownloadDecision y)
|
|
|
|
private int CompareEpisodeNumber(DownloadDecision x, DownloadDecision y)
|
|
|
@ -88,20 +102,20 @@ namespace NzbDrone.Core.DecisionEngine
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// Different protocols should get caught when checking the preferred protocol,
|
|
|
|
// Different protocols should get caught when checking the preferred protocol,
|
|
|
|
// since we're dealing with the same series in our comparisions
|
|
|
|
// since we're dealing with the same series in our comparisions
|
|
|
|
if (x.RemoteEpisode.Release.DownloadProtocol != DownloadProtocol.Torrent ||
|
|
|
|
if (x.RemoteMovie.Release.DownloadProtocol != DownloadProtocol.Torrent ||
|
|
|
|
y.RemoteEpisode.Release.DownloadProtocol != DownloadProtocol.Torrent)
|
|
|
|
y.RemoteMovie.Release.DownloadProtocol != DownloadProtocol.Torrent)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return CompareAll(
|
|
|
|
return CompareAll(
|
|
|
|
CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode =>
|
|
|
|
CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var seeders = TorrentInfo.GetSeeders(remoteEpisode.Release);
|
|
|
|
var seeders = TorrentInfo.GetSeeders(remoteEpisode.Release);
|
|
|
|
|
|
|
|
|
|
|
|
return seeders.HasValue && seeders.Value > 0 ? Math.Round(Math.Log10(seeders.Value)) : 0;
|
|
|
|
return seeders.HasValue && seeders.Value > 0 ? Math.Round(Math.Log10(seeders.Value)) : 0;
|
|
|
|
}),
|
|
|
|
}),
|
|
|
|
CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode =>
|
|
|
|
CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var peers = TorrentInfo.GetPeers(remoteEpisode.Release);
|
|
|
|
var peers = TorrentInfo.GetPeers(remoteEpisode.Release);
|
|
|
|
|
|
|
|
|
|
|
@ -117,7 +131,7 @@ namespace NzbDrone.Core.DecisionEngine
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode =>
|
|
|
|
return CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var ageHours = remoteEpisode.Release.AgeHours;
|
|
|
|
var ageHours = remoteEpisode.Release.AgeHours;
|
|
|
|
var age = remoteEpisode.Release.Age;
|
|
|
|
var age = remoteEpisode.Release.Age;
|
|
|
@ -145,7 +159,7 @@ namespace NzbDrone.Core.DecisionEngine
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// TODO: Is smaller better? Smaller for usenet could mean no par2 files.
|
|
|
|
// TODO: Is smaller better? Smaller for usenet could mean no par2 files.
|
|
|
|
|
|
|
|
|
|
|
|
return CompareBy(x.RemoteEpisode, y.RemoteEpisode, remoteEpisode => remoteEpisode.Release.Size.Round(200.Megabytes()));
|
|
|
|
return CompareBy(x.RemoteMovie, y.RemoteMovie, remoteEpisode => remoteEpisode.Release.Size.Round(200.Megabytes()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|