From 9cb1eb75970800c0f73354a95915b9485f4781a0 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 5 Jun 2011 17:37:32 -0700 Subject: [PATCH] Rename Provider returns proper name for single episode series. --- NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 1 + NzbDrone.Core.Test/RenameProviderTest.cs | 299 +++++++++++++++++++ NzbDrone.Core/Providers/EpisodeProvider.cs | Bin 10754 -> 10953 bytes NzbDrone.Core/Providers/RenameProvider.cs | 59 +++- 4 files changed, 356 insertions(+), 3 deletions(-) create mode 100644 NzbDrone.Core.Test/RenameProviderTest.cs diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 3faf3c3f3..c9a790a07 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -90,6 +90,7 @@ + diff --git a/NzbDrone.Core.Test/RenameProviderTest.cs b/NzbDrone.Core.Test/RenameProviderTest.cs new file mode 100644 index 000000000..807e24a25 --- /dev/null +++ b/NzbDrone.Core.Test/RenameProviderTest.cs @@ -0,0 +1,299 @@ +// ReSharper disable RedundantUsingDirective +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using AutoMoq; +using FizzWare.NBuilder; +using Moq; +using NUnit.Framework; +using NzbDrone.Core.Model; +using NzbDrone.Core.Providers; +using NzbDrone.Core.Providers.Core; +using NzbDrone.Core.Repository; +using NzbDrone.Core.Repository.Quality; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test +{ + [TestFixture] + // ReSharper disable InconsistentNaming + public class RenameProviderTest : TestBase + { + [Test] + public void GetNewFilename_Series_Episode_Quality_S01E05_Dash() + { + //Setup + var mocker = new AutoMoqer(); + + var fakeConfig = mocker.GetMock(); + fakeConfig.SetupGet(c => c.SeriesName).Returns(true); + fakeConfig.SetupGet(c => c.EpisodeName).Returns(true); + fakeConfig.SetupGet(c => c.AppendQuality).Returns(true); + fakeConfig.SetupGet(c => c.SeparatorStyle).Returns(0); + fakeConfig.SetupGet(c => c.NumberStyle).Returns(2); + fakeConfig.SetupGet(c => c.ReplaceSpaces).Returns(false); + + var series = Builder.CreateNew().With(s => s.Title = "South Park").Build(); + + var episodeFile = Builder.CreateNew() + .With(e => e.EpisodeFileId = 12345) + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.Quality = QualityTypes.HDTV) + .Build(); + + var episode = Builder.CreateNew() + .With(e => e.EpisodeFileId = episodeFile.EpisodeFileId) + .With(e => e.Title = "City Sushi") + .With(e => e.SeasonNumber = 15) + .With(e => e.EpisodeNumber = 6) + .With(e => e.SeriesId = series.SeriesId) + .Build(); + + var fakeMediaFileProvider = mocker.GetMock(); + fakeMediaFileProvider.Setup(m => m.GetEpisodeFile(12345)).Returns(episodeFile); + + var fakeEpisodeProvider = mocker.GetMock(); + fakeEpisodeProvider.Setup(m => m.EpisodesByFileId(12345)).Returns(new List {episode}); + + var fakeSeriesProvider = mocker.GetMock(); + fakeSeriesProvider.Setup(m => m.GetSeries(series.SeriesId)).Returns(series); + + //Act + string result = mocker.Resolve().GetNewFilename(12345); + + //Assert + Assert.AreEqual("South Park - S15E06 - City Sushi [HDTV]", result); + } + + [Test] + public void GetNewFilename_Episode_Quality_1x05_Dash() + { + //Setup + var mocker = new AutoMoqer(); + + var fakeConfig = mocker.GetMock(); + fakeConfig.SetupGet(c => c.SeriesName).Returns(false); + fakeConfig.SetupGet(c => c.EpisodeName).Returns(true); + fakeConfig.SetupGet(c => c.AppendQuality).Returns(true); + fakeConfig.SetupGet(c => c.SeparatorStyle).Returns(0); + fakeConfig.SetupGet(c => c.NumberStyle).Returns(0); + fakeConfig.SetupGet(c => c.ReplaceSpaces).Returns(false); + + var series = Builder.CreateNew().With(s => s.Title = "South Park").Build(); + + var episodeFile = Builder.CreateNew() + .With(e => e.EpisodeFileId = 12345) + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.Quality = QualityTypes.HDTV) + .Build(); + + var episode = Builder.CreateNew() + .With(e => e.EpisodeFileId = episodeFile.EpisodeFileId) + .With(e => e.Title = "City Sushi") + .With(e => e.SeasonNumber = 15) + .With(e => e.EpisodeNumber = 6) + .With(e => e.SeriesId = series.SeriesId) + .Build(); + + var fakeMediaFileProvider = mocker.GetMock(); + fakeMediaFileProvider.Setup(m => m.GetEpisodeFile(12345)).Returns(episodeFile); + + var fakeEpisodeProvider = mocker.GetMock(); + fakeEpisodeProvider.Setup(m => m.EpisodesByFileId(12345)).Returns(new List { episode }); + + var fakeSeriesProvider = mocker.GetMock(); + fakeSeriesProvider.Setup(m => m.GetSeries(series.SeriesId)).Returns(series); + + //Act + string result = mocker.Resolve().GetNewFilename(12345); + + //Assert + Assert.AreEqual("15x06 - City Sushi [HDTV]", result); + } + + [Test] + public void GetNewFilename_Series_Quality_01x05_Space() + { + //Setup + var mocker = new AutoMoqer(); + + var fakeConfig = mocker.GetMock(); + fakeConfig.SetupGet(c => c.SeriesName).Returns(true); + fakeConfig.SetupGet(c => c.EpisodeName).Returns(false); + fakeConfig.SetupGet(c => c.AppendQuality).Returns(true); + fakeConfig.SetupGet(c => c.SeparatorStyle).Returns(1); + fakeConfig.SetupGet(c => c.NumberStyle).Returns(1); + fakeConfig.SetupGet(c => c.ReplaceSpaces).Returns(false); + + var series = Builder.CreateNew().With(s => s.Title = "South Park").Build(); + + var episodeFile = Builder.CreateNew() + .With(e => e.EpisodeFileId = 12345) + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.Quality = QualityTypes.HDTV) + .Build(); + + var episode = Builder.CreateNew() + .With(e => e.EpisodeFileId = episodeFile.EpisodeFileId) + .With(e => e.Title = "City Sushi") + .With(e => e.SeasonNumber = 5) + .With(e => e.EpisodeNumber = 6) + .With(e => e.SeriesId = series.SeriesId) + .Build(); + + var fakeMediaFileProvider = mocker.GetMock(); + fakeMediaFileProvider.Setup(m => m.GetEpisodeFile(12345)).Returns(episodeFile); + + var fakeEpisodeProvider = mocker.GetMock(); + fakeEpisodeProvider.Setup(m => m.EpisodesByFileId(12345)).Returns(new List { episode }); + + var fakeSeriesProvider = mocker.GetMock(); + fakeSeriesProvider.Setup(m => m.GetSeries(series.SeriesId)).Returns(series); + + //Act + string result = mocker.Resolve().GetNewFilename(12345); + + //Assert + Assert.AreEqual("South Park 05x06 [HDTV]", result); + } + + [Test] + public void GetNewFilename_Series_s01e05_Space() + { + //Setup + var mocker = new AutoMoqer(); + + var fakeConfig = mocker.GetMock(); + fakeConfig.SetupGet(c => c.SeriesName).Returns(true); + fakeConfig.SetupGet(c => c.EpisodeName).Returns(false); + fakeConfig.SetupGet(c => c.AppendQuality).Returns(false); + fakeConfig.SetupGet(c => c.SeparatorStyle).Returns(1); + fakeConfig.SetupGet(c => c.NumberStyle).Returns(3); + fakeConfig.SetupGet(c => c.ReplaceSpaces).Returns(false); + + var series = Builder.CreateNew().With(s => s.Title = "South Park").Build(); + + var episodeFile = Builder.CreateNew() + .With(e => e.EpisodeFileId = 12345) + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.Quality = QualityTypes.HDTV) + .Build(); + + var episode = Builder.CreateNew() + .With(e => e.EpisodeFileId = episodeFile.EpisodeFileId) + .With(e => e.Title = "City Sushi") + .With(e => e.SeasonNumber = 5) + .With(e => e.EpisodeNumber = 6) + .With(e => e.SeriesId = series.SeriesId) + .Build(); + + var fakeMediaFileProvider = mocker.GetMock(); + fakeMediaFileProvider.Setup(m => m.GetEpisodeFile(12345)).Returns(episodeFile); + + var fakeEpisodeProvider = mocker.GetMock(); + fakeEpisodeProvider.Setup(m => m.EpisodesByFileId(12345)).Returns(new List { episode }); + + var fakeSeriesProvider = mocker.GetMock(); + fakeSeriesProvider.Setup(m => m.GetSeries(series.SeriesId)).Returns(series); + + //Act + string result = mocker.Resolve().GetNewFilename(12345); + + //Assert + Assert.AreEqual("South Park s05e06", result); + } + + [Test] + public void GetNewFilename_Series_Episode_s01e05_Periods() + { + //Setup + var mocker = new AutoMoqer(); + + var fakeConfig = mocker.GetMock(); + fakeConfig.SetupGet(c => c.SeriesName).Returns(true); + fakeConfig.SetupGet(c => c.EpisodeName).Returns(true); + fakeConfig.SetupGet(c => c.AppendQuality).Returns(false); + fakeConfig.SetupGet(c => c.SeparatorStyle).Returns(1); + fakeConfig.SetupGet(c => c.NumberStyle).Returns(3); + fakeConfig.SetupGet(c => c.ReplaceSpaces).Returns(true); + + var series = Builder.CreateNew().With(s => s.Title = "South Park").Build(); + + var episodeFile = Builder.CreateNew() + .With(e => e.EpisodeFileId = 12345) + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.Quality = QualityTypes.HDTV) + .Build(); + + var episode = Builder.CreateNew() + .With(e => e.EpisodeFileId = episodeFile.EpisodeFileId) + .With(e => e.Title = "City Sushi") + .With(e => e.SeasonNumber = 5) + .With(e => e.EpisodeNumber = 6) + .With(e => e.SeriesId = series.SeriesId) + .Build(); + + var fakeMediaFileProvider = mocker.GetMock(); + fakeMediaFileProvider.Setup(m => m.GetEpisodeFile(12345)).Returns(episodeFile); + + var fakeEpisodeProvider = mocker.GetMock(); + fakeEpisodeProvider.Setup(m => m.EpisodesByFileId(12345)).Returns(new List { episode }); + + var fakeSeriesProvider = mocker.GetMock(); + fakeSeriesProvider.Setup(m => m.GetSeries(series.SeriesId)).Returns(series); + + //Act + string result = mocker.Resolve().GetNewFilename(12345); + + //Assert + Assert.AreEqual("South.Park.s05e06.City.Sushi", result); + } + + [Test] + public void GetNewFilename_Series_Episode_s01e05_Dash_Periods_Quality() + { + //Setup + var mocker = new AutoMoqer(); + + var fakeConfig = mocker.GetMock(); + fakeConfig.SetupGet(c => c.SeriesName).Returns(true); + fakeConfig.SetupGet(c => c.EpisodeName).Returns(true); + fakeConfig.SetupGet(c => c.AppendQuality).Returns(true); + fakeConfig.SetupGet(c => c.SeparatorStyle).Returns(0); + fakeConfig.SetupGet(c => c.NumberStyle).Returns(3); + fakeConfig.SetupGet(c => c.ReplaceSpaces).Returns(true); + + var series = Builder.CreateNew().With(s => s.Title = "South Park").Build(); + + var episodeFile = Builder.CreateNew() + .With(e => e.EpisodeFileId = 12345) + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.Quality = QualityTypes.HDTV) + .Build(); + + var episode = Builder.CreateNew() + .With(e => e.EpisodeFileId = episodeFile.EpisodeFileId) + .With(e => e.Title = "City Sushi") + .With(e => e.SeasonNumber = 5) + .With(e => e.EpisodeNumber = 6) + .With(e => e.SeriesId = series.SeriesId) + .Build(); + + var fakeMediaFileProvider = mocker.GetMock(); + fakeMediaFileProvider.Setup(m => m.GetEpisodeFile(12345)).Returns(episodeFile); + + var fakeEpisodeProvider = mocker.GetMock(); + fakeEpisodeProvider.Setup(m => m.EpisodesByFileId(12345)).Returns(new List { episode }); + + var fakeSeriesProvider = mocker.GetMock(); + fakeSeriesProvider.Setup(m => m.GetSeries(series.SeriesId)).Returns(series); + + //Act + string result = mocker.Resolve().GetNewFilename(12345); + + //Assert + Assert.AreEqual("South.Park.-.s05e06.-.City.Sushi.[HDTV]", result); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs index 31024cc5300d6517b6e12e45bed8d557dc2e50bc..7dab9bc2d10125f5e5dfbb47c95518737e138124 100644 GIT binary patch delta 80 zcmZn)IT^a4f^!n9_~iX;{F67Zb4WQ=x@G31dZuV(=9MU<7GxIZr=&teCNr|@PS)Yj UZ+7z;(f^+g!ammdQT!jh%J;nxP diff --git a/NzbDrone.Core/Providers/RenameProvider.cs b/NzbDrone.Core/Providers/RenameProvider.cs index 012de3068..51bc6a1ca 100644 --- a/NzbDrone.Core/Providers/RenameProvider.cs +++ b/NzbDrone.Core/Providers/RenameProvider.cs @@ -25,9 +25,9 @@ namespace NzbDrone.Core.Providers private Thread _renameThread; - public RenameProvider(SeriesProvider seriesProvider, - EpisodeProvider episodeProvider, MediaFileProvider mediaFileProvider, - DiskProvider diskProvider, ConfigProvider configProvider) + public RenameProvider(SeriesProvider seriesProvider,EpisodeProvider episodeProvider, + MediaFileProvider mediaFileProvider, DiskProvider diskProvider, + ConfigProvider configProvider) { _seriesProvider = seriesProvider; _episodeProvider = episodeProvider; @@ -185,5 +185,58 @@ namespace NzbDrone.Core.Providers Logger.Warn("Unable to Rename Episode: {0}", Path.GetFileName(erm.EpisodeFile.Path)); } } + + public string GetNewFilename(int episodeFileId) + { + //Get all episodes attached to the episodeFileId + //Get the users preferred naming convention for episode + + var episodeFile = _mediaFileProvider.GetEpisodeFile(episodeFileId); + var episodes = _episodeProvider.EpisodesByFileId(episodeFileId); + var series = _seriesProvider.GetSeries(episodeFile.SeriesId); + + var separatorStyle = EpisodeSortingHelper.GetSeparatorStyle(_configProvider.SeparatorStyle); + var numberStyle = EpisodeSortingHelper.GetNumberStyle(_configProvider.NumberStyle); + var useSeriesName = _configProvider.SeriesName; + var useEpisodeName = _configProvider.EpisodeName; + var replaceSpaces = _configProvider.ReplaceSpaces; + var appendQuality = _configProvider.AppendQuality; + + if (episodes.Count == 1) + { + var title = String.Empty; + + if (useSeriesName) + { + title += series.Title; + title += separatorStyle.Pattern; + } + + var number = numberStyle.Pattern.Replace("%s", String.Format("{0}", episodes[0].SeasonNumber)) + .Replace("%0s", String.Format("{0:00}", episodes[0].SeasonNumber)) + .Replace("%0e", String.Format("{0:00}", episodes[0].EpisodeNumber)); + + title += number; + + if (useEpisodeName) + { + title += separatorStyle.Pattern; + title += episodes[0].Title; + } + + if (appendQuality) + title += String.Format(" [{0}]", episodeFile.Quality); + + if (replaceSpaces) + title = title.Replace(' ', '.'); + + Logger.Debug("New File Name is: {0}", title); + return title; + } + + var multiEpisodeStyle = EpisodeSortingHelper.GetMultiEpisodeStyle(_configProvider.MultiEpisodeStyle); + + return String.Empty; + } } } \ No newline at end of file