removed searchhistory storage.

pull/23/head
Keivan Beigi 12 years ago
parent 16c6f32639
commit c9370865a4

@ -190,7 +190,6 @@
<Compile Include="ProviderTests\RecycleBinProviderTests\EmptyFixture.cs" /> <Compile Include="ProviderTests\RecycleBinProviderTests\EmptyFixture.cs" />
<Compile Include="ProviderTests\RecycleBinProviderTests\DeleteFileFixture.cs" /> <Compile Include="ProviderTests\RecycleBinProviderTests\DeleteFileFixture.cs" />
<Compile Include="ProviderTests\RecycleBinProviderTests\DeleteDirectoryFixture.cs" /> <Compile Include="ProviderTests\RecycleBinProviderTests\DeleteDirectoryFixture.cs" />
<Compile Include="ProviderTests\SearchHistoryProviderTest.cs" />
<Compile Include="ProviderTests\PlexProviderTest.cs" /> <Compile Include="ProviderTests\PlexProviderTest.cs" />
<Compile Include="TvTests\SeasonProviderTest.cs" /> <Compile Include="TvTests\SeasonProviderTest.cs" />
<Compile Include="DecisionEngineTests\RetentionSpecificationFixture.cs" /> <Compile Include="DecisionEngineTests\RetentionSpecificationFixture.cs" />
@ -220,7 +219,6 @@
<Compile Include="ProviderTests\XemCommunicationProviderTests\GetXemSeriesIdsFixture.cs" /> <Compile Include="ProviderTests\XemCommunicationProviderTests\GetXemSeriesIdsFixture.cs" />
<Compile Include="Services\ParseErrorServiceFixture.cs" /> <Compile Include="Services\ParseErrorServiceFixture.cs" />
<Compile Include="HelperTests\SortHelperFixture.cs" /> <Compile Include="HelperTests\SortHelperFixture.cs" />
<Compile Include="TvTests\EpisodeProviderTests\EpisodeProviderTest_DeleteInvalidEpisodes.cs" />
<Compile Include="DecisionEngineTests\AcceptableSizeSpecificationFixture.cs" /> <Compile Include="DecisionEngineTests\AcceptableSizeSpecificationFixture.cs" />
<Compile Include="ProviderTests\QualityTypeProviderTest.cs" /> <Compile Include="ProviderTests\QualityTypeProviderTest.cs" />
<Compile Include="ProviderTests\MisnamedProviderTest.cs" /> <Compile Include="ProviderTests\MisnamedProviderTest.cs" />

@ -1,362 +0,0 @@
using System;
using System.IO;
using System.Linq;
using System.Net;
using FizzWare.NBuilder;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Common;
using NzbDrone.Core.Download;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Model;
using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers;
using NzbDrone.Core.Repository;
using NzbDrone.Core.Repository.Quality;
using NzbDrone.Core.Repository.Search;
using NzbDrone.Core.Test.Framework;
using NzbDrone.Test.Common.AutoMoq;
using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.ProviderTests
{
[TestFixture]
// ReSharper disable InconsistentNaming
public class SearchHistoryProviderTest : SqlCeTest
{
private SearchHistory _searchHistory;
private Series _series;
private Episode _episode;
[SetUp]
public void Setup()
{
_series = Builder<Series>.CreateNew()
.Build();
_episode = Builder<Episode>.CreateNew()
.Build();
var items = Builder<SearchHistoryItem>.CreateListOfSize(10)
.All()
.With(c => c.Quality = QualityTypes.SDTV)
.Build().ToList();
_searchHistory = Builder<SearchHistory>.CreateNew()
.With(h => h.EpisodeId = _episode.OID)
.With(h => h.SeriesId - _series.OID)
.With(h => h.SearchHistoryItems = items)
.Build();
}
private void WithUnsuccessfulSearch()
{
foreach(var item in _searchHistory.SearchHistoryItems)
{
item.Success = false;
}
}
private void WithSuccessfulSearch()
{
foreach(var item in _searchHistory.SearchHistoryItems)
{
item.Success = false;
}
var i = _searchHistory.SearchHistoryItems.Last();
i.Success = true;
i.SearchError = ReportRejectionType.None;
}
private void WithExpiredHistory()
{
var history = Builder<SearchHistory>.CreateListOfSize(10)
.All()
.With(h => h.SearchTime = DateTime.Now.AddDays(-10))
.Build();
foreach(var searchHistory in history)
{
var items = Builder<SearchHistoryItem>.CreateListOfSize(10)
.All()
.With(c => c.Quality = QualityTypes.SDTV)
.With(i => i.Id == searchHistory.Id)
.Build();
Db.InsertMany(items);
}
Db.InsertMany(history);
}
private void WithValidHistory()
{
var history = Builder<SearchHistory>.CreateListOfSize(10)
.All()
.With(h => h.SearchTime = DateTime.Now)
.Build();
foreach (var searchHistory in history)
{
var items = Builder<SearchHistoryItem>.CreateListOfSize(10)
.All()
.With(c => c.Quality = QualityTypes.SDTV)
.With(i => i.Id == searchHistory.Id)
.Build();
Db.InsertMany(items);
}
Db.InsertMany(history);
}
[Test]
public void Add_should_add_history_and_history_items()
{
WithRealDb();
Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
Db.Fetch<SearchHistory>().Should().HaveCount(1);
Db.Fetch<SearchHistoryItem>().Should().HaveCount(10);
}
[Test]
public void Add_should_add_return_id()
{
WithRealDb();
var result = Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
result.Should().NotBe(0);
}
[Test]
public void Delete_should_delete_history_and_history_items()
{
WithRealDb();
Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
var history = Db.Fetch<SearchHistory>();
Mocker.Resolve<SearchHistoryProvider>().Delete(history.First().Id);
Db.Fetch<SearchHistory>().Should().HaveCount(0);
Db.Fetch<SearchHistoryItem>().Should().HaveCount(0);
}
[Test]
public void AllSearchHistory_should_return_all_items()
{
WithRealDb();
Db.Insert(_series);
Db.Insert(_episode);
Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
var result = Mocker.Resolve<SearchHistoryProvider>().AllSearchHistory();
result.Count.Should().Be(1);
}
[Test]
public void AllSearchHistory_should_have_series_title()
{
WithRealDb();
Db.Insert(_series);
Db.Insert(_episode);
Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
var result = Mocker.Resolve<SearchHistoryProvider>().AllSearchHistory();
result.Count.Should().Be(1);
result.First().SeriesTitle.Should().Be(_series.Title);
}
[Test]
public void AllSearchHistory_should_have_episode_information()
{
WithRealDb();
Db.Insert(_series);
Db.Insert(_episode);
Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
var result = Mocker.Resolve<SearchHistoryProvider>().AllSearchHistory();
result.Count.Should().Be(1);
result.First().EpisodeTitle.Should().Be(_episode.Title);
result.First().EpisodeNumber.Should().Be(_episode.EpisodeNumber);
result.First().SeasonNumber.Should().Be(_episode.SeasonNumber);
}
[Test]
public void AllSearchHistory_should_have_totalItems_count()
{
WithRealDb();
Db.Insert(_series);
Db.Insert(_episode);
Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
var result = Mocker.Resolve<SearchHistoryProvider>().AllSearchHistory();
result.Count.Should().Be(1);
result.First().TotalItems.Should().Be(_searchHistory.SearchHistoryItems.Count);
}
[Test]
public void AllSearchHistory_should_have_successfulCount_equal_zero_when_all_failed()
{
WithRealDb();
Db.Insert(_series);
Db.Insert(_episode);
WithUnsuccessfulSearch();
Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
var result = Mocker.Resolve<SearchHistoryProvider>().AllSearchHistory();
result.Count.Should().Be(1);
result.First().SuccessfulCount.Should().Be(0);
}
[Test]
public void AllSearchHistory_should_have_successfulCount_equal_one_when_one_was_downloaded()
{
WithRealDb();
Db.Insert(_series);
Db.Insert(_episode);
WithSuccessfulSearch();
Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
var result = Mocker.Resolve<SearchHistoryProvider>().AllSearchHistory();
result.Count.Should().Be(1);
result.First().SuccessfulCount.Should().Be(1);
}
[Test]
public void GetSearchHistory_should_return_searchHistory_with_items()
{
WithRealDb();
Db.Insert(_series);
Db.Insert(_episode);
WithSuccessfulSearch();
var id = Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
var result = Mocker.Resolve<SearchHistoryProvider>().GetSearchHistory(id);
result.SearchHistoryItems.Should().HaveCount(_searchHistory.SearchHistoryItems.Count);
}
[Test]
public void GetSearchHistory_should_have_episodeDetails()
{
WithRealDb();
Db.Insert(_series);
Db.Insert(_episode);
WithSuccessfulSearch();
var id = Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
var result = Mocker.Resolve<SearchHistoryProvider>().GetSearchHistory(id);
result.EpisodeNumber.Should().Be(_episode.EpisodeNumber);
result.SeasonNumber.Should().Be(_episode.SeasonNumber);
result.EpisodeTitle.Should().Be(_episode.Title);
result.AirDate.Should().Be(_episode.AirDate.Value);
}
[Test]
public void GetSearchHistory_should_not_have_episode_info_if_it_was_a_full_season_search()
{
WithRealDb();
Db.Insert(_series);
_searchHistory.EpisodeId = 0;
var id = Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
var result = Mocker.Resolve<SearchHistoryProvider>().GetSearchHistory(id);
result.EpisodeNumber.Should().Be(null);
result.SeasonNumber.Should().Be(_searchHistory.SeasonNumber);
result.EpisodeTitle.Should().Be(null);
}
[Test]
public void ForceDownload_should_download_report()
{
WithRealDb();
Db.Insert(_series);
Db.Insert(_episode);
var reportTitle = String.Format("{0} - S{1:00}E{2:00}", _series.Title, _episode.SeasonNumber, _episode.EpisodeNumber);
_searchHistory.SearchHistoryItems.First().ReportTitle = reportTitle;
Mocker.Resolve<SearchHistoryProvider>().Add(_searchHistory);
var items = Db.Fetch<SearchHistoryItem>();
Mocker.Resolve<SearchHistoryProvider>().ForceDownload(items.First().Id);
Mocker.GetMock<DownloadProvider>().Verify(v => v.DownloadReport(It.IsAny<EpisodeParseResult>()), Times.Once());
}
[Test]
public void Cleanup_should_not_blowup_if_there_is_nothing_to_delete()
{
WithRealDb();
Mocker.Resolve<SearchHistoryProvider>().Cleanup();
Db.Fetch<SearchHistory>().Should().HaveCount(0);
}
[Test]
public void Cleanup_should_delete_searchHistory_older_than_1_week()
{
WithRealDb();
WithExpiredHistory();
Mocker.Resolve<SearchHistoryProvider>().Cleanup();
Db.Fetch<SearchHistory>().Should().HaveCount(0);
}
[Test]
public void Cleanup_should_delete_searchHistoryItems_older_than_1_week()
{
WithRealDb();
WithExpiredHistory();
Mocker.Resolve<SearchHistoryProvider>().Cleanup();
Db.Fetch<SearchHistoryItem>().Should().HaveCount(0);
}
[Test]
public void Cleanup_should_not_delete_searchHistory_younger_than_1_week()
{
WithRealDb();
WithValidHistory();
Mocker.Resolve<SearchHistoryProvider>().Cleanup();
Db.Fetch<SearchHistory>().Should().HaveCount(10);
}
[Test]
public void Cleanup_should_not_delete_searchHistoryItems_younger_than_1_week()
{
WithRealDb();
WithValidHistory();
Mocker.Resolve<SearchHistoryProvider>().Cleanup();
Db.Fetch<SearchHistoryItem>().Should().HaveCount(100);
}
}
}

@ -21,9 +21,9 @@ namespace NzbDrone.Core.Test.ProviderTests.SearchTests
public TestSearch(ISeriesService seriesService, IEpisodeService episodeService, DownloadProvider downloadProvider, public TestSearch(ISeriesService seriesService, IEpisodeService episodeService, DownloadProvider downloadProvider,
IIndexerService indexerService, SceneMappingProvider sceneMappingProvider, IIndexerService indexerService, SceneMappingProvider sceneMappingProvider,
AllowedDownloadSpecification allowedDownloadSpecification, SearchHistoryProvider searchHistoryProvider,ISeriesRepository seriesRepository) AllowedDownloadSpecification allowedDownloadSpecification, ISeriesRepository seriesRepository)
: base(seriesService, seriesRepository, episodeService, downloadProvider, indexerService, sceneMappingProvider, : base(seriesService, seriesRepository, episodeService, downloadProvider, indexerService, sceneMappingProvider,
allowedDownloadSpecification, searchHistoryProvider) allowedDownloadSpecification)
{ {
} }

@ -1,226 +0,0 @@
// ReSharper disable RedundantUsingDirective
using System.Collections.Generic;
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Test.Framework;
using TvdbLib.Data;
namespace NzbDrone.Core.Test.TvTests.EpisodeProviderTests
{
[TestFixture]
// ReSharper disable InconsistentNaming
public class EpisodeProviderTest_DeleteInvalidEpisodes : SqlCeTest
{
[Test]
public void Delete_None_Valid_TvDbEpisodeId()
{
//Setup
const int seriesId = 71663;
const int episodeCount = 10;
var tvDbSeries = Builder<TvdbEpisode>.CreateListOfSize(episodeCount).
All()
.With(l => l.Language = new TvdbLanguage(0, "eng", "a"))
.Build();
var fakeSeries = Builder<Series>.CreateNew()
.With(c => c.OID = seriesId)
.Build();
var fakeEpisode = Builder<Episode>.CreateNew()
.With(e => e.SeriesId = seriesId)
.With(e => e.TvDbEpisodeId = tvDbSeries.First().Id)
.Build();
WithRealDb();
Db.Insert(fakeSeries);
Db.Insert(fakeEpisode);
//Act
Mocker.Resolve<EpisodeService>().DeleteEpisodesNotInTvdb(fakeSeries, tvDbSeries);
//Assert
var result = Db.Fetch<Episode>();
result.Should().HaveCount(1);
}
[Test]
public void Delete_None_TvDbEpisodeId_is_zero()
{
//Setup
const int seriesId = 71663;
const int episodeCount = 10;
var tvDbSeries = Builder<TvdbEpisode>.CreateListOfSize(episodeCount).
All()
.With(l => l.Language = new TvdbLanguage(0, "eng", "a"))
.Build();
var fakeSeries = Builder<Series>.CreateNew()
.With(c => c.OID = seriesId)
.Build();
var fakeEpisode = Builder<Episode>.CreateNew()
.With(e => e.SeriesId = seriesId)
.With(e => e.TvDbEpisodeId = 0)
.Build();
WithRealDb();
Db.Insert(fakeSeries);
Db.Insert(fakeEpisode);
//Act
Mocker.Resolve<EpisodeService>().DeleteEpisodesNotInTvdb(fakeSeries, tvDbSeries);
//Assert
var result = Db.Fetch<Episode>();
result.Should().HaveCount(1);
}
[Test]
public void Delete_None_TvDbEpisodeId_is_null()
{
//Setup
const int seriesId = 71663;
const int episodeCount = 10;
var tvDbSeries = Builder<TvdbEpisode>.CreateListOfSize(episodeCount).
All()
.With(l => l.Language = new TvdbLanguage(0, "eng", "a"))
.Build();
var fakeSeries = Builder<Series>.CreateNew()
.With(c => c.OID = seriesId)
.Build();
var fakeEpisode = Builder<Episode>.CreateNew()
.With(e => e.SeriesId = seriesId)
.With(e => e.TvDbEpisodeId = 0)
.Build();
WithRealDb();
Db.Insert(fakeSeries);
Db.Insert(fakeEpisode);
//Act
Mocker.Resolve<EpisodeService>().DeleteEpisodesNotInTvdb(fakeSeries, tvDbSeries);
//Assert
var result = Db.Fetch<Episode>();
result.Should().HaveCount(1);
}
[Test]
public void Delete_TvDbId()
{
//Setup
const int seriesId = 71663;
const int episodeCount = 10;
var tvDbSeries = Builder<TvdbEpisode>.CreateListOfSize(episodeCount).
All()
.With(l => l.Language = new TvdbLanguage(0, "eng", "a"))
.Build();
var fakeSeries = Builder<Series>.CreateNew()
.With(c => c.OID = seriesId)
.Build();
var fakeEpisode = Builder<Episode>.CreateNew()
.With(e => e.SeriesId = seriesId)
.With(e => e.SeasonNumber = 20)
.With(e => e.EpisodeNumber = 20)
.With(e => e.TvDbEpisodeId = 300)
.Build();
WithRealDb();
Db.Insert(fakeSeries);
Db.Insert(fakeEpisode);
//Act
Mocker.Resolve<EpisodeService>().DeleteEpisodesNotInTvdb(fakeSeries, tvDbSeries);
//Assert
var result = Db.Fetch<Episode>();
result.Should().HaveCount(0);
}
//Other series, by season/episode + by tvdbid
[Test]
public void Delete_TvDbId_multiple_series()
{
//Setup
const int seriesId = 71663;
const int episodeCount = 10;
var tvDbSeries = Builder<TvdbEpisode>.CreateListOfSize(episodeCount).
All()
.With(l => l.Language = new TvdbLanguage(0, "eng", "a"))
.Build();
var fakeSeries = Builder<Series>.CreateNew()
.With(c => c.OID = seriesId)
.Build();
var fakeEpisode = Builder<Episode>.CreateNew()
.With(e => e.SeriesId = seriesId)
.With(e => e.SeasonNumber = 20)
.With(e => e.EpisodeNumber = 20)
.With(e => e.TvDbEpisodeId = 300)
.Build();
//Other Series
var otherFakeSeries = Builder<Series>.CreateNew()
.With(c => c.OID = 12345)
.Build();
var otherFakeEpisode = Builder<Episode>.CreateNew()
.With(e => e.SeriesId = 12345)
.With(e => e.SeasonNumber = 20)
.With(e => e.EpisodeNumber = 20)
.With(e => e.TvDbEpisodeId = 300)
.Build();
WithRealDb();
Db.Insert(fakeSeries);
Db.Insert(fakeEpisode);
Db.Insert(otherFakeSeries);
Db.Insert(otherFakeEpisode);
//Act
Mocker.Resolve<EpisodeService>().DeleteEpisodesNotInTvdb(fakeSeries, tvDbSeries);
//Assert
var result = Db.Fetch<Episode>();
result.Should().HaveCount(1);
}
[Test]
public void should_not_do_anything_if_episode_list_is_empty()
{
WithStrictMocker();
var fakeSeries = Builder<Series>.CreateNew().Build();
Mocker.Resolve<EpisodeService>().DeleteEpisodesNotInTvdb(fakeSeries, new List<TvdbEpisode>());
}
}
}

@ -1,7 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using Newtonsoft.Json; using Newtonsoft.Json;
using NzbDrone.Core.Model.Sabnzbd; using NzbDrone.Core.Model.Sabnzbd;

@ -1,7 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace NzbDrone.Core.Helpers namespace NzbDrone.Core.Helpers

@ -1,7 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
namespace NzbDrone.Core.Helpers namespace NzbDrone.Core.Helpers
{ {

@ -1,43 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using NLog;
using NzbDrone.Core.Helpers;
using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository;
namespace NzbDrone.Core.Jobs
{
public class SearchHistoryCleanupJob : IJob
{
private readonly SearchHistoryProvider _searchHistoryProvider;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public SearchHistoryCleanupJob(SearchHistoryProvider searchHistoryProvider)
{
_searchHistoryProvider = searchHistoryProvider;
}
public SearchHistoryCleanupJob()
{
}
public string Name
{
get { return "Search History Cleanup"; }
}
public TimeSpan DefaultInterval
{
get { return TimeSpan.FromHours(24); }
}
public virtual void Start(ProgressNotification notification, dynamic options)
{
Logger.Info("Running search history cleanup.");
_searchHistoryProvider.Cleanup();
}
}
}

@ -284,7 +284,6 @@
<Compile Include="Jobs\EmptyRecycleBinJob.cs" /> <Compile Include="Jobs\EmptyRecycleBinJob.cs" />
<Compile Include="Jobs\RefreshEpsiodeMetadata.cs" /> <Compile Include="Jobs\RefreshEpsiodeMetadata.cs" />
<Compile Include="Jobs\PastWeekBacklogSearchJob.cs" /> <Compile Include="Jobs\PastWeekBacklogSearchJob.cs" />
<Compile Include="Jobs\SearchHistoryCleanupJob.cs" />
<Compile Include="Lifecycle\IInitializable.cs" /> <Compile Include="Lifecycle\IInitializable.cs" />
<Compile Include="Model\DownloadClientType.cs" /> <Compile Include="Model\DownloadClientType.cs" />
<Compile Include="Instrumentation\LogService.cs" /> <Compile Include="Instrumentation\LogService.cs" />
@ -358,7 +357,6 @@
<Compile Include="Providers\Metadata\MetadataBase.cs" /> <Compile Include="Providers\Metadata\MetadataBase.cs" />
<Compile Include="Providers\Metadata\Xbmc.cs" /> <Compile Include="Providers\Metadata\Xbmc.cs" />
<Compile Include="Providers\RecycleBinProvider.cs" /> <Compile Include="Providers\RecycleBinProvider.cs" />
<Compile Include="Providers\SearchHistoryProvider.cs" />
<Compile Include="Providers\Search\DailyEpisodeSearch.cs" /> <Compile Include="Providers\Search\DailyEpisodeSearch.cs" />
<Compile Include="Providers\Search\PartialSeasonSearch.cs" /> <Compile Include="Providers\Search\PartialSeasonSearch.cs" />
<Compile Include="Providers\Search\EpisodeSearch.cs" /> <Compile Include="Providers\Search\EpisodeSearch.cs" />
@ -387,7 +385,6 @@
<Compile Include="Jobs\IJob.cs" /> <Compile Include="Jobs\IJob.cs" />
<Compile Include="Jobs\RssSyncJob.cs" /> <Compile Include="Jobs\RssSyncJob.cs" />
<Compile Include="Jobs\UpdateInfoJob.cs" /> <Compile Include="Jobs\UpdateInfoJob.cs" />
<Compile Include="Providers\StatsProvider.cs" />
<Compile Include="Providers\TvRageMappingProvider.cs" /> <Compile Include="Providers\TvRageMappingProvider.cs" />
<Compile Include="Providers\TvRageProvider.cs" /> <Compile Include="Providers\TvRageProvider.cs" />
<Compile Include="Providers\XemCommunicationProvider.cs" /> <Compile Include="Providers\XemCommunicationProvider.cs" />

@ -2,9 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Metadata; using NzbDrone.Core.Providers.Metadata;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
using PetaPoco; using PetaPoco;

@ -22,9 +22,9 @@ namespace NzbDrone.Core.Providers.Search
public DailyEpisodeSearch(ISeriesService seriesService, IEpisodeService episodeService, DownloadProvider downloadProvider, IIndexerService indexerService, public DailyEpisodeSearch(ISeriesService seriesService, IEpisodeService episodeService, DownloadProvider downloadProvider, IIndexerService indexerService,
SceneMappingProvider sceneMappingProvider, AllowedDownloadSpecification allowedDownloadSpecification, SceneMappingProvider sceneMappingProvider, AllowedDownloadSpecification allowedDownloadSpecification,
SearchHistoryProvider searchHistoryProvider, ISeriesRepository seriesRepository) ISeriesRepository seriesRepository)
: base(seriesService, seriesRepository, episodeService, downloadProvider, indexerService, sceneMappingProvider, : base(seriesService, seriesRepository, episodeService, downloadProvider, indexerService, sceneMappingProvider,
allowedDownloadSpecification, searchHistoryProvider) allowedDownloadSpecification)
{ {
_seriesRepository = seriesRepository; _seriesRepository = seriesRepository;
} }

@ -21,9 +21,9 @@ namespace NzbDrone.Core.Providers.Search
public EpisodeSearch(ISeriesService seriesService, IEpisodeService episodeService, DownloadProvider downloadProvider, IIndexerService indexerService, public EpisodeSearch(ISeriesService seriesService, IEpisodeService episodeService, DownloadProvider downloadProvider, IIndexerService indexerService,
SceneMappingProvider sceneMappingProvider, AllowedDownloadSpecification allowedDownloadSpecification, SceneMappingProvider sceneMappingProvider, AllowedDownloadSpecification allowedDownloadSpecification,
SearchHistoryProvider searchHistoryProvider, ISeriesRepository seriesRepository) ISeriesRepository seriesRepository)
: base(seriesService,seriesRepository, episodeService, downloadProvider, indexerService, sceneMappingProvider, : base(seriesService,seriesRepository, episodeService, downloadProvider, indexerService, sceneMappingProvider,
allowedDownloadSpecification, searchHistoryProvider) allowedDownloadSpecification)
{ {
} }

@ -21,9 +21,9 @@ namespace NzbDrone.Core.Providers.Search
public PartialSeasonSearch(ISeriesService seriesService, IEpisodeService episodeService, DownloadProvider downloadProvider, IIndexerService indexerService, public PartialSeasonSearch(ISeriesService seriesService, IEpisodeService episodeService, DownloadProvider downloadProvider, IIndexerService indexerService,
SceneMappingProvider sceneMappingProvider, AllowedDownloadSpecification allowedDownloadSpecification, SceneMappingProvider sceneMappingProvider, AllowedDownloadSpecification allowedDownloadSpecification,
SearchHistoryProvider searchHistoryProvider,ISeriesRepository seriesRepository) ISeriesRepository seriesRepository)
: base(seriesService, seriesRepository, episodeService, downloadProvider, indexerService, sceneMappingProvider, : base(seriesService, seriesRepository, episodeService, downloadProvider, indexerService, sceneMappingProvider,
allowedDownloadSpecification, searchHistoryProvider) allowedDownloadSpecification)
{ {
} }

@ -23,14 +23,12 @@ namespace NzbDrone.Core.Providers.Search
protected readonly IIndexerService _indexerService; protected readonly IIndexerService _indexerService;
protected readonly SceneMappingProvider _sceneMappingProvider; protected readonly SceneMappingProvider _sceneMappingProvider;
protected readonly AllowedDownloadSpecification _allowedDownloadSpecification; protected readonly AllowedDownloadSpecification _allowedDownloadSpecification;
protected readonly SearchHistoryProvider _searchHistoryProvider;
private static readonly Logger logger = LogManager.GetCurrentClassLogger(); private static readonly Logger logger = LogManager.GetCurrentClassLogger();
protected SearchBase(ISeriesService seriesService,ISeriesRepository seriesRepository, IEpisodeService episodeService, DownloadProvider downloadProvider, protected SearchBase(ISeriesService seriesService,ISeriesRepository seriesRepository, IEpisodeService episodeService, DownloadProvider downloadProvider,
IIndexerService indexerService, SceneMappingProvider sceneMappingProvider, IIndexerService indexerService, SceneMappingProvider sceneMappingProvider,
AllowedDownloadSpecification allowedDownloadSpecification, AllowedDownloadSpecification allowedDownloadSpecification)
SearchHistoryProvider searchHistoryProvider)
{ {
_seriesService = seriesService; _seriesService = seriesService;
_seriesRepository = seriesRepository; _seriesRepository = seriesRepository;
@ -39,7 +37,6 @@ namespace NzbDrone.Core.Providers.Search
_indexerService = indexerService; _indexerService = indexerService;
_sceneMappingProvider = sceneMappingProvider; _sceneMappingProvider = sceneMappingProvider;
_allowedDownloadSpecification = allowedDownloadSpecification; _allowedDownloadSpecification = allowedDownloadSpecification;
_searchHistoryProvider = searchHistoryProvider;
} }
protected SearchBase() protected SearchBase()
@ -71,7 +68,6 @@ namespace NzbDrone.Core.Providers.Search
notification.CurrentMessage = "Processing search results"; notification.CurrentMessage = "Processing search results";
ProcessReports(series, options, reports, searchResult, notification); ProcessReports(series, options, reports, searchResult, notification);
_searchHistoryProvider.Add(searchResult);
if(searchResult.Successes.Any()) if(searchResult.Successes.Any())
return searchResult.Successes; return searchResult.Successes;

@ -1,138 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NLog;
using NzbDrone.Core.Download;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Repository;
using NzbDrone.Core.Repository.Search;
using PetaPoco;
namespace NzbDrone.Core.Providers
{
public class SearchHistoryProvider
{
private readonly IDatabase _database;
private readonly ISeriesService _seriesService;
private readonly DownloadProvider _downloadProvider;
private readonly IEpisodeService _episodeService;
private readonly ISeriesRepository _seriesRepository;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public SearchHistoryProvider(IDatabase database, ISeriesService seriesService,
DownloadProvider downloadProvider, IEpisodeService episodeService, ISeriesRepository seriesRepository)
{
_database = database;
_seriesService = seriesService;
_downloadProvider = downloadProvider;
_episodeService = episodeService;
_seriesRepository = seriesRepository;
}
public SearchHistoryProvider()
{
}
public virtual int Add(SearchHistory searchHistory)
{
logger.Trace("Adding new search result");
searchHistory.SuccessfulDownload = searchHistory.SearchHistoryItems.Any(s => s.Success);
var id = Convert.ToInt32(_database.Insert(searchHistory));
searchHistory.SearchHistoryItems.ForEach(s => s.SearchHistoryId = id);
logger.Trace("Adding search result items");
_database.InsertMany(searchHistory.SearchHistoryItems);
return id;
}
public virtual void Delete(int id)
{
logger.Trace("Deleting search result items attached to: {0}", id);
_database.Execute("DELETE FROM SearchHistoryItems WHERE SearchHistoryId = @0", id);
logger.Trace("Deleting search result: {0}", id);
_database.Delete<SearchHistory>(id);
}
public virtual List<SearchHistory> AllSearchHistory()
{
var sql = @"SELECT SearchHistory.Id, SearchHistory.SeriesId, SearchHistory.SeasonNumber,
SearchHistory.EpisodeId, SearchHistory.SearchTime,
Series.Title as SeriesTitle, Series.IsDaily,
Episodes.EpisodeNumber, Episodes.SeasonNumber, Episodes.Title as EpisodeTitle,
Episodes.AirDate,
Count(SearchHistoryItems.Id) as TotalItems,
SUM(CASE WHEN SearchHistoryItems.Success = 1 THEN 1 ELSE 0 END) as SuccessfulCount
FROM SearchHistory
INNER JOIN Series
ON Series.SeriesId = SearchHistory.SeriesId
LEFT JOIN Episodes
ON Episodes.EpisodeId = SearchHistory.EpisodeId
LEFT JOIN SearchHistoryItems
ON SearchHistoryItems.SearchHistoryId = SearchHistory.Id
GROUP BY SearchHistory.Id, SearchHistory.SeriesId, SearchHistory.SeasonNumber,
SearchHistory.EpisodeId, SearchHistory.SearchTime,
Series.Title, Series.IsDaily,
Episodes.EpisodeNumber, Episodes.SeasonNumber, Episodes.Title,
Episodes.AirDate";
return _database.Fetch<SearchHistory>(sql);
}
public virtual SearchHistory GetSearchHistory(int id)
{
var sql = @"SELECT SearchHistory.Id, SearchHistory.SeriesId, SearchHistory.SeasonNumber,
SearchHistory.EpisodeId, SearchHistory.SearchTime,
Series.Title as SeriesTitle, Series.IsDaily,
Episodes.EpisodeNumber, Episodes.SeasonNumber, Episodes.Title as EpisodeTitle,
Episodes.AirDate
FROM SearchHistory
INNER JOIN Series
ON Series.SeriesId = SearchHistory.SeriesId
LEFT JOIN Episodes
ON Episodes.EpisodeId = SearchHistory.EpisodeId
WHERE SearchHistory.Id = @0";
var result = _database.Single<SearchHistory>(sql, id);
result.SearchHistoryItems = _database.Fetch<SearchHistoryItem>("WHERE SearchHistoryId = @0", id);
return result;
}
public virtual void ForceDownload(int itemId)
{
var item = _database.Single<SearchHistoryItem>(itemId);
logger.Info("Starting Force Download of: {0}", item.ReportTitle);
var searchResult = _database.Single<SearchHistory>(item.SearchHistoryId);
var series = _seriesRepository.Get(searchResult.SeriesId);
var parseResult = Parser.ParseTitle(item.ReportTitle);
parseResult.NzbUrl = item.NzbUrl;
parseResult.Series = series;
parseResult.Indexer = item.Indexer;
parseResult.Episodes = _episodeService.GetEpisodesByParseResult(parseResult);
parseResult.SceneSource = true;
logger.Info("Forcing Download of: {0}", item.ReportTitle);
_downloadProvider.DownloadReport(parseResult);
}
public virtual void Cleanup()
{
var ids = _database.Fetch<int>("SELECT Id FROM SearchHistory WHERE SearchTime < @0", DateTime.Now.AddDays(-7));
if (ids.Any())
{
logger.Trace("Deleting old search items");
_database.Execute("DELETE FROM SearchHistoryItems WHERE SearchHistoryId IN (@0)", ids);
logger.Trace("Deleting old search results");
_database.Execute("DELETE FROM SearchHistory WHERE Id IN (@0)", ids);
}
}
}
}

@ -1,41 +0,0 @@
using System;
using System.Linq;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Model;
using PetaPoco;
namespace NzbDrone.Core.Providers
{
public class StatsProvider
{
private readonly IDatabase _database;
public StatsProvider(IDatabase database)
{
_database = database;
}
public StatsProvider()
{
}
public virtual StatsModel GetStats()
{
var series = _database.Fetch<Series>();
var episodes = _database.Fetch<Episode>();
var history = _database.Fetch<History.History>("WHERE Date >= @0", DateTime.Today.AddDays(-30));
var stats = new StatsModel();
stats.SeriesTotal = series.Count;
stats.SeriesContinuing = series.Count(s => s.Status == "Continuing");
stats.SeriesEnded = series.Count(s => s.Status == "Ended");
stats.EpisodesTotal = episodes.Count;
stats.EpisodesOnDisk = episodes.Count(e => e.EpisodeFileId > 0);
stats.EpisodesMissing = episodes.Count(e => e.Ignored == false && e.EpisodeFileId == 0);
stats.DownloadedLastMonth = history.Count;
stats.DownloadLastWeek = history.Count(h => h.Date >= DateTime.Today.AddDays(-7));
return stats;
}
}
}

@ -1,7 +1,9 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Tvdb; using NzbDrone.Core.Tvdb;
using TvdbLib; using TvdbLib;
using TvdbLib.Cache; using TvdbLib.Cache;
@ -61,10 +63,40 @@ namespace NzbDrone.Core.Providers
.GroupBy(e => e.SeriesId.ToString("000000") + e.SeasonNumber.ToString("000") + e.EpisodeNumber.ToString("000")) .GroupBy(e => e.SeriesId.ToString("000000") + e.SeasonNumber.ToString("000") + e.EpisodeNumber.ToString("000"))
.Select(e => e.First()); .Select(e => e.First());
result.Episodes = episodes.ToList(); result.Episodes = episodes.Where(episode => !string.IsNullOrWhiteSpace(episode.EpisodeName) || (episode.FirstAired < DateTime.Now.AddDays(2) && episode.FirstAired.Year > 1900)).ToList();
return result; return result;
} }
} }
public virtual IList<Episode> GetEpisodes(int tvDbSeriesId)
{
var series = GetSeries(tvDbSeriesId, true);
var episodes = new List<Episode>();
foreach (var tvDbEpisode in series.Episodes)
{
var episode = new Episode();
episode.TvDbEpisodeId = tvDbEpisode.Id;
episode.EpisodeNumber = tvDbEpisode.EpisodeNumber;
episode.SeasonNumber = tvDbEpisode.SeasonNumber;
episode.AbsoluteEpisodeNumber = tvDbEpisode.AbsoluteNumber;
episode.Title = tvDbEpisode.EpisodeName;
episode.Overview = tvDbEpisode.Overview;
if (tvDbEpisode.FirstAired.Year > 1900)
{
episode.AirDate = tvDbEpisode.FirstAired.Date;
}
else
{
episode.AirDate = null;
}
}
return episodes;
}
} }
} }

@ -2,8 +2,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model;
using NzbDrone.Core.Repository;
using PetaPoco; using PetaPoco;
namespace NzbDrone.Core.Providers namespace NzbDrone.Core.Providers

@ -28,7 +28,6 @@ namespace NzbDrone.Core.Tv
IList<int> GetEpisodeNumbersBySeason(int seriesId, int seasonNumber); IList<int> GetEpisodeNumbersBySeason(int seriesId, int seasonNumber);
void SetEpisodeIgnore(int episodeId, bool isIgnored); void SetEpisodeIgnore(int episodeId, bool isIgnored);
bool IsFirstOrLastEpisodeOfSeason(int seriesId, int seasonNumber, int episodeNumber); bool IsFirstOrLastEpisodeOfSeason(int seriesId, int seasonNumber, int episodeNumber);
void DeleteEpisodesNotInTvdb(Series series, IList<TvdbEpisode> tvdbEpisodes);
void SetPostDownloadStatus(List<int> episodeIds, PostDownloadStatusType postDownloadStatus); void SetPostDownloadStatus(List<int> episodeIds, PostDownloadStatusType postDownloadStatus);
void UpdateEpisodes(List<Episode> episodes); void UpdateEpisodes(List<Episode> episodes);
Episode GetEpisodeBySceneNumbering(int seriesId, int seasonNumber, int episodeNumber); Episode GetEpisodeBySceneNumbering(int seriesId, int seasonNumber, int episodeNumber);
@ -181,11 +180,8 @@ namespace NzbDrone.Core.Tv
var successCount = 0; var successCount = 0;
var failCount = 0; var failCount = 0;
var tvdbEpisodes = _tvDbProvider.GetSeries(series.OID, true) var tvdbEpisodes = _tvDbProvider.GetEpisodes(series.OID);
.Episodes
.Where(episode => !string.IsNullOrWhiteSpace(episode.EpisodeName) ||
(episode.FirstAired < DateTime.Now.AddDays(2) && episode.FirstAired.Year > 1900))
.ToList();
var seriesEpisodes = GetEpisodeBySeries(series.OID); var seriesEpisodes = GetEpisodeBySeries(series.OID);
var updateList = new List<Episode>(); var updateList = new List<Episode>();
@ -198,7 +194,7 @@ namespace NzbDrone.Core.Tv
logger.Trace("Updating info for [{0}] - S{1:00}E{2:00}", series.Title, episode.SeasonNumber, episode.EpisodeNumber); logger.Trace("Updating info for [{0}] - S{1:00}E{2:00}", series.Title, episode.SeasonNumber, episode.EpisodeNumber);
//first check using tvdbId, this should cover cases when and episode number in a season is changed //first check using tvdbId, this should cover cases when and episode number in a season is changed
var episodeToUpdate = seriesEpisodes.SingleOrDefault(e => e.TvDbEpisodeId == episode.Id); var episodeToUpdate = seriesEpisodes.SingleOrDefault(e => e.TvDbEpisodeId == episode.TvDbEpisodeId);
//not found, try using season/episode number //not found, try using season/episode number
if (episodeToUpdate == null) if (episodeToUpdate == null)
@ -230,30 +226,20 @@ namespace NzbDrone.Core.Tv
episodeToUpdate.SeasonNumber != episode.SeasonNumber) && episodeToUpdate.SeasonNumber != episode.SeasonNumber) &&
episodeToUpdate.EpisodeFileId > 0) episodeToUpdate.EpisodeFileId > 0)
{ {
logger.Info("Unlinking episode file because TheTVDB changed the epsiode number..."); logger.Info("Unlinking episode file because TheTVDB changed the episode number...");
episodeToUpdate.EpisodeFile = null; episodeToUpdate.EpisodeFile = null;
} }
episodeToUpdate.SeriesId = series.OID; episodeToUpdate.SeriesId = series.OID;
episodeToUpdate.Series = series; episodeToUpdate.Series = series;
episodeToUpdate.TvDbEpisodeId = episode.Id; episodeToUpdate.TvDbEpisodeId = episode.TvDbEpisodeId;
episodeToUpdate.EpisodeNumber = episode.EpisodeNumber; episodeToUpdate.EpisodeNumber = episode.EpisodeNumber;
episodeToUpdate.SeasonNumber = episode.SeasonNumber; episodeToUpdate.SeasonNumber = episode.SeasonNumber;
episodeToUpdate.AbsoluteEpisodeNumber = episode.AbsoluteNumber; episodeToUpdate.AbsoluteEpisodeNumber = episode.AbsoluteEpisodeNumber;
episodeToUpdate.Title = episode.EpisodeName; episodeToUpdate.Title = episode.Title;
episodeToUpdate.Overview = episode.Overview.Truncate(3500);
if(episode.FirstAired.Year > 1900) episodeToUpdate.Overview = episode.Overview;
{ episodeToUpdate.AirDate = episode.AirDate;
episodeToUpdate.AirDate = episode.FirstAired.Date;
if (!String.IsNullOrWhiteSpace(series.AirTime))
episodeToUpdate.AirDate = episodeToUpdate.AirDate.Value.Add(Convert.ToDateTime(series.AirTime).TimeOfDay)
.AddHours(series.UtcOffset * -1);
}
else
episodeToUpdate.AirDate = null;
successCount++; successCount++;
} }
@ -314,19 +300,12 @@ namespace NzbDrone.Core.Tv
return false; return false;
} }
public virtual void DeleteEpisodesNotInTvdb(Series series, IList<TvdbEpisode> tvdbEpisodes) private void DeleteEpisodesNotInTvdb(Series series, IEnumerable<Episode> tvdbEpisodes)
{ {
logger.Trace("Starting deletion of episodes that no longer exist in TVDB: {0}", series.Title.WithDefault(series.OID)); logger.Trace("Starting deletion of episodes that no longer exist in TVDB: {0}", series.Title.WithDefault(series.OID));
foreach (var episode in tvdbEpisodes)
if (!tvdbEpisodes.Any()) return;
var seriesEpisodeIds = _episodeRepository.GetEpisodes(series.OID).Select(c => c.TvDbEpisodeId);
var toBeDeleted = seriesEpisodeIds.Except(tvdbEpisodes.Select(e => e.Id));
foreach (var id in toBeDeleted)
{ {
_episodeRepository.Delete(id); _episodeRepository.Delete(episode.OID);
} }
logger.Trace("Deleted episodes that no longer exist in TVDB for {0}", series.OID); logger.Trace("Deleted episodes that no longer exist in TVDB for {0}", series.OID);

Loading…
Cancel
Save