moved media file service

This commit is contained in:
kay.one 2013-02-28 23:03:41 -08:00
parent 8900bbb3a1
commit de5d5b76e8
46 changed files with 512 additions and 488 deletions

View file

@ -192,6 +192,29 @@ public void deleting_child_model_directly_should_remove_item_from_child_list()
Db.AsQueryable<ParentModel>().Single().ChildList.Should().HaveCount(4); Db.AsQueryable<ParentModel>().Single().ChildList.Should().HaveCount(4);
} }
[Test]
public void update_field_should_only_update_that_filed()
{
var childModel = new ChildModel
{
A = "A_Original",
B = 1,
C = 1
};
Db.Insert(childModel);
_childModel.A = "A_New";
_childModel.B = 2;
_childModel.C = 2;
Db.UpdateField(childModel, "B");
Db.AsQueryable<ChildModel>().Single().A.Should().Be("A_Original");
Db.AsQueryable<ChildModel>().Single().B.Should().Be(2);
Db.AsQueryable<ChildModel>().Single().C.Should().Be(1);
}
[Test] [Test]
public void should_be_able_to_read_unknown_type() public void should_be_able_to_read_unknown_type()

View file

@ -6,6 +6,7 @@
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;

View file

@ -5,6 +5,7 @@
using FluentAssertions; using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;

View file

@ -2,6 +2,7 @@
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;

View file

@ -4,6 +4,7 @@
using FluentAssertions; using FluentAssertions;
using NLog; using NLog;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Instrumentation; using NzbDrone.Core.Instrumentation;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;

View file

@ -6,6 +6,7 @@
using FizzWare.NBuilder; using FizzWare.NBuilder;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Jobs; using NzbDrone.Core.Jobs;
using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Model.Notification;

View file

@ -6,6 +6,7 @@
using FizzWare.NBuilder; using FizzWare.NBuilder;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Jobs; using NzbDrone.Core.Jobs;
using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Model.Notification;
@ -67,8 +68,8 @@ public void import_new_series_succesful()
Mocker.GetMock<ISeriesRepository>() Mocker.GetMock<ISeriesRepository>()
.Setup(s => s.Get(series[1].Id)).Returns(series[1]); .Setup(s => s.Get(series[1].Id)).Returns(series[1]);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(s => s.GetSeriesFiles(It.IsAny<int>())).Returns(new List<EpisodeFile>()); .Setup(s => s.GetFilesBySeries(It.IsAny<int>())).Returns(new List<EpisodeFile>());
//Act //Act
Mocker.Resolve<ImportNewSeriesJob>().Start(notification, null); Mocker.Resolve<ImportNewSeriesJob>().Start(notification, null);
@ -121,8 +122,8 @@ public void failed_import_should_not_be_stuck_in_loop()
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]);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(s => s.GetSeriesFiles(It.IsAny<int>())).Returns(new List<EpisodeFile>()); .Setup(s => s.GetFilesBySeries(It.IsAny<int>())).Returns(new List<EpisodeFile>());
Mocker.GetMock<XemUpdateJob>() Mocker.GetMock<XemUpdateJob>()
.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)));
@ -148,8 +149,8 @@ public void AutoIgnoreSeason_new_series_should_not_ignore_any()
int seriesId = 12; int seriesId = 12;
WithStrictMocker(); WithStrictMocker();
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.GetSeriesFiles(seriesId)) .Setup(p => p.GetFilesBySeries(seriesId))
.Returns(new List<EpisodeFile>()); .Returns(new List<EpisodeFile>());
Mocker.GetMock<ISeasonRepository>() Mocker.GetMock<ISeasonRepository>()
@ -176,8 +177,8 @@ public void AutoIgnoreSeason_existing_should_not_ignore_currentseason()
WithStrictMocker(); WithStrictMocker();
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.GetSeriesFiles(seriesId)) .Setup(p => p.GetFilesBySeries(seriesId))
.Returns(episodesFiles); .Returns(episodesFiles);
Mocker.GetMock<ISeasonRepository>() Mocker.GetMock<ISeasonRepository>()
@ -202,8 +203,8 @@ public void AutoIgnoreSeason_existing_should_ignore_seasons_with_no_file()
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.GetSeriesFiles(seriesId)) .Setup(p => p.GetFilesBySeries(seriesId))
.Returns(episodesFiles); .Returns(episodesFiles);
Mocker.GetMock<ISeasonRepository>() Mocker.GetMock<ISeasonRepository>()

View file

@ -5,6 +5,7 @@
using FizzWare.NBuilder; using FizzWare.NBuilder;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Jobs; using NzbDrone.Core.Jobs;
using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Model.Notification;
@ -40,8 +41,8 @@ public void Setup()
.Setup(s => s.Get(_series.Id)) .Setup(s => s.Get(_series.Id))
.Returns(_series); .Returns(_series);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(s => s.GetSeasonFiles(_series.Id, 5)) .Setup(s => s.GetFilesBySeason(_series.Id, 5))
.Returns(_episodeFiles); .Returns(_episodeFiles);
} }

View file

@ -1,20 +1,16 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text;
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.ProviderTests.MediaFileProviderTests namespace NzbDrone.Core.Test.MediaFileTests
{ {
[TestFixture] [TestFixture]
public class CleanUpDatabaseFixture : SqlCeTest public class CleanUpDatabaseFixture : SqlCeTest
@ -50,7 +46,6 @@ public void CleanUpDatabse_should_detach_none_existing_file_from_episodes_with_a
Db.InsertMany(episodes); Db.InsertMany(episodes);
//Act //Act
Mocker.Resolve<MediaFileProvider>().CleanUpDatabase();
var result = Db.Fetch<Episode>(); var result = Db.Fetch<Episode>();
//Assert //Assert
@ -77,7 +72,6 @@ public void CleanUpDatabse_should_detach_none_existing_file_from_episodes_with_n
Db.InsertMany(episodes); Db.InsertMany(episodes);
//Act //Act
Mocker.Resolve<MediaFileProvider>().CleanUpDatabase();
var result = Db.Fetch<Episode>(); var result = Db.Fetch<Episode>();
//Assert //Assert
@ -102,7 +96,6 @@ public void CleanUpDatabse_should_not_change_episodes_with_no_file_id()
Db.InsertMany(episodes); Db.InsertMany(episodes);
//Act //Act
Mocker.Resolve<MediaFileProvider>().CleanUpDatabase();
var result = Db.Fetch<Episode>(); var result = Db.Fetch<Episode>();
//Assert //Assert
@ -129,12 +122,11 @@ public void DeleteOrphanedEpisodeFiles()
Db.InsertMany(episodeFiles); Db.InsertMany(episodeFiles);
//Act //Act
Mocker.Resolve<MediaFileProvider>().CleanUpDatabase();
var result = Db.Fetch<EpisodeFile>(); var result = Db.Fetch<EpisodeFile>();
//Assert //Assert
result.Should().HaveCount(5); result.Should().HaveCount(5);
result.Should().OnlyContain(e => e.EpisodeFileId > 0); result.Should().OnlyContain(e => e.Id > 0);
} }
} }
} }

View file

@ -8,15 +8,12 @@
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Test.Common.AutoMoq;
namespace NzbDrone.Core.Test.ProviderTests.MediaFileProviderTests namespace NzbDrone.Core.Test.MediaFileTests
{ {
[TestFixture] [TestFixture]
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
@ -54,7 +51,7 @@ public void GetNewFilename_Series_Episode_Quality_S01E05_Dash()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("South Park - S15E06 - City Sushi [HDTV-720p]", result); Assert.AreEqual("South Park - S15E06 - City Sushi [HDTV-720p]", result);
@ -81,7 +78,7 @@ public void GetNewFilename_Episode_Quality_1x05_Dash()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("15x06 - City Sushi [HDTV-720p]", result); Assert.AreEqual("15x06 - City Sushi [HDTV-720p]", result);
@ -108,7 +105,7 @@ public void GetNewFilename_Series_Quality_01x05_Space()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("South Park 05x06 [HDTV-720p]", result); Assert.AreEqual("South Park 05x06 [HDTV-720p]", result);
@ -136,7 +133,7 @@ public void GetNewFilename_Series_s01e05_Space()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("South Park s05e06", result); Assert.AreEqual("South Park s05e06", result);
@ -163,7 +160,7 @@ public void GetNewFilename_Series_Episode_s01e05_Periods()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("South.Park.s05e06.City.Sushi", result); Assert.AreEqual("South.Park.s05e06.City.Sushi", result);
@ -190,7 +187,7 @@ public void GetNewFilename_Series_Episode_s01e05_Dash_Periods_Quality()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("South.Park.-.s05e06.-.City.Sushi.[HDTV-720p]", result); Assert.AreEqual("South.Park.-.s05e06.-.City.Sushi.[HDTV-720p]", result);
@ -218,7 +215,7 @@ public void GetNewFilename_S01E05_Dash()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("S15E06", result); Assert.AreEqual("S15E06", result);
@ -252,7 +249,7 @@ public void GetNewFilename_multi_Series_Episode_Quality_S01E05_Scene_Dash()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episodeOne, episodeTwo }, new Series { Title = "The Mentalist" }, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episodeOne, episodeTwo }, new Series { Title = "The Mentalist" }, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("The Mentalist - S03E23-E24 - Strawberries and Cream [HDTV-720p]", result); Assert.AreEqual("The Mentalist - S03E23-E24 - Strawberries and Cream [HDTV-720p]", result);
@ -286,7 +283,7 @@ public void GetNewFilename_multi_Episode_Quality_1x05_Repeat_Dash()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episodeOne, episodeTwo }, new Series { Title = "The Mentalist" }, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episodeOne, episodeTwo }, new Series { Title = "The Mentalist" }, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("3x23x24 - Strawberries and Cream [HDTV-720p]", result); Assert.AreEqual("3x23x24 - Strawberries and Cream [HDTV-720p]", result);
@ -320,7 +317,7 @@ public void GetNewFilename_multi_Episode_Quality_01x05_Repeat_Space()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episodeOne, episodeTwo }, new Series { Title = "The Mentalist" }, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episodeOne, episodeTwo }, new Series { Title = "The Mentalist" }, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("3x23x24 Strawberries and Cream [HDTV-720p]", result); Assert.AreEqual("3x23x24 Strawberries and Cream [HDTV-720p]", result);
@ -354,7 +351,7 @@ public void GetNewFilename_multi_Series_Episode_s01e05_Duplicate_Period()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episodeOne, episodeTwo }, new Series { Title = "The Mentalist" }, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episodeOne, episodeTwo }, new Series { Title = "The Mentalist" }, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("The.Mentalist.s03e23.s03e24.Strawberries.and.Cream", result); Assert.AreEqual("The.Mentalist.s03e23.s03e24.Strawberries.and.Cream", result);
@ -388,7 +385,7 @@ public void GetNewFilename_multi_Series_S01E05_Extend_Dash_Period()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episodeOne, episodeTwo }, new Series { Title = "The Mentalist" }, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episodeOne, episodeTwo }, new Series { Title = "The Mentalist" }, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("The.Mentalist.-.S03E23-24", result); Assert.AreEqual("The.Mentalist.-.S03E23-24", result);
@ -422,7 +419,7 @@ public void GetNewFilename_multi_1x05_Repeat_Dash_Period()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episodeOne, episodeTwo }, new Series { Title = "The Mentalist" }, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episodeOne, episodeTwo }, new Series { Title = "The Mentalist" }, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("3x23x24", result); Assert.AreEqual("3x23x24", result);
@ -447,7 +444,7 @@ public void GetNewFilename_should_append_proper_when_proper_and_append_quality_i
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, true, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, true, new EpisodeFile());
//Assert //Assert
result.Should().Be("South Park - S15E06 - City Sushi [HDTV-720p] [Proper]"); result.Should().Be("South Park - S15E06 - City Sushi [HDTV-720p] [Proper]");
@ -472,7 +469,7 @@ public void GetNewFilename_should_not_append_proper_when_not_proper_and_append_q
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
result.Should().Be("South Park - S15E06 - City Sushi [HDTV-720p]"); result.Should().Be("South Park - S15E06 - City Sushi [HDTV-720p]");
@ -497,7 +494,7 @@ public void GetNewFilename_should_not_append_proper_when_proper_and_append_quali
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, true, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, true, new EpisodeFile());
//Assert //Assert
result.Should().Be("South Park - S15E06 - City Sushi"); result.Should().Be("South Park - S15E06 - City Sushi");
@ -529,7 +526,7 @@ public void GetNewFilename_should_order_multiple_episode_files_in_numerical_orde
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode2, episode }, new Series { Title = "30 Rock" }, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode2, episode }, new Series { Title = "30 Rock" }, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
result.Should().Be("30 Rock - S06E06-E07 - Hey, Baby, What's Wrong!"); result.Should().Be("30 Rock - S06E06-E07 - Hey, Baby, What's Wrong!");
@ -556,7 +553,7 @@ public void GetNewFilename_Series_Episode_Quality_S01E05_Period()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("South Park.S15E06.City Sushi [HDTV-720p]", result); Assert.AreEqual("South Park.S15E06.City Sushi [HDTV-720p]", result);
@ -583,7 +580,7 @@ public void GetNewFilename_Episode_Quality_1x05_Period()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
Assert.AreEqual("15x06.City Sushi [HDTV-720p]", result); Assert.AreEqual("15x06.City Sushi [HDTV-720p]", result);
@ -614,7 +611,7 @@ public void GetNewFilename_UseSceneName_when_sceneName_isNull()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, episodeFile); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, episodeFile);
//Assert //Assert
result.Should().Be(Path.GetFileNameWithoutExtension(episodeFile.Path)); result.Should().Be(Path.GetFileNameWithoutExtension(episodeFile.Path));
@ -645,7 +642,7 @@ public void GetNewFilename_UseSceneName_when_sceneName_isNotNull()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, episodeFile); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode }, _series, Quality.HDTV720p, false, episodeFile);
//Assert //Assert
result.Should().Be(episodeFile.SceneName); result.Should().Be(episodeFile.SceneName);
@ -677,7 +674,7 @@ public void should_only_have_one_episodeTitle_when_episode_titles_are_the_same()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode2, episode }, new Series { Title = "30 Rock" }, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode2, episode }, new Series { Title = "30 Rock" }, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
result.Should().Be("30 Rock - S06E06-E07 - Hey, Baby, What's Wrong!"); result.Should().Be("30 Rock - S06E06-E07 - Hey, Baby, What's Wrong!");
@ -709,7 +706,7 @@ public void should_have_two_episodeTitles_when_episode_titles_are_not_the_same()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode2, episode }, new Series { Title = "30 Rock" }, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode2, episode }, new Series { Title = "30 Rock" }, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
result.Should().Be("30 Rock - S06E06-E07 - Hello + World"); result.Should().Be("30 Rock - S06E06-E07 - Hello + World");
@ -747,7 +744,7 @@ public void should_have_two_episodeTitles_when_distinct_count_is_two()
.Build(); .Build();
//Act //Act
string result = Mocker.Resolve<MediaFileProvider>().GetNewFilename(new List<Episode> { episode, episode2, episode3 }, new Series { Title = "30 Rock" }, Quality.HDTV720p, false, new EpisodeFile()); string result = Mocker.Resolve<IMediaFileService>().GetNewFilename(new List<Episode> { episode, episode2, episode3 }, new Series { Title = "30 Rock" }, Quality.HDTV720p, false, new EpisodeFile());
//Assert //Assert
result.Should().Be("30 Rock - S06E06-E07-E08 - Hello + World"); result.Should().Be("30 Rock - S06E06-E07-E08 - Hello + World");
@ -777,7 +774,7 @@ public void should_use_airDate_if_series_isDaily()
.With(e => e.Title = "Kristen Stewart") .With(e => e.Title = "Kristen Stewart")
.Build(); .Build();
var result = Mocker.Resolve<MediaFileProvider>() var result = Mocker.Resolve<IMediaFileService>()
.GetNewFilename(episodes, series, Quality.HDTV720p, false, new EpisodeFile()); .GetNewFilename(episodes, series, Quality.HDTV720p, false, new EpisodeFile());
result.Should().Be("The Daily Show with Jon Stewart - 2012-12-13 - Kristen Stewart [HDTV-720p]"); result.Should().Be("The Daily Show with Jon Stewart - 2012-12-13 - Kristen Stewart [HDTV-720p]");
} }
@ -806,7 +803,7 @@ public void should_use_airDate_if_series_isDaily_no_episode_title()
.With(e => e.Title = "Kristen Stewart") .With(e => e.Title = "Kristen Stewart")
.Build(); .Build();
var result = Mocker.Resolve<MediaFileProvider>() var result = Mocker.Resolve<IMediaFileService>()
.GetNewFilename(episodes, series, Quality.HDTV720p, false, new EpisodeFile()); .GetNewFilename(episodes, series, Quality.HDTV720p, false, new EpisodeFile());
result.Should().Be("The Daily Show with Jon Stewart - 2012-12-13"); result.Should().Be("The Daily Show with Jon Stewart - 2012-12-13");
} }
@ -835,7 +832,7 @@ public void should_set_airdate_to_unknown_if_not_available()
.With(e => e.Title = "Kristen Stewart") .With(e => e.Title = "Kristen Stewart")
.Build(); .Build();
var result = Mocker.Resolve<MediaFileProvider>() var result = Mocker.Resolve<IMediaFileService>()
.GetNewFilename(episodes, series, Quality.HDTV720p, false, new EpisodeFile()); .GetNewFilename(episodes, series, Quality.HDTV720p, false, new EpisodeFile());
result.Should().Be("The Daily Show with Jon Stewart - Unknown - Kristen Stewart"); result.Should().Be("The Daily Show with Jon Stewart - Unknown - Kristen Stewart");
} }

View file

@ -1,28 +1,25 @@
// ReSharper disable RedundantUsingDirective // ReSharper disable RedundantUsingDirective
using System.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using FizzWare.NBuilder; using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Test.Common.AutoMoq;
namespace NzbDrone.Core.Test.ProviderTests namespace NzbDrone.Core.Test.MediaFileTests
{ {
[TestFixture] [TestFixture]
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
public class MediaFileProviderTest : SqlCeTest public class MediaFileServiceTest : SqlCeTest
{ {
[Test] [Test]
public void get_series_files() public void get_series_files()
@ -45,7 +42,7 @@ public void get_series_files()
Db.InsertMany(firstSeriesFiles); Db.InsertMany(firstSeriesFiles);
Db.InsertMany(secondSeriesFiles); Db.InsertMany(secondSeriesFiles);
var result = Mocker.Resolve<MediaFileProvider>().GetSeriesFiles(12); var result = Mocker.Resolve<IMediaFileService>().GetFilesBySeries(12);
result.Should().HaveSameCount(firstSeriesFiles); result.Should().HaveSameCount(firstSeriesFiles);
@ -74,7 +71,7 @@ public void get_season_files()
Db.InsertMany(firstSeriesFiles); Db.InsertMany(firstSeriesFiles);
Db.InsertMany(secondSeriesFiles); Db.InsertMany(secondSeriesFiles);
var result = Mocker.Resolve<MediaFileProvider>().GetSeasonFiles(12, 1); var result = Mocker.Resolve<IMediaFileService>().GetFilesBySeason(12, 1);
result.Should().HaveSameCount(firstSeriesFiles); result.Should().HaveSameCount(firstSeriesFiles);
} }
@ -88,9 +85,6 @@ public void Scan_series_should_skip_series_with_no_episodes()
.Setup(c => c.GetEpisodeBySeries(12)) .Setup(c => c.GetEpisodeBySeries(12))
.Returns(new List<Episode>()); .Returns(new List<Episode>());
Mocker.GetMock<MediaFileProvider>()
.Setup(e => e.CleanUpDatabase());
Mocker.GetMock<DiskProvider>() Mocker.GetMock<DiskProvider>()
.Setup(c => c.FolderExists(It.IsAny<string>())) .Setup(c => c.FolderExists(It.IsAny<string>()))
@ -112,7 +106,7 @@ public void Scan_series_should_skip_series_with_no_episodes()
public void CleanFileName(string name, string expectedName) public void CleanFileName(string name, string expectedName)
{ {
//Act //Act
var result = MediaFileProvider.CleanFilename(name); var result = MediaFileService.CleanFilename(name);
//Assert //Assert
Assert.AreEqual(expectedName, result); Assert.AreEqual(expectedName, result);
@ -137,7 +131,7 @@ public void CalculateFilePath_SeasonFolder_SingleNumber(string filename, int sea
Mocker.GetMock<IConfigService>().Setup(e => e.SortingSeasonFolderFormat).Returns(seasonFolderFormat); Mocker.GetMock<IConfigService>().Setup(e => e.SortingSeasonFolderFormat).Returns(seasonFolderFormat);
//Act //Act
var result = Mocker.Resolve<MediaFileProvider>().CalculateFilePath(fakeSeries, 1, filename, ".mkv"); var result = Mocker.Resolve<IMediaFileService>().CalculateFilePath(fakeSeries, 1, filename, ".mkv");
//Assert //Assert
Assert.AreEqual(expectedPath, result.FullName); Assert.AreEqual(expectedPath, result.FullName);
@ -158,12 +152,12 @@ public void DeleteEpisodeFile()
Db.InsertMany(episodeFiles); Db.InsertMany(episodeFiles);
//Act //Act
Mocker.Resolve<MediaFileProvider>().Delete(1); Mocker.Resolve<IMediaFileService>().Delete(1);
var result = Db.Fetch<EpisodeFile>(); var result = Db.Fetch<EpisodeFile>();
//Assert //Assert
result.Should().HaveCount(9); result.Should().HaveCount(9);
result.Should().NotContain(e => e.EpisodeFileId == 1); result.Should().NotContain(e => e.Id == 1);
} }
[Test] [Test]
@ -173,7 +167,7 @@ public void GetFileByPath_should_return_null_if_file_does_not_exist_in_database(
WithRealDb(); WithRealDb();
//Act //Act
var result = Mocker.Resolve<MediaFileProvider>().GetFileByPath(@"C:\Test\EpisodeFile.avi"); var result = Mocker.Resolve<IMediaFileService>().GetFileByPath(@"C:\Test\EpisodeFile.avi");
//Resolve //Resolve
result.Should().BeNull(); result.Should().BeNull();
@ -194,12 +188,12 @@ public void GetFileByPath_should_return_EpisodeFile_if_file_exists_in_database()
var episodeFileId = Convert.ToInt32(Db.Insert(episodeFile)); var episodeFileId = Convert.ToInt32(Db.Insert(episodeFile));
//Act //Act
var result = Mocker.Resolve<MediaFileProvider>().GetFileByPath(path); var result = Mocker.Resolve<IMediaFileService>().GetFileByPath(path);
//Resolve //Resolve
result.Should().NotBeNull(); result.Should().NotBeNull();
result.Path.Should().Be(path.NormalizePath()); result.Path.Should().Be(path.NormalizePath());
result.EpisodeFileId.Should().Be(episodeFileId); result.Id.Should().Be(episodeFileId);
} }
} }
} }

View file

@ -199,7 +199,7 @@
<Compile Include="DecisionEngineTests\QualityUpgradeSpecificationFixture.cs" /> <Compile Include="DecisionEngineTests\QualityUpgradeSpecificationFixture.cs" />
<Compile Include="DecisionEngineTests\UpgradePossibleSpecificationFixture.cs" /> <Compile Include="DecisionEngineTests\UpgradePossibleSpecificationFixture.cs" />
<Compile Include="ProviderTests\DownloadClientTests\BlackholeProviderFixture.cs" /> <Compile Include="ProviderTests\DownloadClientTests\BlackholeProviderFixture.cs" />
<Compile Include="ProviderTests\MediaFileProviderTests\CleanUpDatabaseFixture.cs" /> <Compile Include="MediaFileTests\CleanUpDatabaseFixture.cs" />
<Compile Include="ProviderTests\ReferenceDataProviderTest.cs" /> <Compile Include="ProviderTests\ReferenceDataProviderTest.cs" />
<Compile Include="ProviderTests\NotificationProviderTests\NotificationProviderFixture.cs" /> <Compile Include="ProviderTests\NotificationProviderTests\NotificationProviderFixture.cs" />
<Compile Include="ProviderTests\DownloadClientTests\SabProviderTests\QueueFixture.cs" /> <Compile Include="ProviderTests\DownloadClientTests\SabProviderTests\QueueFixture.cs" />
@ -232,7 +232,7 @@
<Compile Include="ProviderTests\DiskScanProviderTests\ImportFileFixture.cs" /> <Compile Include="ProviderTests\DiskScanProviderTests\ImportFileFixture.cs" />
<Compile Include="FluentTest.cs" /> <Compile Include="FluentTest.cs" />
<Compile Include="InstrumentationTests\DatabaseTargetFixture.cs" /> <Compile Include="InstrumentationTests\DatabaseTargetFixture.cs" />
<Compile Include="ProviderTests\MediaFileProviderTests\GetNewFilenameFixture.cs" /> <Compile Include="MediaFileTests\GetNewFilenameFixture.cs" />
<Compile Include="Framework\SqlCeTest.cs" /> <Compile Include="Framework\SqlCeTest.cs" />
<Compile Include="DecisionEngineTests\MonitoredEpisodeSpecificationFixture.cs" /> <Compile Include="DecisionEngineTests\MonitoredEpisodeSpecificationFixture.cs" />
<Compile Include="ProviderTests\DownloadProviderTests\DownloadProviderFixture.cs" /> <Compile Include="ProviderTests\DownloadProviderTests\DownloadProviderFixture.cs" />
@ -246,7 +246,7 @@
<Compile Include="RootFolderTests\RootFolderServiceFixture.cs" /> <Compile Include="RootFolderTests\RootFolderServiceFixture.cs" />
<Compile Include="Indexers\IndexerServiceTest.cs" /> <Compile Include="Indexers\IndexerServiceTest.cs" />
<Compile Include="HistoryTests\HistoryServiceTest.cs" /> <Compile Include="HistoryTests\HistoryServiceTest.cs" />
<Compile Include="ProviderTests\MediaFileProviderTest.cs" /> <Compile Include="MediaFileTests\MediaFileServiceTest.cs" />
<Compile Include="Configuration\ConfigServiceFixture.cs" /> <Compile Include="Configuration\ConfigServiceFixture.cs" />
<Compile Include="TvTests\EpisodeProviderTests\EpisodeProviderTest.cs" /> <Compile Include="TvTests\EpisodeProviderTests\EpisodeProviderTest.cs" />
<Compile Include="Framework\TestDbHelper.cs" /> <Compile Include="Framework\TestDbHelper.cs" />

View file

@ -8,6 +8,7 @@
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
@ -36,7 +37,7 @@ public void should_do_nothing_if_no_files_are_found()
Mocker.Resolve<DiskScanProvider>().CleanUpDropFolder(folder); Mocker.Resolve<DiskScanProvider>().CleanUpDropFolder(folder);
//Assert //Assert
Mocker.GetMock<MediaFileProvider>().Verify(v => v.GetFileByPath(It.IsAny<string>()), Times.Never()); Mocker.GetMock<IMediaFileService>().Verify(v => v.GetFileByPath(It.IsAny<string>()), Times.Never());
} }
[Test] [Test]
@ -54,14 +55,14 @@ public void should_do_nothing_if_no_conflicting_files_are_found()
Mocker.GetMock<DiskProvider>().Setup(s => s.GetFiles(folder, SearchOption.AllDirectories)) Mocker.GetMock<DiskProvider>().Setup(s => s.GetFiles(folder, SearchOption.AllDirectories))
.Returns(new string[] { filename }); .Returns(new string[] { filename });
Mocker.GetMock<MediaFileProvider>().Setup(s => s.GetFileByPath(filename)) Mocker.GetMock<IMediaFileService>().Setup(s => s.GetFileByPath(filename))
.Returns(() => null); .Returns(() => null);
//Act //Act
Mocker.Resolve<DiskScanProvider>().CleanUpDropFolder(folder); Mocker.Resolve<DiskScanProvider>().CleanUpDropFolder(folder);
//Assert //Assert
Mocker.GetMock<MediaFileProvider>().Verify(v => v.GetFileByPath(filename), Times.Once()); Mocker.GetMock<IMediaFileService>().Verify(v => v.GetFileByPath(filename), Times.Once());
Mocker.GetMock<ISeriesRepository>().Verify(v => v.Get(It.IsAny<int>()), Times.Never()); Mocker.GetMock<ISeriesRepository>().Verify(v => v.Get(It.IsAny<int>()), Times.Never());
} }
@ -91,25 +92,25 @@ public void should_move_file_if_a_conflict_is_found()
.With(e => e.EpisodeFile = episodeFile) .With(e => e.EpisodeFile = episodeFile)
.Build(); .Build();
Mocker.GetMock<MediaFileProvider>().Setup(v => v.GetFileByPath(filename)) Mocker.GetMock<IMediaFileService>().Setup(v => v.GetFileByPath(filename))
.Returns(() => null); .Returns(() => null);
Mocker.GetMock<DiskProvider>().Setup(s => s.GetFiles(folder, SearchOption.AllDirectories)) Mocker.GetMock<DiskProvider>().Setup(s => s.GetFiles(folder, SearchOption.AllDirectories))
.Returns(new string[] { filename }); .Returns(new string[] { filename });
Mocker.GetMock<MediaFileProvider>().Setup(s => s.GetFileByPath(filename)) Mocker.GetMock<IMediaFileService>().Setup(s => s.GetFileByPath(filename))
.Returns(episodeFile); .Returns(episodeFile);
Mocker.GetMock<ISeriesRepository>().Setup(s => s.Get(It.IsAny<int>())) Mocker.GetMock<ISeriesRepository>().Setup(s => s.Get(It.IsAny<int>()))
.Returns(series); .Returns(series);
Mocker.GetMock<IEpisodeService>().Setup(s => s.GetEpisodesByFileId(episodeFile.EpisodeFileId)) Mocker.GetMock<IEpisodeService>().Setup(s => s.GetEpisodesByFileId(episodeFile.Id))
.Returns(episode); .Returns(episode);
Mocker.GetMock<MediaFileProvider>().Setup(s => s.GetNewFilename(It.IsAny<IList<Episode>>(), series, Quality.Unknown, false, It.IsAny<EpisodeFile>())) Mocker.GetMock<IMediaFileService>().Setup(s => s.GetNewFilename(It.IsAny<IList<Episode>>(), series, Quality.Unknown, false, It.IsAny<EpisodeFile>()))
.Returns(newFilename); .Returns(newFilename);
Mocker.GetMock<MediaFileProvider>().Setup(s => s.CalculateFilePath(It.IsAny<Series>(), It.IsAny<int>(), It.IsAny<string>(), It.IsAny<string>())) Mocker.GetMock<IMediaFileService>().Setup(s => s.CalculateFilePath(It.IsAny<Series>(), It.IsAny<int>(), It.IsAny<string>(), It.IsAny<string>()))
.Returns(new FileInfo(newFilePath)); .Returns(new FileInfo(newFilePath));
Mocker.GetMock<DiskProvider>() Mocker.GetMock<DiskProvider>()
@ -122,7 +123,7 @@ public void should_move_file_if_a_conflict_is_found()
Mocker.Resolve<DiskScanProvider>().CleanUpDropFolder(folder); Mocker.Resolve<DiskScanProvider>().CleanUpDropFolder(folder);
//Assert //Assert
Mocker.GetMock<MediaFileProvider>().Verify(v => v.GetFileByPath(filename), Times.Once()); Mocker.GetMock<IMediaFileService>().Verify(v => v.GetFileByPath(filename), Times.Once());
Mocker.GetMock<DiskProvider>().Verify(v => v.MoveFile(filename.NormalizePath(), newFilePath), Times.Once()); Mocker.GetMock<DiskProvider>().Verify(v => v.MoveFile(filename.NormalizePath(), newFilePath), Times.Once());
} }
} }

View file

@ -9,6 +9,7 @@
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
@ -53,7 +54,7 @@ public void should_delete_none_existing_files()
.Setup(e => e.GetEpisodesByFileId(It.IsAny<int>())) .Setup(e => e.GetEpisodesByFileId(It.IsAny<int>()))
.Returns(new List<Episode>()); .Returns(new List<Episode>());
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(e => e.Delete(It.IsAny<int>())); .Setup(e => e.Delete(It.IsAny<int>()));
@ -66,7 +67,7 @@ public void should_delete_none_existing_files()
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Verify(e => e.GetEpisodesByFileId(It.IsAny<int>()), Times.Exactly(10)); .Verify(e => e.GetEpisodesByFileId(It.IsAny<int>()), Times.Exactly(10));
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Verify(e => e.Delete(It.IsAny<int>()), Times.Exactly(10)); .Verify(e => e.Delete(It.IsAny<int>()), Times.Exactly(10));
} }
@ -82,12 +83,12 @@ public void should_delete_none_existing_files_remove_links_to_episodes()
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Setup(e => e.GetEpisodesByFileId(It.IsAny<int>())) .Setup(e => e.GetEpisodesByFileId(It.IsAny<int>()))
.Returns(new List<Episode> { new Episode { EpisodeFile = new EpisodeFile { EpisodeFileId = 10 } }, new Episode { EpisodeFile = new EpisodeFile { EpisodeFileId = 10 } } }); .Returns(new List<Episode> { new Episode { EpisodeFile = new EpisodeFile { Id = 10 } }, new Episode { EpisodeFile = new EpisodeFile { Id = 10 } } });
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Setup(e => e.UpdateEpisode(It.IsAny<Episode>())); .Setup(e => e.UpdateEpisode(It.IsAny<Episode>()));
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(e => e.Delete(It.IsAny<int>())); .Setup(e => e.Delete(It.IsAny<int>()));
Mocker.GetMock<IConfigService>() Mocker.GetMock<IConfigService>()
@ -106,10 +107,10 @@ public void should_delete_none_existing_files_remove_links_to_episodes()
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Verify(e => e.UpdateEpisode(It.Is<Episode>(g => g.EpisodeFileId == 0)), Times.Exactly(20)); .Verify(e => e.UpdateEpisode(It.Is<Episode>(g => g.EpisodeFileId == 0)), Times.Exactly(20));
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Verify(e => e.Delete(It.IsAny<int>()), Times.Exactly(10)); .Verify(e => e.Delete(It.IsAny<int>()), Times.Exactly(10));
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Verify(e => e.Delete(It.IsAny<int>()), Times.Exactly(10)); .Verify(e => e.Delete(It.IsAny<int>()), Times.Exactly(10));
} }

View file

@ -6,6 +6,7 @@
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
@ -63,7 +64,7 @@ public void import_new_file_should_succeed()
//Mocks //Mocks
With80MBFile(); With80MBFile();
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.Exists(It.IsAny<String>())) .Setup(p => p.Exists(It.IsAny<String>()))
.Returns(false); .Returns(false);
@ -120,7 +121,7 @@ public void import_new_file_episode_has_same_or_better_quality_should_skip(strin
//Mocks //Mocks
With80MBFile(); With80MBFile();
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.Exists(It.IsAny<String>())) .Setup(p => p.Exists(It.IsAny<String>()))
.Returns(false); .Returns(false);
@ -141,7 +142,7 @@ public void import_unparsable_file_should_skip()
var fakeSeries = Builder<Series>.CreateNew().Build(); var fakeSeries = Builder<Series>.CreateNew().Build();
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.Exists(It.IsAny<String>())).Returns(false); .Setup(p => p.Exists(It.IsAny<String>())).Returns(false);
With80MBFile(); With80MBFile();
@ -162,7 +163,7 @@ public void import_existing_file_should_skip()
var fakeSeries = Builder<Series>.CreateNew().Build(); var fakeSeries = Builder<Series>.CreateNew().Build();
WithStrictMocker(); WithStrictMocker();
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.Exists(It.IsAny<String>())) .Setup(p => p.Exists(It.IsAny<String>()))
.Returns(true); .Returns(true);
@ -190,7 +191,7 @@ public void import_file_with_no_episode_in_db_should_skip()
With80MBFile(); With80MBFile();
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.Exists(It.IsAny<String>())) .Setup(p => p.Exists(It.IsAny<String>()))
.Returns(false); .Returns(false);
@ -221,7 +222,7 @@ public void import_new_file_episode_has_better_quality_than_existing(string file
//Mocks //Mocks
With80MBFile(); With80MBFile();
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.Exists(It.IsAny<String>())) .Setup(p => p.Exists(It.IsAny<String>()))
.Returns(false); .Returns(false);
@ -253,7 +254,7 @@ public void import_new_multi_part_file_episode_has_equal_or_better_quality_than_
With80MBFile(); With80MBFile();
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.Exists(It.IsAny<String>())) .Setup(p => p.Exists(It.IsAny<String>()))
.Returns(false); .Returns(false);
@ -286,7 +287,7 @@ public void skip_import_new_multi_part_file_episode_existing_has_better_quality(
With80MBFile(); With80MBFile();
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.Exists(It.IsAny<String>())) .Setup(p => p.Exists(It.IsAny<String>()))
.Returns(false); .Returns(false);
@ -324,7 +325,7 @@ public void import_new_multi_part_file_episode_replace_two_files()
//Mocks //Mocks
With80MBFile(); With80MBFile();
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.Exists(It.IsAny<String>())) .Setup(p => p.Exists(It.IsAny<String>()))
.Returns(false); .Returns(false);
@ -353,7 +354,7 @@ public void should_import_new_episode_no_existing_episode_file()
//Mocks //Mocks
With80MBFile(); With80MBFile();
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(p => p.Exists(It.IsAny<String>())) .Setup(p => p.Exists(It.IsAny<String>()))
.Returns(false); .Returns(false);
@ -419,7 +420,7 @@ public void should_return_null_if_file_size_is_under_70MB_and_runTime_under_3_mi
{ {
const string path = @"C:\Test\TV\30.rock.s01e01.pilot.avi"; const string path = @"C:\Test\TV\30.rock.s01e01.pilot.avi";
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(m => m.Exists(path)) .Setup(m => m.Exists(path))
.Returns(false); .Returns(false);
@ -442,7 +443,7 @@ public void should_import_if_file_size_is_under_70MB_but_runTime_over_3_minutes(
const string path = @"C:\Test\TV\30.rock.s01e01.pilot.avi"; const string path = @"C:\Test\TV\30.rock.s01e01.pilot.avi";
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(m => m.Exists(path)) .Setup(m => m.Exists(path))
.Returns(false); .Returns(false);
@ -473,7 +474,7 @@ public void should_import_if_file_size_is_over_70MB_but_runTime_under_3_minutes(
const string path = @"C:\Test\TV\30.rock.s01e01.pilot.avi"; const string path = @"C:\Test\TV\30.rock.s01e01.pilot.avi";
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(m => m.Exists(path)) .Setup(m => m.Exists(path))
.Returns(false); .Returns(false);
@ -500,7 +501,7 @@ public void should_import_special_even_if_file_size_is_under_70MB_and_runTime_un
const string path = @"C:\Test\TV\30.rock.s00e01.pre-pilot.avi"; const string path = @"C:\Test\TV\30.rock.s00e01.pre-pilot.avi";
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(m => m.Exists(path)) .Setup(m => m.Exists(path))
.Returns(false); .Returns(false);
@ -528,7 +529,7 @@ public void should_return_null_if_daily_series_with_file_size_is_under_70MB_and_
const string path = @"C:\Test\TV\30.rock.s01e01.pilot.avi"; const string path = @"C:\Test\TV\30.rock.s01e01.pilot.avi";
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(m => m.Exists(path)) .Setup(m => m.Exists(path))
.Returns(false); .Returns(false);
@ -549,18 +550,18 @@ private static void VerifyFileImport(EpisodeFile result, AutoMoqer Mocker, Episo
result.SeriesId.Should().Be(fakeEpisode.SeriesId); result.SeriesId.Should().Be(fakeEpisode.SeriesId);
result.Size.Should().Be(size); result.Size.Should().Be(size);
result.DateAdded.Should().HaveDay(DateTime.Now.Day); result.DateAdded.Should().HaveDay(DateTime.Now.Day);
Mocker.GetMock<MediaFileProvider>().Verify(p => p.Add(It.IsAny<EpisodeFile>()), Times.Once()); Mocker.GetMock<IMediaFileService>().Verify(p => p.Add(It.IsAny<EpisodeFile>()), Times.Once());
//Get the count of episodes linked //Get the count of episodes linked
var count = Mocker.GetMock<IEpisodeService>().Object.GetEpisodesByParseResult(null).Count; var count = Mocker.GetMock<IEpisodeService>().Object.GetEpisodesByParseResult(null).Count;
Mocker.GetMock<IEpisodeService>().Verify(p => p.UpdateEpisode(It.Is<Episode>(e => e.EpisodeFileId == result.EpisodeFileId)), Times.Exactly(count)); Mocker.GetMock<IEpisodeService>().Verify(p => p.UpdateEpisode(It.Is<Episode>(e => e.EpisodeFileId == result.Id)), Times.Exactly(count));
} }
private static void VerifySkipImport(EpisodeFile result, AutoMoqer Mocker) private static void VerifySkipImport(EpisodeFile result, AutoMoqer Mocker)
{ {
result.Should().BeNull(); result.Should().BeNull();
Mocker.GetMock<MediaFileProvider>().Verify(p => p.Add(It.IsAny<EpisodeFile>()), Times.Never()); Mocker.GetMock<IMediaFileService>().Verify(p => p.Add(It.IsAny<EpisodeFile>()), Times.Never());
Mocker.GetMock<IEpisodeService>().Verify(p => p.UpdateEpisode(It.IsAny<Episode>()), Times.Never()); Mocker.GetMock<IEpisodeService>().Verify(p => p.UpdateEpisode(It.IsAny<Episode>()), Times.Never());
Mocker.GetMock<DiskProvider>().Verify(p => p.DeleteFile(It.IsAny<string>()), Times.Never()); Mocker.GetMock<DiskProvider>().Verify(p => p.DeleteFile(It.IsAny<string>()), Times.Never());
} }

View file

@ -10,6 +10,7 @@
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.Download; using NzbDrone.Core.Download;
using NzbDrone.Core.ExternalNotification; using NzbDrone.Core.ExternalNotification;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
@ -53,14 +54,14 @@ public void should_not_move_file_if_source_and_destination_are_the_same_path()
.Returns(fakeSeries); .Returns(fakeSeries);
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Setup(e => e.GetEpisodesByFileId(file.EpisodeFileId)) .Setup(e => e.GetEpisodesByFileId(file.Id))
.Returns(fakeEpisode); .Returns(fakeEpisode);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(e => e.GetNewFilename(fakeEpisode, fakeSeries, It.IsAny<Quality>(), It.IsAny<bool>(), It.IsAny<EpisodeFile>())) .Setup(e => e.GetNewFilename(fakeEpisode, fakeSeries, It.IsAny<Quality>(), It.IsAny<bool>(), It.IsAny<EpisodeFile>()))
.Returns(filename); .Returns(filename);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(e => e.CalculateFilePath(It.IsAny<Series>(), fakeEpisode.First().SeasonNumber, filename, ".avi")) .Setup(e => e.CalculateFilePath(It.IsAny<Series>(), fakeEpisode.First().SeasonNumber, filename, ".avi"))
.Returns(fi); .Returns(fi);
@ -103,14 +104,14 @@ public void should_use_EpisodeFiles_quality()
.Returns(fakeSeries); .Returns(fakeSeries);
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Setup(e => e.GetEpisodesByFileId(file.EpisodeFileId)) .Setup(e => e.GetEpisodesByFileId(file.Id))
.Returns(fakeEpisode); .Returns(fakeEpisode);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(e => e.GetNewFilename(fakeEpisode, fakeSeries, It.IsAny<Quality>(), It.IsAny<bool>(), It.IsAny<EpisodeFile>())) .Setup(e => e.GetNewFilename(fakeEpisode, fakeSeries, It.IsAny<Quality>(), It.IsAny<bool>(), It.IsAny<EpisodeFile>()))
.Returns(filename); .Returns(filename);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(e => e.CalculateFilePath(It.IsAny<Series>(), fakeEpisode.First().SeasonNumber, filename, ".mkv")) .Setup(e => e.CalculateFilePath(It.IsAny<Series>(), fakeEpisode.First().SeasonNumber, filename, ".mkv"))
.Returns(fi); .Returns(fi);
@ -155,14 +156,14 @@ public void should_log_error_and_return_null_when_source_file_does_not_exists()
.Returns(fakeSeries); .Returns(fakeSeries);
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Setup(e => e.GetEpisodesByFileId(file.EpisodeFileId)) .Setup(e => e.GetEpisodesByFileId(file.Id))
.Returns(fakeEpisode); .Returns(fakeEpisode);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(e => e.GetNewFilename(fakeEpisode, fakeSeries, It.IsAny<Quality>(), It.IsAny<bool>(), It.IsAny<EpisodeFile>())) .Setup(e => e.GetNewFilename(fakeEpisode, fakeSeries, It.IsAny<Quality>(), It.IsAny<bool>(), It.IsAny<EpisodeFile>()))
.Returns(filename); .Returns(filename);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(e => e.CalculateFilePath(It.IsAny<Series>(), fakeEpisode.First().SeasonNumber, filename, ".mkv")) .Setup(e => e.CalculateFilePath(It.IsAny<Series>(), fakeEpisode.First().SeasonNumber, filename, ".mkv"))
.Returns(fi); .Returns(fi);

View file

@ -4,6 +4,7 @@
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
@ -30,8 +31,8 @@ public void series_should_update_the_last_scan_date()
.Setup(c => c.FolderExists(It.IsAny<string>())) .Setup(c => c.FolderExists(It.IsAny<string>()))
.Returns(true); .Returns(true);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetSeriesFiles(It.IsAny<int>())) .Setup(c => c.GetFilesBySeries(It.IsAny<int>()))
.Returns(new List<EpisodeFile>()); .Returns(new List<EpisodeFile>());
Mocker.Resolve<DiskScanProvider>().Scan(new Series()); Mocker.Resolve<DiskScanProvider>().Scan(new Series());
@ -51,10 +52,6 @@ public void series_should_log_warning_if_path_doesnt_exist_on_disk()
.Build(); .Build();
Mocker.GetMock<MediaFileProvider>()
.Setup(c => c.CleanUpDatabase());
Mocker.GetMock<DiskProvider>() Mocker.GetMock<DiskProvider>()
.Setup(c => c.FolderExists(series.Path)) .Setup(c => c.FolderExists(series.Path))
.Returns(false); .Returns(false);

View file

@ -9,6 +9,7 @@
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
@ -105,7 +106,7 @@ private void WithSingleEpisodeFile()
.Build(); .Build();
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Setup(s => s.GetEpisodesByFileId(episodeFile.EpisodeFileId)) .Setup(s => s.GetEpisodesByFileId(episodeFile.Id))
.Returns(new List<Episode> { episode }); .Returns(new List<Episode> { episode });
} }
@ -118,7 +119,7 @@ private void WithMultiEpisodeFile()
.Build(); .Build();
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Setup(s => s.GetEpisodesByFileId(episodeFile.EpisodeFileId)) .Setup(s => s.GetEpisodesByFileId(episodeFile.Id))
.Returns(episodes.ToList()); .Returns(episodes.ToList());
} }

View file

@ -4,6 +4,7 @@
using FluentAssertions; using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
@ -26,10 +27,10 @@ public void no_misnamed_files()
var episodeFiles = Builder<EpisodeFile>.CreateListOfSize(2) var episodeFiles = Builder<EpisodeFile>.CreateListOfSize(2)
.TheFirst(1) .TheFirst(1)
.With(f => f.EpisodeFileId = 1) .With(f => f.Id = 1)
.With(f => f.Path = @"C:\Test\Title1.avi") .With(f => f.Path = @"C:\Test\Title1.avi")
.TheNext(1) .TheNext(1)
.With(f => f.EpisodeFileId = 2) .With(f => f.Id = 2)
.With(f => f.Path = @"C:\Test\Title2.avi") .With(f => f.Path = @"C:\Test\Title2.avi")
.Build(); .Build();
@ -47,11 +48,11 @@ public void no_misnamed_files()
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Setup(c => c.EpisodesWithFiles()).Returns(episodes); .Setup(c => c.EpisodesWithFiles()).Returns(episodes);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetNewFilename(new List<Episode> { episodes[0] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[0])) .Setup(c => c.GetNewFilename(new List<Episode> { episodes[0] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[0]))
.Returns("Title1"); .Returns("Title1");
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetNewFilename(new List<Episode> { episodes[1] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[1])) .Setup(c => c.GetNewFilename(new List<Episode> { episodes[1] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[1]))
.Returns("Title2"); .Returns("Title2");
@ -73,10 +74,10 @@ public void all_misnamed_files()
var episodeFiles = Builder<EpisodeFile>.CreateListOfSize(2) var episodeFiles = Builder<EpisodeFile>.CreateListOfSize(2)
.TheFirst(1) .TheFirst(1)
.With(f => f.EpisodeFileId = 1) .With(f => f.Id = 1)
.With(f => f.Path = @"C:\Test\Title1.avi") .With(f => f.Path = @"C:\Test\Title1.avi")
.TheNext(1) .TheNext(1)
.With(f => f.EpisodeFileId = 2) .With(f => f.Id = 2)
.With(f => f.Path = @"C:\Test\Title2.avi") .With(f => f.Path = @"C:\Test\Title2.avi")
.Build(); .Build();
@ -94,11 +95,11 @@ public void all_misnamed_files()
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Setup(c => c.EpisodesWithFiles()).Returns(episodes); .Setup(c => c.EpisodesWithFiles()).Returns(episodes);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetNewFilename(new List<Episode> { episodes[0] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[0])) .Setup(c => c.GetNewFilename(new List<Episode> { episodes[0] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[0]))
.Returns("New Title 1"); .Returns("New Title 1");
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetNewFilename(new List<Episode> { episodes[1] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[1])) .Setup(c => c.GetNewFilename(new List<Episode> { episodes[1] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[1]))
.Returns("New Title 2"); .Returns("New Title 2");
@ -120,10 +121,10 @@ public void one_misnamed_file()
var episodeFiles = Builder<EpisodeFile>.CreateListOfSize(2) var episodeFiles = Builder<EpisodeFile>.CreateListOfSize(2)
.TheFirst(1) .TheFirst(1)
.With(f => f.EpisodeFileId = 1) .With(f => f.Id = 1)
.With(f => f.Path = @"C:\Test\Title1.avi") .With(f => f.Path = @"C:\Test\Title1.avi")
.TheNext(1) .TheNext(1)
.With(f => f.EpisodeFileId = 2) .With(f => f.Id = 2)
.With(f => f.Path = @"C:\Test\Title2.avi") .With(f => f.Path = @"C:\Test\Title2.avi")
.Build(); .Build();
@ -141,11 +142,11 @@ public void one_misnamed_file()
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Setup(c => c.EpisodesWithFiles()).Returns(episodes); .Setup(c => c.EpisodesWithFiles()).Returns(episodes);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetNewFilename(new List<Episode> { episodes[0] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[0])) .Setup(c => c.GetNewFilename(new List<Episode> { episodes[0] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[0]))
.Returns("New Title 1"); .Returns("New Title 1");
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetNewFilename(new List<Episode> { episodes[1] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[1])) .Setup(c => c.GetNewFilename(new List<Episode> { episodes[1] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[1]))
.Returns("Title2"); .Returns("Title2");
@ -169,10 +170,10 @@ public void misnamed_multi_episode_file()
var episodeFiles = Builder<EpisodeFile>.CreateListOfSize(2) var episodeFiles = Builder<EpisodeFile>.CreateListOfSize(2)
.TheFirst(1) .TheFirst(1)
.With(f => f.EpisodeFileId = 1) .With(f => f.Id = 1)
.With(f => f.Path = @"C:\Test\Title1.avi") .With(f => f.Path = @"C:\Test\Title1.avi")
.TheNext(1) .TheNext(1)
.With(f => f.EpisodeFileId = 2) .With(f => f.Id = 2)
.With(f => f.Path = @"C:\Test\Title2.avi") .With(f => f.Path = @"C:\Test\Title2.avi")
.Build(); .Build();
@ -190,11 +191,11 @@ public void misnamed_multi_episode_file()
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Setup(c => c.EpisodesWithFiles()).Returns(episodes); .Setup(c => c.EpisodesWithFiles()).Returns(episodes);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetNewFilename(new List<Episode> { episodes[0], episodes[1] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[0])) .Setup(c => c.GetNewFilename(new List<Episode> { episodes[0], episodes[1] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[0]))
.Returns("New Title 1"); .Returns("New Title 1");
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetNewFilename(new List<Episode> { episodes[2] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[1])) .Setup(c => c.GetNewFilename(new List<Episode> { episodes[2] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[1]))
.Returns("Title2"); .Returns("Title2");
@ -218,10 +219,10 @@ public void no_misnamed_multi_episode_file()
var episodeFiles = Builder<EpisodeFile>.CreateListOfSize(2) var episodeFiles = Builder<EpisodeFile>.CreateListOfSize(2)
.TheFirst(1) .TheFirst(1)
.With(f => f.EpisodeFileId = 1) .With(f => f.Id = 1)
.With(f => f.Path = @"C:\Test\Title1.avi") .With(f => f.Path = @"C:\Test\Title1.avi")
.TheNext(1) .TheNext(1)
.With(f => f.EpisodeFileId = 2) .With(f => f.Id = 2)
.With(f => f.Path = @"C:\Test\Title2.avi") .With(f => f.Path = @"C:\Test\Title2.avi")
.Build(); .Build();
@ -239,11 +240,11 @@ public void no_misnamed_multi_episode_file()
Mocker.GetMock<IEpisodeService>() Mocker.GetMock<IEpisodeService>()
.Setup(c => c.EpisodesWithFiles()).Returns(episodes); .Setup(c => c.EpisodesWithFiles()).Returns(episodes);
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetNewFilename(new List<Episode> { episodes[0], episodes[1] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[0])) .Setup(c => c.GetNewFilename(new List<Episode> { episodes[0], episodes[1] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[0]))
.Returns("Title1"); .Returns("Title1");
Mocker.GetMock<MediaFileProvider>() Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetNewFilename(new List<Episode> { episodes[2] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[1])) .Setup(c => c.GetNewFilename(new List<Episode> { episodes[2] }, It.IsAny<Series>(), It.IsAny<Quality>(), It.IsAny<bool>(), episodeFiles[1]))
.Returns("Title2"); .Returns("Title2");

View file

@ -8,6 +8,7 @@
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;

View file

@ -8,6 +8,7 @@
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;

View file

@ -8,6 +8,7 @@
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;

View file

@ -9,6 +9,7 @@
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Download; using NzbDrone.Core.Download;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
@ -86,9 +87,9 @@ public void GetEpisode_with_EpisodeFile()
WithRealDb(); WithRealDb();
var fakeSeries = Builder<Series>.CreateNew().Build(); var fakeSeries = Builder<Series>.CreateNew().Build();
var fakeFile = Builder<EpisodeFile>.CreateNew().With(f => f.EpisodeFileId).With(c => c.Quality = Quality.SDTV).Build(); var fakeFile = Builder<EpisodeFile>.CreateNew().With(f => f.Id).With(c => c.Quality = Quality.SDTV).Build();
var fakeEpisodes = Builder<Episode>.CreateListOfSize(5) var fakeEpisodes = Builder<Episode>.CreateListOfSize(5)
.All().With(e => e.SeriesId = 1).TheFirst(1).With(e => e.EpisodeFile = new EpisodeFile { EpisodeFileId = 1 }).With(e => e.EpisodeFile = fakeFile).Build(); .All().With(e => e.SeriesId = 1).TheFirst(1).With(e => e.EpisodeFile = new EpisodeFile { Id = 1 }).With(e => e.EpisodeFile = fakeFile).Build();
Db.Insert(fakeSeries); Db.Insert(fakeSeries);
Db.InsertMany(fakeEpisodes); Db.InsertMany(fakeEpisodes);
@ -630,7 +631,7 @@ public void existing_episodes_keep_their_episodeId_file_id()
{ {
TvDbEpisodeId = tvDbEpisode.Id, TvDbEpisodeId = tvDbEpisode.Id,
Id = 99, Id = 99,
EpisodeFile = new EpisodeFile { EpisodeFileId = 69 }, EpisodeFile = new EpisodeFile { Id = 69 },
Ignored = true, Ignored = true,
Series = fakeSeries, Series = fakeSeries,
EpisodeNumber = tvDbEpisode.EpisodeNumber, EpisodeNumber = tvDbEpisode.EpisodeNumber,
@ -679,7 +680,7 @@ public void existing_episodes_remote_their_episodeId_file_id_when_episode_number
{ {
TvDbEpisodeId = tvDbEpisode.Id, TvDbEpisodeId = tvDbEpisode.Id,
Id = 99, Id = 99,
EpisodeFile = new EpisodeFile { EpisodeFileId = 69 }, EpisodeFile = new EpisodeFile { Id = 69 },
Ignored = true, Ignored = true,
Series = fakeSeries, Series = fakeSeries,
EpisodeNumber = tvDbEpisode.EpisodeNumber + 1, EpisodeNumber = tvDbEpisode.EpisodeNumber + 1,
@ -725,7 +726,7 @@ public void existing_episodes_remote_their_episodeId_file_id_when_season_number_
{ {
TvDbEpisodeId = tvDbEpisode.Id, TvDbEpisodeId = tvDbEpisode.Id,
Id = 99, Id = 99,
EpisodeFile = new EpisodeFile { EpisodeFileId = 69 }, EpisodeFile = new EpisodeFile { Id = 69 },
Ignored = true, Ignored = true,
Series = fakeSeries, Series = fakeSeries,
EpisodeNumber = tvDbEpisode.EpisodeNumber, EpisodeNumber = tvDbEpisode.EpisodeNumber,
@ -857,9 +858,9 @@ public void GetEpisode_by_Season_Episode_with_EpisodeFile()
WithRealDb(); WithRealDb();
var fakeSeries = Builder<Series>.CreateNew().Build(); var fakeSeries = Builder<Series>.CreateNew().Build();
var fakeFile = Builder<EpisodeFile>.CreateNew().With(f => f.EpisodeFileId).With(c => c.Quality = Quality.SDTV).Build(); var fakeFile = Builder<EpisodeFile>.CreateNew().With(f => f.Id).With(c => c.Quality = Quality.SDTV).Build();
var fakeEpisodes = Builder<Episode>.CreateListOfSize(5) var fakeEpisodes = Builder<Episode>.CreateListOfSize(5)
.All().With(e => e.SeriesId = 1).TheFirst(1).With(c => c.EpisodeFile = new EpisodeFile { EpisodeFileId = 1 }).With(e => e.EpisodeFile = fakeFile).Build(); .All().With(e => e.SeriesId = 1).TheFirst(1).With(c => c.EpisodeFile = new EpisodeFile { Id = 1 }).With(e => e.EpisodeFile = fakeFile).Build();
Db.Insert(fakeSeries); Db.Insert(fakeSeries);
Db.InsertMany(fakeEpisodes); Db.InsertMany(fakeEpisodes);
@ -901,9 +902,9 @@ public void GetEpisode_by_AirDate_with_EpisodeFile()
WithRealDb(); WithRealDb();
var fakeSeries = Builder<Series>.CreateNew().Build(); var fakeSeries = Builder<Series>.CreateNew().Build();
var fakeFile = Builder<EpisodeFile>.CreateNew().With(f => f.EpisodeFileId).With(c => c.Quality = Quality.SDTV).Build(); var fakeFile = Builder<EpisodeFile>.CreateNew().With(f => f.Id).With(c => c.Quality = Quality.SDTV).Build();
var fakeEpisodes = Builder<Episode>.CreateListOfSize(5) var fakeEpisodes = Builder<Episode>.CreateListOfSize(5)
.All().With(e => e.SeriesId = 1).TheFirst(1).With(e => e.EpisodeFile = new EpisodeFile { EpisodeFileId = 1 }).With(e => e.EpisodeFile = fakeFile).Build(); .All().With(e => e.SeriesId = 1).TheFirst(1).With(e => e.EpisodeFile = new EpisodeFile { Id = 1 }).With(e => e.EpisodeFile = fakeFile).Build();
Db.Insert(fakeSeries); Db.Insert(fakeSeries);
Db.InsertMany(fakeEpisodes); Db.InsertMany(fakeEpisodes);
@ -925,7 +926,7 @@ public void GetEpisode_by_AirDate_without_EpisodeFile()
var fakeSeries = Builder<Series>.CreateNew().Build(); var fakeSeries = Builder<Series>.CreateNew().Build();
var fakeEpisodes = Builder<Episode>.CreateListOfSize(5) var fakeEpisodes = Builder<Episode>.CreateListOfSize(5)
.All().With(e => e.SeriesId = 1).TheFirst(1).With(e => e.EpisodeFile = new EpisodeFile { EpisodeFileId = 1 }).Build(); .All().With(e => e.SeriesId = 1).TheFirst(1).With(e => e.EpisodeFile = new EpisodeFile { Id = 1 }).Build();
Db.InsertMany(fakeEpisodes); Db.InsertMany(fakeEpisodes);
Db.Insert(fakeSeries); Db.Insert(fakeSeries);
@ -1212,7 +1213,7 @@ public void EpisodesWithFiles_success()
.Build(); .Build();
var episodeFile = Builder<EpisodeFile>.CreateNew() var episodeFile = Builder<EpisodeFile>.CreateNew()
.With(c => c.EpisodeFileId = 1) .With(c => c.Id = 1)
.With(c => c.Quality = Quality.SDTV) .With(c => c.Quality = Quality.SDTV)
.Build(); .Build();
@ -1288,7 +1289,7 @@ public void GetEpisodesByFileId_multi_episodes()
.All() .All()
.With(c => c.SeriesId = 10) .With(c => c.SeriesId = 10)
.With(c => c.SeasonNumber = 1) .With(c => c.SeasonNumber = 1)
.With(c => c.EpisodeFile = new EpisodeFile { EpisodeFileId = 12345 }) .With(c => c.EpisodeFile = new EpisodeFile { Id = 12345 })
.Build(); .Build();
Db.Insert(series); Db.Insert(series);
@ -1314,7 +1315,7 @@ public void GetEpisodesByFileId_single_episode()
var fakeEpisode = Builder<Episode>.CreateNew() var fakeEpisode = Builder<Episode>.CreateNew()
.With(c => c.SeriesId = 10) .With(c => c.SeriesId = 10)
.With(c => c.SeasonNumber = 1) .With(c => c.SeasonNumber = 1)
.With(c => c.EpisodeFile = new EpisodeFile { EpisodeFileId = 12345 }) .With(c => c.EpisodeFile = new EpisodeFile { Id = 12345 })
.Build(); .Build();
Db.Insert(series); Db.Insert(series);

View file

@ -1,5 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;

View file

@ -15,6 +15,7 @@ public interface IObjectDatabase : IDisposable
IList<T> UpdateMany<T>(IList<T> objects) where T : ModelBase; IList<T> UpdateMany<T>(IList<T> objects) where T : ModelBase;
void Delete<T>(T obj) where T : ModelBase; void Delete<T>(T obj) where T : ModelBase;
void DeleteMany<T>(IEnumerable<T> objects) where T : ModelBase; void DeleteMany<T>(IEnumerable<T> objects) where T : ModelBase;
void UpdateField<T>(T model, string fieldName) where T : ModelBase;
} }
public static class SiaqodbLogger public static class SiaqodbLogger
@ -22,8 +23,8 @@ public static class SiaqodbLogger
public static void ListenTo(Siaqodb db) public static void ListenTo(Siaqodb db)
{ {
db.DeletedObject += OnDeletedObject; db.DeletedObject += OnDeletedObject;
db.LoadingObject +=OnLoadingObject; db.LoadingObject += OnLoadingObject;
db.LoadedObject +=OnLoadedObject; db.LoadedObject += OnLoadedObject;
} }
private static void OnLoadedObject(object sender, LoadedObjectEventArgs e) private static void OnLoadedObject(object sender, LoadedObjectEventArgs e)
@ -116,6 +117,11 @@ public void DeleteMany<T>(IEnumerable<T> objects) where T : ModelBase
} }
} }
public void UpdateField<T>(T model, string fieldName) where T : ModelBase
{
_db.UpdateObjectBy(model, fieldName);
}
private IList<T> DoMany<T>(IEnumerable<T> objects, Func<T, T> function) where T : ModelBase private IList<T> DoMany<T>(IEnumerable<T> objects, Func<T, T> function) where T : ModelBase
{ {
return objects.Select(function).ToList(); return objects.Select(function).ToList();

View file

@ -4,6 +4,7 @@
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
@ -18,7 +19,7 @@ public class ImportNewSeriesJob : IJob
{ {
private readonly ISeriesService _seriesService; private readonly ISeriesService _seriesService;
private readonly IEpisodeService _episodeService; private readonly IEpisodeService _episodeService;
private readonly MediaFileProvider _mediaFileProvider; 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 BannerDownloadJob _bannerDownloadJob;
@ -32,13 +33,13 @@ public class ImportNewSeriesJob : IJob
private List<int> _attemptedSeries; private List<int> _attemptedSeries;
public ImportNewSeriesJob(ISeriesService seriesService, IEpisodeService episodeService, public ImportNewSeriesJob(ISeriesService seriesService, IEpisodeService episodeService,
MediaFileProvider mediaFileProvider, UpdateInfoJob updateInfoJob, IMediaFileService mediaFileService, UpdateInfoJob updateInfoJob,
DiskScanJob diskScanJob, BannerDownloadJob bannerDownloadJob, DiskScanJob diskScanJob, BannerDownloadJob bannerDownloadJob,
ISeasonRepository seasonRepository, XemUpdateJob xemUpdateJob, ISeriesRepository seriesRepository,ISeasonService seasonService) ISeasonRepository seasonRepository, XemUpdateJob xemUpdateJob, ISeriesRepository seriesRepository,ISeasonService seasonService)
{ {
_seriesService = seriesService; _seriesService = seriesService;
_episodeService = episodeService; _episodeService = episodeService;
_mediaFileProvider = mediaFileProvider; _mediaFileService = mediaFileService;
_updateInfoJob = updateInfoJob; _updateInfoJob = updateInfoJob;
_diskScanJob = diskScanJob; _diskScanJob = diskScanJob;
_bannerDownloadJob = bannerDownloadJob; _bannerDownloadJob = bannerDownloadJob;
@ -108,7 +109,7 @@ public void AutoIgnoreSeasons(int seriesId)
{ {
//Todo: Need to convert this over to ObjectDb //Todo: Need to convert this over to ObjectDb
return; return;
var episodeFiles = _mediaFileProvider.GetSeriesFiles(seriesId); var episodeFiles = _mediaFileService.GetFilesBySeries(seriesId);
if (episodeFiles.Count() != 0) if (episodeFiles.Count() != 0)
{ {

View file

@ -3,6 +3,7 @@
using System; using System;
using NLog; using NLog;
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
@ -12,17 +13,17 @@ namespace NzbDrone.Core.Jobs
{ {
public class RefreshEpisodeMetadata : IJob public class RefreshEpisodeMetadata : IJob
{ {
private readonly MediaFileProvider _mediaFileProvider; private readonly IMediaFileService _mediaFileService;
private readonly ISeriesService _seriesService; private readonly ISeriesService _seriesService;
private readonly MetadataProvider _metadataProvider; private readonly MetadataProvider _metadataProvider;
private readonly ISeriesRepository _seriesRepository; private readonly ISeriesRepository _seriesRepository;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public RefreshEpisodeMetadata(MediaFileProvider mediaFileProvider, ISeriesService seriesService, public RefreshEpisodeMetadata(IMediaFileService mediaFileService, ISeriesService seriesService,
MetadataProvider metadataProvider,ISeriesRepository seriesRepository) MetadataProvider metadataProvider,ISeriesRepository seriesRepository)
{ {
_mediaFileProvider = mediaFileProvider; _mediaFileService = mediaFileService;
_seriesService = seriesService; _seriesService = seriesService;
_metadataProvider = metadataProvider; _metadataProvider = metadataProvider;
_seriesRepository = seriesRepository; _seriesRepository = seriesRepository;
@ -59,7 +60,7 @@ private void RefreshMetadata(ProgressNotification notification, Series series)
notification.CurrentMessage = String.Format("Refreshing episode metadata for '{0}'", series.Title); notification.CurrentMessage = String.Format("Refreshing episode metadata for '{0}'", series.Title);
Logger.Debug("Getting episodes from database for series: {0}", series.Id); Logger.Debug("Getting episodes from database for series: {0}", series.Id);
var episodeFiles = _mediaFileProvider.GetSeriesFiles(series.Id); var episodeFiles = _mediaFileService.GetFilesBySeries(series.Id);
if (episodeFiles == null || episodeFiles.Count == 0) if (episodeFiles == null || episodeFiles.Count == 0)
{ {

View file

@ -5,6 +5,7 @@
using NzbDrone.Common.Eventing; using NzbDrone.Common.Eventing;
using NzbDrone.Core.Download; using NzbDrone.Core.Download;
using NzbDrone.Core.ExternalNotification; using NzbDrone.Core.ExternalNotification;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
@ -13,7 +14,7 @@ namespace NzbDrone.Core.Jobs
{ {
public class RenameSeasonJob : IJob public class RenameSeasonJob : IJob
{ {
private readonly MediaFileProvider _mediaFileProvider; private readonly IMediaFileService _mediaFileService;
private readonly DiskScanProvider _diskScanProvider; private readonly DiskScanProvider _diskScanProvider;
private readonly ISeriesService _seriesService; private readonly ISeriesService _seriesService;
private readonly MetadataProvider _metadataProvider; private readonly MetadataProvider _metadataProvider;
@ -22,10 +23,10 @@ public class RenameSeasonJob : IJob
private static readonly Logger logger = LogManager.GetCurrentClassLogger(); private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public RenameSeasonJob(MediaFileProvider mediaFileProvider, DiskScanProvider diskScanProvider, ISeriesService seriesService, public RenameSeasonJob(IMediaFileService mediaFileService, DiskScanProvider diskScanProvider, ISeriesService seriesService,
MetadataProvider metadataProvider, ISeriesRepository seriesRepository, IEventAggregator eventAggregator) MetadataProvider metadataProvider, ISeriesRepository seriesRepository, IEventAggregator eventAggregator)
{ {
_mediaFileProvider = mediaFileProvider; _mediaFileService = mediaFileService;
_diskScanProvider = diskScanProvider; _diskScanProvider = diskScanProvider;
_seriesService = seriesService; _seriesService = seriesService;
_metadataProvider = metadataProvider; _metadataProvider = metadataProvider;
@ -56,7 +57,7 @@ public void Start(ProgressNotification notification, dynamic options)
notification.CurrentMessage = String.Format("Renaming episodes for {0} Season {1}", series.Title, options.SeasonNumber); notification.CurrentMessage = String.Format("Renaming episodes for {0} Season {1}", series.Title, options.SeasonNumber);
logger.Debug("Getting episodes from database for series: {0} and season: {1}", options.SeriesId, options.SeasonNumber); logger.Debug("Getting episodes from database for series: {0} and season: {1}", options.SeriesId, options.SeasonNumber);
IList<EpisodeFile> episodeFiles = _mediaFileProvider.GetSeasonFiles((int)options.SeriesId, (int)options.SeasonNumber); IList<EpisodeFile> episodeFiles = _mediaFileService.GetFilesBySeason((int)options.SeriesId, (int)options.SeasonNumber);
if (episodeFiles == null || !episodeFiles.Any()) if (episodeFiles == null || !episodeFiles.Any())
{ {

View file

@ -4,6 +4,7 @@
using NLog; using NLog;
using NzbDrone.Common.Eventing; using NzbDrone.Common.Eventing;
using NzbDrone.Core.Download; using NzbDrone.Core.Download;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
@ -12,7 +13,7 @@ namespace NzbDrone.Core.Jobs
{ {
public class RenameSeriesJob : IJob public class RenameSeriesJob : IJob
{ {
private readonly MediaFileProvider _mediaFileProvider; private readonly IMediaFileService _mediaFileService;
private readonly DiskScanProvider _diskScanProvider; private readonly DiskScanProvider _diskScanProvider;
private readonly MetadataProvider _metadataProvider; private readonly MetadataProvider _metadataProvider;
private readonly ISeriesRepository _seriesRepository; private readonly ISeriesRepository _seriesRepository;
@ -20,10 +21,10 @@ public class RenameSeriesJob : IJob
private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public RenameSeriesJob(MediaFileProvider mediaFileProvider, DiskScanProvider diskScanProvider, public RenameSeriesJob(IMediaFileService mediaFileService, DiskScanProvider diskScanProvider,
MetadataProvider metadataProvider,ISeriesRepository seriesRepository,IEventAggregator eventAggregator) MetadataProvider metadataProvider,ISeriesRepository seriesRepository,IEventAggregator eventAggregator)
{ {
_mediaFileProvider = mediaFileProvider; _mediaFileService = mediaFileService;
_diskScanProvider = diskScanProvider; _diskScanProvider = diskScanProvider;
_metadataProvider = metadataProvider; _metadataProvider = metadataProvider;
_seriesRepository = seriesRepository; _seriesRepository = seriesRepository;
@ -59,7 +60,7 @@ public void Start(ProgressNotification notification, dynamic options)
notification.CurrentMessage = String.Format("Renaming episodes for '{0}'", series.Title); notification.CurrentMessage = String.Format("Renaming episodes for '{0}'", series.Title);
Logger.Debug("Getting episodes from database for series: {0}", series.Id); Logger.Debug("Getting episodes from database for series: {0}", series.Id);
var episodeFiles = _mediaFileProvider.GetSeriesFiles(series.Id); var episodeFiles = _mediaFileService.GetFilesBySeries(series.Id);
if (episodeFiles == null || episodeFiles.Count == 0) if (episodeFiles == null || episodeFiles.Count == 0)
{ {

View file

@ -1,11 +1,12 @@
using System.Linq; using System.Linq;
using System; using System;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using PetaPoco; using NzbDrone.Core.Tv;
namespace NzbDrone.Core.Tv namespace NzbDrone.Core.MediaFiles
{ {
public class EpisodeFile public class EpisodeFile : ModelBase
{ {
public EpisodeFile() public EpisodeFile()
{ {
@ -14,7 +15,7 @@ public EpisodeFile()
public EpisodeFile(EpisodeFile source) public EpisodeFile(EpisodeFile source)
{ {
EpisodeFileId = source.EpisodeFileId; Id = source.Id;
SeriesId = source.SeriesId; SeriesId = source.SeriesId;
SeasonNumber = source.SeasonNumber; SeasonNumber = source.SeasonNumber;
Path = source.Path; Path = source.Path;
@ -23,8 +24,6 @@ public EpisodeFile(EpisodeFile source)
Size = source.Size; Size = source.Size;
} }
public int EpisodeFileId { get; set; }
public int SeriesId { get; set; } public int SeriesId { get; set; }
public int SeasonNumber { get; set; } public int SeasonNumber { get; set; }
public string Path { get; set; } public string Path { get; set; }

View file

@ -0,0 +1,39 @@
using System.Collections.Generic;
using System.Linq;
using NzbDrone.Core.Datastore;
namespace NzbDrone.Core.MediaFiles
{
public interface IMediaFileRepository : IBasicRepository<EpisodeFile>
{
EpisodeFile GetFileByPath(string path);
List<EpisodeFile> GetFilesBySeries(int seriesId);
List<EpisodeFile> GetFilesBySeason(int seriesId, int seasonNumber);
}
public class MediaFileRepository : BasicRepository<EpisodeFile>, IMediaFileRepository
{
public MediaFileRepository(IObjectDatabase objectDatabase)
: base(objectDatabase)
{
}
public EpisodeFile GetFileByPath(string path)
{
return Queryable.SingleOrDefault(c => c.Path == path);
}
public List<EpisodeFile> GetFilesBySeries(int seriesId)
{
return Queryable.Where(c => c.SeriesId == seriesId).ToList();
}
public List<EpisodeFile> GetFilesBySeason(int seriesId, int seasonNumber)
{
return Queryable.Where(c => c.SeriesId == seriesId && c.SeasonNumber == seasonNumber).ToList();
}
}
}

View file

@ -0,0 +1,214 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using NLog;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Helpers;
namespace NzbDrone.Core.MediaFiles
{
public interface IMediaFileService
{
EpisodeFile Add(EpisodeFile episodeFile);
void Update(EpisodeFile episodeFile);
void Delete(int episodeFileId);
bool Exists(string path);
EpisodeFile GetFileByPath(string path);
IList<EpisodeFile> GetFilesBySeries(int seriesId);
IList<EpisodeFile> GetFilesBySeason(int seriesId, int seasonNumber);
FileInfo CalculateFilePath(Series series, int seasonNumber, string fileName, string extention);
string GetNewFilename(IList<Episode> episodes, Series series, Quality quality, bool proper, EpisodeFile episodeFile);
}
public class MediaFileService : IMediaFileService
{
private readonly IConfigService _configService;
private readonly IEpisodeService _episodeService;
private readonly Logger _logger;
private readonly IMediaFileRepository _mediaFileRepository;
public MediaFileService(IMediaFileRepository mediaFileRepository, IConfigService configService, IEpisodeService episodeService, Logger logger)
{
_mediaFileRepository = mediaFileRepository;
_configService = configService;
_episodeService = episodeService;
_logger = logger;
}
public EpisodeFile Add(EpisodeFile episodeFile)
{
return _mediaFileRepository.Insert(episodeFile);
}
public void Update(EpisodeFile episodeFile)
{
_mediaFileRepository.Update(episodeFile);
}
public void Delete(int episodeFileId)
{
_mediaFileRepository.Delete(episodeFileId);
var ep = _episodeService.GetEpisodesByFileId(episodeFileId);
foreach (var episode in ep)
{
_episodeService.SetEpisodeIgnore(episode.Id, true);
}
}
public bool Exists(string path)
{
return GetFileByPath(path) != null;
}
public EpisodeFile GetFileByPath(string path)
{
return _mediaFileRepository.GetFileByPath(path.Normalize());
}
public IList<EpisodeFile> GetFilesBySeries(int seriesId)
{
return _mediaFileRepository.GetFilesBySeries(seriesId);
}
public IList<EpisodeFile> GetFilesBySeason(int seriesId, int seasonNumber)
{
return _mediaFileRepository.GetFilesBySeason(seriesId, seasonNumber);
}
public FileInfo CalculateFilePath(Series series, int seasonNumber, string fileName, string extention)
{
string path = series.Path;
if (series.SeasonFolder)
{
var seasonFolder = _configService.SortingSeasonFolderFormat
.Replace("%0s", seasonNumber.ToString("00"))
.Replace("%s", seasonNumber.ToString());
path = Path.Combine(path, seasonFolder);
}
path = Path.Combine(path, fileName + extention);
return new FileInfo(path);
}
public string GetNewFilename(IList<Episode> episodes, Series series, Quality quality, bool proper, EpisodeFile episodeFile)
{
if (_configService.SortingUseSceneName)
{
_logger.Trace("Attempting to use scene name");
if (String.IsNullOrWhiteSpace(episodeFile.SceneName))
{
var name = Path.GetFileNameWithoutExtension(episodeFile.Path);
_logger.Trace("Unable to use scene name, because it is null, sticking with current name: {0}", name);
return name;
}
return episodeFile.SceneName;
}
var sortedEpisodes = episodes.OrderBy(e => e.EpisodeNumber);
var separatorStyle = EpisodeSortingHelper.GetSeparatorStyle(_configService.SortingSeparatorStyle);
var numberStyle = EpisodeSortingHelper.GetNumberStyle(_configService.SortingNumberStyle);
var episodeNames = new List<String>();
episodeNames.Add(Parser.CleanupEpisodeTitle(sortedEpisodes.First().Title));
string result = String.Empty;
if (_configService.SortingIncludeSeriesName)
{
result += series.Title + separatorStyle.Pattern;
}
if (series.SeriesType == SeriesType.Standard)
{
result += numberStyle.Pattern.Replace("%0e",
String.Format("{0:00}", sortedEpisodes.First().EpisodeNumber));
if (episodes.Count > 1)
{
var multiEpisodeStyle =
EpisodeSortingHelper.GetMultiEpisodeStyle(_configService.SortingMultiEpisodeStyle);
foreach (var episode in sortedEpisodes.Skip(1))
{
if (multiEpisodeStyle.Name == "Duplicate")
{
result += separatorStyle.Pattern + numberStyle.Pattern;
}
else
{
result += multiEpisodeStyle.Pattern;
}
result = result.Replace("%0e", String.Format("{0:00}", episode.EpisodeNumber));
episodeNames.Add(Parser.CleanupEpisodeTitle(episode.Title));
}
}
result = result
.Replace("%s", String.Format("{0}", episodes.First().SeasonNumber))
.Replace("%0s", String.Format("{0:00}", episodes.First().SeasonNumber))
.Replace("%x", numberStyle.EpisodeSeparator)
.Replace("%p", separatorStyle.Pattern);
}
else
{
if (episodes.First().AirDate.HasValue)
result += episodes.First().AirDate.Value.ToString("yyyy-MM-dd");
else
result += "Unknown";
}
if (_configService.SortingIncludeEpisodeTitle)
{
if (episodeNames.Distinct().Count() == 1)
result += separatorStyle.Pattern + episodeNames.First();
else
result += separatorStyle.Pattern + String.Join(" + ", episodeNames.Distinct());
}
if (_configService.SortingAppendQuality)
{
result += String.Format(" [{0}]", quality);
if (proper)
result += " [Proper]";
}
if (_configService.SortingReplaceSpaces)
result = result.Replace(' ', '.');
_logger.Trace("New File Name is: [{0}]", result.Trim());
return CleanFilename(result.Trim());
}
public static string CleanFilename(string name)
{
string result = name;
string[] badCharacters = { "\\", "/", "<", ">", "?", "*", ":", "|", "\"" };
string[] goodCharacters = { "+", "+", "{", "}", "!", "@", "-", "#", "`" };
for (int i = 0; i < badCharacters.Length; i++)
result = result.Replace(badCharacters[i], goodCharacters[i]);
return result.Trim();
}
}
}

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Linq; using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
@ -76,7 +77,7 @@ public override string ToString()
public string GetDownloadTitle() public string GetDownloadTitle()
{ {
var seriesTitle = MediaFileProvider.CleanFilename(Series.Title); var seriesTitle = MediaFileService.CleanFilename(Series.Title);
//Handle Full Naming //Handle Full Naming
if (FullSeason) if (FullSeason)

View file

@ -285,6 +285,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="MediaFiles\MediaFileRepository.cs" />
<Compile Include="Model\DownloadClientType.cs" /> <Compile Include="Model\DownloadClientType.cs" />
<Compile Include="Instrumentation\LogService.cs" /> <Compile Include="Instrumentation\LogService.cs" />
<Compile Include="Instrumentation\DatabaseTarget.cs" /> <Compile Include="Instrumentation\DatabaseTarget.cs" />
@ -508,7 +509,7 @@
<Compile Include="Indexers\SyndicationFeedXmlReader.cs"> <Compile Include="Indexers\SyndicationFeedXmlReader.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="Providers\MediaFileProvider.cs"> <Compile Include="MediaFiles\MediaFileService.cs">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="Providers\MisnamedProvider.cs"> <Compile Include="Providers\MisnamedProvider.cs">
@ -582,7 +583,7 @@
<Compile Include="Model\EpisodeStatusType.cs" /> <Compile Include="Model\EpisodeStatusType.cs" />
<Compile Include="Model\Sabnzbd\SabPriorityType.cs" /> <Compile Include="Model\Sabnzbd\SabPriorityType.cs" />
<Compile Include="Model\SeasonParseResult.cs" /> <Compile Include="Model\SeasonParseResult.cs" />
<Compile Include="Tv\EpisodeFile.cs" /> <Compile Include="MediaFiles\EpisodeFile.cs" />
<Compile Include="Model\Notification\ProgressNotificationStatus.cs" /> <Compile Include="Model\Notification\ProgressNotificationStatus.cs" />
<Compile Include="Parser.cs" /> <Compile Include="Parser.cs" />
<Compile Include="Model\Notification\ProgressNotification.cs" /> <Compile Include="Model\Notification\ProgressNotification.cs" />

View file

@ -8,6 +8,7 @@
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Download; using NzbDrone.Core.Download;
using NzbDrone.Core.ExternalNotification; using NzbDrone.Core.ExternalNotification;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
@ -19,7 +20,7 @@ public class DiskScanProvider
private static readonly string[] mediaExtentions = new[] { ".mkv", ".avi", ".wmv", ".mp4", ".mpg", ".mpeg", ".xvid", ".flv", ".mov", ".rm", ".rmvb", ".divx", ".dvr-ms", ".ts", ".ogm", ".m4v", ".strm" }; private static readonly string[] mediaExtentions = new[] { ".mkv", ".avi", ".wmv", ".mp4", ".mpg", ".mpeg", ".xvid", ".flv", ".mov", ".rm", ".rmvb", ".divx", ".dvr-ms", ".ts", ".ogm", ".m4v", ".strm" };
private readonly DiskProvider _diskProvider; private readonly DiskProvider _diskProvider;
private readonly IEpisodeService _episodeService; private readonly IEpisodeService _episodeService;
private readonly MediaFileProvider _mediaFileProvider; private readonly IMediaFileService _mediaFileService;
private readonly SignalRProvider _signalRProvider; private readonly SignalRProvider _signalRProvider;
private readonly IConfigService _configService; private readonly IConfigService _configService;
private readonly RecycleBinProvider _recycleBinProvider; private readonly RecycleBinProvider _recycleBinProvider;
@ -27,13 +28,13 @@ public class DiskScanProvider
private readonly ISeriesRepository _seriesRepository; private readonly ISeriesRepository _seriesRepository;
private readonly IEventAggregator _eventAggregator; private readonly IEventAggregator _eventAggregator;
public DiskScanProvider(DiskProvider diskProvider, IEpisodeService episodeService, MediaFileProvider mediaFileProvider, public DiskScanProvider(DiskProvider diskProvider, IEpisodeService episodeService, IMediaFileService mediaFileService,
SignalRProvider signalRProvider, IConfigService configService, SignalRProvider signalRProvider, IConfigService configService,
RecycleBinProvider recycleBinProvider, MediaInfoProvider mediaInfoProvider, ISeriesRepository seriesRepository, IEventAggregator eventAggregator) RecycleBinProvider recycleBinProvider, MediaInfoProvider mediaInfoProvider, ISeriesRepository seriesRepository, IEventAggregator eventAggregator)
{ {
_diskProvider = diskProvider; _diskProvider = diskProvider;
_episodeService = episodeService; _episodeService = episodeService;
_mediaFileProvider = mediaFileProvider; _mediaFileService = mediaFileService;
_signalRProvider = signalRProvider; _signalRProvider = signalRProvider;
_configService = configService; _configService = configService;
_recycleBinProvider = recycleBinProvider; _recycleBinProvider = recycleBinProvider;
@ -62,8 +63,6 @@ public virtual List<EpisodeFile> Scan(Series series)
/// <param name="path">Path to scan</param> /// <param name="path">Path to scan</param>
public virtual List<EpisodeFile> Scan(Series series, string path) public virtual List<EpisodeFile> Scan(Series series, string path)
{ {
_mediaFileProvider.CleanUpDatabase();
if (!_diskProvider.FolderExists(path)) if (!_diskProvider.FolderExists(path))
{ {
Logger.Warn("Series folder doesn't exist: {0}", path); Logger.Warn("Series folder doesn't exist: {0}", path);
@ -76,7 +75,7 @@ public virtual List<EpisodeFile> Scan(Series series, string path)
return new List<EpisodeFile>(); return new List<EpisodeFile>();
} }
var seriesFile = _mediaFileProvider.GetSeriesFiles(series.Id); var seriesFile = _mediaFileService.GetFilesBySeries(series.Id);
CleanUp(seriesFile); CleanUp(seriesFile);
var mediaFileList = GetVideoFiles(path); var mediaFileList = GetVideoFiles(path);
@ -104,7 +103,7 @@ public virtual EpisodeFile ImportFile(Series series, string filePath)
{ {
Logger.Trace("Importing file to database [{0}]", filePath); Logger.Trace("Importing file to database [{0}]", filePath);
if (_mediaFileProvider.Exists(filePath)) if (_mediaFileService.Exists(filePath))
{ {
Logger.Trace("[{0}] already exists in the database. skipping.", filePath); Logger.Trace("[{0}] already exists in the database. skipping.", filePath);
return null; return null;
@ -169,7 +168,7 @@ public virtual EpisodeFile ImportFile(Series series, string filePath)
//Todo: We shouldn't actually import the file until we confirm its the only one we want. //Todo: We shouldn't actually import the file until we confirm its the only one we want.
//Todo: Separate episodeFile creation from importing (pass file to import to import) //Todo: Separate episodeFile creation from importing (pass file to import to import)
_mediaFileProvider.Add(episodeFile); _mediaFileService.Add(episodeFile);
//Link file to all episodes //Link file to all episodes
foreach (var ep in episodes) foreach (var ep in episodes)
@ -189,9 +188,9 @@ public virtual EpisodeFile MoveEpisodeFile(EpisodeFile episodeFile, bool newDown
throw new ArgumentNullException("episodeFile"); throw new ArgumentNullException("episodeFile");
var series = _seriesRepository.Get(episodeFile.SeriesId); var series = _seriesRepository.Get(episodeFile.SeriesId);
var episodes = _episodeService.GetEpisodesByFileId(episodeFile.EpisodeFileId); var episodes = _episodeService.GetEpisodesByFileId(episodeFile.Id);
string newFileName = _mediaFileProvider.GetNewFilename(episodes, series, episodeFile.Quality, episodeFile.Proper, episodeFile); string newFileName = _mediaFileService.GetNewFilename(episodes, series, episodeFile.Quality, episodeFile.Proper, episodeFile);
var newFile = _mediaFileProvider.CalculateFilePath(series, episodes.First().SeasonNumber, newFileName, Path.GetExtension(episodeFile.Path)); var newFile = _mediaFileService.CalculateFilePath(series, episodes.First().SeasonNumber, newFileName, Path.GetExtension(episodeFile.Path));
//Only rename if existing and new filenames don't match //Only rename if existing and new filenames don't match
if (DiskProvider.PathEquals(episodeFile.Path, newFile.FullName)) if (DiskProvider.PathEquals(episodeFile.Path, newFile.FullName))
@ -223,7 +222,7 @@ public virtual EpisodeFile MoveEpisodeFile(EpisodeFile episodeFile, bool newDown
} }
episodeFile.Path = newFile.FullName; episodeFile.Path = newFile.FullName;
_mediaFileProvider.Update(episodeFile); _mediaFileService.Update(episodeFile);
var parseResult = Parser.ParsePath(episodeFile.Path); var parseResult = Parser.ParsePath(episodeFile.Path);
parseResult.Series = series; parseResult.Series = series;
@ -257,7 +256,7 @@ public virtual void CleanUp(IList<EpisodeFile> files)
Logger.Trace("File [{0}] no longer exists on disk. removing from db", episodeFile.Path); Logger.Trace("File [{0}] no longer exists on disk. removing from db", episodeFile.Path);
//Set the EpisodeFileId for each episode attached to this file to 0 //Set the EpisodeFileId for each episode attached to this file to 0
foreach (var episode in _episodeService.GetEpisodesByFileId(episodeFile.EpisodeFileId)) foreach (var episode in _episodeService.GetEpisodesByFileId(episodeFile.Id))
{ {
Logger.Trace("Detaching episode {0} from file.", episode.Id); Logger.Trace("Detaching episode {0} from file.", episode.Id);
episode.EpisodeFile = null; episode.EpisodeFile = null;
@ -269,12 +268,12 @@ public virtual void CleanUp(IList<EpisodeFile> files)
//Delete it from the DB //Delete it from the DB
Logger.Trace("Removing EpisodeFile from DB."); Logger.Trace("Removing EpisodeFile from DB.");
_mediaFileProvider.Delete(episodeFile.EpisodeFileId); _mediaFileService.Delete(episodeFile.Id);
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
var message = String.Format("Unable to cleanup EpisodeFile in DB: {0}", episodeFile.EpisodeFileId); var message = String.Format("Unable to cleanup EpisodeFile in DB: {0}", episodeFile.Id);
Logger.ErrorException(message, ex); Logger.ErrorException(message, ex);
} }
} }
@ -290,7 +289,7 @@ public virtual void CleanUpDropFolder(string path)
{ {
try try
{ {
var episodeFile = _mediaFileProvider.GetFileByPath(file); var episodeFile = _mediaFileService.GetFileByPath(file);
if (episodeFile != null) if (episodeFile != null)
{ {

View file

@ -5,6 +5,7 @@
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.History; using NzbDrone.Core.History;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
@ -38,7 +39,7 @@ public virtual bool DownloadNzb(string url, string title, bool recentlyAired)
{ {
try try
{ {
title = MediaFileProvider.CleanFilename(title); title = MediaFileService.CleanFilename(title);
var filename = Path.Combine(_configService.BlackholeDirectory, title + ".nzb"); var filename = Path.Combine(_configService.BlackholeDirectory, title + ".nzb");

View file

@ -4,6 +4,7 @@
using NLog; using NLog;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.DecisionEngine;
@ -43,7 +44,7 @@ public virtual bool DownloadNzb(string url, string title, bool recentlyAired)
return false; return false;
} }
title = MediaFileProvider.CleanFilename(title); title = MediaFileService.CleanFilename(title);
//Save to the Pneumatic directory (The user will need to ensure its accessible by XBMC) //Save to the Pneumatic directory (The user will need to ensure its accessible by XBMC)
var filename = Path.Combine(_configService.PneumaticDirectory, title + ".nzb"); var filename = Path.Combine(_configService.PneumaticDirectory, title + ".nzb");

View file

@ -1,265 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using NLog;
using NzbDrone.Core.Configuration;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv;
using NzbDrone.Core.Helpers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Repository;
using PetaPoco;
using NzbDrone.Common;
namespace NzbDrone.Core.Providers
{
public class MediaFileProvider
{
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly IConfigService _configService;
private readonly IDatabase _database;
private readonly IEpisodeService _episodeService;
public MediaFileProvider(IEpisodeService episodeService, IConfigService configService, IDatabase database)
{
_episodeService = episodeService;
_configService = configService;
_database = database;
}
public MediaFileProvider()
{
}
public virtual int Add(EpisodeFile episodeFile)
{
return Convert.ToInt32(_database.Insert(episodeFile));
}
public virtual void Update(EpisodeFile episodeFile)
{
_database.Update(episodeFile);
}
public virtual void Delete(int episodeFileId)
{
_database.Delete<EpisodeFile>(episodeFileId);
}
public virtual bool Exists(string path)
{
return _database.Exists<EpisodeFile>("WHERE Path =@0", path.NormalizePath());
}
public virtual EpisodeFile GetFileByPath(string path)
{
return _database.SingleOrDefault<EpisodeFile>("WHERE Path =@0", path.NormalizePath());
}
public virtual EpisodeFile GetEpisodeFile(int episodeFileId)
{
return _database.Single<EpisodeFile>(episodeFileId);
}
public virtual List<EpisodeFile> GetEpisodeFiles()
{
return _database.Fetch<EpisodeFile>();
}
public virtual IList<EpisodeFile> GetSeriesFiles(int seriesId)
{
return _database.Fetch<EpisodeFile>("WHERE SeriesId= @0", seriesId);
}
public virtual IList<EpisodeFile> GetSeasonFiles(int seriesId, int seasonNumber)
{
return _database.Fetch<EpisodeFile>("WHERE SeriesId= @0 AND SeasonNumber = @1", seriesId, seasonNumber);
}
public virtual Tuple<int, int> GetEpisodeFilesCount(int seriesId)
{
var allEpisodes = _episodeService.GetEpisodeBySeries(seriesId).ToList();
var episodeTotal = allEpisodes.Where(e => !e.Ignored && e.AirDate != null && e.AirDate <= DateTime.Today).ToList();
var avilableEpisodes = episodeTotal.Where(e => e.EpisodeFileId > 0).ToList();
return new Tuple<int, int>(avilableEpisodes.Count, episodeTotal.Count);
}
public virtual FileInfo CalculateFilePath(Series series, int seasonNumber, string fileName, string extention)
{
string path = series.Path;
if (series.SeasonFolder)
{
var seasonFolder = _configService.SortingSeasonFolderFormat
.Replace("%0s", seasonNumber.ToString("00"))
.Replace("%s", seasonNumber.ToString());
path = Path.Combine(path, seasonFolder);
}
path = Path.Combine(path, fileName + extention);
return new FileInfo(path);
}
public virtual void CleanUpDatabase()
{
Logger.Trace("Verifying Episode > Episode file relationships.");
string updateString = "UPDATE Episodes SET EpisodeFileId = 0, GrabDate = NULL, PostDownloadStatus = 0";
if (_configService.AutoIgnorePreviouslyDownloadedEpisodes)
{
updateString += ", Ignored = 1";
}
var updated = _database.Execute(updateString +
@"WHERE EpisodeFileId IN
(SELECT Episodes.EpisodeFileId FROM Episodes
LEFT OUTER JOIN EpisodeFiles
ON Episodes.EpisodeFileId = EpisodeFiles.EpisodeFileId
WHERE Episodes.EpisodeFileId > 0 AND EpisodeFiles.EpisodeFileId IS NULL)");
if (updated > 0)
{
Logger.Debug("Removed {0} invalid links to episode files.", updated);
}
Logger.Trace("Deleting orphan files.");
updated = _database.Execute(@"DELETE FROM EpisodeFiles
WHERE EpisodeFileId IN
(SELECT EpisodeFiles.EpisodeFileId FROM EpisodeFiles
LEFT OUTER JOIN Episodes
ON EpisodeFiles.EpisodeFileId = Episodes.EpisodeFileId
WHERE Episodes.EpisodeFileId IS NULL)");
if (updated > 0)
{
Logger.Debug("Removed {0} orphan file(s) from database.", updated);
}
}
public virtual string GetNewFilename(IList<Episode> episodes, Series series, Quality quality, bool proper, EpisodeFile episodeFile)
{
if (_configService.SortingUseSceneName)
{
Logger.Trace("Attempting to use scene name");
if (String.IsNullOrWhiteSpace(episodeFile.SceneName))
{
var name = Path.GetFileNameWithoutExtension(episodeFile.Path);
Logger.Trace("Unable to use scene name, because it is null, sticking with current name: {0}", name);
return name;
}
return episodeFile.SceneName;
}
var sortedEpisodes = episodes.OrderBy(e => e.EpisodeNumber);
var separatorStyle = EpisodeSortingHelper.GetSeparatorStyle(_configService.SortingSeparatorStyle);
var numberStyle = EpisodeSortingHelper.GetNumberStyle(_configService.SortingNumberStyle);
var episodeNames = new List<String>();
episodeNames.Add(Parser.CleanupEpisodeTitle(sortedEpisodes.First().Title));
string result = String.Empty;
if (_configService.SortingIncludeSeriesName)
{
result += series.Title + separatorStyle.Pattern;
}
if (series.SeriesType == SeriesType.Standard)
{
result += numberStyle.Pattern.Replace("%0e",
String.Format("{0:00}", sortedEpisodes.First().EpisodeNumber));
if(episodes.Count > 1)
{
var multiEpisodeStyle =
EpisodeSortingHelper.GetMultiEpisodeStyle(_configService.SortingMultiEpisodeStyle);
foreach(var episode in sortedEpisodes.Skip(1))
{
if(multiEpisodeStyle.Name == "Duplicate")
{
result += separatorStyle.Pattern + numberStyle.Pattern;
}
else
{
result += multiEpisodeStyle.Pattern;
}
result = result.Replace("%0e", String.Format("{0:00}", episode.EpisodeNumber));
episodeNames.Add(Parser.CleanupEpisodeTitle(episode.Title));
}
}
result = result
.Replace("%s", String.Format("{0}", episodes.First().SeasonNumber))
.Replace("%0s", String.Format("{0:00}", episodes.First().SeasonNumber))
.Replace("%x", numberStyle.EpisodeSeparator)
.Replace("%p", separatorStyle.Pattern);
}
else
{
if(episodes.First().AirDate.HasValue)
result += episodes.First().AirDate.Value.ToString("yyyy-MM-dd");
else
result += "Unknown";
}
if (_configService.SortingIncludeEpisodeTitle)
{
if (episodeNames.Distinct().Count() == 1)
result += separatorStyle.Pattern + episodeNames.First();
else
result += separatorStyle.Pattern + String.Join(" + ", episodeNames.Distinct());
}
if (_configService.SortingAppendQuality)
{
result += String.Format(" [{0}]", quality);
if (proper)
result += " [Proper]";
}
if (_configService.SortingReplaceSpaces)
result = result.Replace(' ', '.');
Logger.Trace("New File Name is: [{0}]", result.Trim());
return CleanFilename(result.Trim());
}
public virtual void ChangeQuality(int episodeFileId, Quality quality)
{
_database.Execute("UPDATE EpisodeFiles SET Quality = @quality WHERE EpisodeFileId = @episodeFileId", new { episodeFileId, quality });
}
public virtual void ChangeQuality(int seriesId, int seasonNumber, Quality quality)
{
_database.Execute("UPDATE EpisodeFiles SET Quality = @quality WHERE SeriesId = @seriesId AND SeasonNumber = @seasonNumber", new { seriesId, seasonNumber, quality });
}
public static string CleanFilename(string name)
{
string result = name;
string[] badCharacters = { "\\", "/", "<", ">", "?", "*", ":", "|", "\"" };
string[] goodCharacters = { "+", "+", "{", "}", "!", "@", "-", "#", "`" };
for (int i = 0; i < badCharacters.Length; i++)
result = result.Replace(badCharacters[i], goodCharacters[i]);
return result.Trim();
}
}
}

View file

@ -2,6 +2,7 @@
using NLog; using NLog;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Providers.Core;

View file

@ -7,6 +7,7 @@
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Providers.Core;
@ -115,11 +116,11 @@ public override void CreateForSeries(Series series, TvdbSeries tvDbSeries)
public override void CreateForEpisodeFile(EpisodeFile episodeFile, TvdbSeries tvDbSeries) public override void CreateForEpisodeFile(EpisodeFile episodeFile, TvdbSeries tvDbSeries)
{ {
//Create filename.tbn and filename.nfo //Create filename.tbn and filename.nfo
var episodes = _episodeService.GetEpisodesByFileId(episodeFile.EpisodeFileId); var episodes = _episodeService.GetEpisodesByFileId(episodeFile.Id);
if (!episodes.Any()) if (!episodes.Any())
{ {
_logger.Debug("No episodes where found for this episode file: {0}", episodeFile.EpisodeFileId); _logger.Debug("No episodes where found for this episode file: {0}", episodeFile.Id);
return; return;
} }
@ -137,7 +138,7 @@ public override void CreateForEpisodeFile(EpisodeFile episodeFile, TvdbSeries tv
{ {
if (!_diskProvider.FileExists(episodeFile.Path.Replace(Path.GetExtension(episodeFile.Path), ".tbn"))) if (!_diskProvider.FileExists(episodeFile.Path.Replace(Path.GetExtension(episodeFile.Path), ".tbn")))
{ {
_logger.Debug("Downloading episode thumbnail for: {0}", episodeFile.EpisodeFileId); _logger.Debug("Downloading episode thumbnail for: {0}", episodeFile.Id);
_bannerProvider.Download(episodeFileThumbnail.BannerPath, _bannerProvider.Download(episodeFileThumbnail.BannerPath,
episodeFile.Path.Replace(Path.GetExtension(episodeFile.Path), ".tbn")); episodeFile.Path.Replace(Path.GetExtension(episodeFile.Path), ".tbn"));
} }
@ -145,7 +146,7 @@ public override void CreateForEpisodeFile(EpisodeFile episodeFile, TvdbSeries tv
_logger.Debug("Generating filename.nfo for: {0}", episodeFile.EpisodeFileId); _logger.Debug("Generating filename.nfo for: {0}", episodeFile.Id);
var xmlResult = String.Empty; var xmlResult = String.Empty;
foreach (var episode in episodes) foreach (var episode in episodes)

View file

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NLog; using NLog;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Providers.Metadata; using NzbDrone.Core.Providers.Metadata;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
@ -135,7 +136,7 @@ public virtual void CreateForEpisodeFiles(List<EpisodeFile> episodeFiles)
{ {
foreach (var provider in _metadataProviders.Where(i => GetSettings(i.GetType()).Enable)) foreach (var provider in _metadataProviders.Where(i => GetSettings(i.GetType()).Enable))
{ {
Logger.Trace("Creating {0} metadata for {1}", provider.Name, episodeFile.EpisodeFileId); Logger.Trace("Creating {0} metadata for {1}", provider.Name, episodeFile.Id);
provider.CreateForEpisodeFile(episodeFile, tvDbSeries); provider.CreateForEpisodeFile(episodeFile, tvDbSeries);
} }
} }

View file

@ -5,6 +5,7 @@
using System.Text; using System.Text;
using System.Diagnostics; using System.Diagnostics;
using NLog; using NLog;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Tv; using NzbDrone.Core.Tv;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Repository; using NzbDrone.Core.Repository;
@ -13,14 +14,14 @@ namespace NzbDrone.Core.Providers
{ {
public class MisnamedProvider public class MisnamedProvider
{ {
private readonly MediaFileProvider _mediaFileProvider; private readonly IMediaFileService _mediaFileService;
private readonly IEpisodeService _episodeService; private readonly IEpisodeService _episodeService;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public MisnamedProvider(MediaFileProvider mediaFileProvider, IEpisodeService episodeService) public MisnamedProvider(IMediaFileService mediaFileService, IEpisodeService episodeService)
{ {
_mediaFileProvider = mediaFileProvider; _mediaFileService = mediaFileService;
_episodeService = episodeService; _episodeService = episodeService;
} }
@ -36,7 +37,7 @@ public virtual List<MisnamedEpisodeModel> MisnamedFiles(int pageNumber, int page
var misnamedFilesSelect = episodesWithFiles.AsParallel().Where( var misnamedFilesSelect = episodesWithFiles.AsParallel().Where(
w => w =>
w.First().EpisodeFile.Path != w.First().EpisodeFile.Path !=
_mediaFileProvider.GetNewFilename(w.Select(e => e).ToList(), w.First().Series, _mediaFileService.GetNewFilename(w.Select(e => e).ToList(), w.First().Series,
w.First().EpisodeFile.Quality, w.First().EpisodeFile.Proper, w.First().EpisodeFile)).Skip(Math.Max(pageSize * (pageNumber - 1), 0)).Take(pageSize); w.First().EpisodeFile.Quality, w.First().EpisodeFile.Proper, w.First().EpisodeFile)).Skip(Math.Max(pageSize * (pageNumber - 1), 0)).Take(pageSize);
//Process the episodes //Process the episodes
@ -44,7 +45,7 @@ public virtual List<MisnamedEpisodeModel> MisnamedFiles(int pageNumber, int page
{ {
var episodes = f.Select(e => e).ToList(); var episodes = f.Select(e => e).ToList();
var firstEpisode = episodes[0]; var firstEpisode = episodes[0];
var properName = _mediaFileProvider.GetNewFilename(episodes, var properName = _mediaFileService.GetNewFilename(episodes,
firstEpisode.Series, firstEpisode.Series,
firstEpisode.EpisodeFile.Quality, firstEpisode.EpisodeFile.Proper, firstEpisode.EpisodeFile); firstEpisode.EpisodeFile.Quality, firstEpisode.EpisodeFile.Proper, firstEpisode.EpisodeFile);

View file

@ -1,6 +1,7 @@
using System.Linq; using System.Linq;
using System; using System;
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using Sqo.Attributes; using Sqo.Attributes;
@ -40,7 +41,7 @@ public int EpisodeFileId
get get
{ {
if (!HasFile) return 0; if (!HasFile) return 0;
return EpisodeFile.EpisodeFileId; return EpisodeFile.Id;
} }
} }

View file

@ -283,8 +283,7 @@ public virtual IList<int> GetEpisodeNumbersBySeason(int seriesId, int seasonNumb
public virtual void SetEpisodeIgnore(int episodeId, bool isIgnored) public virtual void SetEpisodeIgnore(int episodeId, bool isIgnored)
{ {
var episode = _episodeRepository.Get(episodeId); var episode = _episodeRepository.Get(episodeId);
episode.Ignored = isIgnored; _episodeRepository.SetIgnoreFlat(episode, isIgnored);
_episodeRepository.Update(episode);
logger.Info("Ignore flag for Episode:{0} was set to {1}", episodeId, isIgnored); logger.Info("Ignore flag for Episode:{0} was set to {1}", episodeId, isIgnored);
} }

View file

@ -9,7 +9,6 @@
using NzbDrone.Core.Datastore; using NzbDrone.Core.Datastore;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers; using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Core;
using NzbDrone.Core.Qualities; using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv.Events; using NzbDrone.Core.Tv.Events;