Fixed a bug where reports weren't being added to history
This commit is contained in:
parent
f3be5fa08e
commit
500e9af6c3
|
@ -0,0 +1,55 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using AutoMoq;
|
||||
using FizzWare.NBuilder;
|
||||
using Gallio.Framework;
|
||||
using MbUnit.Framework;
|
||||
using MbUnit.Framework.ContractVerifiers;
|
||||
using Moq;
|
||||
using NzbDrone.Core.Model;
|
||||
using NzbDrone.Core.Providers;
|
||||
using NzbDrone.Core.Repository;
|
||||
|
||||
// ReSharper disable InconsistentNaming
|
||||
namespace NzbDrone.Core.Test
|
||||
{
|
||||
[TestFixture]
|
||||
public class DownloadProviderTest
|
||||
{
|
||||
[Test]
|
||||
public void Download_report_should_send_to_sab_and_add_to_history()
|
||||
{
|
||||
var mocker = new AutoMoqer(MockBehavior.Strict);
|
||||
var parseResult = Builder<EpisodeParseResult>.CreateNew()
|
||||
.With(e => e.Episodes = Builder<Episode>.CreateListOfSize(2)
|
||||
.WhereTheFirst(1).Has(s => s.EpisodeId = 12)
|
||||
.AndTheNext(1).Has(s => s.EpisodeId = 99)
|
||||
.Build())
|
||||
.Build();
|
||||
|
||||
const string sabTitle = "My fake sab title";
|
||||
mocker.GetMock<SabProvider>()
|
||||
.Setup(s => s.IsInQueue(It.IsAny<String>()))
|
||||
.Returns(false);
|
||||
|
||||
mocker.GetMock<SabProvider>()
|
||||
.Setup(s => s.AddByUrl(parseResult.NzbUrl, sabTitle))
|
||||
.Returns(true);
|
||||
|
||||
mocker.GetMock<SabProvider>()
|
||||
.Setup(s => s.GetSabTitle(parseResult))
|
||||
.Returns(sabTitle);
|
||||
|
||||
mocker.GetMock<HistoryProvider>()
|
||||
.Setup(s => s.Add(It.Is<History>(h=>h.EpisodeId == 12)));
|
||||
mocker.GetMock<HistoryProvider>()
|
||||
.Setup(s => s.Add(It.Is<History>(h => h.EpisodeId == 99)));
|
||||
|
||||
mocker.Resolve<DownloadProvider>().DownloadReport(parseResult);
|
||||
|
||||
|
||||
mocker.VerifyAllMocks();
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
|
@ -41,7 +41,8 @@ namespace NzbDrone.Core.Test
|
|||
.Setup(c => c.GetSettings(It.IsAny<Type>()))
|
||||
.Returns(fakeSettings);
|
||||
|
||||
var parseResults = mocker.Resolve<MockIndexer>().Fetch();
|
||||
var mockIndexer = mocker.Resolve<MockIndexer>();
|
||||
var parseResults = mockIndexer.Fetch();
|
||||
|
||||
foreach (var episodeParseResult in parseResults)
|
||||
{
|
||||
|
@ -51,6 +52,11 @@ namespace NzbDrone.Core.Test
|
|||
|
||||
|
||||
Assert.IsNotEmpty(parseResults);
|
||||
|
||||
Assert.ForAll(parseResults, s => Assert.AreEqual(mockIndexer.Name, s.Indexer));
|
||||
Assert.ForAll(parseResults, s => Assert.AreNotEqual("", s.NzbTitle));
|
||||
Assert.ForAll(parseResults, s => Assert.AreNotEqual(null, s.NzbTitle));
|
||||
|
||||
ExceptionVerification.ExcpectedWarns(warns);
|
||||
}
|
||||
|
||||
|
@ -70,7 +76,8 @@ namespace NzbDrone.Core.Test
|
|||
.Setup(c => c.GetSettings(It.IsAny<Type>()))
|
||||
.Returns(fakeSettings);
|
||||
|
||||
var parseResults = mocker.Resolve<Newzbin>().Fetch();
|
||||
var newzbinProvider = mocker.Resolve<Newzbin>();
|
||||
var parseResults = newzbinProvider.Fetch();
|
||||
|
||||
foreach (var episodeParseResult in parseResults)
|
||||
{
|
||||
|
@ -80,6 +87,10 @@ namespace NzbDrone.Core.Test
|
|||
|
||||
|
||||
Assert.IsNotEmpty(parseResults);
|
||||
Assert.ForAll(parseResults, s => Assert.AreEqual(newzbinProvider.Name, s.Indexer));
|
||||
Assert.ForAll(parseResults, s => Assert.AreNotEqual("", s.NzbTitle));
|
||||
Assert.ForAll(parseResults, s => Assert.AreNotEqual(null, s.NzbTitle));
|
||||
|
||||
ExceptionVerification.ExcpectedWarns(1);
|
||||
}
|
||||
|
||||
|
@ -111,7 +122,7 @@ namespace NzbDrone.Core.Test
|
|||
Assert.IsNotNull(result);
|
||||
Assert.AreEqual(summary, result.EpisodeTitle);
|
||||
Assert.AreEqual(season, result.SeasonNumber);
|
||||
Assert.AreEqual(episode, result.Episodes[0]);
|
||||
Assert.AreEqual(episode, result.EpisodeNumbers[0]);
|
||||
Assert.AreEqual(quality, result.Quality);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,37 +23,56 @@ namespace NzbDrone.Core.Test
|
|||
// ReSharper disable InconsistentNaming
|
||||
public class InventoryProviderTest : TestBase
|
||||
{
|
||||
private EpisodeParseResult parseResult;
|
||||
private EpisodeParseResult parseResultMulti;
|
||||
private Series series;
|
||||
private Episode episode;
|
||||
private Episode episode2;
|
||||
private EpisodeParseResult parseResultSingle;
|
||||
|
||||
[SetUp]
|
||||
public new void Setup()
|
||||
{
|
||||
parseResult = new EpisodeParseResult()
|
||||
parseResultMulti = new EpisodeParseResult()
|
||||
{
|
||||
CleanTitle = "Title",
|
||||
EpisodeTitle = "EpisodeTitle",
|
||||
Language = LanguageType.English,
|
||||
Proper = true,
|
||||
Quality = QualityTypes.Bluray720,
|
||||
Episodes = new List<int> { 3 },
|
||||
EpisodeNumbers = new List<int> { 3, 4 },
|
||||
SeasonNumber = 12,
|
||||
AirDate = DateTime.Now.AddDays(-12).Date
|
||||
|
||||
};
|
||||
|
||||
parseResultSingle = new EpisodeParseResult()
|
||||
{
|
||||
CleanTitle = "Title",
|
||||
EpisodeTitle = "EpisodeTitle",
|
||||
Language = LanguageType.English,
|
||||
Proper = true,
|
||||
Quality = QualityTypes.Bluray720,
|
||||
EpisodeNumbers = new List<int> { 3 },
|
||||
SeasonNumber = 12,
|
||||
AirDate = DateTime.Now.AddDays(-12).Date
|
||||
};
|
||||
|
||||
series = Builder<Series>.CreateNew()
|
||||
.With(c => c.Monitored = true)
|
||||
.With(d => d.CleanTitle = parseResult.CleanTitle)
|
||||
.With(d => d.CleanTitle = parseResultMulti.CleanTitle)
|
||||
.Build();
|
||||
|
||||
episode = Builder<Episode>.CreateNew()
|
||||
.With(c => c.EpisodeNumber = parseResult.Episodes[0])
|
||||
.With(c => c.SeasonNumber = parseResult.SeasonNumber)
|
||||
.With(c => c.AirDate = parseResult.AirDate)
|
||||
.With(c => c.EpisodeNumber = parseResultMulti.EpisodeNumbers[0])
|
||||
.With(c => c.SeasonNumber = parseResultMulti.SeasonNumber)
|
||||
.With(c => c.AirDate = parseResultMulti.AirDate)
|
||||
.Build();
|
||||
|
||||
episode2 = Builder<Episode>.CreateNew()
|
||||
.With(c => c.EpisodeNumber = parseResultMulti.EpisodeNumbers[1])
|
||||
.With(c => c.SeasonNumber = parseResultMulti.SeasonNumber)
|
||||
.With(c => c.AirDate = parseResultMulti.AirDate)
|
||||
.Build();
|
||||
|
||||
base.Setup();
|
||||
|
||||
}
|
||||
|
@ -71,7 +90,7 @@ namespace NzbDrone.Core.Test
|
|||
.Returns(series);
|
||||
|
||||
//Act
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResult);
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResultMulti);
|
||||
|
||||
//Assert
|
||||
Assert.IsFalse(result);
|
||||
|
@ -90,7 +109,7 @@ namespace NzbDrone.Core.Test
|
|||
.Returns<Series>(null);
|
||||
|
||||
//Act
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResult);
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResultMulti);
|
||||
|
||||
//Assert
|
||||
Assert.IsFalse(result);
|
||||
|
@ -107,12 +126,12 @@ namespace NzbDrone.Core.Test
|
|||
.Returns(series);
|
||||
|
||||
mocker.GetMock<SeriesProvider>()
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResult.Quality))
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResultMulti.Quality))
|
||||
.Returns(false);
|
||||
|
||||
|
||||
//Act
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResult);
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResultMulti);
|
||||
|
||||
//Assert
|
||||
Assert.IsFalse(result);
|
||||
|
@ -131,15 +150,15 @@ namespace NzbDrone.Core.Test
|
|||
.Returns(series);
|
||||
|
||||
mocker.GetMock<SeriesProvider>()
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResult.Quality))
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResultMulti.Quality))
|
||||
.Returns(true);
|
||||
|
||||
mocker.GetMock<SeasonProvider>()
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResult.SeasonNumber))
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResultMulti.SeasonNumber))
|
||||
.Returns(true);
|
||||
|
||||
//Act
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResult);
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResultMulti);
|
||||
|
||||
//Assert
|
||||
Assert.IsFalse(result);
|
||||
|
@ -163,21 +182,29 @@ namespace NzbDrone.Core.Test
|
|||
.Setup(p => p.GetEpisode(episode.SeriesId, episode.SeasonNumber, episode.EpisodeNumber))
|
||||
.Returns(episode);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
.Setup(p => p.GetEpisode(episode2.SeriesId, episode2.SeasonNumber, episode2.EpisodeNumber))
|
||||
.Returns(episode2);
|
||||
|
||||
|
||||
mocker.GetMock<SeriesProvider>()
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResult.Quality))
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResultMulti.Quality))
|
||||
.Returns(true);
|
||||
|
||||
mocker.GetMock<SeasonProvider>()
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResult.SeasonNumber))
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResultMulti.SeasonNumber))
|
||||
.Returns(false);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
.Setup(p => p.IsNeeded(parseResult, episode))
|
||||
.Setup(p => p.IsNeeded(parseResultMulti, episode))
|
||||
.Returns(false);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
.Setup(p => p.IsNeeded(parseResultMulti, episode2))
|
||||
.Returns(false);
|
||||
|
||||
//Act
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResult);
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResultMulti);
|
||||
|
||||
//Assert
|
||||
Assert.IsFalse(result);
|
||||
|
@ -198,25 +225,24 @@ namespace NzbDrone.Core.Test
|
|||
.Setup(p => p.GetEpisode(episode.SeriesId, episode.SeasonNumber, episode.EpisodeNumber))
|
||||
.Returns(episode);
|
||||
|
||||
|
||||
mocker.GetMock<SeriesProvider>()
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResult.Quality))
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResultSingle.Quality))
|
||||
.Returns(true);
|
||||
|
||||
mocker.GetMock<SeasonProvider>()
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResult.SeasonNumber))
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResultSingle.SeasonNumber))
|
||||
.Returns(false);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
.Setup(p => p.IsNeeded(parseResult, episode))
|
||||
.Setup(p => p.IsNeeded(parseResultSingle, episode))
|
||||
.Returns(true);
|
||||
|
||||
mocker.GetMock<HistoryProvider>()
|
||||
.Setup(p => p.Exists(episode.EpisodeId, parseResult.Quality, parseResult.Proper))
|
||||
.Setup(p => p.Exists(episode.EpisodeId, parseResultSingle.Quality, parseResultSingle.Proper))
|
||||
.Returns(true);
|
||||
|
||||
//Act
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResult);
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResultSingle);
|
||||
|
||||
//Assert
|
||||
Assert.IsFalse(result);
|
||||
|
@ -242,19 +268,19 @@ namespace NzbDrone.Core.Test
|
|||
|
||||
|
||||
mocker.GetMock<SeriesProvider>()
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResult.Quality))
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResultSingle.Quality))
|
||||
.Returns(true);
|
||||
|
||||
mocker.GetMock<SeasonProvider>()
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResult.SeasonNumber))
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResultSingle.SeasonNumber))
|
||||
.Returns(false);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
.Setup(p => p.IsNeeded(parseResult, episode))
|
||||
.Setup(p => p.IsNeeded(parseResultSingle, episode))
|
||||
.Returns(false);
|
||||
|
||||
//Act
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResult);
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResultSingle);
|
||||
|
||||
//Assert
|
||||
Assert.IsFalse(result);
|
||||
|
@ -272,11 +298,11 @@ namespace NzbDrone.Core.Test
|
|||
.Returns(series);
|
||||
|
||||
mocker.GetMock<SeriesProvider>()
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResult.Quality))
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResultSingle.Quality))
|
||||
.Returns(true);
|
||||
|
||||
mocker.GetMock<SeasonProvider>()
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResult.SeasonNumber))
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResultSingle.SeasonNumber))
|
||||
.Returns(false);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
|
@ -292,11 +318,11 @@ namespace NzbDrone.Core.Test
|
|||
.Returns(12);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
.Setup(p => p.IsNeeded(parseResult, It.IsAny<Episode>()))
|
||||
.Setup(p => p.IsNeeded(parseResultSingle, It.IsAny<Episode>()))
|
||||
.Returns(false);
|
||||
|
||||
//Act
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResult);
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResultSingle);
|
||||
|
||||
//Assert
|
||||
Assert.IsFalse(result);
|
||||
|
@ -305,7 +331,7 @@ namespace NzbDrone.Core.Test
|
|||
|
||||
|
||||
[Test]
|
||||
public void file_needed_should_return_true()
|
||||
public void first_file_needed_should_return_true()
|
||||
{
|
||||
var mocker = new AutoMoqer(MockBehavior.Strict);
|
||||
|
||||
|
@ -317,30 +343,83 @@ namespace NzbDrone.Core.Test
|
|||
.Setup(p => p.GetEpisode(episode.SeriesId, episode.SeasonNumber, episode.EpisodeNumber))
|
||||
.Returns(episode);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
.Setup(p => p.GetEpisode(episode2.SeriesId, episode2.SeasonNumber, episode2.EpisodeNumber))
|
||||
.Returns(episode2);
|
||||
|
||||
mocker.GetMock<SeriesProvider>()
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResult.Quality))
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResultMulti.Quality))
|
||||
.Returns(true);
|
||||
|
||||
mocker.GetMock<SeasonProvider>()
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResult.SeasonNumber))
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResultMulti.SeasonNumber))
|
||||
.Returns(false);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
.Setup(p => p.IsNeeded(parseResult, episode))
|
||||
.Setup(p => p.IsNeeded(parseResultMulti, episode))
|
||||
.Returns(true);
|
||||
|
||||
mocker.GetMock<HistoryProvider>()
|
||||
.Setup(p => p.Exists(episode.EpisodeId, parseResult.Quality, parseResult.Proper))
|
||||
.Setup(p => p.Exists(episode.EpisodeId, parseResultMulti.Quality, parseResultMulti.Proper))
|
||||
.Returns(false);
|
||||
|
||||
//Act
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResult);
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResultMulti);
|
||||
|
||||
//Assert
|
||||
Assert.IsTrue(result);
|
||||
Assert.IsNotNull(parseResult.Series);
|
||||
Assert.AreEqual(series, parseResult.Series);
|
||||
Assert.Contains(parseResultMulti.Episodes, episode);
|
||||
Assert.Contains(parseResultMulti.Episodes, episode2);
|
||||
Assert.AreEqual(series, parseResultMulti.Series);
|
||||
mocker.VerifyAllMocks();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void second_file_needed_should_return_true()
|
||||
{
|
||||
var mocker = new AutoMoqer(MockBehavior.Strict);
|
||||
|
||||
mocker.GetMock<SeriesProvider>()
|
||||
.Setup(p => p.FindSeries(It.IsAny<String>()))
|
||||
.Returns(series);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
.Setup(p => p.GetEpisode(episode.SeriesId, episode.SeasonNumber, episode.EpisodeNumber))
|
||||
.Returns(episode);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
.Setup(p => p.GetEpisode(episode2.SeriesId, episode2.SeasonNumber, episode2.EpisodeNumber))
|
||||
.Returns(episode2);
|
||||
|
||||
|
||||
mocker.GetMock<SeriesProvider>()
|
||||
.Setup(p => p.QualityWanted(series.SeriesId, parseResultMulti.Quality))
|
||||
.Returns(true);
|
||||
|
||||
mocker.GetMock<SeasonProvider>()
|
||||
.Setup(p => p.IsIgnored(series.SeriesId, parseResultMulti.SeasonNumber))
|
||||
.Returns(false);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
.Setup(p => p.IsNeeded(parseResultMulti, episode))
|
||||
.Returns(false);
|
||||
|
||||
mocker.GetMock<EpisodeProvider>()
|
||||
.Setup(p => p.IsNeeded(parseResultMulti, episode2))
|
||||
.Returns(true);
|
||||
|
||||
mocker.GetMock<HistoryProvider>()
|
||||
.Setup(p => p.Exists(episode2.EpisodeId, parseResultMulti.Quality, parseResultMulti.Proper))
|
||||
.Returns(false);
|
||||
|
||||
//Act
|
||||
var result = mocker.Resolve<InventoryProvider>().IsNeeded(parseResultMulti);
|
||||
|
||||
//Assert
|
||||
Assert.IsTrue(result);
|
||||
Assert.Contains(parseResultMulti.Episodes, episode);
|
||||
Assert.Contains(parseResultMulti.Episodes, episode2);
|
||||
Assert.AreEqual(series, parseResultMulti.Series);
|
||||
mocker.VerifyAllMocks();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ namespace NzbDrone.Core.Test
|
|||
[Test]
|
||||
public void Run_Jobs_Updates_Last_Execution()
|
||||
{
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { new FakeJob() };
|
||||
IList<IJob> fakeJobs = new List<IJob> { new FakeJob() };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(MockLib.GetEmptyRepository());
|
||||
|
@ -39,7 +39,7 @@ namespace NzbDrone.Core.Test
|
|||
public void Run_Jobs_Updates_Last_Execution_Mark_as_unsuccesful()
|
||||
{
|
||||
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { new BrokenJob() };
|
||||
IList<IJob> fakeJobs = new List<IJob> { new BrokenJob() };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(MockLib.GetEmptyRepository());
|
||||
|
@ -63,7 +63,7 @@ namespace NzbDrone.Core.Test
|
|||
//after execution so the job can successfully run.
|
||||
public void can_run_job_again()
|
||||
{
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { new FakeJob() };
|
||||
IList<IJob> fakeJobs = new List<IJob> { new FakeJob() };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(MockLib.GetEmptyRepository());
|
||||
|
@ -84,7 +84,7 @@ namespace NzbDrone.Core.Test
|
|||
//after execution so the job can successfully run.
|
||||
public void can_run_async_job_again()
|
||||
{
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { new FakeJob() };
|
||||
IList<IJob> fakeJobs = new List<IJob> { new FakeJob() };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(MockLib.GetEmptyRepository());
|
||||
|
@ -106,7 +106,7 @@ namespace NzbDrone.Core.Test
|
|||
//after execution so the job can successfully run.
|
||||
public void no_concurent_jobs()
|
||||
{
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { new SlowJob() };
|
||||
IList<IJob> fakeJobs = new List<IJob> { new SlowJob() };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(MockLib.GetEmptyRepository());
|
||||
|
@ -129,7 +129,7 @@ namespace NzbDrone.Core.Test
|
|||
//after execution so the job can successfully run.
|
||||
public void can_run_broken_async_job_again()
|
||||
{
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { new BrokenJob() };
|
||||
IList<IJob> fakeJobs = new List<IJob> { new BrokenJob() };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(MockLib.GetEmptyRepository());
|
||||
|
@ -152,7 +152,7 @@ namespace NzbDrone.Core.Test
|
|||
//after execution so the job can successfully run.
|
||||
public void can_run_two_jobs_at_the_same_time()
|
||||
{
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { new SlowJob() };
|
||||
IList<IJob> fakeJobs = new List<IJob> { new SlowJob() };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(MockLib.GetEmptyRepository());
|
||||
|
@ -186,7 +186,7 @@ namespace NzbDrone.Core.Test
|
|||
{
|
||||
var slowJob = new SlowJob();
|
||||
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { slowJob };
|
||||
IList<IJob> fakeJobs = new List<IJob> { slowJob };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(MockLib.GetEmptyRepository());
|
||||
|
@ -214,7 +214,7 @@ namespace NzbDrone.Core.Test
|
|||
public void Init_Jobs()
|
||||
{
|
||||
var fakeTimer = new FakeJob();
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { fakeTimer };
|
||||
IList<IJob> fakeJobs = new List<IJob> { fakeTimer };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(MockLib.GetEmptyRepository());
|
||||
|
@ -245,7 +245,7 @@ namespace NzbDrone.Core.Test
|
|||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
var fakeTimer = new FakeJob();
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { fakeTimer };
|
||||
IList<IJob> fakeJobs = new List<IJob> { fakeTimer };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(repo);
|
||||
|
@ -276,7 +276,7 @@ namespace NzbDrone.Core.Test
|
|||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
var disabledJob = new DisabledJob();
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { disabledJob };
|
||||
IList<IJob> fakeJobs = new List<IJob> { disabledJob };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(repo);
|
||||
|
@ -302,7 +302,7 @@ namespace NzbDrone.Core.Test
|
|||
[Test]
|
||||
public void Get_Next_Execution_Time()
|
||||
{
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { new FakeJob() };
|
||||
IList<IJob> fakeJobs = new List<IJob> { new FakeJob() };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(MockLib.GetEmptyRepository());
|
||||
|
@ -327,7 +327,7 @@ namespace NzbDrone.Core.Test
|
|||
|
||||
|
||||
var disabledJob = new DisabledJob();
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { disabledJob };
|
||||
IList<IJob> fakeJobs = new List<IJob> { disabledJob };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(repo);
|
||||
|
@ -348,7 +348,7 @@ namespace NzbDrone.Core.Test
|
|||
[Test]
|
||||
public void SingleId_do_not_update_last_execution()
|
||||
{
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { new FakeJob() };
|
||||
IList<IJob> fakeJobs = new List<IJob> { new FakeJob() };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(MockLib.GetEmptyRepository());
|
||||
|
@ -369,7 +369,7 @@ namespace NzbDrone.Core.Test
|
|||
[Test]
|
||||
public void SingleId_do_not_set_success()
|
||||
{
|
||||
IEnumerable<IJob> fakeJobs = new List<IJob> { new FakeJob() };
|
||||
IList<IJob> fakeJobs = new List<IJob> { new FakeJob() };
|
||||
var mocker = new AutoMoqer();
|
||||
|
||||
mocker.SetConstant(MockLib.GetEmptyRepository());
|
||||
|
|
|
@ -116,7 +116,7 @@ namespace NzbDrone.Core.Test
|
|||
|
||||
//Currently can't verify this since the list of episodes are loaded
|
||||
//Dynamically by SubSonic
|
||||
//Assert.AreEqual(fakeEpisode, result.Episodes[0]);
|
||||
//Assert.AreEqual(fakeEpisode, result.EpisodeNumbers[0]);
|
||||
|
||||
Assert.AreEqual(fakeEpisode.SeriesId, result.SeriesId);
|
||||
Assert.AreEqual(QualityTypes.HDTV, result.Quality);
|
||||
|
|
|
@ -85,6 +85,7 @@
|
|||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="DownloadProviderTest.cs" />
|
||||
<Compile Include="EpisodeStatusTest.cs" />
|
||||
<Compile Include="ImportNewSeriesJobTest.cs" />
|
||||
<Compile Include="DiskScanJobTest.cs" />
|
||||
|
|
|
@ -46,9 +46,9 @@ namespace NzbDrone.Core.Test
|
|||
{
|
||||
var result = Parser.ParseEpisodeInfo(postTitle);
|
||||
Assert.AreEqual(season, result.SeasonNumber);
|
||||
Assert.AreEqual(episode, result.Episodes[0]);
|
||||
Assert.AreEqual(episode, result.EpisodeNumbers[0]);
|
||||
Assert.AreEqual(Parser.NormalizeTitle(title), result.CleanTitle);
|
||||
Assert.AreEqual(1, result.Episodes.Count);
|
||||
Assert.AreEqual(1, result.EpisodeNumbers.Count);
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
@ -60,9 +60,9 @@ namespace NzbDrone.Core.Test
|
|||
public void file_path_parse(string path, int season, int episode)
|
||||
{
|
||||
var result = Parser.ParseEpisodeInfo(path);
|
||||
Assert.Count(1, result.Episodes);
|
||||
Assert.Count(1, result.EpisodeNumbers);
|
||||
Assert.AreEqual(season, result.SeasonNumber);
|
||||
Assert.AreEqual(episode, result.Episodes[0]);
|
||||
Assert.AreEqual(episode, result.EpisodeNumbers[0]);
|
||||
}
|
||||
|
||||
|
||||
|
@ -110,10 +110,10 @@ namespace NzbDrone.Core.Test
|
|||
{
|
||||
var result = Parser.ParseEpisodeInfo(postTitle);
|
||||
Assert.AreEqual(season, result.SeasonNumber);
|
||||
Assert.Count(episodes.Length, result.Episodes);
|
||||
Assert.AreElementsEqualIgnoringOrder(episodes, result.Episodes);
|
||||
Assert.Count(episodes.Length, result.EpisodeNumbers);
|
||||
Assert.AreElementsEqualIgnoringOrder(episodes, result.EpisodeNumbers);
|
||||
Assert.AreEqual(Parser.NormalizeTitle(title), result.CleanTitle);
|
||||
Assert.AreEqual(count, result.Episodes.Count);
|
||||
Assert.AreEqual(count, result.EpisodeNumbers.Count);
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
@ -129,7 +129,7 @@ namespace NzbDrone.Core.Test
|
|||
var airDate = new DateTime(year, month, day);
|
||||
Assert.AreEqual(Parser.NormalizeTitle(title), result.CleanTitle);
|
||||
Assert.AreEqual(airDate, result.AirDate);
|
||||
Assert.IsNull(result.Episodes);
|
||||
Assert.IsNull(result.EpisodeNumbers);
|
||||
}
|
||||
|
||||
|
||||
|
@ -142,7 +142,7 @@ namespace NzbDrone.Core.Test
|
|||
var result = Parser.ParseEpisodeInfo(postTitle);
|
||||
Assert.AreEqual(season, result.SeasonNumber);
|
||||
Assert.AreEqual(Parser.NormalizeTitle(title), result.CleanTitle);
|
||||
Assert.AreEqual(0, result.Episodes.Count);
|
||||
Assert.AreEqual(0, result.EpisodeNumbers.Count);
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
|
|
@ -229,7 +229,7 @@ namespace NzbDrone.Core.Test
|
|||
var parsResult = new EpisodeParseResult()
|
||||
{
|
||||
AirDate = DateTime.Now,
|
||||
Episodes = episodes.ToList(),
|
||||
EpisodeNumbers = episodes.ToList(),
|
||||
Proper = proper,
|
||||
Quality = quality,
|
||||
SeasonNumber = seasons,
|
||||
|
|
|
@ -11,7 +11,7 @@ namespace NzbDrone.Core.Model
|
|||
|
||||
internal int SeasonNumber { get; set; }
|
||||
|
||||
internal List<int> Episodes { get; set; }
|
||||
internal List<int> EpisodeNumbers { get; set; }
|
||||
|
||||
internal string EpisodeTitle { get; set; }
|
||||
|
||||
|
@ -25,15 +25,21 @@ namespace NzbDrone.Core.Model
|
|||
|
||||
public string NzbUrl { get; set; }
|
||||
|
||||
public string NzbTitle { get; set; }
|
||||
|
||||
public Series Series { get; set; }
|
||||
|
||||
public IList<Episode> Episodes { get; set; }
|
||||
|
||||
public String Indexer { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
if (Episodes == null)
|
||||
if (EpisodeNumbers == null)
|
||||
return string.Format("{0} - {1}", CleanTitle, AirDate.Date);
|
||||
|
||||
return string.Format("{0} - S{1:00}E{2}", CleanTitle, SeasonNumber,
|
||||
String.Join("-", Episodes));
|
||||
String.Join("-", EpisodeNumbers));
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ namespace NzbDrone.Core
|
|||
Proper = title.ToLower().Contains("proper"),
|
||||
CleanTitle = seriesName,
|
||||
SeasonNumber = season,
|
||||
Episodes = new List<int>()
|
||||
EpisodeNumbers = new List<int>()
|
||||
};
|
||||
|
||||
foreach (Match matchGroup in match)
|
||||
|
@ -83,7 +83,7 @@ namespace NzbDrone.Core
|
|||
|
||||
for (int i = first; i <= last; i++)
|
||||
{
|
||||
parsedEpisode.Episodes.Add(i);
|
||||
parsedEpisode.EpisodeNumbers.Add(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,11 +13,15 @@ namespace NzbDrone.Core.Providers
|
|||
public class DownloadProvider
|
||||
{
|
||||
private readonly SabProvider _sabProvider;
|
||||
private readonly HistoryProvider _historyProvider;
|
||||
private readonly EpisodeProvider _episodeProvider;
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
public DownloadProvider(SabProvider sabProvider)
|
||||
public DownloadProvider(SabProvider sabProvider, HistoryProvider historyProvider, EpisodeProvider episodeProvider)
|
||||
{
|
||||
_sabProvider = sabProvider;
|
||||
_historyProvider = historyProvider;
|
||||
_episodeProvider = episodeProvider;
|
||||
}
|
||||
|
||||
public DownloadProvider()
|
||||
|
@ -34,7 +38,25 @@ namespace NzbDrone.Core.Providers
|
|||
return false;
|
||||
}
|
||||
|
||||
return _sabProvider.AddByUrl(parseResult.NzbUrl, sabTitle);
|
||||
var addSuccess = _sabProvider.AddByUrl(parseResult.NzbUrl, sabTitle);
|
||||
|
||||
if (addSuccess)
|
||||
{
|
||||
foreach (var episode in parseResult.Episodes)
|
||||
{
|
||||
var history = new History();
|
||||
history.Date = DateTime.Now;
|
||||
history.Indexer = parseResult.Indexer;
|
||||
history.IsProper = parseResult.Proper;
|
||||
history.Quality = parseResult.Quality;
|
||||
history.NzbTitle = parseResult.NzbTitle;
|
||||
history.EpisodeId = episode.EpisodeId;
|
||||
|
||||
_historyProvider.Add(history);
|
||||
}
|
||||
}
|
||||
|
||||
return addSuccess;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -77,6 +77,8 @@ namespace NzbDrone.Core.Providers.Indexer
|
|||
if (parsedEpisode != null)
|
||||
{
|
||||
parsedEpisode.NzbUrl = NzbDownloadUrl(item);
|
||||
parsedEpisode.Indexer = Name;
|
||||
parsedEpisode.NzbTitle = item.Title.Text;
|
||||
result.Add(parsedEpisode);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using NLog;
|
||||
using NzbDrone.Core.Model;
|
||||
|
@ -36,32 +37,28 @@ namespace NzbDrone.Core.Providers.Indexer
|
|||
}
|
||||
|
||||
parseResult.Series = series;
|
||||
parseResult.Episodes = new List<Episode>();
|
||||
|
||||
foreach (var episodeNumber in parseResult.Episodes)
|
||||
if (!series.Monitored)
|
||||
{
|
||||
//Todo: How to handle full season files? Currently the episode list is completely empty for these releases
|
||||
//Todo: Should we assume that the release contains all the episodes that belong to this season and add them from the DB?
|
||||
//Todo: Fix this so it properly handles multi-epsiode releases (Currently as long as the first episode is needed we download it)
|
||||
//Todo: for small releases this is less of an issue, but for Full Season Releases this could be an issue if we only need the first episode (or first few)
|
||||
Logger.Debug("{0} is present in the DB but not tracked. skipping.", parseResult.CleanTitle);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!series.Monitored)
|
||||
{
|
||||
Logger.Debug("{0} is present in the DB but not tracked. skipping.", parseResult.CleanTitle);
|
||||
return false;
|
||||
}
|
||||
if (!_seriesProvider.QualityWanted(series.SeriesId, parseResult.Quality))
|
||||
{
|
||||
Logger.Debug("Post doesn't meet the quality requirements [{0}]. skipping.", parseResult.Quality);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!_seriesProvider.QualityWanted(series.SeriesId, parseResult.Quality))
|
||||
{
|
||||
Logger.Debug("Post doesn't meet the quality requirements [{0}]. skipping.", parseResult.Quality);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_seasonProvider.IsIgnored(series.SeriesId, parseResult.SeasonNumber))
|
||||
{
|
||||
Logger.Debug("Season {0} is currently set to ignore. skipping.", parseResult.SeasonNumber);
|
||||
return false;
|
||||
}
|
||||
if (_seasonProvider.IsIgnored(series.SeriesId, parseResult.SeasonNumber))
|
||||
{
|
||||
Logger.Debug("Season {0} is currently set to ignore. skipping.", parseResult.SeasonNumber);
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (var episodeNumber in parseResult.EpisodeNumbers)
|
||||
{
|
||||
var episodeInfo = _episodeProvider.GetEpisode(series.SeriesId, parseResult.SeasonNumber, episodeNumber);
|
||||
if (episodeInfo == null)
|
||||
{
|
||||
|
@ -84,21 +81,33 @@ namespace NzbDrone.Core.Providers.Indexer
|
|||
_episodeProvider.AddEpisode(episodeInfo);
|
||||
}
|
||||
|
||||
parseResult.Episodes.Add(episodeInfo);
|
||||
}
|
||||
|
||||
if (!_episodeProvider.IsNeeded(parseResult, episodeInfo))
|
||||
foreach (var episode in parseResult.Episodes)
|
||||
{
|
||||
//Todo: How to handle full season files? Currently the episode list is completely empty for these releases
|
||||
//Todo: Should we assume that the release contains all the episodes that belong to this season and add them from the DB?
|
||||
//Todo: Fix this so it properly handles multi-epsiode releases (Currently as long as the first episode is needed we download it)
|
||||
//Todo: for small releases this is less of an issue, but for Full Season Releases this could be an issue if we only need the first episode (or first few)
|
||||
|
||||
|
||||
|
||||
if (!_episodeProvider.IsNeeded(parseResult, episode))
|
||||
{
|
||||
Logger.Debug("Episode {0} is not needed. skipping.", parseResult);
|
||||
return false;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (_historyProvider.Exists(episodeInfo.EpisodeId, parseResult.Quality, parseResult.Proper))
|
||||
if (_historyProvider.Exists(episode.EpisodeId, parseResult.Quality, parseResult.Proper))
|
||||
{
|
||||
Logger.Debug("Episode {0} is in history. skipping.", parseResult);
|
||||
return false;
|
||||
continue;
|
||||
}
|
||||
|
||||
//Congragulations younge feed item! you have made it this far. you are truly special!!!
|
||||
Logger.Debug("Episode {0} is needed", parseResult);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ namespace NzbDrone.Core.Providers
|
|||
var episodes = new List<Episode>();
|
||||
|
||||
//Check for daily shows
|
||||
if (parseResult.Episodes == null)
|
||||
if (parseResult.EpisodeNumbers == null)
|
||||
{
|
||||
var episode = _episodeProvider.GetEpisode(series.SeriesId, parseResult.AirDate.Date);
|
||||
|
||||
|
@ -98,7 +98,7 @@ namespace NzbDrone.Core.Providers
|
|||
}
|
||||
else
|
||||
{
|
||||
foreach (var episodeNumber in parseResult.Episodes)
|
||||
foreach (var episodeNumber in parseResult.EpisodeNumbers)
|
||||
{
|
||||
var episode = _episodeProvider.GetEpisode(series.SeriesId, parseResult.SeasonNumber,
|
||||
episodeNumber);
|
||||
|
|
|
@ -92,13 +92,13 @@ namespace NzbDrone.Core.Providers
|
|||
_configProvider.SabPassword);
|
||||
}
|
||||
|
||||
public String GetSabTitle(EpisodeParseResult parseResult)
|
||||
public virtual String GetSabTitle(EpisodeParseResult parseResult)
|
||||
{
|
||||
//Show Name - 1x01-1x02 - Episode Name
|
||||
//Show Name - 1x01 - Episode Name
|
||||
var episodeString = new List<String>();
|
||||
|
||||
foreach (var episode in parseResult.Episodes)
|
||||
foreach (var episode in parseResult.EpisodeNumbers)
|
||||
{
|
||||
episodeString.Add(String.Format("{0}x{1}", parseResult.SeasonNumber, episode));
|
||||
}
|
||||
|
|
|
@ -142,15 +142,14 @@ namespace NzbDrone.Web.Controllers
|
|||
return View(new GridModel(episodes));
|
||||
}
|
||||
|
||||
[GridAction]
|
||||
public ActionResult _CustomBinding(GridCommand command, int seasonId)
|
||||
//Local Helpers
|
||||
private string GetEpisodePath(EpisodeFile file)
|
||||
{
|
||||
IEnumerable<Episode> data = GetData(command);
|
||||
return View(new GridModel
|
||||
{
|
||||
Data = data,
|
||||
Total = data.Count()
|
||||
});
|
||||
if (file == null)
|
||||
return String.Empty;
|
||||
|
||||
//Return the path relative to the Series' Folder
|
||||
return file.Path.Replace(file.Series.Path, "").Trim(Path.DirectorySeparatorChar);
|
||||
}
|
||||
|
||||
public ActionResult SearchForSeries(string seriesName)
|
||||
|
@ -174,66 +173,6 @@ namespace NzbDrone.Web.Controllers
|
|||
return PartialView("SeriesSearchResults", model);
|
||||
}
|
||||
|
||||
private IEnumerable<Episode> GetData(GridCommand command)
|
||||
{
|
||||
return null;
|
||||
/*
|
||||
IQueryable<Episode> data = .Orders;
|
||||
//Apply filtering
|
||||
if (command.FilterDescriptors.Any())
|
||||
{
|
||||
data = data.Where(ExpressionBuilder.Expression<Order>(command.FilterDescriptors));
|
||||
}
|
||||
// Apply sorting
|
||||
foreach (SortDescriptor sortDescriptor in command.SortDescriptors)
|
||||
{
|
||||
if (sortDescriptor.SortDirection == ListSortDirection.Ascending)
|
||||
{
|
||||
switch (sortDescriptor.Member)
|
||||
{
|
||||
case "OrderID":
|
||||
data = data.OrderBy(ExpressionBuilder.Expression<Order, int>(sortDescriptor.Member));
|
||||
break;
|
||||
case "Customer.ContactName":
|
||||
data = data.OrderBy(order => order.Customer.ContactName);
|
||||
break;
|
||||
case "ShipAddress":
|
||||
data = data.OrderBy(order => order.ShipAddress);
|
||||
break;
|
||||
case "OrderDate":
|
||||
data = data.OrderBy(order => order.OrderDate);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (sortDescriptor.Member)
|
||||
{
|
||||
case "OrderID":
|
||||
data = data.OrderByDescending(order => order.OrderID);
|
||||
break;
|
||||
case "Customer.ContactName":
|
||||
data = data.OrderByDescending(order => order.Customer.ContactName);
|
||||
break;
|
||||
case "ShipAddress":
|
||||
data = data.OrderByDescending(order => order.ShipAddress);
|
||||
break;
|
||||
case "OrderDate":
|
||||
data = data.OrderByDescending(order => order.OrderDate);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
count = data.Count();
|
||||
// ... and paging
|
||||
if (command.PageSize > 0)
|
||||
{
|
||||
data = data.Skip((command.Page - 1) * command.PageSize);
|
||||
}
|
||||
data = data.Take(command.PageSize);
|
||||
return data;*/
|
||||
}
|
||||
|
||||
[AcceptVerbs(HttpVerbs.Post)]
|
||||
[GridAction]
|
||||
public ActionResult _SaveAjaxEditing(string id)
|
||||
|
@ -301,16 +240,6 @@ namespace NzbDrone.Web.Controllers
|
|||
return RedirectToAction("Index");
|
||||
}
|
||||
|
||||
//Local Helpers
|
||||
private string GetEpisodePath(EpisodeFile file)
|
||||
{
|
||||
if (file == null)
|
||||
return String.Empty;
|
||||
|
||||
//Return the path relative to the Series' Folder
|
||||
return file.Path.Replace(file.Series.Path, "").Trim(Path.DirectorySeparatorChar);
|
||||
}
|
||||
|
||||
private List<SeriesModel> GetSeriesModels(List<Series> seriesInDb)
|
||||
{
|
||||
var series = new List<SeriesModel>();
|
||||
|
|
|
@ -58,45 +58,47 @@
|
|||
{
|
||||
|
||||
<br />
|
||||
<h3>Season @season.SeasonNumber</h3>
|
||||
<h3>
|
||||
Season @season.SeasonNumber</h3>
|
||||
<div class="grid-container">
|
||||
@{Season season1 = season;
|
||||
Html.Telerik().Grid<EpisodeModel>().Name("seasons_" + season.SeasonNumber)
|
||||
.TableHtmlAttributes(new { @class = "Grid" })
|
||||
.Columns(columns =>
|
||||
{
|
||||
columns.Bound(o => o.EpisodeId)
|
||||
.ClientTemplate(
|
||||
"<input type='checkbox' name='checkedEpisodes' value='<#= EpisodeId #>' />")
|
||||
.Title("")
|
||||
.Width(1)
|
||||
.HtmlAttributes(new { style = "text-align:center" });
|
||||
Html.Telerik().Grid<EpisodeModel>().Name("seasons_" + season.SeasonNumber)
|
||||
.TableHtmlAttributes(new { @class = "Grid" })
|
||||
.Columns(columns =>
|
||||
{
|
||||
columns.Bound(o => o.EpisodeId)
|
||||
.ClientTemplate(
|
||||
"<input type='checkbox' name='checkedEpisodes' value='<#= EpisodeId #>' />")
|
||||
.Title("")
|
||||
.Width(1)
|
||||
.HtmlAttributes(new { style = "text-align:center" });
|
||||
|
||||
columns.Bound(c => c.EpisodeNumber).Width(10).Title("Episode");
|
||||
columns.Bound(c => c.Title).Title("Title").Width(300);
|
||||
columns.Bound(c => c.AirDate).Format("{0:d}").Width(10);
|
||||
columns.Bound(c => c.Quality).Width(10);
|
||||
columns.Bound(c => c.Path);
|
||||
columns.Bound(c => c.Status);
|
||||
})
|
||||
.DetailView(detailView => detailView.ClientTemplate("<div><#= Overview #> </br><#= Path #> </div>"))
|
||||
.ClientEvents(clientEvents =>
|
||||
{
|
||||
clientEvents.OnDataBinding("grid_bind");
|
||||
clientEvents.OnDataBound("grid_bound");
|
||||
})
|
||||
.Sortable(rows => rows.OrderBy(epSort => epSort.Add(c => c.EpisodeNumber).Descending()).Enabled(true))
|
||||
.Footer(true)
|
||||
.DataBinding(
|
||||
d =>
|
||||
d.Ajax().Select("_AjaxSeasonGrid", "Series",
|
||||
new RouteValueDictionary { { "seasonId", season1.SeasonId.ToString() } }))
|
||||
.ToolBar(
|
||||
c =>
|
||||
c.Custom().Text("Rename Season").Action("RenameSeason", "Series", new { seasonId = season1.SeasonId })
|
||||
.ButtonType(GridButtonType.Text))
|
||||
.Render();}
|
||||
<span class="grid-loader"><img src="@Url.Content("~/Content/Images/Loading.gif")" alt="Loading"/> Loading...</span>
|
||||
columns.Bound(c => c.EpisodeNumber).Width(0).Title("Episode");
|
||||
columns.Bound(c => c.Title).Title("Title");
|
||||
columns.Bound(c => c.AirDate).Format("{0:d}").Width(0);
|
||||
columns.Bound(c => c.Quality).Width(0);
|
||||
columns.Bound(c => c.Status).Width(0);
|
||||
})
|
||||
.DetailView(detailView => detailView.ClientTemplate("<div><#= Overview #> </br><#= Path #> </div>"))
|
||||
.ClientEvents(clientEvents =>
|
||||
{
|
||||
clientEvents.OnDataBinding("grid_bind");
|
||||
clientEvents.OnDataBound("grid_bound");
|
||||
})
|
||||
.Sortable(rows => rows.OrderBy(epSort => epSort.Add(c => c.EpisodeNumber).Descending()).Enabled(true))
|
||||
.Footer(true)
|
||||
.DataBinding(
|
||||
d =>
|
||||
d.Ajax().Select("_AjaxSeasonGrid", "Series",
|
||||
new RouteValueDictionary { { "seasonId", season1.SeasonId.ToString() } }))
|
||||
.ToolBar(
|
||||
c =>
|
||||
c.Custom().Text("Rename Season").Action("RenameSeason", "Series", new { seasonId = season1.SeasonId })
|
||||
.ButtonType(GridButtonType.Text))
|
||||
.Render();}
|
||||
<span class="grid-loader">
|
||||
<img src="@Url.Content("~/Content/Images/Loading.gif")" alt="Loading"/>
|
||||
Loading...</span>
|
||||
</div>
|
||||
}
|
||||
@{var specialSeasons = Model.Seasons.Where(s => s.SeasonNumber == 0).FirstOrDefault();}
|
||||
|
@ -104,10 +106,11 @@
|
|||
{
|
||||
|
||||
<br />
|
||||
<h3>Specials</h3>
|
||||
<h3>
|
||||
Specials</h3>
|
||||
<div class="grid-container">
|
||||
@{Html.Telerik().Grid<EpisodeModel>().Name("seasons_specials")
|
||||
.TableHtmlAttributes(new {@class = "Grid"})
|
||||
.TableHtmlAttributes(new { @class = "Grid" })
|
||||
.Columns(columns =>
|
||||
{
|
||||
columns.Bound(o => o.EpisodeId)
|
||||
|
@ -118,10 +121,10 @@
|
|||
.HtmlAttributes(new { style = "text-align:center" });
|
||||
|
||||
columns.Bound(c => c.EpisodeNumber).Width(10).Title("Episode");
|
||||
columns.Bound(c => c.Title).Title("Title").Width(300);
|
||||
columns.Bound(c => c.Title).Title("Title").Width(10000);
|
||||
columns.Bound(c => c.AirDate).Format("{0:d}").Width(10);
|
||||
columns.Bound(c => c.Quality).Width(10);
|
||||
columns.Bound(c => c.Path);
|
||||
columns.Bound(c => c.Status).Width(10);
|
||||
})
|
||||
.DetailView(detailView => detailView.ClientTemplate("<div><#= Overview #> </br><#= Path #> </div>"))
|
||||
.ClientEvents(clientEvents =>
|
||||
|
@ -136,7 +139,9 @@
|
|||
d.Ajax().Select("_AjaxSeasonGrid", "Series",
|
||||
new RouteValueDictionary { { "seasonId", specialSeasons.SeasonId.ToString() } }))
|
||||
.Render(); }
|
||||
<span class="grid-loader"><img src="@Url.Content("~/Content/Images/Loading.gif")" alt="Loading"/> Loading...</span>
|
||||
<span class="grid-loader">
|
||||
<img src="@Url.Content("~/Content/Images/Loading.gif")" alt="Loading"/>
|
||||
Loading...</span>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue