From 3dbb38b54f54c8a9b9fe569f479af85624f99365 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 16 Jun 2011 20:29:39 -0700 Subject: [PATCH] MediaFileProvider moved to PetaPoco. Season Grid now shows episodeFile quality. --- NzbDrone.Core.Test/MediaFileProviderTests.cs | 73 ++++++++++--------- .../Datastore/Migrations/MigrationExport.cs | 11 ++- NzbDrone.Core/Providers/MediaFileProvider.cs | 28 +++---- NzbDrone.Core/Repository/EpisodeFile.cs | 5 ++ NzbDrone.Web/Controllers/SeriesController.cs | 13 ++-- 5 files changed, 74 insertions(+), 56 deletions(-) diff --git a/NzbDrone.Core.Test/MediaFileProviderTests.cs b/NzbDrone.Core.Test/MediaFileProviderTests.cs index 0e9db08fe..acfdc626a 100644 --- a/NzbDrone.Core.Test/MediaFileProviderTests.cs +++ b/NzbDrone.Core.Test/MediaFileProviderTests.cs @@ -17,6 +17,7 @@ using NzbDrone.Core.Providers.Jobs; using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; +using PetaPoco; using SubSonic.Repository; namespace NzbDrone.Core.Test @@ -51,24 +52,20 @@ namespace NzbDrone.Core.Test mocker.GetMock() .Setup(e => e.GetSize(fileName)).Returns(12345).Verifiable(); - mocker.GetMock() - .Setup(r => r.Exists(It.IsAny>>())).Returns(false).Verifiable(); + var database = mocker.GetMock(MockBehavior.Strict); + database.Setup(r => r.Single(It.IsAny(), It.IsAny())).Returns(0).Verifiable(); + database.Setup(r => r.Insert(It.IsAny())).Returns(1).Verifiable(); - mocker.GetMock() - .Setup(r => r.Add(It.IsAny())).Returns(0).Verifiable(); mocker.GetMock() .Setup(e => e.GetEpisode(fakeSeries.SeriesId, seasonNumber, episodeNumner)).Returns(fakeEpisode); - - - //Act var result = mocker.Resolve().ImportFile(fakeSeries, fileName); //Assert Assert.IsNotNull(result); - mocker.GetMock().Verify(r => r.Add(result), Times.Once()); + mocker.GetMock().Verify(r => r.Insert(result), Times.Once()); mocker.VerifyAllMocks(); result.SeasonNumber.Should().Be(fakeEpisode.SeasonNumber); @@ -99,10 +96,9 @@ namespace NzbDrone.Core.Test //Mocks var mocker = new AutoMoqer(); - mocker.GetMock() - .Setup(r => r.Exists(It.IsAny>>())).Returns(false).Verifiable(); - mocker.GetMock() - .Setup(r => r.Add(It.IsAny())).Returns(0).Verifiable(); + var database = mocker.GetMock(MockBehavior.Strict); + database.Setup(r => r.Single(It.IsAny(), It.IsAny())).Returns(0).Verifiable(); + database.Setup(r => r.Insert(It.IsAny())).Returns(1).Verifiable(); mocker.GetMock() .Setup(e => e.GetEpisode(fakeSeries.SeriesId, airDate)).Returns(fakeEpisode). @@ -117,8 +113,8 @@ namespace NzbDrone.Core.Test //Assert Assert.IsNotNull(result); - mocker.GetMock().VerifyAll(); - mocker.GetMock().Verify(r => r.Add(result), Times.Once()); + mocker.GetMock().VerifyAll(); + mocker.GetMock().Verify(r => r.Insert(result), Times.Once()); mocker.GetMock().VerifyAll(); mocker.GetMock().VerifyAll(); @@ -147,12 +143,13 @@ namespace NzbDrone.Core.Test //Fakes var fakeSeries = Builder.CreateNew().Build(); + var fakeEpisodeFile = Builder.CreateNew().With(s => s.SeriesId = fakeSeries.SeriesId).Build(); //Mocks var mocker = new AutoMoqer(); - mocker.GetMock(MockBehavior.Strict) - .Setup(r => r.Exists(It.IsAny>>())).Returns(true).Verifiable(); + mocker.GetMock(MockBehavior.Strict) + .Setup(r => r.Single(It.IsAny(), It.IsAny())).Returns(1).Verifiable(); mocker.GetMock() .Setup(e => e.GetSize(fileName)).Returns(size).Verifiable(); @@ -183,13 +180,12 @@ namespace NzbDrone.Core.Test //Mocks var mocker = new AutoMoqer(); - mocker.GetMock(MockBehavior.Strict) - .Setup(r => r.Exists(It.IsAny>>())).Returns(false).Verifiable(); + mocker.GetMock(MockBehavior.Strict) + .Setup(r => r.Single(It.IsAny(), It.IsAny())).Returns(0).Verifiable(); mocker.GetMock() .Setup(e => e.GetSize(fileName)).Returns(size).Verifiable(); - //Act var result = mocker.Resolve().ImportFile(fakeSeries, fileName); @@ -252,8 +248,9 @@ namespace NzbDrone.Core.Test //Mocks var mocker = new AutoMoqer(); - mocker.GetMock(MockBehavior.Strict) - .Setup(r => r.Exists(It.IsAny>>())).Returns(true).Verifiable(); + mocker.GetMock(MockBehavior.Strict) + .Setup(r => r.Single(It.IsAny(), It.IsAny())).Returns(1).Verifiable(); + mocker.GetMock(MockBehavior.Strict); mocker.GetMock() .Setup(e => e.GetSize(fileName)).Returns(500000).Verifiable(); @@ -264,7 +261,7 @@ namespace NzbDrone.Core.Test //Assert Assert.IsNull(result); - mocker.GetMock().Verify(r => r.Add(result), Times.Never()); + mocker.GetMock().Verify(r => r.Insert(result), Times.Never()); mocker.VerifyAllMocks(); } @@ -285,8 +282,8 @@ namespace NzbDrone.Core.Test //Mocks var mocker = new AutoMoqer(); - mocker.GetMock(MockBehavior.Strict) - .Setup(r => r.Exists(It.IsAny>>())).Returns(false).Verifiable(); + mocker.GetMock(MockBehavior.Strict) + .Setup(r => r.Single(It.IsAny(), It.IsAny())).Returns(0).Verifiable(); mocker.GetMock(MockBehavior.Strict) .Setup(e => e.GetEpisode(fakeSeries.SeriesId, seasonNumber, episodeNumner)).Returns(null). @@ -320,7 +317,6 @@ namespace NzbDrone.Core.Test } - [Test] public void scan_media_job_should_not_scan_new_series() { @@ -350,10 +346,16 @@ namespace NzbDrone.Core.Test .WhereAll().Have(s => s.SeriesId = 20).Build(); var mocker = new AutoMoqer(); - var repo = MockLib.GetEmptyRepository(true); - repo.AddMany(firstSeriesFiles); - repo.AddMany(secondSeriesFiles); - mocker.SetConstant(repo); + + var database = MockLib.GetEmptyDatabase(true); + + foreach (var file in firstSeriesFiles) + database.Insert(file); + + foreach (var file in secondSeriesFiles) + database.Insert(file); + + mocker.SetConstant(database); var result = mocker.Resolve().GetSeriesFiles(12); @@ -402,9 +404,9 @@ namespace NzbDrone.Core.Test configProvider.SetupGet(c => c.NumberStyle).Returns(2); configProvider.SetupGet(c => c.ReplaceSpaces).Returns(false); - var repo = mocker.GetMock(); - repo.Setup(r => r.Exists(It.IsAny>>())).Returns(false).Verifiable(); - repo.Setup(r => r.Add(It.IsAny())).Returns(1); + var database = mocker.GetMock(MockBehavior.Strict); + database.Setup(r => r.Single(It.IsAny(), It.IsAny())).Returns(0).Verifiable(); + database.Setup(r => r.Insert(It.IsAny())).Returns(1).Verifiable(); //Act var result = mocker.Resolve().ImportNewFiles(@"C:\Test\30 Rock - 1x05 - Episode Title", fakeSeries); @@ -464,9 +466,10 @@ namespace NzbDrone.Core.Test configProvider.SetupGet(c => c.NumberStyle).Returns(2); configProvider.SetupGet(c => c.ReplaceSpaces).Returns(false); - var repo = mocker.GetMock(); - repo.Setup(r => r.Exists(It.IsAny>>())).Returns(false).Verifiable(); - repo.Setup(r => r.Add(It.IsAny())).Returns(1); + var database = mocker.GetMock(MockBehavior.Strict); + database.Setup(r => r.Single(It.IsAny(), It.IsAny())).Returns(0).Verifiable(); + database.Setup(r => r.Insert(It.IsAny())).Returns(1); + database.Setup(r => r.Delete(It.IsAny())).Returns(1); //Act var result = mocker.Resolve().ImportNewFiles(@"C:\Test\30 Rock - 1x05 - Episode Title", fakeSeries); diff --git a/NzbDrone.Core/Datastore/Migrations/MigrationExport.cs b/NzbDrone.Core/Datastore/Migrations/MigrationExport.cs index 524415601..c64b6494c 100644 --- a/NzbDrone.Core/Datastore/Migrations/MigrationExport.cs +++ b/NzbDrone.Core/Datastore/Migrations/MigrationExport.cs @@ -44,8 +44,15 @@ namespace NzbDrone.Core.Datastore.Migrations .WithNullableColumn("AirDate", DbType.DateTime) .WithNullableColumn("GrabDate", DbType.DateTime); - - + db.CreateTable("EpisodeFiles") + .WithPrimaryKeyColumn("EpisodeFileId", DbType.Int32).AsIdentity() + .WithNotNullableColumn("SeriesId", DbType.Int32) + .WithNotNullableColumn("Path", DbType.String) + .WithNotNullableColumn("Quality", DbType.Int16) + .WithNotNullableColumn("Proper", DbType.Int16) + .WithNotNullableColumn("Size", DbType.Int64) + .WithNotNullableColumn("DateAdded", DbType.DateTime) + .WithNotNullableColumn("SeasonNumber", DbType.Int16); } } } diff --git a/NzbDrone.Core/Providers/MediaFileProvider.cs b/NzbDrone.Core/Providers/MediaFileProvider.cs index 0acd4ba3c..ad28ef4d9 100644 --- a/NzbDrone.Core/Providers/MediaFileProvider.cs +++ b/NzbDrone.Core/Providers/MediaFileProvider.cs @@ -10,7 +10,7 @@ using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; -using SubSonic.Repository; +using PetaPoco; namespace NzbDrone.Core.Providers { @@ -21,19 +21,19 @@ namespace NzbDrone.Core.Providers private readonly DiskProvider _diskProvider; private readonly EpisodeProvider _episodeProvider; private readonly SeriesProvider _seriesProvider; - private readonly IRepository _repository; private readonly ConfigProvider _configProvider; + private readonly IDatabase _database; [Inject] - public MediaFileProvider(IRepository repository, DiskProvider diskProvider, - EpisodeProvider episodeProvider, SeriesProvider seriesProvider, - ConfigProvider configProvider) + public MediaFileProvider(DiskProvider diskProvider, EpisodeProvider episodeProvider, + SeriesProvider seriesProvider, ConfigProvider configProvider, + IDatabase database) { - _repository = repository; _diskProvider = diskProvider; _episodeProvider = episodeProvider; _seriesProvider = seriesProvider; _configProvider = configProvider; + _database = database; } public MediaFileProvider() { } @@ -76,7 +76,7 @@ namespace NzbDrone.Core.Providers } //Check to see if file already exists in the database - if (!_repository.Exists(e => e.Path == Parser.NormalizePath(filePath))) + if (_database.Single("SELECT COUNT (*) FROM EpisodeFiles WHERE Path =@0", Parser.NormalizePath(filePath)) == 0) { var parseResult = Parser.ParseEpisodeInfo(filePath); @@ -132,7 +132,7 @@ namespace NzbDrone.Core.Providers episodeFile.Quality = parseResult.Quality.QualityType; episodeFile.Proper = parseResult.Quality.Proper; episodeFile.SeasonNumber = parseResult.SeasonNumber; - var fileId = (int)_repository.Add(episodeFile); + var fileId = (int)_database.Insert(episodeFile); //This is for logging + updating the episodes that are linked to this EpisodeFile string episodeList = String.Empty; @@ -179,29 +179,29 @@ namespace NzbDrone.Core.Providers } //Delete it from the DB - _repository.Delete(episodeFile.EpisodeFileId); + _database.Delete(episodeFile.EpisodeFileId); } } } public virtual void Update(EpisodeFile episodeFile) { - _repository.Update(episodeFile); + _database.Update(episodeFile); } public virtual EpisodeFile GetEpisodeFile(int episodeFileId) { - return _repository.Single(episodeFileId); + return _database.Single(episodeFileId); } public virtual List GetEpisodeFiles() { - return _repository.All().ToList(); + return _database.Fetch(); } - public virtual IEnumerable GetSeriesFiles(int seriesId) + public virtual List GetSeriesFiles(int seriesId) { - return _repository.All().Where(c => c.SeriesId == seriesId); + return _database.Fetch("WHERE seriesId= @0", seriesId); } public virtual Tuple GetEpisodeFilesCount(int seriesId) diff --git a/NzbDrone.Core/Repository/EpisodeFile.cs b/NzbDrone.Core/Repository/EpisodeFile.cs index 56bddda87..386abfbc6 100644 --- a/NzbDrone.Core/Repository/EpisodeFile.cs +++ b/NzbDrone.Core/Repository/EpisodeFile.cs @@ -1,10 +1,13 @@ using System; using System.Collections.Generic; using NzbDrone.Core.Repository.Quality; +using PetaPoco; using SubSonic.SqlGeneration.Schema; namespace NzbDrone.Core.Repository { + [TableName("EpisodeFiles")] + [PrimaryKey("EpisodeFileId", autoIncrement = true)] public class EpisodeFile { [SubSonicPrimaryKey] @@ -19,9 +22,11 @@ namespace NzbDrone.Core.Repository public DateTime DateAdded { get; set; } [SubSonicToManyRelation] + [Ignore] public virtual IList Episodes { get; set; } [SubSonicToOneRelation(ThisClassContainsJoinKey = true)] + [Ignore] public virtual Series Series { get; set; } } } \ No newline at end of file diff --git a/NzbDrone.Web/Controllers/SeriesController.cs b/NzbDrone.Web/Controllers/SeriesController.cs index a61cc2122..62cf93632 100644 --- a/NzbDrone.Web/Controllers/SeriesController.cs +++ b/NzbDrone.Web/Controllers/SeriesController.cs @@ -235,14 +235,19 @@ namespace NzbDrone.Web.Controllers foreach (var e in episodesInDb) { - var episodeFile = e.EpisodeFile; - var episodePath = String.Empty; var episodeFileId = 0; + var episodePath = String.Empty; + var episodeQuality = String.Empty; + EpisodeFile episodeFile = null; + + if (e.EpisodeFileId > 0) + episodeFile = _mediaFileProvider.GetEpisodeFile(e.EpisodeFileId); if (episodeFile != null) { episodePath = episodeFile.Path; episodeFileId = episodeFile.EpisodeFileId; + episodeQuality = episodeFile.Quality.ToString(); } episodes.Add(new EpisodeModel @@ -256,9 +261,7 @@ namespace NzbDrone.Web.Controllers Path = episodePath, EpisodeFileId = episodeFileId, Status = e.Status.ToString(), - Quality = e.EpisodeFile == null - ? String.Empty - : e.EpisodeFile.Quality.ToString() + Quality = episodeQuality }); }