mirror of
https://github.com/Sonarr/Sonarr.git
synced 2024-10-29 23:12:39 +01:00
moved history over to objectdb
This commit is contained in:
parent
cf8be4bf8f
commit
f568fdad6a
@ -5,6 +5,7 @@ using System.Linq;
|
||||
using FizzWare.NBuilder;
|
||||
using FluentAssertions;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.History;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Model;
|
||||
using NzbDrone.Core.Providers;
|
||||
@ -65,9 +66,9 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
||||
firstQuality = new QualityModel(QualityTypes.Bluray1080p, true);
|
||||
secondQuality = new QualityModel(QualityTypes.Bluray1080p, true);
|
||||
|
||||
Mocker.GetMock<HistoryProvider>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 3)).Returns(firstQuality);
|
||||
Mocker.GetMock<HistoryProvider>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 4)).Returns(secondQuality);
|
||||
Mocker.GetMock<HistoryProvider>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 5)).Returns<QualityModel>(null);
|
||||
Mocker.GetMock<HistoryService>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 3)).Returns(firstQuality);
|
||||
Mocker.GetMock<HistoryService>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 4)).Returns(secondQuality);
|
||||
Mocker.GetMock<HistoryService>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 5)).Returns<QualityModel>(null);
|
||||
}
|
||||
|
||||
private void WithFirstReportUpgradable()
|
||||
@ -123,7 +124,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests
|
||||
parseResultSingle.Quality = new QualityModel(QualityTypes.WEBDL1080p, false);
|
||||
firstQuality = new QualityModel(QualityTypes.WEBDL1080p, false);
|
||||
|
||||
Mocker.GetMock<HistoryProvider>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 3)).Returns(firstQuality);
|
||||
Mocker.GetMock<HistoryService>().Setup(c => c.GetBestQualityInHistory(fakeSeries.SeriesId, 12, 3)).Returns(firstQuality);
|
||||
|
||||
_upgradeHistory.IsSatisfiedBy(parseResultSingle).Should().BeFalse();
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ namespace NzbDrone.Core.Test.Framework
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class CoreTest<TSubject> : CoreTest where TSubject: class
|
||||
public abstract class CoreTest<TSubject> : CoreTest where TSubject : class
|
||||
{
|
||||
private TSubject _subject;
|
||||
|
||||
|
108
NzbDrone.Core.Test/HistoryTests/HistoryServiceTest.cs
Normal file
108
NzbDrone.Core.Test/HistoryTests/HistoryServiceTest.cs
Normal file
@ -0,0 +1,108 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using FizzWare.NBuilder;
|
||||
using FluentAssertions;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.History;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Repository.Quality;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Test.HistoryTests
|
||||
{
|
||||
[TestFixture]
|
||||
public class HistoryServiceTest : ObjectDbTest<HistoryRepository, History.History>
|
||||
{
|
||||
[Test]
|
||||
public void Trim_Items()
|
||||
{
|
||||
var historyItem = Builder<History.History>.CreateListOfSize(30)
|
||||
.All()
|
||||
.With(c=>c.OID = 0)
|
||||
.TheFirst(10).With(c => c.Date = DateTime.Now)
|
||||
.TheNext(20).With(c => c.Date = DateTime.Now.AddDays(-31))
|
||||
.Build();
|
||||
|
||||
Db.InsertMany(historyItem);
|
||||
|
||||
AllStoredModels.Should().HaveCount(30);
|
||||
Subject.Trim();
|
||||
|
||||
AllStoredModels.Should().HaveCount(10);
|
||||
AllStoredModels.Should().OnlyContain(s => s.Date > DateTime.Now.AddDays(-30));
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void GetBestQualityInHistory_no_result()
|
||||
{
|
||||
Subject.GetBestQualityInHistory(12, 12, 12).Should().Be(null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetBestQualityInHistory_single_result()
|
||||
{
|
||||
var series = Builder<Series>.CreateNew().Build();
|
||||
var episode = Builder<Episode>.CreateNew()
|
||||
.With(c => c.Series = series)
|
||||
.With(c => c.SeriesId = series.OID)
|
||||
.Build();
|
||||
|
||||
|
||||
|
||||
var history = Builder<History.History>.CreateNew()
|
||||
.With(c => c.OID = 0)
|
||||
.With(h => h.Quality = new QualityModel(QualityTypes.Bluray720p, true))
|
||||
.With(h => h.Episode = episode)
|
||||
.Build();
|
||||
|
||||
Db.Insert(history);
|
||||
|
||||
var result = Subject.GetBestQualityInHistory(episode.SeriesId, episode.SeasonNumber, episode.EpisodeNumber);
|
||||
|
||||
result.Should().NotBeNull();
|
||||
result.Quality.Should().Be(QualityTypes.Bluray720p);
|
||||
result.Proper.Should().BeTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetBestQualityInHistory_should_return_highest_result()
|
||||
{
|
||||
|
||||
var series = Builder<Series>.CreateNew().Build();
|
||||
var episode = Builder<Episode>.CreateNew()
|
||||
.With(c => c.Series = series)
|
||||
.With(c => c.SeriesId = series.OID)
|
||||
.Build();
|
||||
|
||||
|
||||
var history = Builder<History.History>
|
||||
.CreateListOfSize(5)
|
||||
.All()
|
||||
.With(c => c.OID = 0)
|
||||
.With(h => h.Episode = episode)
|
||||
.TheFirst(1)
|
||||
.With(h => h.Quality = new QualityModel(QualityTypes.DVD, true))
|
||||
.TheNext(1)
|
||||
.With(h => h.Quality = new QualityModel(QualityTypes.Bluray720p, true))
|
||||
.TheNext(1)
|
||||
.With(h => h.Quality = new QualityModel(QualityTypes.Bluray720p, true))
|
||||
.TheNext(1)
|
||||
.With(h => h.Quality = new QualityModel(QualityTypes.Bluray720p, false))
|
||||
.TheNext(1)
|
||||
.With(h => h.Quality = new QualityModel(QualityTypes.SDTV, true))
|
||||
.Build();
|
||||
|
||||
Db.InsertMany(history);
|
||||
|
||||
var result = Subject.GetBestQualityInHistory(episode.SeriesId, episode.SeasonNumber, episode.EpisodeNumber);
|
||||
|
||||
result.Should().NotBeNull();
|
||||
result.Quality.Should().Be(QualityTypes.Bluray720p);
|
||||
result.Proper.Should().BeTrue();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -248,7 +248,7 @@
|
||||
<Compile Include="QualityTest.cs" />
|
||||
<Compile Include="RootFolderTests\RootFolderServiceFixture.cs" />
|
||||
<Compile Include="Indexers\IndexerServiceTest.cs" />
|
||||
<Compile Include="ProviderTests\HistoryProviderTest.cs" />
|
||||
<Compile Include="HistoryTests\HistoryServiceTest.cs" />
|
||||
<Compile Include="ProviderTests\MediaFileProviderTest.cs" />
|
||||
<Compile Include="ProviderTests\ConfigProviderTests\ConfigProviderFixture.cs" />
|
||||
<Compile Include="TvTests\EpisodeProviderTests\EpisodeProviderTest.cs" />
|
||||
|
@ -5,12 +5,12 @@ using FizzWare.NBuilder;
|
||||
using FluentAssertions;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.History;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Model;
|
||||
using NzbDrone.Core.Providers;
|
||||
using NzbDrone.Core.Providers.Core;
|
||||
using NzbDrone.Core.Providers.DownloadClients;
|
||||
using NzbDrone.Core.Repository;
|
||||
using NzbDrone.Core.Repository.Quality;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
|
||||
@ -98,11 +98,11 @@ namespace NzbDrone.Core.Test.ProviderTests.DownloadProviderTests
|
||||
Mocker.GetMock<BlackholeProvider>()
|
||||
.Verify(s => s.DownloadNzb(It.IsAny<String>(), It.IsAny<String>(), true), Times.Never());
|
||||
|
||||
Mocker.GetMock<HistoryProvider>()
|
||||
.Verify(s => s.Add(It.Is<History>(h => h.EpisodeId == 12 && h.SeriesId == 5)), Times.Once());
|
||||
Mocker.GetMock<HistoryService>()
|
||||
.Verify(s => s.Add(It.Is<History.History>(h => h.Episode == parseResult.Episodes[0])), Times.Once());
|
||||
|
||||
Mocker.GetMock<HistoryProvider>()
|
||||
.Verify(s => s.Add(It.Is<History>(h => h.EpisodeId == 99 && h.SeriesId == 5)), Times.Once());
|
||||
Mocker.GetMock<HistoryService>()
|
||||
.Verify(s => s.Add(It.Is<History.History>(h => h.Episode == parseResult.Episodes[1])), Times.Once());
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Verify(c => c.MarkEpisodeAsFetched(12));
|
||||
@ -133,11 +133,11 @@ namespace NzbDrone.Core.Test.ProviderTests.DownloadProviderTests
|
||||
Mocker.GetMock<BlackholeProvider>()
|
||||
.Verify(s => s.DownloadNzb(It.IsAny<String>(), It.IsAny<String>(), true), Times.Once());
|
||||
|
||||
Mocker.GetMock<HistoryProvider>()
|
||||
.Verify(s => s.Add(It.Is<History>(h => h.EpisodeId == 12 && h.SeriesId == 5)), Times.Once());
|
||||
Mocker.GetMock<HistoryService>()
|
||||
.Verify(s => s.Add(It.Is<History.History>(h => h.Episode == parseResult.Episodes[0])), Times.Once());
|
||||
|
||||
Mocker.GetMock<HistoryProvider>()
|
||||
.Verify(s => s.Add(It.Is<History>(h => h.EpisodeId == 99 && h.SeriesId == 5)), Times.Once());
|
||||
Mocker.GetMock<HistoryService>()
|
||||
.Verify(s => s.Add(It.Is<History.History>(h => h.Episode == parseResult.Episodes[1])), Times.Once());
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
.Verify(c => c.MarkEpisodeAsFetched(12));
|
||||
@ -161,8 +161,8 @@ namespace NzbDrone.Core.Test.ProviderTests.DownloadProviderTests
|
||||
//Act
|
||||
Mocker.Resolve<DownloadProvider>().DownloadReport(parseResult);
|
||||
|
||||
Mocker.GetMock<HistoryProvider>()
|
||||
.Verify(s => s.Add(It.IsAny<History>()), Times.Never());
|
||||
Mocker.GetMock<HistoryService>()
|
||||
.Verify(s => s.Add(It.IsAny<History.History>()), Times.Never());
|
||||
|
||||
|
||||
Mocker.GetMock<IEpisodeService>()
|
||||
|
@ -1,278 +0,0 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using FizzWare.NBuilder;
|
||||
using FluentAssertions;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Providers;
|
||||
using NzbDrone.Core.Repository;
|
||||
using NzbDrone.Core.Repository.Quality;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
|
||||
namespace NzbDrone.Core.Test.ProviderTests
|
||||
{
|
||||
[TestFixture]
|
||||
// ReSharper disable InconsistentNaming
|
||||
public class HistoryProviderTest : SqlCeTest
|
||||
{
|
||||
[Test]
|
||||
public void AllItems()
|
||||
{
|
||||
WithRealDb();
|
||||
//Setup
|
||||
var historyItem = Builder<History>.CreateListOfSize(10)
|
||||
.All()
|
||||
.With(c => c.Quality = QualityTypes.SDTV)
|
||||
.Build();
|
||||
|
||||
Db.InsertMany(historyItem);
|
||||
|
||||
//Act
|
||||
var result = Mocker.Resolve<HistoryProvider>().AllItems();
|
||||
|
||||
//Assert
|
||||
result.Should().HaveSameCount(historyItem);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AllItemsWithRelationships()
|
||||
{
|
||||
WithRealDb();
|
||||
var seriesOne = Builder<Series>.CreateNew().With(s => s.SeriesId = 12345).Build();
|
||||
var seriesTwo = Builder<Series>.CreateNew().With(s => s.SeriesId = 54321).Build();
|
||||
|
||||
var episodes = Builder<Episode>.CreateListOfSize(10).Build();
|
||||
|
||||
var historyItems = Builder<History>
|
||||
.CreateListOfSize(10)
|
||||
.All()
|
||||
.With(c => c.Quality = QualityTypes.SDTV)
|
||||
.TheFirst(5)
|
||||
.With(h => h.SeriesId = seriesOne.SeriesId)
|
||||
.TheLast(5)
|
||||
.With(h => h.SeriesId = seriesTwo.SeriesId)
|
||||
.Build();
|
||||
|
||||
|
||||
Db.InsertMany(historyItems);
|
||||
Db.InsertMany(episodes);
|
||||
Db.Insert(seriesOne);
|
||||
Db.Insert(seriesTwo);
|
||||
|
||||
//Act
|
||||
var result = Mocker.Resolve<HistoryProvider>().AllItemsWithRelationships();
|
||||
|
||||
//Assert
|
||||
result.Should().HaveSameCount(historyItems);
|
||||
|
||||
foreach (var history in result)
|
||||
{
|
||||
Assert.NotNull(history.Episode);
|
||||
Assert.That(!String.IsNullOrEmpty(history.SeriesTitle));
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void PurgeItem()
|
||||
{
|
||||
WithRealDb();
|
||||
|
||||
var historyItem = Builder<History>
|
||||
.CreateListOfSize(10)
|
||||
.All()
|
||||
.With(c => c.Quality = QualityTypes.SDTV)
|
||||
.Build();
|
||||
Db.InsertMany(historyItem);
|
||||
|
||||
//Act
|
||||
Db.Fetch<History>().Should().HaveCount(10);
|
||||
Mocker.Resolve<HistoryProvider>().Purge();
|
||||
|
||||
//Assert
|
||||
Db.Fetch<History>().Should().HaveCount(0);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Trim_Items()
|
||||
{
|
||||
WithRealDb();
|
||||
|
||||
var historyItem = Builder<History>.CreateListOfSize(30)
|
||||
.All()
|
||||
.With(c => c.Quality = QualityTypes.SDTV)
|
||||
.TheFirst(10).With(c => c.Date = DateTime.Now)
|
||||
.TheNext(20).With(c => c.Date = DateTime.Now.AddDays(-31))
|
||||
.Build();
|
||||
|
||||
Db.InsertMany(historyItem);
|
||||
|
||||
//Act
|
||||
Db.Fetch<History>().Should().HaveCount(30);
|
||||
Mocker.Resolve<HistoryProvider>().Trim();
|
||||
|
||||
//Assert
|
||||
var result = Db.Fetch<History>();
|
||||
result.Should().HaveCount(10);
|
||||
result.Should().OnlyContain(s => s.Date > DateTime.Now.AddDays(-30));
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void GetBestQualityInHistory_no_result()
|
||||
{
|
||||
WithRealDb();
|
||||
Mocker.Resolve<HistoryProvider>().GetBestQualityInHistory(12, 12, 12).Should().Be(null);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetBestQualityInHistory_single_result()
|
||||
{
|
||||
WithRealDb();
|
||||
|
||||
var episodes = Builder<Episode>.CreateListOfSize(10).Build();
|
||||
var historyEpisode = episodes[6];
|
||||
|
||||
var history = Builder<History>.CreateNew()
|
||||
.With(h => h.Quality = QualityTypes.Bluray720p)
|
||||
.With(h => h.IsProper = true)
|
||||
.With(h => h.EpisodeId = historyEpisode.OID)
|
||||
.Build();
|
||||
|
||||
Db.Insert(history);
|
||||
Db.InsertMany(episodes);
|
||||
|
||||
//Act
|
||||
var result = Mocker.Resolve<HistoryProvider>()
|
||||
.GetBestQualityInHistory(historyEpisode.SeriesId, historyEpisode.SeasonNumber, historyEpisode.EpisodeNumber);
|
||||
|
||||
//Assert
|
||||
result.Should().NotBeNull();
|
||||
result.Quality.Should().Be(QualityTypes.Bluray720p);
|
||||
result.Proper.Should().BeTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetBestQualityInHistory_should_return_highest_result()
|
||||
{
|
||||
WithRealDb();
|
||||
|
||||
var episodes = Builder<Episode>.CreateListOfSize(10).Build();
|
||||
var historyEpisode = episodes[6];
|
||||
|
||||
var history = Builder<History>
|
||||
.CreateListOfSize(5)
|
||||
.All()
|
||||
.With(h => h.EpisodeId = historyEpisode.OID)
|
||||
.With(h => h.SeriesId = historyEpisode.SeriesId)
|
||||
.TheFirst(1)
|
||||
.With(h => h.Quality = QualityTypes.DVD)
|
||||
.With(h => h.IsProper = true)
|
||||
.TheNext(1)
|
||||
.With(h => h.Quality = QualityTypes.Bluray720p)
|
||||
.With(h => h.IsProper = false)
|
||||
.TheNext(1)
|
||||
.With(h => h.Quality = QualityTypes.Bluray720p)
|
||||
.With(h => h.IsProper = true)
|
||||
.TheNext(1)
|
||||
.With(h => h.Quality = QualityTypes.Bluray720p)
|
||||
.With(h => h.IsProper = false)
|
||||
.TheNext(1)
|
||||
.With(h => h.Quality = QualityTypes.SDTV)
|
||||
.With(h => h.IsProper = true)
|
||||
.Build();
|
||||
|
||||
Db.InsertMany(history);
|
||||
Db.InsertMany(episodes);
|
||||
|
||||
//Act
|
||||
var result = Mocker.Resolve<HistoryProvider>()
|
||||
.GetBestQualityInHistory(historyEpisode.SeriesId, historyEpisode.SeasonNumber, historyEpisode.EpisodeNumber);
|
||||
|
||||
//Assert
|
||||
result.Should().NotBeNull();
|
||||
result.Quality.Should().Be(QualityTypes.Bluray720p);
|
||||
result.Proper.Should().BeTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GetBestQualityInHistory_should_return_highest_weighted_result()
|
||||
{
|
||||
WithRealDb();
|
||||
|
||||
var episodes = Builder<Episode>.CreateListOfSize(10).Build();
|
||||
var historyEpisode = episodes[6];
|
||||
|
||||
var history = Builder<History>
|
||||
.CreateListOfSize(5)
|
||||
.All()
|
||||
.With(h => h.EpisodeId = historyEpisode.OID)
|
||||
.With(h => h.SeriesId = historyEpisode.SeriesId)
|
||||
.TheFirst(1)
|
||||
.With(h => h.Quality = QualityTypes.DVD)
|
||||
.With(h => h.IsProper = true)
|
||||
.TheNext(1)
|
||||
.With(h => h.Quality = QualityTypes.WEBDL720p)
|
||||
.With(h => h.IsProper = false)
|
||||
.TheNext(1)
|
||||
.With(h => h.Quality = QualityTypes.WEBDL720p)
|
||||
.With(h => h.IsProper = true)
|
||||
.TheNext(1)
|
||||
.With(h => h.Quality = QualityTypes.WEBDL1080p)
|
||||
.With(h => h.IsProper = false)
|
||||
.TheNext(1)
|
||||
.With(h => h.Quality = QualityTypes.SDTV)
|
||||
.With(h => h.IsProper = true)
|
||||
.Build();
|
||||
|
||||
Db.InsertMany(history);
|
||||
Db.InsertMany(episodes);
|
||||
|
||||
//Act
|
||||
var result = Mocker.Resolve<HistoryProvider>()
|
||||
.GetBestQualityInHistory(historyEpisode.SeriesId, historyEpisode.SeasonNumber, historyEpisode.EpisodeNumber);
|
||||
|
||||
//Assert
|
||||
result.Should().NotBeNull();
|
||||
result.Quality.Should().Be(QualityTypes.WEBDL1080p);
|
||||
result.Proper.Should().BeFalse();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void add_item()
|
||||
{
|
||||
WithRealDb();
|
||||
|
||||
var episode = Builder<Episode>.CreateNew().Build();
|
||||
|
||||
QualityTypes quality = QualityTypes.HDTV720p;
|
||||
const bool proper = true;
|
||||
|
||||
var history = new History
|
||||
{
|
||||
Date = DateTime.Now,
|
||||
EpisodeId = episode.OID,
|
||||
SeriesId = episode.SeriesId,
|
||||
NzbTitle = "my title",
|
||||
Indexer = "Fake Indexer",
|
||||
Quality = quality,
|
||||
IsProper = proper
|
||||
};
|
||||
|
||||
//Act
|
||||
Mocker.Resolve<HistoryProvider>().Add(history);
|
||||
|
||||
//Assert
|
||||
var storedHistory = Db.Fetch<History>();
|
||||
|
||||
storedHistory.Should().HaveCount(1);
|
||||
history.Date.Should().BeWithin(TimeSpan.FromMinutes(1)).Before(storedHistory.First().Date);
|
||||
|
||||
history.EpisodeId.Should().Be(storedHistory.First().EpisodeId);
|
||||
history.SeriesId.Should().Be(storedHistory.First().SeriesId);
|
||||
history.NzbTitle.Should().Be(storedHistory.First().NzbTitle);
|
||||
history.Indexer.Should().Be(storedHistory.First().Indexer);
|
||||
history.Quality.Should().Be(storedHistory.First().Quality);
|
||||
history.IsProper.Should().Be(storedHistory.First().IsProper);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,8 +1,10 @@
|
||||
using System.Linq;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace NzbDrone.Core.Datastore
|
||||
{
|
||||
[DebuggerDisplay("ID = {OID}")]
|
||||
public abstract class ModelBase
|
||||
{
|
||||
[PetaPoco.Ignore]
|
||||
|
@ -1,5 +1,6 @@
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Core.History;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Model;
|
||||
using NzbDrone.Core.Providers;
|
||||
@ -9,14 +10,14 @@ namespace NzbDrone.Core.DecisionEngine
|
||||
public class UpgradeHistorySpecification
|
||||
{
|
||||
private readonly IEpisodeService _episodeService;
|
||||
private readonly HistoryProvider _historyProvider;
|
||||
private readonly HistoryService _historyService;
|
||||
private readonly QualityUpgradeSpecification _qualityUpgradeSpecification;
|
||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
public UpgradeHistorySpecification(IEpisodeService episodeService, HistoryProvider historyProvider, QualityUpgradeSpecification qualityUpgradeSpecification)
|
||||
public UpgradeHistorySpecification(IEpisodeService episodeService, HistoryService historyService, QualityUpgradeSpecification qualityUpgradeSpecification)
|
||||
{
|
||||
_episodeService = episodeService;
|
||||
_historyProvider = historyProvider;
|
||||
_historyService = historyService;
|
||||
_qualityUpgradeSpecification = qualityUpgradeSpecification;
|
||||
}
|
||||
|
||||
@ -29,7 +30,7 @@ namespace NzbDrone.Core.DecisionEngine
|
||||
{
|
||||
foreach (var episode in subject.Episodes)
|
||||
{
|
||||
var bestQualityInHistory = _historyProvider.GetBestQualityInHistory(subject.Series.SeriesId, episode.SeasonNumber, episode.EpisodeNumber);
|
||||
var bestQualityInHistory = _historyService.GetBestQualityInHistory(subject.Series.SeriesId, episode.SeasonNumber, episode.EpisodeNumber);
|
||||
if (bestQualityInHistory != null)
|
||||
{
|
||||
logger.Trace("Comparing history quality with report. History is {0}", bestQualityInHistory);
|
||||
|
19
NzbDrone.Core/History/History.cs
Normal file
19
NzbDrone.Core/History/History.cs
Normal file
@ -0,0 +1,19 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Tv;
|
||||
|
||||
namespace NzbDrone.Core.History
|
||||
{
|
||||
public class History : ModelBase
|
||||
{
|
||||
public string NzbTitle { get; set; }
|
||||
public QualityModel Quality { get; set; }
|
||||
public DateTime Date { get; set; }
|
||||
public string Indexer { get; set; }
|
||||
public string NzbInfoUrl { get; set; }
|
||||
public string ReleaseGroup { get; set; }
|
||||
|
||||
public Episode Episode { get; set; }
|
||||
}
|
||||
}
|
41
NzbDrone.Core/History/HistoryRepository.cs
Normal file
41
NzbDrone.Core/History/HistoryRepository.cs
Normal file
@ -0,0 +1,41 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using NzbDrone.Core.Datastore;
|
||||
using NzbDrone.Core.Tv;
|
||||
|
||||
namespace NzbDrone.Core.History
|
||||
{
|
||||
public interface IHistoryRepository : IBasicRepository<History>
|
||||
{
|
||||
void Trim();
|
||||
QualityModel GetBestQualityInHistory(int seriesId, int seasonNumber, int episodeNumber);
|
||||
}
|
||||
|
||||
public class HistoryRepository : BasicRepository<History>, IHistoryRepository
|
||||
{
|
||||
public HistoryRepository(IObjectDatabase objectDatabase)
|
||||
: base(objectDatabase)
|
||||
{
|
||||
}
|
||||
|
||||
public void Trim()
|
||||
{
|
||||
var oldIds = Queryable.Where(c => c.Date < DateTime.Now.AddDays(-30).Date).Select(c => c.OID);
|
||||
DeleteMany(oldIds);
|
||||
}
|
||||
|
||||
|
||||
public QualityModel GetBestQualityInHistory(int seriesId, int seasonNumber, int episodeNumber)
|
||||
{
|
||||
var history = Queryable.OrderByDescending(c => c.Quality).FirstOrDefault(c => c.Episode.Series.SeriesId == seriesId && c.Episode.SeasonNumber == seasonNumber &&
|
||||
c.Episode.EpisodeNumber == episodeNumber);
|
||||
|
||||
if (history != null)
|
||||
{
|
||||
return history.Quality;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
47
NzbDrone.Core/History/HistoryService.cs
Normal file
47
NzbDrone.Core/History/HistoryService.cs
Normal file
@ -0,0 +1,47 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Core.Tv;
|
||||
|
||||
namespace NzbDrone.Core.History
|
||||
{
|
||||
|
||||
public class HistoryService
|
||||
{
|
||||
private readonly IHistoryRepository _historyRepository;
|
||||
private readonly Logger _logger;
|
||||
|
||||
|
||||
public HistoryService(IHistoryRepository historyRepository, Logger logger)
|
||||
{
|
||||
_historyRepository = historyRepository;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public List<History> All()
|
||||
{
|
||||
return _historyRepository.All().ToList();
|
||||
}
|
||||
|
||||
public void Purge()
|
||||
{
|
||||
_historyRepository.Purge();
|
||||
}
|
||||
|
||||
public virtual void Trim()
|
||||
{
|
||||
_historyRepository.Trim();
|
||||
}
|
||||
|
||||
public void Add(History item)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public virtual QualityModel GetBestQualityInHistory(int seriesId, int seasonNumber, int episodeNumber)
|
||||
{
|
||||
return _historyRepository.GetBestQualityInHistory(seriesId, seasonNumber, episodeNumber);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
using System;
|
||||
using NzbDrone.Core.Repository;
|
||||
using NzbDrone.Core.Repository.Quality;
|
||||
using PetaPoco;
|
||||
|
||||
namespace NzbDrone.Core.Model
|
||||
{
|
||||
public class HistoryQueryModel
|
||||
{
|
||||
public int HistoryId { get; set; }
|
||||
public int EpisodeId { get; set; }
|
||||
public int SeriesId { get; set; }
|
||||
public string NzbTitle { get; set; }
|
||||
public QualityTypes Quality { get; set; }
|
||||
public DateTime Date { get; set; }
|
||||
public bool IsProper { get; set; }
|
||||
public string Indexer { get; set; }
|
||||
public string NzbInfoUrl { get; set; }
|
||||
public string ReleaseGroup { get; set; }
|
||||
|
||||
public string EpisodeTitle { get; set; }
|
||||
public int SeasonNumber { get; set; }
|
||||
public int EpisodeNumber { get; set; }
|
||||
public string EpisodeOverview { get; set; }
|
||||
public string SeriesTitle { get; set; }public int Id { get; set; }
|
||||
}
|
||||
}
|
@ -131,10 +131,6 @@
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Autofac.3.0.1\lib\net40\Autofac.Configuration.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="DataTables.Mvc.Core, Version=0.1.0.85, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\DataTables.Mvc.Core.0.1.0.85\lib\DataTables.Mvc.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="DeskMetrics.NET">
|
||||
<HintPath>..\Libraries\DeskMetrics\DeskMetrics.NET.dll</HintPath>
|
||||
</Reference>
|
||||
@ -268,6 +264,7 @@
|
||||
<Compile Include="Helpers\SortHelper.cs" />
|
||||
<Compile Include="Helpers\SabnzbdPriorityTypeConverter.cs" />
|
||||
<Compile Include="Helpers\XElementHelper.cs" />
|
||||
<Compile Include="History\HistoryRepository.cs" />
|
||||
<Compile Include="Indexers\IndexerRepository.cs" />
|
||||
<Compile Include="Indexers\NewznabRepository.cs" />
|
||||
<Compile Include="Instrumentation\LogInjectionModule.cs" />
|
||||
@ -282,7 +279,6 @@
|
||||
<Compile Include="Jobs\PastWeekBacklogSearchJob.cs" />
|
||||
<Compile Include="Jobs\SearchHistoryCleanupJob.cs" />
|
||||
<Compile Include="Lifecycle\IInitializable.cs" />
|
||||
<Compile Include="Model\HistoryQueryModel.cs" />
|
||||
<Compile Include="Model\DownloadClientType.cs" />
|
||||
<Compile Include="Instrumentation\LogService.cs" />
|
||||
<Compile Include="Instrumentation\DatabaseTarget.cs" />
|
||||
@ -491,7 +487,7 @@
|
||||
<Compile Include="Providers\GrowlProvider.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Providers\HistoryProvider.cs">
|
||||
<Compile Include="History\HistoryService.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Indexers\IndexerService.cs">
|
||||
@ -592,7 +588,7 @@
|
||||
<Compile Include="Model\Notification\ProgressNotification.cs" />
|
||||
<Compile Include="Tv\Episode.cs" />
|
||||
<Compile Include="Instrumentation\Log.cs" />
|
||||
<Compile Include="Repository\History.cs" />
|
||||
<Compile Include="History\History.cs" />
|
||||
<Compile Include="Repository\Config.cs" />
|
||||
<Compile Include="Repository\Quality\QualityType.cs" />
|
||||
<Compile Include="Repository\Quality\QualityProfile.cs" />
|
||||
|
@ -3,6 +3,7 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Common;
|
||||
using NzbDrone.Core.History;
|
||||
using NzbDrone.Core.Model;
|
||||
using NzbDrone.Core.Providers.Core;
|
||||
using NzbDrone.Core.DecisionEngine;
|
||||
@ -15,7 +16,7 @@ namespace NzbDrone.Core.Providers.DownloadClients
|
||||
private readonly HttpProvider _httpProvider;
|
||||
private readonly DiskProvider _diskProvider;
|
||||
private readonly UpgradeHistorySpecification _upgradeHistorySpecification;
|
||||
private readonly HistoryProvider _historyProvider;
|
||||
private readonly HistoryService _historyService;
|
||||
|
||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Core.History;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Model;
|
||||
using NzbDrone.Core.Providers.Core;
|
||||
@ -13,7 +14,7 @@ namespace NzbDrone.Core.Providers
|
||||
public class DownloadProvider
|
||||
{
|
||||
private readonly SabProvider _sabProvider;
|
||||
private readonly HistoryProvider _historyProvider;
|
||||
private readonly HistoryService _historyService;
|
||||
private readonly IEpisodeService _episodeService;
|
||||
private readonly ExternalNotificationProvider _externalNotificationProvider;
|
||||
private readonly ConfigProvider _configProvider;
|
||||
@ -24,14 +25,14 @@ namespace NzbDrone.Core.Providers
|
||||
|
||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
public DownloadProvider(SabProvider sabProvider, HistoryProvider historyProvider,
|
||||
public DownloadProvider(SabProvider sabProvider, HistoryService historyService,
|
||||
IEpisodeService episodeService, ExternalNotificationProvider externalNotificationProvider,
|
||||
ConfigProvider configProvider, BlackholeProvider blackholeProvider,
|
||||
SignalRProvider signalRProvider, PneumaticProvider pneumaticProvider,
|
||||
NzbgetProvider nzbgetProvider)
|
||||
{
|
||||
_sabProvider = sabProvider;
|
||||
_historyProvider = historyProvider;
|
||||
_historyService = historyService;
|
||||
_episodeService = episodeService;
|
||||
_externalNotificationProvider = externalNotificationProvider;
|
||||
_configProvider = configProvider;
|
||||
@ -59,20 +60,18 @@ namespace NzbDrone.Core.Providers
|
||||
|
||||
foreach (var episode in parseResult.Episodes)
|
||||
{
|
||||
var history = new History
|
||||
var history = new History.History
|
||||
{
|
||||
Date = DateTime.Now,
|
||||
Indexer = parseResult.Indexer,
|
||||
IsProper = parseResult.Quality.Proper,
|
||||
Quality = parseResult.Quality.Quality,
|
||||
Quality = parseResult.Quality,
|
||||
NzbTitle = parseResult.OriginalString,
|
||||
EpisodeId = episode.OID,
|
||||
SeriesId = episode.SeriesId,
|
||||
Episode = episode,
|
||||
NzbInfoUrl = parseResult.NzbInfoUrl,
|
||||
ReleaseGroup = parseResult.ReleaseGroup,
|
||||
};
|
||||
|
||||
_historyProvider.Add(history);
|
||||
_historyService.Add(history);
|
||||
_episodeService.MarkEpisodeAsFetched(episode.OID);
|
||||
|
||||
_signalRProvider.UpdateEpisodeStatus(episode.OID, EpisodeStatusType.Downloading, null);
|
||||
|
@ -1,118 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using DataTables.Mvc.Core.Helpers;
|
||||
using DataTables.Mvc.Core.Models;
|
||||
using NLog;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Model;
|
||||
using NzbDrone.Core.Repository;
|
||||
using NzbDrone.Core.Repository.Quality;
|
||||
using PetaPoco;
|
||||
|
||||
namespace NzbDrone.Core.Providers
|
||||
{
|
||||
public class HistoryProvider
|
||||
{
|
||||
private readonly IDatabase _database;
|
||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
|
||||
public HistoryProvider(IDatabase database)
|
||||
{
|
||||
_database = database;
|
||||
}
|
||||
|
||||
public HistoryProvider()
|
||||
{
|
||||
}
|
||||
|
||||
public virtual List<History> AllItems()
|
||||
{
|
||||
return _database.Fetch<History>("");
|
||||
}
|
||||
|
||||
public virtual List<History> AllItemsWithRelationships()
|
||||
{
|
||||
return _database.Fetch<History, Episode>(@"
|
||||
SELECT History.*, Series.Title as SeriesTitle, Episodes.* FROM History
|
||||
INNER JOIN Series ON History.SeriesId = Series.SeriesId
|
||||
INNER JOIN Episodes ON History.EpisodeId = Episodes.EpisodeId
|
||||
");
|
||||
}
|
||||
|
||||
public virtual void Purge()
|
||||
{
|
||||
_database.Delete<History>("");
|
||||
logger.Info("History has been Purged");
|
||||
}
|
||||
|
||||
public virtual void Trim()
|
||||
{
|
||||
_database.Delete<History>("WHERE Date < @0", DateTime.Now.AddDays(-30).Date);
|
||||
logger.Info("History has been trimmed, items older than 30 days have been removed");
|
||||
}
|
||||
|
||||
public virtual void Add(History item)
|
||||
{
|
||||
_database.Insert(item);
|
||||
logger.Debug("Item added to history: {0}", item.NzbTitle);
|
||||
}
|
||||
|
||||
public virtual QualityModel GetBestQualityInHistory(int seriesId, int seasonNumber, int episodeNumber)
|
||||
{
|
||||
var quality = _database.Fetch<QualityModel>(@"SELECT History.Quality , History.IsProper as Proper FROM History
|
||||
INNER JOIN Episodes ON History.EpisodeId = Episodes.EpisodeId
|
||||
WHERE Episodes.seriesId = @0 AND
|
||||
Episodes.SeasonNumber = @1 AND
|
||||
Episodes.EpisodeNumber = @2"
|
||||
, seriesId, seasonNumber, episodeNumber);
|
||||
|
||||
var best = quality.OrderByDescending(q => q).FirstOrDefault();
|
||||
|
||||
return best;
|
||||
}
|
||||
|
||||
public virtual void Delete(int historyId)
|
||||
{
|
||||
_database.Delete<History>(historyId);
|
||||
}
|
||||
|
||||
public virtual Page<HistoryQueryModel> GetPagedItems(DataTablesPageRequest pageRequest)
|
||||
{
|
||||
var query = Sql.Builder
|
||||
.Select(@"History.*, Series.Title as SeriesTitle, Episodes.Title as EpisodeTitle,
|
||||
Episodes.SeasonNumber as SeasonNumber, Episodes.EpisodeNumber as EpisodeNumber,
|
||||
Episodes.Overview as EpisodeOverview")
|
||||
.From("History")
|
||||
.InnerJoin("Series")
|
||||
.On("History.SeriesId = Series.SeriesId")
|
||||
.InnerJoin("Episodes")
|
||||
.On("History.EpisodeId = Episodes.EpisodeId");
|
||||
|
||||
var startPage = (pageRequest.DisplayLength == 0) ? 1 : pageRequest.DisplayStart / pageRequest.DisplayLength + 1;
|
||||
|
||||
if (!string.IsNullOrEmpty(pageRequest.Search))
|
||||
{
|
||||
var whereClause = string.Join(" OR ", SqlBuilderHelper.GetSearchClause(pageRequest));
|
||||
|
||||
if (!string.IsNullOrEmpty(whereClause))
|
||||
query.Append("WHERE " + whereClause, "%" + pageRequest.Search + "%");
|
||||
}
|
||||
|
||||
var orderBy = string.Join(",", SqlBuilderHelper.GetOrderByClause(pageRequest));
|
||||
|
||||
if (!string.IsNullOrEmpty(orderBy))
|
||||
{
|
||||
query.Append("ORDER BY " + orderBy);
|
||||
}
|
||||
|
||||
return _database.Page<HistoryQueryModel>(startPage, pageRequest.DisplayLength, query);
|
||||
}
|
||||
|
||||
public virtual long Count()
|
||||
{
|
||||
return _database.Single<long>(@"SELECT COUNT(*) from History");
|
||||
}
|
||||
}
|
||||
}
|
@ -26,7 +26,7 @@ namespace NzbDrone.Core.Providers
|
||||
{
|
||||
var series = _database.Fetch<Series>();
|
||||
var episodes = _database.Fetch<Episode>();
|
||||
var history = _database.Fetch<History>("WHERE Date >= @0", DateTime.Today.AddDays(-30));
|
||||
var history = _database.Fetch<History.History>("WHERE Date >= @0", DateTime.Today.AddDays(-30));
|
||||
|
||||
var stats = new StatsModel();
|
||||
stats.SeriesTotal = series.Count;
|
||||
|
@ -1,29 +0,0 @@
|
||||
using System;
|
||||
using NzbDrone.Core.Tv;
|
||||
using NzbDrone.Core.Repository.Quality;
|
||||
using PetaPoco;
|
||||
|
||||
namespace NzbDrone.Core.Repository
|
||||
{
|
||||
[PrimaryKey("HistoryId")]
|
||||
public class History
|
||||
{
|
||||
public int HistoryId { get; set; }
|
||||
|
||||
public int EpisodeId { get; set; }
|
||||
public int SeriesId { get; set; }
|
||||
public string NzbTitle { get; set; }
|
||||
public QualityTypes Quality { get; set; }
|
||||
public DateTime Date { get; set; }
|
||||
public bool IsProper { get; set; }
|
||||
public string Indexer { get; set; }
|
||||
public string NzbInfoUrl { get; set; }
|
||||
public string ReleaseGroup { get; set; }
|
||||
|
||||
[ResultColumn]
|
||||
public Episode Episode { get; set; }
|
||||
|
||||
[ResultColumn]
|
||||
public string SeriesTitle { get; set; }
|
||||
}
|
||||
}
|
@ -10,7 +10,10 @@ namespace NzbDrone.Core.Tv
|
||||
|
||||
public Boolean Proper { get; set; }
|
||||
|
||||
public QualityModel() { }
|
||||
public QualityModel():this(QualityTypes.Unknown, false)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public QualityModel(QualityTypes quality, Boolean proper)
|
||||
{
|
||||
|
@ -1,7 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Autofac" version="3.0.1" targetFramework="net40" />
|
||||
<package id="DataTables.Mvc.Core" version="0.1.0.85" />
|
||||
<package id="DotNetZip" version="1.9.1.8" />
|
||||
<package id="Growl" version="0.6" />
|
||||
<package id="MediaInfoNet" version="0.3" targetFramework="net40" />
|
||||
|
Loading…
Reference in New Issue
Block a user