diff --git a/NzbDrone.Core.Test/Download/DownloadApprovedReportsTests/GetQualifiedReportsFixture.cs b/NzbDrone.Core.Test/Download/DownloadApprovedReportsTests/GetQualifiedReportsFixture.cs index 69f67e504..d1be02648 100644 --- a/NzbDrone.Core.Test/Download/DownloadApprovedReportsTests/GetQualifiedReportsFixture.cs +++ b/NzbDrone.Core.Test/Download/DownloadApprovedReportsTests/GetQualifiedReportsFixture.cs @@ -23,7 +23,7 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests .Build(); } - private RemoteEpisode GetRemoteEpisode(List episodes, QualityModel quality) + private RemoteEpisode GetRemoteEpisode(List episodes, QualityModel quality, int Age = 0, long size = 0) { var remoteEpisode = new RemoteEpisode(); remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo(); @@ -33,7 +33,8 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests remoteEpisode.Episodes.AddRange(episodes); remoteEpisode.Report = new ReportInfo(); - remoteEpisode.Report.Age = 0; + remoteEpisode.Report.Age = Age; + remoteEpisode.Report.Size = size; return remoteEpisode; } @@ -77,7 +78,7 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests } [Test] - public void should_order_by_lowest_episode_number() + public void should_order_by_lowest_number_of_episodes() { var remoteEpisode1 = GetRemoteEpisode(new List { GetEpisode(2) }, new QualityModel(Quality.HDTV720p)); var remoteEpisode2 = GetRemoteEpisode(new List { GetEpisode(1) }, new QualityModel(Quality.HDTV720p)); @@ -91,7 +92,7 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests } [Test] - public void should_order_by_lowest_episode_number_with_multiple_episodes() + public void should_order_by_lowest_number_of_episodes_with_multiple_episodes() { var remoteEpisode1 = GetRemoteEpisode(new List { GetEpisode(2), GetEpisode(3) }, new QualityModel(Quality.HDTV720p)); var remoteEpisode2 = GetRemoteEpisode(new List { GetEpisode(1), GetEpisode(2) }, new QualityModel(Quality.HDTV720p)); @@ -104,21 +105,38 @@ namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests qualifiedReports.First().RemoteEpisode.Episodes.First().EpisodeNumber.Should().Be(1); } + + [Test] + public void should_order_by_smallest_rounded_to_200mb_then_age() + { + var remoteEpisodeSd = GetRemoteEpisode(new List { GetEpisode(1) }, new QualityModel(Quality.SDTV), size: 100.Megabytes(), Age: 1); + var remoteEpisodeHdSmallOld = GetRemoteEpisode(new List { GetEpisode(1) }, new QualityModel(Quality.HDTV720p), size:1200.Megabytes(), Age:1000); + var remoteEpisodeHdSmallYounge = GetRemoteEpisode(new List { GetEpisode(1) }, new QualityModel(Quality.HDTV720p), size:1250.Megabytes(), Age:10); + var remoteEpisodeHdLargeYounge = GetRemoteEpisode(new List { GetEpisode(1) }, new QualityModel(Quality.HDTV720p), size:3000.Megabytes(), Age:1); + + var decisions = new List(); + decisions.Add(new DownloadDecision(remoteEpisodeSd)); + decisions.Add(new DownloadDecision(remoteEpisodeHdSmallOld)); + decisions.Add(new DownloadDecision(remoteEpisodeHdSmallYounge)); + decisions.Add(new DownloadDecision(remoteEpisodeHdLargeYounge)); + + var qualifiedReports = Subject.GetQualifiedReports(decisions); + qualifiedReports.First().RemoteEpisode.Should().Be(remoteEpisodeHdSmallYounge); + } + [Test] public void should_order_by_youngest() { - var remoteEpisode1 = GetRemoteEpisode(new List { GetEpisode(1) }, new QualityModel(Quality.HDTV720p)); - var remoteEpisode2 = GetRemoteEpisode(new List { GetEpisode(1) }, new QualityModel(Quality.HDTV720p)); + var remoteEpisode1 = GetRemoteEpisode(new List { GetEpisode(1) }, new QualityModel(Quality.HDTV720p), Age: 10); + var remoteEpisode2 = GetRemoteEpisode(new List { GetEpisode(1) }, new QualityModel(Quality.HDTV720p), Age: 5); - remoteEpisode1.Report.Age = 10; - remoteEpisode2.Report.Age = 5; var decisions = new List(); decisions.Add(new DownloadDecision(remoteEpisode1)); decisions.Add(new DownloadDecision(remoteEpisode2)); var qualifiedReports = Subject.GetQualifiedReports(decisions); - qualifiedReports.First().RemoteEpisode.Report.Age.Should().Be(5); + qualifiedReports.First().RemoteEpisode.Should().Be(remoteEpisode2); } } } diff --git a/NzbDrone.Core.Test/FluentTest.cs b/NzbDrone.Core.Test/FluentTest.cs index c3d999194..7af26ed45 100644 --- a/NzbDrone.Core.Test/FluentTest.cs +++ b/NzbDrone.Core.Test/FluentTest.cs @@ -271,5 +271,16 @@ namespace NzbDrone.Core.Test //Resolve result.Should().Be(0); } + + + [TestCase(100,100,100)] + [TestCase(110,100,100)] + [TestCase(199,100,100)] + [TestCase(1000,100,1000)] + [TestCase(0,100,0)] + public void round_to_level(long number, int level, int result) + { + number.Round(level).Should().Be(result); + } } } diff --git a/NzbDrone.Core/Download/DownloadApprovedReports.cs b/NzbDrone.Core/Download/DownloadApprovedReports.cs index e0a781e8a..0da8ff3d9 100644 --- a/NzbDrone.Core/Download/DownloadApprovedReports.cs +++ b/NzbDrone.Core/Download/DownloadApprovedReports.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using NLog; using NzbDrone.Core.DecisionEngine; +using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.Download { @@ -54,11 +55,12 @@ namespace NzbDrone.Core.Download return downloadedReports; } - public List GetQualifiedReports(List decisions) + public List GetQualifiedReports(IEnumerable decisions) { - return decisions.Where(c => c.Approved) + return decisions.Where(c => c.Approved && c.RemoteEpisode.Episodes.Any()) .OrderByDescending(c => c.RemoteEpisode.ParsedEpisodeInfo.Quality) .ThenBy(c => c.RemoteEpisode.Episodes.Select(e => e.EpisodeNumber).MinOrDefault()) + .ThenBy(c => c.RemoteEpisode.Report.Size.Round(200.Megabytes()) / c.RemoteEpisode.Episodes.Count) .ThenBy(c => c.RemoteEpisode.Report.Age) .ToList(); } diff --git a/NzbDrone.Core/Fluent.cs b/NzbDrone.Core/Fluent.cs index 8e256e592..8ec82a8ab 100644 --- a/NzbDrone.Core/Fluent.cs +++ b/NzbDrone.Core/Fluent.cs @@ -21,7 +21,7 @@ namespace NzbDrone.Core public static Int64 Megabytes(this int megabytes) { - return Convert.ToInt64(megabytes * 1024L *1024L); + return Convert.ToInt64(megabytes * 1024L * 1024L); } public static Int64 Gigabytes(this int gigabytes) @@ -29,6 +29,12 @@ namespace NzbDrone.Core return Convert.ToInt64(gigabytes * 1024L * 1024L * 1024L); } + + public static Int64 Round(this long number, long level) + { + return Convert.ToInt64(Math.Floor((decimal)number / level) * level); + } + public static string ToBestDateString(this DateTime dateTime) { if (dateTime == DateTime.Today.AddDays(-1))