diff --git a/NzbDrone.Core.Test/ProviderTests/MediaFileProviderTests/GetNewFilenameFixture.cs b/NzbDrone.Core.Test/ProviderTests/MediaFileProviderTests/GetNewFilenameFixture.cs index 21d0de628..86d60ec7c 100644 --- a/NzbDrone.Core.Test/ProviderTests/MediaFileProviderTests/GetNewFilenameFixture.cs +++ b/NzbDrone.Core.Test/ProviderTests/MediaFileProviderTests/GetNewFilenameFixture.cs @@ -240,7 +240,7 @@ namespace NzbDrone.Core.Test.ProviderTests.MediaFileProviderTests string result = Mocker.Resolve().GetNewFilename(new List { episodeOne, episodeTwo }, "The Mentalist", QualityTypes.HDTV, false, new EpisodeFile()); //Assert - Assert.AreEqual("The Mentalist - S03E23-E24 - Strawberries and Cream (1) + Strawberries and Cream (2) [HDTV]", result); + Assert.AreEqual("The Mentalist - S03E23-E24 - Strawberries and Cream [HDTV]", result); } [Test] @@ -274,7 +274,7 @@ namespace NzbDrone.Core.Test.ProviderTests.MediaFileProviderTests string result = Mocker.Resolve().GetNewFilename(new List { episodeOne, episodeTwo }, "The Mentalist", QualityTypes.HDTV, false, new EpisodeFile()); //Assert - Assert.AreEqual("3x23x24 - Strawberries and Cream (1) + Strawberries and Cream (2) [HDTV]", result); + Assert.AreEqual("3x23x24 - Strawberries and Cream [HDTV]", result); } [Test] @@ -308,7 +308,7 @@ namespace NzbDrone.Core.Test.ProviderTests.MediaFileProviderTests string result = Mocker.Resolve().GetNewFilename(new List { episodeOne, episodeTwo }, "The Mentalist", QualityTypes.HDTV, false, new EpisodeFile()); //Assert - Assert.AreEqual("3x23x24 Strawberries and Cream (1) + Strawberries and Cream (2) [HDTV]", result); + Assert.AreEqual("3x23x24 Strawberries and Cream [HDTV]", result); } [Test] @@ -342,7 +342,7 @@ namespace NzbDrone.Core.Test.ProviderTests.MediaFileProviderTests string result = Mocker.Resolve().GetNewFilename(new List { episodeOne, episodeTwo }, "The Mentalist", QualityTypes.HDTV, false, new EpisodeFile()); //Assert - Assert.AreEqual("The.Mentalist.s03e23.s03e24.Strawberries.and.Cream.(1).+.Strawberries.and.Cream.(2)", result); + Assert.AreEqual("The.Mentalist.s03e23.s03e24.Strawberries.and.Cream", result); } [Test] @@ -517,7 +517,7 @@ namespace NzbDrone.Core.Test.ProviderTests.MediaFileProviderTests string result = Mocker.Resolve().GetNewFilename(new List { episode2, episode }, "30 Rock", QualityTypes.HDTV, false, new EpisodeFile()); //Assert - result.Should().Be("30 Rock - S06E06-E07 - Hey, Baby, What's Wrong! (1) + Hey, Baby, What's Wrong! (2)"); + result.Should().Be("30 Rock - S06E06-E07 - Hey, Baby, What's Wrong!"); } [Test] @@ -635,5 +635,69 @@ namespace NzbDrone.Core.Test.ProviderTests.MediaFileProviderTests //Assert result.Should().Be(episodeFile.SceneName); } + + [Test] + public void should_only_have_one_episodeTitle_when_episode_titles_are_the_same() + { + //Setup + var fakeConfig = Mocker.GetMock(); + fakeConfig.SetupGet(c => c.SortingIncludeSeriesName).Returns(true); + fakeConfig.SetupGet(c => c.SortingIncludeEpisodeTitle).Returns(true); + fakeConfig.SetupGet(c => c.SortingAppendQuality).Returns(false); + fakeConfig.SetupGet(c => c.SortingSeparatorStyle).Returns(0); + fakeConfig.SetupGet(c => c.SortingNumberStyle).Returns(2); + fakeConfig.SetupGet(c => c.SortingReplaceSpaces).Returns(false); + fakeConfig.SetupGet(c => c.SortingMultiEpisodeStyle).Returns(3); + + var episode = Builder.CreateNew() + .With(e => e.Title = "Hey, Baby, What's Wrong? (1)") + .With(e => e.SeasonNumber = 6) + .With(e => e.EpisodeNumber = 6) + .Build(); + + var episode2 = Builder.CreateNew() + .With(e => e.Title = "Hey, Baby, What's Wrong? (2)") + .With(e => e.SeasonNumber = 6) + .With(e => e.EpisodeNumber = 7) + .Build(); + + //Act + string result = Mocker.Resolve().GetNewFilename(new List { episode2, episode }, "30 Rock", QualityTypes.HDTV, false, new EpisodeFile()); + + //Assert + result.Should().Be("30 Rock - S06E06-E07 - Hey, Baby, What's Wrong!"); + } + + [Test] + public void should_have_two_episodeTitles_when_episode_titles_are_not_the_same() + { + //Setup + var fakeConfig = Mocker.GetMock(); + fakeConfig.SetupGet(c => c.SortingIncludeSeriesName).Returns(true); + fakeConfig.SetupGet(c => c.SortingIncludeEpisodeTitle).Returns(true); + fakeConfig.SetupGet(c => c.SortingAppendQuality).Returns(false); + fakeConfig.SetupGet(c => c.SortingSeparatorStyle).Returns(0); + fakeConfig.SetupGet(c => c.SortingNumberStyle).Returns(2); + fakeConfig.SetupGet(c => c.SortingReplaceSpaces).Returns(false); + fakeConfig.SetupGet(c => c.SortingMultiEpisodeStyle).Returns(3); + + var episode = Builder.CreateNew() + .With(e => e.Title = "Hello") + .With(e => e.SeasonNumber = 6) + .With(e => e.EpisodeNumber = 6) + .Build(); + + var episode2 = Builder.CreateNew() + .With(e => e.Title = "World") + .With(e => e.SeasonNumber = 6) + .With(e => e.EpisodeNumber = 7) + .Build(); + + //Act + string result = Mocker.Resolve().GetNewFilename(new List { episode2, episode }, "30 Rock", QualityTypes.HDTV, false, new EpisodeFile()); + + //Assert + result.Should().Be("30 Rock - S06E06-E07 - Hello + World"); + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Parser.cs b/NzbDrone.Core/Parser.cs index c3e7f5a72..4f8172453 100644 --- a/NzbDrone.Core/Parser.cs +++ b/NzbDrone.Core/Parser.cs @@ -83,6 +83,8 @@ namespace NzbDrone.Core RegexOptions.IgnoreCase | RegexOptions.Compiled), }; + private static readonly Regex MultiPartCleanupRegex = new Regex(@"\(\d+\)$", RegexOptions.Compiled); + internal static EpisodeParseResult ParsePath(string path) { var fileInfo = new FileInfo(path); @@ -496,5 +498,11 @@ namespace NzbDrone.Core return header; } + + internal static string CleanupEpisodeTitle(string title) + { + //this will remove (1),(2) from the end of multi part episodes. + return MultiPartCleanupRegex.Replace(title, string.Empty).Trim(); + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/DownloadProvider.cs b/NzbDrone.Core/Providers/DownloadProvider.cs index 05b9753ad..a4114022b 100644 --- a/NzbDrone.Core/Providers/DownloadProvider.cs +++ b/NzbDrone.Core/Providers/DownloadProvider.cs @@ -96,13 +96,10 @@ namespace NzbDrone.Core.Providers } } - public virtual String GetDownloadTitle(EpisodeParseResult parseResult) { - var seriesTitle = MediaFileProvider.CleanFilename(parseResult.Series.Title); - //Handle Full Naming if (parseResult.FullSeason) { diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs index 9276a1dd1..b8221b152 100644 --- a/NzbDrone.Core/Providers/EpisodeProvider.cs +++ b/NzbDrone.Core/Providers/EpisodeProvider.cs @@ -16,22 +16,17 @@ namespace NzbDrone.Core.Providers private static readonly Logger logger = LogManager.GetCurrentClassLogger(); - //this will remove (1),(2) from the end of multi part episodes. - private static readonly Regex multiPartCleanupRegex = new Regex(@"\(\d+\)$", RegexOptions.Compiled); - private readonly TvDbProvider _tvDbProvider; private readonly SeasonProvider _seasonProvider; private readonly IDatabase _database; - private readonly SeriesProvider _seriesProvider; [Inject] - public EpisodeProvider(IDatabase database, SeriesProvider seriesProvider, - TvDbProvider tvDbProviderProvider, SeasonProvider seasonProvider) + public EpisodeProvider(IDatabase database, TvDbProvider tvDbProviderProvider, + SeasonProvider seasonProvider) { _tvDbProvider = tvDbProviderProvider; _seasonProvider = seasonProvider; _database = database; - _seriesProvider = seriesProvider; } public EpisodeProvider() @@ -228,7 +223,7 @@ namespace NzbDrone.Core.Providers } else { - parseResult.EpisodeTitle = multiPartCleanupRegex.Replace(episodeInfo.Title, string.Empty).Trim(); + parseResult.EpisodeTitle = Parser.CleanupEpisodeTitle(episodeInfo.Title); } } else diff --git a/NzbDrone.Core/Providers/MediaFileProvider.cs b/NzbDrone.Core/Providers/MediaFileProvider.cs index 7cb7d59b9..c0d49e097 100644 --- a/NzbDrone.Core/Providers/MediaFileProvider.cs +++ b/NzbDrone.Core/Providers/MediaFileProvider.cs @@ -163,7 +163,9 @@ namespace NzbDrone.Core.Providers var separatorStyle = EpisodeSortingHelper.GetSeparatorStyle(_configProvider.SortingSeparatorStyle); var numberStyle = EpisodeSortingHelper.GetNumberStyle(_configProvider.SortingNumberStyle); - string episodeNames = sortedEpisodes.First().Title; + var episodeNames = new List(); + + episodeNames.Add(Parser.CleanupEpisodeTitle(sortedEpisodes.First().Title)); string result = String.Empty; @@ -190,7 +192,7 @@ namespace NzbDrone.Core.Providers } result = result.Replace("%0e", String.Format("{0:00}", episode.EpisodeNumber)); - episodeNames += String.Format(" + {0}", episode.Title); + episodeNames.Add(Parser.CleanupEpisodeTitle(episode.Title)); } } @@ -202,8 +204,11 @@ namespace NzbDrone.Core.Providers if (_configProvider.SortingIncludeEpisodeTitle) { - episodeNames = episodeNames.TrimEnd(' ', '+'); - result += separatorStyle.Pattern + episodeNames; + if (episodeNames.Distinct().Count() == 1) + result += separatorStyle.Pattern + episodeNames.First(); + + else + result += separatorStyle.Pattern + String.Join(" + ", episodeNames); } if (_configProvider.SortingAppendQuality)