Fixed: series/season folders will have leading/trailing periods removed when they are created

This commit is contained in:
Mark McDowall 2014-09-02 17:15:03 -07:00
parent 17aac81a4d
commit b9ff97fe9f
5 changed files with 59 additions and 7 deletions

View File

@ -222,6 +222,7 @@
<Compile Include="NotificationTests\Xbmc\Json\UpdateFixture.cs" /> <Compile Include="NotificationTests\Xbmc\Json\UpdateFixture.cs" />
<Compile Include="NotificationTests\Xbmc\OnDownloadFixture.cs" /> <Compile Include="NotificationTests\Xbmc\OnDownloadFixture.cs" />
<Compile Include="OrganizerTests\BuildFilePathFixture.cs" /> <Compile Include="OrganizerTests\BuildFilePathFixture.cs" />
<Compile Include="OrganizerTests\GetSeasonFolderFixture.cs" />
<Compile Include="OrganizerTests\FileNameBuilderFixture.cs" /> <Compile Include="OrganizerTests\FileNameBuilderFixture.cs" />
<Compile Include="OrganizerTests\GetSeriesFolderFixture.cs" /> <Compile Include="OrganizerTests\GetSeriesFolderFixture.cs" />
<Compile Include="ParserTests\AbsoluteEpisodeNumberParserFixture.cs" /> <Compile Include="ParserTests\AbsoluteEpisodeNumberParserFixture.cs" />

View File

@ -64,8 +64,6 @@ namespace NzbDrone.Core.Test.OrganizerTests
_episodeFile.Quality.Proper = true; _episodeFile.Quality.Proper = true;
} }
[Test] [Test]
public void should_replace_Series_space_Title() public void should_replace_Series_space_Title()
{ {
@ -576,5 +574,15 @@ namespace NzbDrone.Core.Test.OrganizerTests
Subject.BuildFileName(new List<Episode> { _episode1 }, _series, _episodeFile) Subject.BuildFileName(new List<Episode> { _episode1 }, _series, _episodeFile)
.Should().Be("South.Park.S15E06.City.Sushi.X264.DTS.[EN+ES+IT]"); .Should().Be("South.Park.S15E06.City.Sushi.X264.DTS.[EN+ES+IT]");
} }
[Test]
public void should_remove_duplicate_non_word_characters()
{
_series.Title = "Venture Bros.";
_namingConfig.StandardEpisodeFormat = "{Series.Title}.{season}x{episode:00}";
Subject.BuildFileName(new List<Episode> { _episode1 }, _series, _episodeFile)
.Should().Be("Venture.Bros.15x06");
}
} }
} }

View File

@ -0,0 +1,35 @@
using System;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Organizer;
using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.Tv;
namespace NzbDrone.Core.Test.OrganizerTests
{
[TestFixture]
public class GetSeasonFolderFixture : CoreTest<FileNameBuilder>
{
private NamingConfig namingConfig;
[SetUp]
public void Setup()
{
namingConfig = new NamingConfig();
Mocker.GetMock<INamingConfigService>()
.Setup(c => c.GetConfig()).Returns(namingConfig);
}
[TestCase("Venture Bros.", 1, "{Series.Title}.{season:00}", "Venture.Bros.01")]
[TestCase("Venture Bros.", 1, "{Series Title} Season {season:00}", "Venture Bros. Season 01")]
public void should_use_seriesFolderFormat_to_build_folder_name(String seriesTitle, Int32 seasonNumber, String format, String expected)
{
namingConfig.SeasonFolderFormat = format;
var series = new Series { Title = seriesTitle };
Subject.GetSeasonFolder(series, seasonNumber, namingConfig).Should().Be(expected);
}
}
}

View File

@ -1,7 +1,9 @@
using System;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.Organizer; using NzbDrone.Core.Organizer;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Core.Tv;
namespace NzbDrone.Core.Test.OrganizerTests namespace NzbDrone.Core.Test.OrganizerTests
{ {
@ -23,11 +25,12 @@ namespace NzbDrone.Core.Test.OrganizerTests
[TestCase("30 Rock", "{Series Title}", "30 Rock")] [TestCase("30 Rock", "{Series Title}", "30 Rock")]
[TestCase("30 Rock", "{Series.Title}", "30.Rock")] [TestCase("30 Rock", "{Series.Title}", "30.Rock")]
[TestCase("24/7 Road to the NHL Winter Classic", "{Series Title}", "24+7 Road to the NHL Winter Classic")] [TestCase("24/7 Road to the NHL Winter Classic", "{Series Title}", "24+7 Road to the NHL Winter Classic")]
public void should_use_seriesFolderFormat_to_build_folder_name(string seriesTitle, string format, string expected) [TestCase("Venture Bros.", "{Series.Title}", "Venture.Bros")]
public void should_use_seriesFolderFormat_to_build_folder_name(String seriesTitle, String format, String expected)
{ {
namingConfig.SeriesFolderFormat = format; namingConfig.SeriesFolderFormat = format;
var series = new NzbDrone.Core.Tv.Series { Title = seriesTitle }; var series = new Series { Title = seriesTitle };
Subject.GetSeriesFolder(series).Should().Be(expected); Subject.GetSeriesFolder(series).Should().Be(expected);
} }

View File

@ -289,7 +289,7 @@ namespace NzbDrone.Core.Organizer
AddSeriesTokens(tokenHandlers, series); AddSeriesTokens(tokenHandlers, series);
return ReplaceTokens(namingConfig.SeriesFolderFormat, tokenHandlers); return CleanFolderName(ReplaceTokens(namingConfig.SeriesFolderFormat, tokenHandlers));
} }
public string GetSeasonFolder(Series series, Int32 seasonNumber, NamingConfig namingConfig = null) public string GetSeasonFolder(Series series, Int32 seasonNumber, NamingConfig namingConfig = null)
@ -302,10 +302,9 @@ namespace NzbDrone.Core.Organizer
var tokenHandlers = new Dictionary<string, Func<TokenMatch, String>>(FileNameBuilderTokenEqualityComparer.Instance); var tokenHandlers = new Dictionary<string, Func<TokenMatch, String>>(FileNameBuilderTokenEqualityComparer.Instance);
AddSeriesTokens(tokenHandlers, series); AddSeriesTokens(tokenHandlers, series);
AddSeasonTokens(tokenHandlers, seasonNumber); AddSeasonTokens(tokenHandlers, seasonNumber);
return ReplaceTokens(namingConfig.SeasonFolderFormat, tokenHandlers); return CleanFolderName(ReplaceTokens(namingConfig.SeasonFolderFormat, tokenHandlers));
} }
public static string CleanTitle(string name) public static string CleanTitle(string name)
@ -336,6 +335,12 @@ namespace NzbDrone.Core.Organizer
return result.Trim(); return result.Trim();
} }
public static string CleanFolderName(string name)
{
name = FileNameCleanupRegex.Replace(name, match => match.Captures[0].Value[0].ToString());
return name.Trim(' ', '.');
}
private void AddSeriesTokens(Dictionary<String, Func<TokenMatch, String>> tokenHandlers, Series series) private void AddSeriesTokens(Dictionary<String, Func<TokenMatch, String>> tokenHandlers, Series series)
{ {
tokenHandlers["{Series Title}"] = m => series.Title; tokenHandlers["{Series Title}"] = m => series.Title;