mirror of
https://github.com/Radarr/Radarr.git
synced 2024-11-09 04:22:30 +01:00
automatically download banner,poster, fanart. without a job :D
This commit is contained in:
parent
62c1be1634
commit
1ccbb3c9d8
@ -2,25 +2,26 @@
|
|||||||
using Nancy;
|
using Nancy;
|
||||||
using NzbDrone.Api.Extensions;
|
using NzbDrone.Api.Extensions;
|
||||||
using NzbDrone.Api.QualityType;
|
using NzbDrone.Api.QualityType;
|
||||||
|
using NzbDrone.Core.MetadataSource;
|
||||||
using NzbDrone.Core.Providers;
|
using NzbDrone.Core.Providers;
|
||||||
|
|
||||||
namespace NzbDrone.Api.Series
|
namespace NzbDrone.Api.Series
|
||||||
{
|
{
|
||||||
public class SeriesLookupModule : NzbDroneApiModule
|
public class SeriesLookupModule : NzbDroneApiModule
|
||||||
{
|
{
|
||||||
private readonly TvDbProvider _tvDbProvider;
|
private readonly TvDbProxy _tvDbProxy;
|
||||||
|
|
||||||
public SeriesLookupModule(TvDbProvider tvDbProvider)
|
public SeriesLookupModule(TvDbProxy tvDbProxy)
|
||||||
: base("/Series/lookup")
|
: base("/Series/lookup")
|
||||||
{
|
{
|
||||||
_tvDbProvider = tvDbProvider;
|
_tvDbProxy = tvDbProxy;
|
||||||
Get["/"] = x => GetQualityType();
|
Get["/"] = x => GetQualityType();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private Response GetQualityType()
|
private Response GetQualityType()
|
||||||
{
|
{
|
||||||
var tvDbResults = _tvDbProvider.SearchSeries((string)Request.Query.term);
|
var tvDbResults = _tvDbProxy.SearchSeries((string)Request.Query.term);
|
||||||
return tvDbResults.AsResponse();
|
return tvDbResults.AsResponse();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -202,7 +202,7 @@ public string create_proper_sab_season_title(bool proper)
|
|||||||
public string create_proper_sab_daily_titles(bool proper)
|
public string create_proper_sab_daily_titles(bool proper)
|
||||||
{
|
{
|
||||||
var series = Builder<Series>.CreateNew()
|
var series = Builder<Series>.CreateNew()
|
||||||
.With(c => c.SeriesType = SeriesType.Daily)
|
.With(c => c.SeriesTypes = SeriesTypes.Daily)
|
||||||
.With(c => c.Title = "My Series Name")
|
.With(c => c.Title = "My Series Name")
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
|
@ -1,92 +0,0 @@
|
|||||||
using FizzWare.NBuilder;
|
|
||||||
using Moq;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using NzbDrone.Core.Tv;
|
|
||||||
using NzbDrone.Core.Jobs;
|
|
||||||
using NzbDrone.Core.Model.Notification;
|
|
||||||
using NzbDrone.Core.Providers;
|
|
||||||
using NzbDrone.Core.Test.Framework;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Test.JobTests
|
|
||||||
{
|
|
||||||
[TestFixture]
|
|
||||||
// ReSharper disable InconsistentNaming
|
|
||||||
public class BannerDownloadJobTest : CoreTest
|
|
||||||
{
|
|
||||||
private ProgressNotification _notification;
|
|
||||||
|
|
||||||
[SetUp]
|
|
||||||
public void Setup()
|
|
||||||
{
|
|
||||||
_notification = new ProgressNotification("Test");
|
|
||||||
WithTempAsAppPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void WithSuccessfulDownload()
|
|
||||||
{
|
|
||||||
Mocker.GetMock<BannerProvider>()
|
|
||||||
.Setup(s => s.Download(It.IsAny<Series>()))
|
|
||||||
.Returns(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void WithFailedDownload()
|
|
||||||
{
|
|
||||||
Mocker.GetMock<BannerProvider>()
|
|
||||||
.Setup(s => s.Download(It.IsAny<Series>()))
|
|
||||||
.Returns(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void VerifyDownloadMock(int times)
|
|
||||||
{
|
|
||||||
Mocker.GetMock<BannerProvider>().Verify(v => v.Download(It.IsAny<Series>()), Times.Exactly(times));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Start_should_download_banners_for_all_series_when_no_targetId_is_passed_in()
|
|
||||||
{
|
|
||||||
WithSuccessfulDownload();
|
|
||||||
|
|
||||||
var series = Builder<Series>.CreateListOfSize(5)
|
|
||||||
.Build().ToList();
|
|
||||||
|
|
||||||
Mocker.GetMock<ISeriesRepository>().Setup(s => s.All())
|
|
||||||
.Returns(series);
|
|
||||||
|
|
||||||
Mocker.Resolve<BannerDownloadJob>().Start(_notification, null);
|
|
||||||
VerifyDownloadMock(series.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Start_should_only_attempt_to_download_for_series_with_banner_url()
|
|
||||||
{
|
|
||||||
WithSuccessfulDownload();
|
|
||||||
|
|
||||||
var series = Builder<Series>.CreateListOfSize(5)
|
|
||||||
.TheFirst(2)
|
|
||||||
.With(s => s.BannerUrl = null)
|
|
||||||
.Build().ToList();
|
|
||||||
|
|
||||||
Mocker.GetMock<ISeriesRepository>().Setup(s => s.All())
|
|
||||||
.Returns(series);
|
|
||||||
|
|
||||||
Mocker.Resolve<BannerDownloadJob>().Start(_notification, null);
|
|
||||||
VerifyDownloadMock(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Start_should_download_single_banner_when_seriesId_is_passed_in()
|
|
||||||
{
|
|
||||||
WithSuccessfulDownload();
|
|
||||||
|
|
||||||
var series = Builder<Series>.CreateNew()
|
|
||||||
.Build();
|
|
||||||
|
|
||||||
Mocker.GetMock<ISeriesRepository>().Setup(s => s.Get(series.Id))
|
|
||||||
.Returns(series);
|
|
||||||
|
|
||||||
Mocker.Resolve<BannerDownloadJob>().Start(_notification, new { SeriesId = series.Id });
|
|
||||||
VerifyDownloadMock(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -48,9 +48,6 @@ public void import_new_series_succesful()
|
|||||||
.Setup(j => j.Start(notification, It.Is<object>(d => d.GetPropertyValue<int>("SeriesId") == series[1].Id)))
|
.Setup(j => j.Start(notification, It.Is<object>(d => d.GetPropertyValue<int>("SeriesId") == series[1].Id)))
|
||||||
.Callback(() => series[1].LastDiskSync = DateTime.Now);
|
.Callback(() => series[1].LastDiskSync = DateTime.Now);
|
||||||
|
|
||||||
Mocker.GetMock<BannerDownloadJob>()
|
|
||||||
.Setup(j => j.Start(notification, It.Is<object>(d => d.GetPropertyValue<int>("SeriesId") > 0)));
|
|
||||||
|
|
||||||
Mocker.GetMock<XemUpdateJob>()
|
Mocker.GetMock<XemUpdateJob>()
|
||||||
.Setup(j => j.Start(notification, It.Is<object>(d => d.GetPropertyValue<int>("SeriesId") > 0)));
|
.Setup(j => j.Start(notification, It.Is<object>(d => d.GetPropertyValue<int>("SeriesId") > 0)));
|
||||||
|
|
||||||
@ -116,9 +113,6 @@ public void failed_import_should_not_be_stuck_in_loop()
|
|||||||
.Setup(j => j.Start(notification, It.Is<object>(d => d.GetPropertyValue<int>("SeriesId") == series[0].Id)))
|
.Setup(j => j.Start(notification, It.Is<object>(d => d.GetPropertyValue<int>("SeriesId") == series[0].Id)))
|
||||||
.Callback(() => series[0].LastDiskSync = DateTime.Now);
|
.Callback(() => series[0].LastDiskSync = DateTime.Now);
|
||||||
|
|
||||||
Mocker.GetMock<BannerDownloadJob>()
|
|
||||||
.Setup(j => j.Start(notification, It.Is<object>(d => d.GetPropertyValue<int>("SeriesId") == series[0].Id)));
|
|
||||||
|
|
||||||
Mocker.GetMock<ISeriesRepository>()
|
Mocker.GetMock<ISeriesRepository>()
|
||||||
.Setup(s => s.Get(series[0].Id)).Returns(series[0]);
|
.Setup(s => s.Get(series[0].Id)).Returns(series[0]);
|
||||||
|
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common;
|
||||||
|
using NzbDrone.Core.MediaCover;
|
||||||
|
using NzbDrone.Core.Test.Framework;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
using NzbDrone.Core.Tv.Events;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Test.MediaCoverTests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class MediaCoverServiceFixture : CoreTest<MediaCoverService>
|
||||||
|
{
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
Mocker.SetConstant(new HttpProvider());
|
||||||
|
Mocker.SetConstant(new DiskProvider());
|
||||||
|
Mocker.SetConstant(new EnvironmentProvider());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -763,7 +763,7 @@ public void should_use_airDate_if_series_isDaily()
|
|||||||
|
|
||||||
var series = Builder<Series>
|
var series = Builder<Series>
|
||||||
.CreateNew()
|
.CreateNew()
|
||||||
.With(s => s.SeriesType = SeriesType.Daily)
|
.With(s => s.SeriesTypes = SeriesTypes.Daily)
|
||||||
.With(s => s.Title = "The Daily Show with Jon Stewart")
|
.With(s => s.Title = "The Daily Show with Jon Stewart")
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
@ -792,7 +792,7 @@ public void should_use_airDate_if_series_isDaily_no_episode_title()
|
|||||||
|
|
||||||
var series = Builder<Series>
|
var series = Builder<Series>
|
||||||
.CreateNew()
|
.CreateNew()
|
||||||
.With(s => s.SeriesType = SeriesType.Daily)
|
.With(s => s.SeriesTypes = SeriesTypes.Daily)
|
||||||
.With(s => s.Title = "The Daily Show with Jon Stewart")
|
.With(s => s.Title = "The Daily Show with Jon Stewart")
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
@ -821,7 +821,7 @@ public void should_set_airdate_to_unknown_if_not_available()
|
|||||||
|
|
||||||
var series = Builder<Series>
|
var series = Builder<Series>
|
||||||
.CreateNew()
|
.CreateNew()
|
||||||
.With(s => s.SeriesType = SeriesType.Daily)
|
.With(s => s.SeriesTypes = SeriesTypes.Daily)
|
||||||
.With(s => s.Title = "The Daily Show with Jon Stewart")
|
.With(s => s.Title = "The Daily Show with Jon Stewart")
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
|
@ -140,6 +140,7 @@
|
|||||||
<Compile Include="JobTests\JobRepositoryFixture.cs" />
|
<Compile Include="JobTests\JobRepositoryFixture.cs" />
|
||||||
<Compile Include="JobTests\RenameSeasonJobFixture.cs" />
|
<Compile Include="JobTests\RenameSeasonJobFixture.cs" />
|
||||||
<Compile Include="DecisionEngineTests\LanguageSpecificationFixture.cs" />
|
<Compile Include="DecisionEngineTests\LanguageSpecificationFixture.cs" />
|
||||||
|
<Compile Include="MediaCoverTests\MediaCoverServiceFixture.cs" />
|
||||||
<Compile Include="ProviderTests\DownloadClientTests\NzbgetProviderTests\DownloadNzbFixture.cs" />
|
<Compile Include="ProviderTests\DownloadClientTests\NzbgetProviderTests\DownloadNzbFixture.cs" />
|
||||||
<Compile Include="ProviderTests\DownloadClientTests\NzbgetProviderTests\QueueFixture.cs" />
|
<Compile Include="ProviderTests\DownloadClientTests\NzbgetProviderTests\QueueFixture.cs" />
|
||||||
<Compile Include="ProviderTests\DownloadProviderTests\ContainsRecentEpisode.cs" />
|
<Compile Include="ProviderTests\DownloadProviderTests\ContainsRecentEpisode.cs" />
|
||||||
@ -163,13 +164,11 @@
|
|||||||
<Compile Include="Qualities\QualityFixture.cs" />
|
<Compile Include="Qualities\QualityFixture.cs" />
|
||||||
<Compile Include="EpisodeParseResultTest.cs" />
|
<Compile Include="EpisodeParseResultTest.cs" />
|
||||||
<Compile Include="JobTests\BacklogSearchJobTest.cs" />
|
<Compile Include="JobTests\BacklogSearchJobTest.cs" />
|
||||||
<Compile Include="JobTests\BannerDownloadJobTest.cs" />
|
|
||||||
<Compile Include="JobTests\RssSyncJobTest.cs" />
|
<Compile Include="JobTests\RssSyncJobTest.cs" />
|
||||||
<Compile Include="JobTests\PostDownloadScanJobFixture.cs" />
|
<Compile Include="JobTests\PostDownloadScanJobFixture.cs" />
|
||||||
<Compile Include="JobTests\RecentBacklogSearchJobTest.cs" />
|
<Compile Include="JobTests\RecentBacklogSearchJobTest.cs" />
|
||||||
<Compile Include="ParserTests\QualityParserFixture.cs" />
|
<Compile Include="ParserTests\QualityParserFixture.cs" />
|
||||||
<Compile Include="Configuration\ConfigCachingFixture.cs" />
|
<Compile Include="Configuration\ConfigCachingFixture.cs" />
|
||||||
<Compile Include="ProviderTests\BannerProviderTest.cs" />
|
|
||||||
<Compile Include="DecisionEngineTests\AllowedReleaseGroupSpecificationFixture.cs" />
|
<Compile Include="DecisionEngineTests\AllowedReleaseGroupSpecificationFixture.cs" />
|
||||||
<Compile Include="DecisionEngineTests\CustomStartDateSpecificationFixture.cs" />
|
<Compile Include="DecisionEngineTests\CustomStartDateSpecificationFixture.cs" />
|
||||||
<Compile Include="ProviderTests\DiskScanProviderTests\CleanUpFixture.cs" />
|
<Compile Include="ProviderTests\DiskScanProviderTests\CleanUpFixture.cs" />
|
||||||
|
@ -1,103 +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.Tv;
|
|
||||||
using NzbDrone.Core.Model.Notification;
|
|
||||||
using NzbDrone.Core.Providers;
|
|
||||||
using NzbDrone.Core.Repository;
|
|
||||||
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 BannerProviderTest : CoreTest
|
|
||||||
{
|
|
||||||
private Series _series;
|
|
||||||
|
|
||||||
[SetUp]
|
|
||||||
public void Setup()
|
|
||||||
{
|
|
||||||
WithTempAsAppPath();
|
|
||||||
|
|
||||||
_series = Builder<Series>.CreateNew()
|
|
||||||
.With(s => s.Id = 12345)
|
|
||||||
.Build();
|
|
||||||
|
|
||||||
var path = @"C:\Windows\Temp";
|
|
||||||
|
|
||||||
Mocker.GetMock<DiskProvider>().Setup(s => s.CreateDirectory(path));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void WithSuccessfulDownload()
|
|
||||||
{
|
|
||||||
Mocker.GetMock<HttpProvider>().Setup(s => s.DownloadFile(It.IsAny<string>(), It.IsAny<string>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void WithFailedDownload()
|
|
||||||
{
|
|
||||||
Mocker.GetMock<HttpProvider>().Setup(s => s.DownloadFile(It.IsAny<string>(), It.IsAny<string>()))
|
|
||||||
.Throws(new WebException("Failed to download file (Mocked)"));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Download_should_return_true_when_banner_is_downloaded_successfully()
|
|
||||||
{
|
|
||||||
WithSuccessfulDownload();
|
|
||||||
var result = Mocker.Resolve<BannerProvider>().Download(_series);
|
|
||||||
result.Should().BeTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Download_should_return_false_when_banner_download_fails()
|
|
||||||
{
|
|
||||||
WithFailedDownload();
|
|
||||||
var result = Mocker.Resolve<BannerProvider>().Download(_series);
|
|
||||||
result.Should().BeFalse();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Delete_should_delete_banner_file_when_it_exists()
|
|
||||||
{
|
|
||||||
Mocker.GetMock<DiskProvider>().Setup(s => s.FileExists(It.IsAny<string>()))
|
|
||||||
.Returns(true);
|
|
||||||
|
|
||||||
Mocker.GetMock<DiskProvider>().Setup(s => s.DeleteFile(It.IsAny<string>()));
|
|
||||||
|
|
||||||
var result = Mocker.Resolve<BannerProvider>().Delete(1);
|
|
||||||
result.Should().BeTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Delete_should_return_true_even_when_file_sint_deleted()
|
|
||||||
{
|
|
||||||
Mocker.GetMock<DiskProvider>().Setup(s => s.FileExists(It.IsAny<string>()))
|
|
||||||
.Returns(false);
|
|
||||||
|
|
||||||
var result = Mocker.Resolve<BannerProvider>().Delete(1);
|
|
||||||
result.Should().BeTrue();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Delete_should_return_false_when_file_fails_to_delete()
|
|
||||||
{
|
|
||||||
Mocker.GetMock<DiskProvider>().Setup(s => s.FileExists(It.IsAny<string>()))
|
|
||||||
.Returns(true);
|
|
||||||
|
|
||||||
Mocker.GetMock<DiskProvider>().Setup(s => s.DeleteFile(It.IsAny<string>()))
|
|
||||||
.Throws(new SystemException("File not found."));
|
|
||||||
|
|
||||||
var result = Mocker.Resolve<BannerProvider>().Delete(1);
|
|
||||||
result.Should().BeFalse();
|
|
||||||
ExceptionVerification.ExpectedWarns(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -37,7 +37,7 @@ public void Setup()
|
|||||||
{
|
{
|
||||||
_series = Builder<Series>
|
_series = Builder<Series>
|
||||||
.CreateNew()
|
.CreateNew()
|
||||||
.With(s => s.SeriesType = SeriesType.Standard)
|
.With(s => s.SeriesTypes = SeriesTypes.Standard)
|
||||||
.Build();
|
.Build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ public void With80MBFile()
|
|||||||
|
|
||||||
public void WithDailySeries()
|
public void WithDailySeries()
|
||||||
{
|
{
|
||||||
_series.SeriesType = SeriesType.Daily;
|
_series.SeriesTypes = SeriesTypes.Daily;
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -149,7 +149,7 @@ public void is_in_queue_should_find_if_exact_daily_episode_is_in_queue()
|
|||||||
{
|
{
|
||||||
Quality = new QualityModel { Quality = Quality.Bluray720p, Proper = false },
|
Quality = new QualityModel { Quality = Quality.Bluray720p, Proper = false },
|
||||||
AirDate = new DateTime(2011, 12, 01),
|
AirDate = new DateTime(2011, 12, 01),
|
||||||
Series = new Series { Title = "The Dailyshow", CleanTitle = Parser.NormalizeTitle("The Dailyshow"), SeriesType = SeriesType.Daily },
|
Series = new Series { Title = "The Dailyshow", CleanTitle = Parser.NormalizeTitle("The Dailyshow"), SeriesTypes = SeriesTypes.Daily },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
|
using NzbDrone.Core.MetadataSource;
|
||||||
using NzbDrone.Core.Providers;
|
using NzbDrone.Core.Providers;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
using NzbDrone.Test.Common;
|
using NzbDrone.Test.Common;
|
||||||
@ -17,7 +18,7 @@ namespace NzbDrone.Core.Test.ProviderTests
|
|||||||
// ReSharper disable InconsistentNaming
|
// ReSharper disable InconsistentNaming
|
||||||
public class TvDbProviderTest : CoreTest
|
public class TvDbProviderTest : CoreTest
|
||||||
{
|
{
|
||||||
private TvDbProvider tvDbProvider;
|
private TvDbProxy tvDbProxy;
|
||||||
|
|
||||||
[SetUp]
|
[SetUp]
|
||||||
public void Setup()
|
public void Setup()
|
||||||
@ -25,11 +26,11 @@ public void Setup()
|
|||||||
var builder = new ContainerBuilder();
|
var builder = new ContainerBuilder();
|
||||||
|
|
||||||
builder.RegisterType<EnvironmentProvider>();
|
builder.RegisterType<EnvironmentProvider>();
|
||||||
builder.RegisterType<TvDbProvider>();
|
builder.RegisterType<TvDbProxy>();
|
||||||
|
|
||||||
var container = builder.Build();
|
var container = builder.Build();
|
||||||
|
|
||||||
tvDbProvider = container.Resolve<TvDbProvider>();
|
tvDbProxy = container.Resolve<TvDbProxy>();
|
||||||
}
|
}
|
||||||
|
|
||||||
[TearDown]
|
[TearDown]
|
||||||
@ -45,7 +46,7 @@ public void TearDown()
|
|||||||
[TestCase("Franklin & Bash")]
|
[TestCase("Franklin & Bash")]
|
||||||
public void successful_search(string title)
|
public void successful_search(string title)
|
||||||
{
|
{
|
||||||
var result = tvDbProvider.SearchSeries(title);
|
var result = tvDbProxy.SearchSeries(title);
|
||||||
|
|
||||||
result.Should().NotBeEmpty();
|
result.Should().NotBeEmpty();
|
||||||
result[0].Title.Should().Be(title);
|
result[0].Title.Should().Be(title);
|
||||||
@ -56,7 +57,7 @@ public void successful_search(string title)
|
|||||||
public void no_search_result()
|
public void no_search_result()
|
||||||
{
|
{
|
||||||
//act
|
//act
|
||||||
var result = tvDbProvider.SearchSeries(Guid.NewGuid().ToString());
|
var result = tvDbProxy.SearchSeries(Guid.NewGuid().ToString());
|
||||||
|
|
||||||
//assert
|
//assert
|
||||||
result.Should().BeEmpty();
|
result.Should().BeEmpty();
|
||||||
@ -67,7 +68,7 @@ public void no_search_result()
|
|||||||
public void none_unique_season_episode_number()
|
public void none_unique_season_episode_number()
|
||||||
{
|
{
|
||||||
//act
|
//act
|
||||||
var result = tvDbProvider.GetEpisodes(75978);//Family guy
|
var result = tvDbProxy.GetEpisodes(75978);//Family guy
|
||||||
|
|
||||||
//Asserts that when episodes are grouped by Season/Episode each group contains maximum of
|
//Asserts that when episodes are grouped by Season/Episode each group contains maximum of
|
||||||
//one item.
|
//one item.
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
using FizzWare.NBuilder;
|
using FizzWare.NBuilder;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Core.MetadataSource;
|
||||||
using NzbDrone.Core.ReferenceData;
|
using NzbDrone.Core.ReferenceData;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
using NzbDrone.Core.Model.TvRage;
|
using NzbDrone.Core.Model.TvRage;
|
||||||
@ -54,11 +55,11 @@ public void Setup()
|
|||||||
.Setup(s => s.GetCleanName(_series.Id))
|
.Setup(s => s.GetCleanName(_series.Id))
|
||||||
.Returns("");
|
.Returns("");
|
||||||
|
|
||||||
Mocker.GetMock<TvRageProvider>()
|
Mocker.GetMock<TvRageProxy>()
|
||||||
.Setup(s => s.SearchSeries(_series.Title))
|
.Setup(s => s.SearchSeries(_series.Title))
|
||||||
.Returns(_searchResults);
|
.Returns(_searchResults);
|
||||||
|
|
||||||
Mocker.GetMock<TvRageProvider>()
|
Mocker.GetMock<TvRageProxy>()
|
||||||
.Setup(s => s.GetSeries(_searchResults.First().ShowId))
|
.Setup(s => s.GetSeries(_searchResults.First().ShowId))
|
||||||
.Returns(_tvRageSeries);
|
.Returns(_tvRageSeries);
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
using FizzWare.NBuilder;
|
using FizzWare.NBuilder;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Core.MetadataSource;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
using NzbDrone.Core.Model.TvRage;
|
using NzbDrone.Core.Model.TvRage;
|
||||||
using NzbDrone.Core.Providers;
|
using NzbDrone.Core.Providers;
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
|
using NzbDrone.Core.MetadataSource;
|
||||||
using NzbDrone.Core.Providers;
|
using NzbDrone.Core.Providers;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
using NzbDrone.Test.Common;
|
using NzbDrone.Test.Common;
|
||||||
@ -38,7 +39,7 @@ private void WithOneResult()
|
|||||||
public void should_be_null_when_no_showinfo_is_returned()
|
public void should_be_null_when_no_showinfo_is_returned()
|
||||||
{
|
{
|
||||||
WithEmptyResults();
|
WithEmptyResults();
|
||||||
Mocker.Resolve<TvRageProvider>().GetSeries(100).Should().BeNull();
|
Mocker.Resolve<TvRageProxy>().GetSeries(100).Should().BeNull();
|
||||||
|
|
||||||
ExceptionVerification.ExpectedWarns(1);
|
ExceptionVerification.ExpectedWarns(1);
|
||||||
}
|
}
|
||||||
@ -47,7 +48,7 @@ public void should_be_null_when_no_showinfo_is_returned()
|
|||||||
public void should_return_series_when_showinfo_is_valid()
|
public void should_return_series_when_showinfo_is_valid()
|
||||||
{
|
{
|
||||||
WithOneResult();
|
WithOneResult();
|
||||||
var result = Mocker.Resolve<TvRageProvider>().GetSeries(29999);
|
var result = Mocker.Resolve<TvRageProxy>().GetSeries(29999);
|
||||||
|
|
||||||
result.ShowId.Should().Be(29999);
|
result.ShowId.Should().Be(29999);
|
||||||
result.Name.Should().Be("Anger Management");
|
result.Name.Should().Be("Anger Management");
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
|
using NzbDrone.Core.MetadataSource;
|
||||||
using NzbDrone.Core.Providers;
|
using NzbDrone.Core.Providers;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
using NzbDrone.Test.Common;
|
using NzbDrone.Test.Common;
|
||||||
@ -19,13 +20,13 @@ public class GetUtcOffsetFixture : CoreTest
|
|||||||
[Test]
|
[Test]
|
||||||
public void should_return_zero_if_timeZone_is_empty()
|
public void should_return_zero_if_timeZone_is_empty()
|
||||||
{
|
{
|
||||||
Mocker.Resolve<TvRageProvider>().GetUtcOffset("").Should().Be(0);
|
Mocker.Resolve<TvRageProxy>().GetUtcOffset("").Should().Be(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_return_zero_if_cannot_be_coverted_to_int()
|
public void should_return_zero_if_cannot_be_coverted_to_int()
|
||||||
{
|
{
|
||||||
Mocker.Resolve<TvRageProvider>().GetUtcOffset("adfhadfhdjaf").Should().Be(0);
|
Mocker.Resolve<TvRageProxy>().GetUtcOffset("adfhadfhdjaf").Should().Be(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestCase("GMT-5", -5)]
|
[TestCase("GMT-5", -5)]
|
||||||
@ -33,7 +34,7 @@ public void should_return_zero_if_cannot_be_coverted_to_int()
|
|||||||
[TestCase("GMT+8", 8)]
|
[TestCase("GMT+8", 8)]
|
||||||
public void should_return_offset_when_not_dst(string timezone, int expected)
|
public void should_return_offset_when_not_dst(string timezone, int expected)
|
||||||
{
|
{
|
||||||
Mocker.Resolve<TvRageProvider>().GetUtcOffset(timezone).Should().Be(expected);
|
Mocker.Resolve<TvRageProxy>().GetUtcOffset(timezone).Should().Be(expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
[TestCase("GMT-5 +DST", -4)]
|
[TestCase("GMT-5 +DST", -4)]
|
||||||
@ -41,7 +42,7 @@ public void should_return_offset_when_not_dst(string timezone, int expected)
|
|||||||
[TestCase("GMT+8 +DST", 9)]
|
[TestCase("GMT+8 +DST", 9)]
|
||||||
public void should_return_offset_plus_one_when_dst(string timezone, int expected)
|
public void should_return_offset_plus_one_when_dst(string timezone, int expected)
|
||||||
{
|
{
|
||||||
Mocker.Resolve<TvRageProvider>().GetUtcOffset(timezone).Should().Be(expected);
|
Mocker.Resolve<TvRageProxy>().GetUtcOffset(timezone).Should().Be(expected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -8,6 +8,7 @@
|
|||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
|
using NzbDrone.Core.MetadataSource;
|
||||||
using NzbDrone.Core.Providers;
|
using NzbDrone.Core.Providers;
|
||||||
using NzbDrone.Core.Test.Framework;
|
using NzbDrone.Core.Test.Framework;
|
||||||
using NzbDrone.Test.Common;
|
using NzbDrone.Test.Common;
|
||||||
@ -45,35 +46,35 @@ private void WithOneResult()
|
|||||||
public void should_be_empty_when_no_results_are_found()
|
public void should_be_empty_when_no_results_are_found()
|
||||||
{
|
{
|
||||||
WithEmptyResults();
|
WithEmptyResults();
|
||||||
Mocker.Resolve<TvRageProvider>().SearchSeries("asdasdasdasdas").Should().BeEmpty();
|
Mocker.Resolve<TvRageProxy>().SearchSeries("asdasdasdasdas").Should().BeEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_be_have_more_than_one_when_multiple_results_are_returned()
|
public void should_be_have_more_than_one_when_multiple_results_are_returned()
|
||||||
{
|
{
|
||||||
WithManyResults();
|
WithManyResults();
|
||||||
Mocker.Resolve<TvRageProvider>().SearchSeries("top+gear").Should().NotBeEmpty();
|
Mocker.Resolve<TvRageProxy>().SearchSeries("top+gear").Should().NotBeEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_have_one_when_only_one_result_is_found()
|
public void should_have_one_when_only_one_result_is_found()
|
||||||
{
|
{
|
||||||
WithOneResult();
|
WithOneResult();
|
||||||
Mocker.Resolve<TvRageProvider>().SearchSeries("suits").Should().HaveCount(1);
|
Mocker.Resolve<TvRageProxy>().SearchSeries("suits").Should().HaveCount(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void ended_should_not_have_a_value_when_series_has_not_ended()
|
public void ended_should_not_have_a_value_when_series_has_not_ended()
|
||||||
{
|
{
|
||||||
WithOneResult();
|
WithOneResult();
|
||||||
Mocker.Resolve<TvRageProvider>().SearchSeries("suits").First().Ended.HasValue.Should().BeFalse();
|
Mocker.Resolve<TvRageProxy>().SearchSeries("suits").First().Ended.HasValue.Should().BeFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void started_should_match_series()
|
public void started_should_match_series()
|
||||||
{
|
{
|
||||||
WithOneResult();
|
WithOneResult();
|
||||||
Mocker.Resolve<TvRageProvider>().SearchSeries("suits").First().Started.Should().Be(new DateTime(2011, 6, 23));
|
Mocker.Resolve<TvRageProxy>().SearchSeries("suits").First().Started.Should().Be(new DateTime(2011, 6, 23));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,81 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using NLog;
|
|
||||||
using NzbDrone.Common;
|
|
||||||
using NzbDrone.Core.Tv;
|
|
||||||
using NzbDrone.Core.Model.Notification;
|
|
||||||
using NzbDrone.Core.Providers;
|
|
||||||
using NzbDrone.Core.Providers.Core;
|
|
||||||
using NzbDrone.Core.Repository;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Jobs
|
|
||||||
{
|
|
||||||
public class BannerDownloadJob : IJob
|
|
||||||
{
|
|
||||||
private readonly ISeriesService _seriesService;
|
|
||||||
private readonly BannerProvider _bannerProvider;
|
|
||||||
private readonly ISeriesRepository _seriesRepository;
|
|
||||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
|
||||||
|
|
||||||
private const string BANNER_URL_PREFIX = "http://www.thetvdb.com/banners/";
|
|
||||||
|
|
||||||
public BannerDownloadJob(ISeriesService seriesService, BannerProvider bannerProvider, ISeriesRepository seriesRepository)
|
|
||||||
{
|
|
||||||
_seriesService = seriesService;
|
|
||||||
_bannerProvider = bannerProvider;
|
|
||||||
_seriesRepository = seriesRepository;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BannerDownloadJob()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Name
|
|
||||||
{
|
|
||||||
get { return "Banner Download"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public TimeSpan DefaultInterval
|
|
||||||
{
|
|
||||||
get { return TimeSpan.FromDays(30); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void Start(ProgressNotification notification, dynamic options)
|
|
||||||
{
|
|
||||||
Logger.Debug("Starting banner download job");
|
|
||||||
|
|
||||||
if (options != null)
|
|
||||||
{
|
|
||||||
Series series = _seriesRepository.Get((int)options.SeriesId);
|
|
||||||
|
|
||||||
if (series != null && !String.IsNullOrEmpty(series.BannerUrl))
|
|
||||||
{
|
|
||||||
DownloadBanner(notification, series);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var seriesInDb = _seriesRepository.All();
|
|
||||||
|
|
||||||
foreach (var series in seriesInDb.Where(s => !String.IsNullOrEmpty(s.BannerUrl)))
|
|
||||||
{
|
|
||||||
DownloadBanner(notification, series);
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger.Debug("Finished banner download job");
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void DownloadBanner(ProgressNotification notification, Series series)
|
|
||||||
{
|
|
||||||
notification.CurrentMessage = string.Format("Downloading banner for '{0}'", series.Title);
|
|
||||||
|
|
||||||
if (_bannerProvider.Download(series))
|
|
||||||
notification.CurrentMessage = string.Format("Successfully download banner for '{0}'", series.Title);
|
|
||||||
|
|
||||||
else
|
|
||||||
notification.CurrentMessage = string.Format("Failed to download banner for '{0}'", series.Title);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -64,7 +64,7 @@ public virtual void Start(ProgressNotification notification, dynamic options)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (episode.Series.SeriesType == SeriesType.Daily)
|
if (episode.Series.SeriesTypes == SeriesTypes.Daily)
|
||||||
{
|
{
|
||||||
if (!episode.AirDate.HasValue)
|
if (!episode.AirDate.HasValue)
|
||||||
{
|
{
|
||||||
|
@ -22,7 +22,6 @@ public class ImportNewSeriesJob : IJob
|
|||||||
private readonly IMediaFileService _mediaFileService;
|
private readonly IMediaFileService _mediaFileService;
|
||||||
private readonly UpdateInfoJob _updateInfoJob;
|
private readonly UpdateInfoJob _updateInfoJob;
|
||||||
private readonly DiskScanJob _diskScanJob;
|
private readonly DiskScanJob _diskScanJob;
|
||||||
private readonly BannerDownloadJob _bannerDownloadJob;
|
|
||||||
private readonly ISeasonRepository _seasonRepository;
|
private readonly ISeasonRepository _seasonRepository;
|
||||||
private readonly XemUpdateJob _xemUpdateJob;
|
private readonly XemUpdateJob _xemUpdateJob;
|
||||||
private readonly ISeriesRepository _seriesRepository;
|
private readonly ISeriesRepository _seriesRepository;
|
||||||
@ -34,15 +33,14 @@ public class ImportNewSeriesJob : IJob
|
|||||||
|
|
||||||
public ImportNewSeriesJob(ISeriesService seriesService, IEpisodeService episodeService,
|
public ImportNewSeriesJob(ISeriesService seriesService, IEpisodeService episodeService,
|
||||||
IMediaFileService mediaFileService, UpdateInfoJob updateInfoJob,
|
IMediaFileService mediaFileService, UpdateInfoJob updateInfoJob,
|
||||||
DiskScanJob diskScanJob, BannerDownloadJob bannerDownloadJob,
|
DiskScanJob diskScanJob,
|
||||||
ISeasonRepository seasonRepository, XemUpdateJob xemUpdateJob, ISeriesRepository seriesRepository,ISeasonService seasonService)
|
ISeasonRepository seasonRepository, XemUpdateJob xemUpdateJob, ISeriesRepository seriesRepository, ISeasonService seasonService)
|
||||||
{
|
{
|
||||||
_seriesService = seriesService;
|
_seriesService = seriesService;
|
||||||
_episodeService = episodeService;
|
_episodeService = episodeService;
|
||||||
_mediaFileService = mediaFileService;
|
_mediaFileService = mediaFileService;
|
||||||
_updateInfoJob = updateInfoJob;
|
_updateInfoJob = updateInfoJob;
|
||||||
_diskScanJob = diskScanJob;
|
_diskScanJob = diskScanJob;
|
||||||
_bannerDownloadJob = bannerDownloadJob;
|
|
||||||
_seasonRepository = seasonRepository;
|
_seasonRepository = seasonRepository;
|
||||||
_xemUpdateJob = xemUpdateJob;
|
_xemUpdateJob = xemUpdateJob;
|
||||||
_seriesRepository = seriesRepository;
|
_seriesRepository = seriesRepository;
|
||||||
@ -86,9 +84,6 @@ private void ScanSeries(ProgressNotification notification)
|
|||||||
var updatedSeries = _seriesRepository.Get(((ModelBase)currentSeries).Id);
|
var updatedSeries = _seriesRepository.Get(((ModelBase)currentSeries).Id);
|
||||||
AutoIgnoreSeasons(((ModelBase)updatedSeries).Id);
|
AutoIgnoreSeasons(((ModelBase)updatedSeries).Id);
|
||||||
|
|
||||||
//Download the banner for the new series
|
|
||||||
_bannerDownloadJob.Start(notification, new { SeriesId = ((ModelBase)updatedSeries).Id });
|
|
||||||
|
|
||||||
//Get Scene Numbering if applicable
|
//Get Scene Numbering if applicable
|
||||||
_xemUpdateJob.Start(notification, new { SeriesId = ((ModelBase)updatedSeries).Id });
|
_xemUpdateJob.Start(notification, new { SeriesId = ((ModelBase)updatedSeries).Id });
|
||||||
|
|
||||||
|
18
NzbDrone.Core/MediaCover/MediaCover.cs
Normal file
18
NzbDrone.Core/MediaCover/MediaCover.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.MediaCover
|
||||||
|
{
|
||||||
|
|
||||||
|
public enum MediaCoverTypes
|
||||||
|
{
|
||||||
|
Poster = 0,
|
||||||
|
Banner = 1,
|
||||||
|
Fanart = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MediaCover
|
||||||
|
{
|
||||||
|
public MediaCoverTypes CoverType { get; set; }
|
||||||
|
public string Url { get; set; }
|
||||||
|
}
|
||||||
|
}
|
68
NzbDrone.Core/MediaCover/MediaCoverService.cs
Normal file
68
NzbDrone.Core/MediaCover/MediaCoverService.cs
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using NLog;
|
||||||
|
using NzbDrone.Common;
|
||||||
|
using NzbDrone.Common.Eventing;
|
||||||
|
using NzbDrone.Core.Tv;
|
||||||
|
using NzbDrone.Core.Tv.Events;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.MediaCover
|
||||||
|
{
|
||||||
|
public class MediaCoverService : IHandle<SeriesUpdatedEvent>
|
||||||
|
{
|
||||||
|
private readonly HttpProvider _httpProvider;
|
||||||
|
private readonly DiskProvider _diskProvider;
|
||||||
|
private readonly Logger _logger;
|
||||||
|
|
||||||
|
private readonly string _coverRootFolder;
|
||||||
|
|
||||||
|
private const string COVER_URL_PREFIX = "http://www.thetvdb.com/banners/";
|
||||||
|
|
||||||
|
public MediaCoverService(HttpProvider httpProvider, DiskProvider diskProvider, EnvironmentProvider environmentProvider, Logger logger)
|
||||||
|
{
|
||||||
|
_httpProvider = httpProvider;
|
||||||
|
_diskProvider = diskProvider;
|
||||||
|
_logger = logger;
|
||||||
|
|
||||||
|
_coverRootFolder = environmentProvider.GetMediaCoverPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Handle(SeriesUpdatedEvent message)
|
||||||
|
{
|
||||||
|
EnsureCovers(message.Series);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EnsureCovers(Series series)
|
||||||
|
{
|
||||||
|
foreach (var cover in series.Covers)
|
||||||
|
{
|
||||||
|
var fileName = GetCoverPath(series.Id, cover.CoverType);
|
||||||
|
if (!_diskProvider.FileExists(fileName))
|
||||||
|
{
|
||||||
|
DownloadCover(series, cover);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DownloadCover(Series series, MediaCover cover)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var fileName = GetCoverPath(series.Id, cover.CoverType);
|
||||||
|
|
||||||
|
_logger.Info("Downloading {0} for {1}", cover.CoverType, series.Title);
|
||||||
|
_httpProvider.DownloadFile(COVER_URL_PREFIX + cover.Url, fileName);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_logger.ErrorException("Couldn't download media cover for " + series.TvDbId, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetCoverPath(int seriesId, MediaCoverTypes coverTypes)
|
||||||
|
{
|
||||||
|
return Path.Combine(_coverRootFolder, seriesId.ToString("0000"), coverTypes.ToString().ToLower() + ".jpg");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -132,7 +132,7 @@ public string GetNewFilename(IList<Episode> episodes, Series series, Quality qua
|
|||||||
result += series.Title + separatorStyle.Pattern;
|
result += series.Title + separatorStyle.Pattern;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (series.SeriesType == SeriesType.Standard)
|
if (series.SeriesTypes == SeriesTypes.Standard)
|
||||||
{
|
{
|
||||||
result += numberStyle.Pattern.Replace("%0e",
|
result += numberStyle.Pattern.Replace("%0e",
|
||||||
String.Format("{0:00}", sortedEpisodes.First().EpisodeNumber));
|
String.Format("{0:00}", sortedEpisodes.First().EpisodeNumber));
|
||||||
|
@ -3,12 +3,13 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using NLog;
|
using NLog;
|
||||||
|
using NzbDrone.Core.MediaCover;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Providers
|
namespace NzbDrone.Core.MetadataSource
|
||||||
{
|
{
|
||||||
public class TvDbProvider
|
public class TvDbProxy
|
||||||
{
|
{
|
||||||
public const string TVDB_APIKEY = "5D2D188E86E07F4F";
|
public const string TVDB_APIKEY = "5D2D188E86E07F4F";
|
||||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||||
@ -18,7 +19,7 @@ public class TvDbProvider
|
|||||||
private readonly Tvdb.Tvdb _handlerV2;
|
private readonly Tvdb.Tvdb _handlerV2;
|
||||||
|
|
||||||
|
|
||||||
public TvDbProvider()
|
public TvDbProxy()
|
||||||
{
|
{
|
||||||
_handlerV2 = new Tvdb.Tvdb(TVDB_APIKEY);
|
_handlerV2 = new Tvdb.Tvdb(TVDB_APIKEY);
|
||||||
}
|
}
|
||||||
@ -64,7 +65,23 @@ public virtual Series GetSeries(int tvDbSeriesId)
|
|||||||
series.Runtime = Convert.ToInt32(tvDbSeries.Runtime);
|
series.Runtime = Convert.ToInt32(tvDbSeries.Runtime);
|
||||||
}
|
}
|
||||||
|
|
||||||
series.BannerUrl = tvDbSeries.banner;
|
series.Covers = new List<MediaCover.MediaCover>();
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(tvDbSeries.banner))
|
||||||
|
{
|
||||||
|
series.Covers.Add(new MediaCover.MediaCover { CoverType = MediaCoverTypes.Banner, Url = tvDbSeries.banner });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(tvDbSeries.fanart))
|
||||||
|
{
|
||||||
|
series.Covers.Add(new MediaCover.MediaCover { CoverType = MediaCoverTypes.Fanart, Url = tvDbSeries.fanart });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(tvDbSeries.poster))
|
||||||
|
{
|
||||||
|
series.Covers.Add(new MediaCover.MediaCover { CoverType = MediaCoverTypes.Poster, Url = tvDbSeries.poster });
|
||||||
|
}
|
||||||
|
|
||||||
series.Network = tvDbSeries.Network;
|
series.Network = tvDbSeries.Network;
|
||||||
|
|
||||||
if (tvDbSeries.FirstAired.HasValue && tvDbSeries.FirstAired.Value.Year > 1900)
|
if (tvDbSeries.FirstAired.HasValue && tvDbSeries.FirstAired.Value.Year > 1900)
|
@ -1,29 +1,27 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Providers;
|
||||||
using NzbDrone.Core.ReferenceData;
|
using NzbDrone.Core.ReferenceData;
|
||||||
using NzbDrone.Core.Tv;
|
using NzbDrone.Core.Tv;
|
||||||
using NzbDrone.Core.Model.TvRage;
|
using NzbDrone.Core.Model.TvRage;
|
||||||
using NzbDrone.Core.Repository;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Providers
|
namespace NzbDrone.Core.MetadataSource
|
||||||
{
|
{
|
||||||
public class TvRageMappingProvider
|
public class TvRageMappingProvider
|
||||||
{
|
{
|
||||||
private readonly SceneMappingService _sceneMappingService;
|
private readonly SceneMappingService _sceneMappingService;
|
||||||
private readonly TvRageProvider _tvRageProvider;
|
private readonly TvRageProxy _tvRageProxy;
|
||||||
private readonly IEpisodeService _episodeService;
|
private readonly IEpisodeService _episodeService;
|
||||||
|
|
||||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
public TvRageMappingProvider(SceneMappingService sceneMappingService,
|
public TvRageMappingProvider(SceneMappingService sceneMappingService,
|
||||||
TvRageProvider tvRageProvider, IEpisodeService episodeService)
|
TvRageProxy tvRageProxy, IEpisodeService episodeService)
|
||||||
{
|
{
|
||||||
_sceneMappingService = sceneMappingService;
|
_sceneMappingService = sceneMappingService;
|
||||||
_tvRageProvider = tvRageProvider;
|
_tvRageProxy = tvRageProxy;
|
||||||
_episodeService = episodeService;
|
_episodeService = episodeService;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,7 +34,7 @@ public Series FindMatchingTvRageSeries(Series series)
|
|||||||
var firstEpisode = _episodeService.GetEpisode(series.Id, 1, 1);
|
var firstEpisode = _episodeService.GetEpisode(series.Id, 1, 1);
|
||||||
|
|
||||||
var cleanName = _sceneMappingService.GetCleanName(series.Id);
|
var cleanName = _sceneMappingService.GetCleanName(series.Id);
|
||||||
var results = _tvRageProvider.SearchSeries(series.Title);
|
var results = _tvRageProxy.SearchSeries(series.Title);
|
||||||
var result = ProcessResults(results, series, cleanName, firstEpisode);
|
var result = ProcessResults(results, series, cleanName, firstEpisode);
|
||||||
|
|
||||||
if (result != null)
|
if (result != null)
|
||||||
@ -44,7 +42,7 @@ public Series FindMatchingTvRageSeries(Series series)
|
|||||||
logger.Trace("TV Rage: {0} matches TVDB: {1}", result.Name, series.Title);
|
logger.Trace("TV Rage: {0} matches TVDB: {1}", result.Name, series.Title);
|
||||||
series.TvRageId = result.ShowId;
|
series.TvRageId = result.ShowId;
|
||||||
series.TvRageTitle = result.Name;
|
series.TvRageTitle = result.Name;
|
||||||
series.UtcOffset = _tvRageProvider.GetSeries(result.ShowId).UtcOffset;
|
series.UtcOffset = _tvRageProxy.GetSeries(result.ShowId).UtcOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
return series;
|
return series;
|
@ -1,27 +1,26 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Common;
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Core.Helpers;
|
using NzbDrone.Core.Helpers;
|
||||||
using NzbDrone.Core.Model.TvRage;
|
using NzbDrone.Core.Model.TvRage;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Providers
|
namespace NzbDrone.Core.MetadataSource
|
||||||
{
|
{
|
||||||
public class TvRageProvider
|
public class TvRageProxy
|
||||||
{
|
{
|
||||||
private readonly HttpProvider _httpProvider;
|
private readonly HttpProvider _httpProvider;
|
||||||
private const string TVRAGE_APIKEY = "NW4v0PSmQIoVmpbASLdD";
|
private const string TVRAGE_APIKEY = "NW4v0PSmQIoVmpbASLdD";
|
||||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
public TvRageProvider(HttpProvider httpProvider)
|
public TvRageProxy(HttpProvider httpProvider)
|
||||||
{
|
{
|
||||||
_httpProvider = httpProvider;
|
_httpProvider = httpProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TvRageProvider()
|
public TvRageProxy()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
@ -91,7 +91,7 @@ public string GetDownloadTitle()
|
|||||||
return seasonResult;
|
return seasonResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Series.SeriesType == SeriesType.Daily)
|
if (Series.SeriesTypes == SeriesTypes.Daily)
|
||||||
{
|
{
|
||||||
var dailyResult = String.Format("{0} - {1:yyyy-MM-dd} - {2} [{3}]", seriesTitle,
|
var dailyResult = String.Format("{0} - {1:yyyy-MM-dd} - {2} [{3}]", seriesTitle,
|
||||||
AirDate, Episodes.First().Title, Quality.Quality);
|
AirDate, Episodes.First().Title, Quality.Quality);
|
||||||
|
@ -232,6 +232,7 @@
|
|||||||
<Compile Include="Jobs\RefreshEpsiodeMetadata.cs" />
|
<Compile Include="Jobs\RefreshEpsiodeMetadata.cs" />
|
||||||
<Compile Include="Jobs\PastWeekBacklogSearchJob.cs" />
|
<Compile Include="Jobs\PastWeekBacklogSearchJob.cs" />
|
||||||
<Compile Include="Lifecycle\IInitializable.cs" />
|
<Compile Include="Lifecycle\IInitializable.cs" />
|
||||||
|
<Compile Include="MediaCover\MediaCover.cs" />
|
||||||
<Compile Include="MediaFiles\MediaFileRepository.cs" />
|
<Compile Include="MediaFiles\MediaFileRepository.cs" />
|
||||||
<Compile Include="Model\DownloadClientType.cs" />
|
<Compile Include="Model\DownloadClientType.cs" />
|
||||||
<Compile Include="Instrumentation\LogService.cs" />
|
<Compile Include="Instrumentation\LogService.cs" />
|
||||||
@ -264,6 +265,7 @@
|
|||||||
<Compile Include="Tv\Events\EpisodeInfoUpdatedEvent.cs" />
|
<Compile Include="Tv\Events\EpisodeInfoUpdatedEvent.cs" />
|
||||||
<Compile Include="Tv\Events\EpisodeInfoAddedEvent.cs" />
|
<Compile Include="Tv\Events\EpisodeInfoAddedEvent.cs" />
|
||||||
<Compile Include="Tv\Events\SeriesAddedEvent.cs" />
|
<Compile Include="Tv\Events\SeriesAddedEvent.cs" />
|
||||||
|
<Compile Include="Tv\Events\SeriesUpdatedEvent.cs" />
|
||||||
<Compile Include="Tv\SeasonRepository.cs" />
|
<Compile Include="Tv\SeasonRepository.cs" />
|
||||||
<Compile Include="Tv\SeriesRepository.cs" />
|
<Compile Include="Tv\SeriesRepository.cs" />
|
||||||
<Compile Include="Tv\QualityModel.cs" />
|
<Compile Include="Tv\QualityModel.cs" />
|
||||||
@ -294,7 +296,7 @@
|
|||||||
<Compile Include="Model\Xem\XemSceneTvdbMapping.cs" />
|
<Compile Include="Model\Xem\XemSceneTvdbMapping.cs" />
|
||||||
<Compile Include="Model\Xem\XemValues.cs" />
|
<Compile Include="Model\Xem\XemValues.cs" />
|
||||||
<Compile Include="AutofacSignalrDependencyResolver.cs" />
|
<Compile Include="AutofacSignalrDependencyResolver.cs" />
|
||||||
<Compile Include="Providers\BannerProvider.cs" />
|
<Compile Include="MediaCover\MediaCoverService.cs" />
|
||||||
<Compile Include="DecisionEngine\LanguageSpecification.cs" />
|
<Compile Include="DecisionEngine\LanguageSpecification.cs" />
|
||||||
<Compile Include="Providers\DownloadClients\NzbgetProvider.cs" />
|
<Compile Include="Providers\DownloadClients\NzbgetProvider.cs" />
|
||||||
<Compile Include="Providers\MediaInfoProvider.cs" />
|
<Compile Include="Providers\MediaInfoProvider.cs" />
|
||||||
@ -321,7 +323,6 @@
|
|||||||
<Compile Include="Jobs\RenameSeriesJob.cs" />
|
<Compile Include="Jobs\RenameSeriesJob.cs" />
|
||||||
<Compile Include="Lifecycle\AppUpdateJob.cs" />
|
<Compile Include="Lifecycle\AppUpdateJob.cs" />
|
||||||
<Compile Include="Jobs\BacklogSearchJob.cs" />
|
<Compile Include="Jobs\BacklogSearchJob.cs" />
|
||||||
<Compile Include="Jobs\BannerDownloadJob.cs" />
|
|
||||||
<Compile Include="Jobs\ConvertEpisodeJob.cs" />
|
<Compile Include="Jobs\ConvertEpisodeJob.cs" />
|
||||||
<Compile Include="Jobs\SeriesSearchJob.cs" />
|
<Compile Include="Jobs\SeriesSearchJob.cs" />
|
||||||
<Compile Include="Jobs\SeasonSearchJob.cs" />
|
<Compile Include="Jobs\SeasonSearchJob.cs" />
|
||||||
@ -337,8 +338,8 @@
|
|||||||
<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\TvRageMappingProvider.cs" />
|
<Compile Include="MetadataSource\TvRageMappingProvider.cs" />
|
||||||
<Compile Include="Providers\TvRageProvider.cs" />
|
<Compile Include="MetadataSource\TvRageProxy.cs" />
|
||||||
<Compile Include="Providers\XemCommunicationProvider.cs" />
|
<Compile Include="Providers\XemCommunicationProvider.cs" />
|
||||||
<Compile Include="Providers\XemProvider.cs" />
|
<Compile Include="Providers\XemProvider.cs" />
|
||||||
<Compile Include="Qualities\Quality.cs" />
|
<Compile Include="Qualities\Quality.cs" />
|
||||||
@ -504,7 +505,7 @@
|
|||||||
<Compile Include="Providers\SmtpProvider.cs">
|
<Compile Include="Providers\SmtpProvider.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Providers\TvDbProvider.cs">
|
<Compile Include="MetadataSource\TvDbProxy.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Providers\TwitterProvider.cs">
|
<Compile Include="Providers\TwitterProvider.cs">
|
||||||
|
@ -1,102 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using NLog;
|
|
||||||
using NzbDrone.Common;
|
|
||||||
using NzbDrone.Core.Datastore;
|
|
||||||
using NzbDrone.Core.Tv;
|
|
||||||
using NzbDrone.Core.Model.Notification;
|
|
||||||
using NzbDrone.Core.Repository;
|
|
||||||
|
|
||||||
namespace NzbDrone.Core.Providers
|
|
||||||
{
|
|
||||||
public class BannerProvider
|
|
||||||
{
|
|
||||||
private readonly HttpProvider _httpProvider;
|
|
||||||
private readonly EnvironmentProvider _environmentProvider;
|
|
||||||
private readonly DiskProvider _diskProvider;
|
|
||||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
|
||||||
|
|
||||||
private const string BANNER_URL_PREFIX = "http://www.thetvdb.com/banners/";
|
|
||||||
|
|
||||||
public BannerProvider(HttpProvider httpProvider, EnvironmentProvider environmentProvider,
|
|
||||||
DiskProvider diskProvider)
|
|
||||||
{
|
|
||||||
_httpProvider = httpProvider;
|
|
||||||
_environmentProvider = environmentProvider;
|
|
||||||
_diskProvider = diskProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BannerProvider()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual bool Download(Series series)
|
|
||||||
{
|
|
||||||
var bannerPath = _environmentProvider.GetBannerPath();
|
|
||||||
|
|
||||||
logger.Trace("Ensuring Banner Folder exists: ", bannerPath);
|
|
||||||
_diskProvider.CreateDirectory(bannerPath);
|
|
||||||
|
|
||||||
var bannerFilename = Path.Combine(bannerPath, series.Id.ToString()) + ".jpg";
|
|
||||||
|
|
||||||
logger.Trace("Downloading banner for '{0}'", series.Title);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_httpProvider.DownloadFile(BANNER_URL_PREFIX + series.BannerUrl, bannerFilename);
|
|
||||||
logger.Trace("Successfully download banner for '{0}'", series.Title);
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
logger.Debug("Failed to download banner for '{0}'", series.Title);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual bool Delete(int seriesId)
|
|
||||||
{
|
|
||||||
var bannerPath = _environmentProvider.GetBannerPath();
|
|
||||||
var bannerFilename = Path.Combine(bannerPath, seriesId.ToString()) + ".jpg";
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
logger.Trace("Checking if banner exists: {0}", bannerFilename);
|
|
||||||
|
|
||||||
if (_diskProvider.FileExists(bannerFilename))
|
|
||||||
{
|
|
||||||
logger.Trace("Deleting existing banner: {0}", bannerFilename);
|
|
||||||
_diskProvider.DeleteFile(bannerFilename);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(Exception ex)
|
|
||||||
{
|
|
||||||
logger.WarnException("Failed to delete banner: " + bannerFilename, ex);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void Download(string remotePath, string filename)
|
|
||||||
{
|
|
||||||
var url = BANNER_URL_PREFIX + remotePath;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_httpProvider.DownloadFile(url, filename);
|
|
||||||
logger.Trace("Successfully download banner from '{0}' to '{1}'", url, filename);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
var message = String.Format("Failed to download Banner from '{0}' to '{1}'", url, filename);
|
|
||||||
logger.DebugException(message, ex);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -117,7 +117,7 @@ public virtual EpisodeFile ImportFile(Series series, string filePath)
|
|||||||
var size = _diskProvider.GetSize(filePath);
|
var size = _diskProvider.GetSize(filePath);
|
||||||
var runTime = _mediaInfoProvider.GetRunTime(filePath);
|
var runTime = _mediaInfoProvider.GetRunTime(filePath);
|
||||||
|
|
||||||
if (series.SeriesType == SeriesType.Daily || parseResult.SeasonNumber > 0)
|
if (series.SeriesTypes == SeriesTypes.Daily || parseResult.SeasonNumber > 0)
|
||||||
{
|
{
|
||||||
if (size < Constants.IgnoreFileSize && runTime < 180)
|
if (size < Constants.IgnoreFileSize && runTime < 180)
|
||||||
{
|
{
|
||||||
|
@ -43,7 +43,7 @@ public virtual bool IsInQueue(EpisodeParseResult newParseResult)
|
|||||||
var matchingTitleWithQuality = matchigTitle.Where(q => q.ParseResult.Quality >= newParseResult.Quality);
|
var matchingTitleWithQuality = matchigTitle.Where(q => q.ParseResult.Quality >= newParseResult.Quality);
|
||||||
|
|
||||||
|
|
||||||
if (newParseResult.Series.SeriesType == SeriesType.Daily)
|
if (newParseResult.Series.SeriesTypes == SeriesTypes.Daily)
|
||||||
{
|
{
|
||||||
return matchingTitleWithQuality.Any(q => q.ParseResult.AirDate.Value.Date == newParseResult.AirDate.Value.Date);
|
return matchingTitleWithQuality.Any(q => q.ParseResult.AirDate.Value.Date == newParseResult.AirDate.Value.Date);
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ public virtual bool IsInQueue(EpisodeParseResult newParseResult)
|
|||||||
|
|
||||||
var matchingTitleWithQuality = matchigTitle.Where(q => q.ParseResult.Quality >= newParseResult.Quality);
|
var matchingTitleWithQuality = matchigTitle.Where(q => q.ParseResult.Quality >= newParseResult.Quality);
|
||||||
|
|
||||||
if (newParseResult.Series.SeriesType == SeriesType.Daily)
|
if (newParseResult.Series.SeriesTypes == SeriesTypes.Daily)
|
||||||
{
|
{
|
||||||
return matchingTitleWithQuality.Any(q => q.ParseResult.AirDate.Value.Date == newParseResult.AirDate.Value.Date);
|
return matchingTitleWithQuality.Any(q => q.ParseResult.AirDate.Value.Date == newParseResult.AirDate.Value.Date);
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ public virtual List<int> SeasonSearch(ProgressNotification notification, int ser
|
|||||||
return new List<int>();
|
return new List<int>();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (series.SeriesType == SeriesType.Daily)
|
if (series.SeriesTypes == SeriesTypes.Daily)
|
||||||
{
|
{
|
||||||
logger.Trace("Daily series detected, skipping season search: {0}", series.Title);
|
logger.Trace("Daily series detected, skipping season search: {0}", series.Title);
|
||||||
return new List<int>();
|
return new List<int>();
|
||||||
@ -75,7 +75,7 @@ public virtual List<int> PartialSeasonSearch(ProgressNotification notification,
|
|||||||
return new List<int>();
|
return new List<int>();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (series.SeriesType == SeriesType.Daily)
|
if (series.SeriesTypes == SeriesTypes.Daily)
|
||||||
{
|
{
|
||||||
logger.Trace("Daily series detected, skipping season search: {0}", series.Title);
|
logger.Trace("Daily series detected, skipping season search: {0}", series.Title);
|
||||||
return new List<int>();
|
return new List<int>();
|
||||||
|
@ -24,7 +24,7 @@ public virtual void UpdateDailySeries()
|
|||||||
|
|
||||||
if (series != null)
|
if (series != null)
|
||||||
{
|
{
|
||||||
_seriesService.SetSeriesType(series.Id, SeriesType.Daily);
|
_seriesService.SetSeriesType(series.Id, SeriesTypes.Daily);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@ public override string ToString()
|
|||||||
{
|
{
|
||||||
string seriesTitle = Series == null ? "[NULL]" : Series.Title;
|
string seriesTitle = Series == null ? "[NULL]" : Series.Title;
|
||||||
|
|
||||||
if (Series != null && Series.SeriesType == SeriesType.Daily && AirDate.HasValue)
|
if (Series != null && Series.SeriesTypes == SeriesTypes.Daily && AirDate.HasValue)
|
||||||
return string.Format("{0} - {1:yyyy-MM-dd}", seriesTitle, AirDate.Value);
|
return string.Format("{0} - {1:yyyy-MM-dd}", seriesTitle, AirDate.Value);
|
||||||
|
|
||||||
return string.Format("{0} - S{1:00}E{2:00}", seriesTitle, SeasonNumber, EpisodeNumber);
|
return string.Format("{0} - S{1:00}E{2:00}", seriesTitle, SeasonNumber, EpisodeNumber);
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
using NzbDrone.Common.Eventing;
|
using NzbDrone.Common.Eventing;
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
using NzbDrone.Core.Download;
|
using NzbDrone.Core.Download;
|
||||||
|
using NzbDrone.Core.MetadataSource;
|
||||||
using NzbDrone.Core.Model;
|
using NzbDrone.Core.Model;
|
||||||
using NzbDrone.Core.Providers;
|
using NzbDrone.Core.Providers;
|
||||||
using NzbDrone.Core.Tv.Events;
|
using NzbDrone.Core.Tv.Events;
|
||||||
@ -39,14 +40,14 @@ public class EpisodeService : IEpisodeService, IHandle<EpisodeGrabbedEvent>
|
|||||||
|
|
||||||
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
private readonly TvDbProvider _tvDbProvider;
|
private readonly TvDbProxy _tvDbProxy;
|
||||||
private readonly ISeasonRepository _seasonRepository;
|
private readonly ISeasonRepository _seasonRepository;
|
||||||
private readonly IEpisodeRepository _episodeRepository;
|
private readonly IEpisodeRepository _episodeRepository;
|
||||||
private readonly IEventAggregator _eventAggregator;
|
private readonly IEventAggregator _eventAggregator;
|
||||||
|
|
||||||
public EpisodeService(TvDbProvider tvDbProviderProvider, ISeasonRepository seasonRepository, IEpisodeRepository episodeRepository, IEventAggregator eventAggregator)
|
public EpisodeService(TvDbProxy tvDbProxyProxy, ISeasonRepository seasonRepository, IEpisodeRepository episodeRepository, IEventAggregator eventAggregator)
|
||||||
{
|
{
|
||||||
_tvDbProvider = tvDbProviderProvider;
|
_tvDbProxy = tvDbProxyProxy;
|
||||||
_seasonRepository = seasonRepository;
|
_seasonRepository = seasonRepository;
|
||||||
_episodeRepository = episodeRepository;
|
_episodeRepository = episodeRepository;
|
||||||
_eventAggregator = eventAggregator;
|
_eventAggregator = eventAggregator;
|
||||||
@ -89,7 +90,7 @@ public List<Episode> GetEpisodesByParseResult(EpisodeParseResult parseResult)
|
|||||||
|
|
||||||
if (parseResult.AirDate.HasValue)
|
if (parseResult.AirDate.HasValue)
|
||||||
{
|
{
|
||||||
if (parseResult.Series.SeriesType == SeriesType.Standard)
|
if (parseResult.Series.SeriesTypes == SeriesTypes.Standard)
|
||||||
{
|
{
|
||||||
//Todo: Collect this as a Series we want to treat as a daily series, or possible parsing error
|
//Todo: Collect this as a Series we want to treat as a daily series, or possible parsing error
|
||||||
logger.Warn("Found daily-style episode for non-daily series: {0}. {1}", parseResult.Series.Title, parseResult.OriginalString);
|
logger.Warn("Found daily-style episode for non-daily series: {0}. {1}", parseResult.Series.Title, parseResult.OriginalString);
|
||||||
@ -182,7 +183,7 @@ public void RefreshEpisodeInfo(Series series)
|
|||||||
var successCount = 0;
|
var successCount = 0;
|
||||||
var failCount = 0;
|
var failCount = 0;
|
||||||
|
|
||||||
var tvdbEpisodes = _tvDbProvider.GetEpisodes(series.TvDbId);
|
var tvdbEpisodes = _tvDbProxy.GetEpisodes(series.TvDbId);
|
||||||
|
|
||||||
var seriesEpisodes = GetEpisodeBySeries(series.Id);
|
var seriesEpisodes = GetEpisodeBySeries(series.Id);
|
||||||
var updateList = new List<Episode>();
|
var updateList = new List<Episode>();
|
||||||
|
15
NzbDrone.Core/Tv/Events/SeriesUpdatedEvent.cs
Normal file
15
NzbDrone.Core/Tv/Events/SeriesUpdatedEvent.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using NzbDrone.Common.Eventing;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Tv.Events
|
||||||
|
{
|
||||||
|
public class SeriesUpdatedEvent : IEvent
|
||||||
|
{
|
||||||
|
public Series Series { get; private set; }
|
||||||
|
|
||||||
|
public SeriesUpdatedEvent(Series series)
|
||||||
|
{
|
||||||
|
Series = series;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -9,10 +9,10 @@
|
|||||||
|
|
||||||
namespace NzbDrone.Core.Tv
|
namespace NzbDrone.Core.Tv
|
||||||
{
|
{
|
||||||
public enum SeriesType
|
public enum SeriesTypes
|
||||||
{
|
{
|
||||||
Standard =0,
|
Standard = 0,
|
||||||
Daily =1,
|
Daily = 1,
|
||||||
Anime = 2,
|
Anime = 2,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,8 +35,8 @@ public class Series : ModelBase
|
|||||||
public DateTime? LastInfoSync { get; set; }
|
public DateTime? LastInfoSync { get; set; }
|
||||||
public DateTime? LastDiskSync { get; set; }
|
public DateTime? LastDiskSync { get; set; }
|
||||||
public int Runtime { get; set; }
|
public int Runtime { get; set; }
|
||||||
public string BannerUrl { get; set; }
|
public List<MediaCover.MediaCover> Covers { get; set; }
|
||||||
public SeriesType SeriesType { get; set; }
|
public SeriesTypes SeriesTypes { get; set; }
|
||||||
public BacklogSettingType BacklogSetting { get; set; }
|
public BacklogSettingType BacklogSetting { get; set; }
|
||||||
public string Network { get; set; }
|
public string Network { get; set; }
|
||||||
public DateTime? CustomStartDate { get; set; }
|
public DateTime? CustomStartDate { get; set; }
|
||||||
|
@ -11,7 +11,7 @@ public interface ISeriesRepository : IBasicRepository<Series>
|
|||||||
List<Series> Search(string title);
|
List<Series> Search(string title);
|
||||||
Series GetByTitle(string cleanTitle);
|
Series GetByTitle(string cleanTitle);
|
||||||
Series FindByTvdbId(int tvdbId);
|
Series FindByTvdbId(int tvdbId);
|
||||||
void SetSeriesType(int seriesId, SeriesType seriesType);
|
void SetSeriesType(int seriesId, SeriesTypes seriesTypes);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,9 +42,9 @@ public Series FindByTvdbId(int tvdbId)
|
|||||||
return Queryable.SingleOrDefault(s => s.TvDbId == tvdbId);
|
return Queryable.SingleOrDefault(s => s.TvDbId == tvdbId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetSeriesType(int seriesId, SeriesType seriesType)
|
public void SetSeriesType(int seriesId, SeriesTypes seriesTypes)
|
||||||
{
|
{
|
||||||
ObjectDatabase.UpdateField(new Series(){Id = seriesId, SeriesType =seriesType }, "SeriesType");
|
ObjectDatabase.UpdateField(new Series(){Id = seriesId, SeriesTypes =seriesTypes }, "SeriesType");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -6,6 +6,7 @@
|
|||||||
using NzbDrone.Common.Eventing;
|
using NzbDrone.Common.Eventing;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Datastore;
|
using NzbDrone.Core.Datastore;
|
||||||
|
using NzbDrone.Core.MetadataSource;
|
||||||
using NzbDrone.Core.Model;
|
using NzbDrone.Core.Model;
|
||||||
using NzbDrone.Core.Providers;
|
using NzbDrone.Core.Providers;
|
||||||
using NzbDrone.Core.Qualities;
|
using NzbDrone.Core.Qualities;
|
||||||
@ -22,14 +23,14 @@ public interface ISeriesService
|
|||||||
void AddSeries(string title, string path, int tvDbSeriesId, int qualityProfileId, DateTime? airedAfter);
|
void AddSeries(string title, string path, int tvDbSeriesId, int qualityProfileId, DateTime? airedAfter);
|
||||||
void UpdateFromSeriesEditor(IList<Series> editedSeries);
|
void UpdateFromSeriesEditor(IList<Series> editedSeries);
|
||||||
Series FindByTvdbId(int tvdbId);
|
Series FindByTvdbId(int tvdbId);
|
||||||
void SetSeriesType(int seriesId, SeriesType seriesType);
|
void SetSeriesType(int seriesId, SeriesTypes seriesTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SeriesService : ISeriesService
|
public class SeriesService : ISeriesService
|
||||||
{
|
{
|
||||||
private readonly ISeriesRepository _seriesRepository;
|
private readonly ISeriesRepository _seriesRepository;
|
||||||
private readonly IConfigService _configService;
|
private readonly IConfigService _configService;
|
||||||
private readonly TvDbProvider _tvDbProvider;
|
private readonly TvDbProxy _tvDbProxy;
|
||||||
private readonly TvRageMappingProvider _tvRageMappingProvider;
|
private readonly TvRageMappingProvider _tvRageMappingProvider;
|
||||||
private readonly IEventAggregator _eventAggregator;
|
private readonly IEventAggregator _eventAggregator;
|
||||||
private readonly IQualityProfileService _qualityProfileService;
|
private readonly IQualityProfileService _qualityProfileService;
|
||||||
@ -39,12 +40,12 @@ public class SeriesService : ISeriesService
|
|||||||
private readonly SceneMappingService _sceneNameMappingService;
|
private readonly SceneMappingService _sceneNameMappingService;
|
||||||
|
|
||||||
public SeriesService(ISeriesRepository seriesRepository, IConfigService configServiceService,
|
public SeriesService(ISeriesRepository seriesRepository, IConfigService configServiceService,
|
||||||
TvDbProvider tvDbProviderProvider, SceneMappingService sceneNameMappingService,
|
TvDbProxy tvDbProxyProxy, SceneMappingService sceneNameMappingService,
|
||||||
TvRageMappingProvider tvRageMappingProvider, IEventAggregator eventAggregator, IQualityProfileService qualityProfileService)
|
TvRageMappingProvider tvRageMappingProvider, IEventAggregator eventAggregator, IQualityProfileService qualityProfileService)
|
||||||
{
|
{
|
||||||
_seriesRepository = seriesRepository;
|
_seriesRepository = seriesRepository;
|
||||||
_configService = configServiceService;
|
_configService = configServiceService;
|
||||||
_tvDbProvider = tvDbProviderProvider;
|
_tvDbProxy = tvDbProxyProxy;
|
||||||
_sceneNameMappingService = sceneNameMappingService;
|
_sceneNameMappingService = sceneNameMappingService;
|
||||||
_tvRageMappingProvider = tvRageMappingProvider;
|
_tvRageMappingProvider = tvRageMappingProvider;
|
||||||
_eventAggregator = eventAggregator;
|
_eventAggregator = eventAggregator;
|
||||||
@ -61,7 +62,7 @@ public bool IsMonitored(int id)
|
|||||||
public Series UpdateSeriesInfo(int seriesId)
|
public Series UpdateSeriesInfo(int seriesId)
|
||||||
{
|
{
|
||||||
var series = _seriesRepository.Get(seriesId);
|
var series = _seriesRepository.Get(seriesId);
|
||||||
var tvDbSeries = _tvDbProvider.GetSeries(series.TvDbId);
|
var tvDbSeries = _tvDbProxy.GetSeries(series.TvDbId);
|
||||||
|
|
||||||
series.Title = tvDbSeries.Title;
|
series.Title = tvDbSeries.Title;
|
||||||
series.AirTime = tvDbSeries.AirTime;
|
series.AirTime = tvDbSeries.AirTime;
|
||||||
@ -71,7 +72,7 @@ public Series UpdateSeriesInfo(int seriesId)
|
|||||||
series.CleanTitle = tvDbSeries.CleanTitle;
|
series.CleanTitle = tvDbSeries.CleanTitle;
|
||||||
series.LastInfoSync = DateTime.Now;
|
series.LastInfoSync = DateTime.Now;
|
||||||
series.Runtime = tvDbSeries.Runtime;
|
series.Runtime = tvDbSeries.Runtime;
|
||||||
series.BannerUrl = tvDbSeries.BannerUrl;
|
series.Covers = tvDbSeries.Covers;
|
||||||
series.Network = tvDbSeries.Network;
|
series.Network = tvDbSeries.Network;
|
||||||
series.FirstAired = tvDbSeries.FirstAired;
|
series.FirstAired = tvDbSeries.FirstAired;
|
||||||
|
|
||||||
@ -88,6 +89,8 @@ public Series UpdateSeriesInfo(int seriesId)
|
|||||||
|
|
||||||
_seriesRepository.Update(series);
|
_seriesRepository.Update(series);
|
||||||
|
|
||||||
|
_eventAggregator.Publish(new SeriesUpdatedEvent(series));
|
||||||
|
|
||||||
return series;
|
return series;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,9 +162,9 @@ public Series FindByTvdbId(int tvdbId)
|
|||||||
return _seriesRepository.FindByTvdbId(tvdbId);
|
return _seriesRepository.FindByTvdbId(tvdbId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetSeriesType(int seriesId, SeriesType seriesType)
|
public void SetSeriesType(int seriesId, SeriesTypes seriesTypes)
|
||||||
{
|
{
|
||||||
_seriesRepository.SetSeriesType(seriesId, seriesType);
|
_seriesRepository.SetSeriesType(seriesId, seriesTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,10 +16,9 @@ protected static void InitLogging()
|
|||||||
if (LogManager.Configuration == null || LogManager.Configuration is XmlLoggingConfiguration)
|
if (LogManager.Configuration == null || LogManager.Configuration is XmlLoggingConfiguration)
|
||||||
{
|
{
|
||||||
LogManager.Configuration = new LoggingConfiguration();
|
LogManager.Configuration = new LoggingConfiguration();
|
||||||
var consoleTarget = new ConsoleTarget();
|
var consoleTarget = new ConsoleTarget { Layout = "${message} ${exception}" };
|
||||||
consoleTarget.Layout = "${message} ${exception}";
|
|
||||||
LogManager.Configuration.AddTarget(consoleTarget.GetType().Name, consoleTarget);
|
LogManager.Configuration.AddTarget(consoleTarget.GetType().Name, consoleTarget);
|
||||||
LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", consoleTarget));
|
LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, consoleTarget));
|
||||||
|
|
||||||
RegisterExceptionVerification();
|
RegisterExceptionVerification();
|
||||||
}
|
}
|
||||||
@ -29,7 +28,7 @@ private static void RegisterExceptionVerification()
|
|||||||
{
|
{
|
||||||
var exceptionVerification = new ExceptionVerification();
|
var exceptionVerification = new ExceptionVerification();
|
||||||
LogManager.Configuration.AddTarget("ExceptionVerification", exceptionVerification);
|
LogManager.Configuration.AddTarget("ExceptionVerification", exceptionVerification);
|
||||||
LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Trace, exceptionVerification));
|
LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Warn, exceptionVerification));
|
||||||
}
|
}
|
||||||
|
|
||||||
[SetUp]
|
[SetUp]
|
||||||
|
@ -49,6 +49,8 @@ public void TestBaseSetup()
|
|||||||
|
|
||||||
Mocker.SetConstant(LogManager.GetLogger("TestLogger"));
|
Mocker.SetConstant(LogManager.GetLogger("TestLogger"));
|
||||||
|
|
||||||
|
LogManager.ReconfigExistingLoggers();
|
||||||
|
|
||||||
TempFolder = Path.Combine(Directory.GetCurrentDirectory(), "_temp_" + DateTime.Now.Ticks);
|
TempFolder = Path.Combine(Directory.GetCurrentDirectory(), "_temp_" + DateTime.Now.Ticks);
|
||||||
|
|
||||||
MockedRestProvider = new Mock<RestProvider>();
|
MockedRestProvider = new Mock<RestProvider>();
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
<FileVersion>1</FileVersion>
|
<FileVersion>1</FileVersion>
|
||||||
<AutoEnableOnStartup>False</AutoEnableOnStartup>
|
<AutoEnableOnStartup>False</AutoEnableOnStartup>
|
||||||
<AllowParallelTestExecution>true</AllowParallelTestExecution>
|
<AllowParallelTestExecution>true</AllowParallelTestExecution>
|
||||||
|
<AllowTestsToRunInParallelWithThemselves>true</AllowTestsToRunInParallelWithThemselves>
|
||||||
<FrameworkUtilisationTypeForNUnit>UseDynamicAnalysis</FrameworkUtilisationTypeForNUnit>
|
<FrameworkUtilisationTypeForNUnit>UseDynamicAnalysis</FrameworkUtilisationTypeForNUnit>
|
||||||
<FrameworkUtilisationTypeForGallio>Disabled</FrameworkUtilisationTypeForGallio>
|
<FrameworkUtilisationTypeForGallio>Disabled</FrameworkUtilisationTypeForGallio>
|
||||||
<FrameworkUtilisationTypeForMSpec>Disabled</FrameworkUtilisationTypeForMSpec>
|
<FrameworkUtilisationTypeForMSpec>Disabled</FrameworkUtilisationTypeForMSpec>
|
||||||
|
Loading…
Reference in New Issue
Block a user