diff --git a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/ReplaceCharacterFixture.cs b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/ReplaceCharacterFixture.cs new file mode 100644 index 000000000..c560c8f2d --- /dev/null +++ b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/ReplaceCharacterFixture.cs @@ -0,0 +1,88 @@ +using System.Collections.Generic; +using System.Linq; +using FizzWare.NBuilder; +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Core.CustomFormats; +using NzbDrone.Core.MediaFiles; +using NzbDrone.Core.Music; +using NzbDrone.Core.Organizer; +using NzbDrone.Core.Qualities; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests +{ + [TestFixture] + public class ReplaceCharacterFixture : CoreTest + { + private Artist _artist; + private Album _album; + private AlbumRelease _release; + private Track _track; + private TrackFile _trackFiles; + private NamingConfig _namingConfig; + + [SetUp] + public void Setup() + { + _artist = Builder + .CreateNew() + .With(s => s.Name = "South Park") + .Build(); + + _album = Builder + .CreateNew() + .With(s => s.Title = "Some Album") + .Build(); + + _release = Builder + .CreateNew() + .With(s => s.Media = new List { new Medium { Number = 1 } }) + .Build(); + + _track = Builder.CreateNew() + .With(e => e.Title = "City Sushi") + .With(e => e.AbsoluteTrackNumber = 15) + .With(e => e.AlbumRelease = _release) + .Build(); + + _trackFiles = new TrackFile { Quality = new QualityModel(Quality.FLAC), ReleaseGroup = "SonarrTest" }; + + _namingConfig = NamingConfig.Default; + _namingConfig.RenameTracks = true; + + Mocker.GetMock() + .Setup(c => c.GetConfig()).Returns(_namingConfig); + + Mocker.GetMock() + .Setup(v => v.Get(Moq.It.IsAny())) + .Returns(v => Quality.DefaultQualityDefinitions.First(c => c.Quality == v)); + + Mocker.GetMock() + .Setup(v => v.All()) + .Returns(new List()); + } + + // { "\\", "/", "<", ">", "?", "*", ":", "|", "\"" }; + // { "+", "+", "", "", "!", "-", " -", "", "" }; + [TestCase("CSI: Crime Scene Investigation", "CSI - Crime Scene Investigation")] + [TestCase("Code:Breaker", "Code-Breaker")] + [TestCase("Back Slash\\", "Back Slash+")] + [TestCase("Forward Slash/", "Forward Slash+")] + [TestCase("Greater Than>", "Greater Than")] + [TestCase("Less Than<", "Less Than")] + [TestCase("Question Mark?", "Question Mark!")] + [TestCase("Aster*sk", "Aster-sk")] + [TestCase("Colon: Two Periods", "Colon - Two Periods")] + [TestCase("Pipe|", "Pipe")] + [TestCase("Quotes\"", "Quotes")] + public void should_replace_illegal_characters(string title, string expected) + { + _artist.Name = title; + _namingConfig.StandardTrackFormat = "{Artist Name}"; + + Subject.BuildTrackFileName(new List { _track }, _artist, _album, _trackFiles) + .Should().Be(expected); + } + } +} diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index ae3bb5b9d..757330a6f 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -249,6 +249,12 @@ namespace NzbDrone.Core.Organizer string[] badCharacters = { "\\", "/", "<", ">", "?", "*", ":", "|", "\"" }; string[] goodCharacters = { "+", "+", "", "", "!", "-", "-", "", "" }; + // Replace a colon followed by a space with space dash space for a better appearance + if (replace) + { + result = result.Replace(": ", " - "); + } + for (int i = 0; i < badCharacters.Length; i++) { result = result.Replace(badCharacters[i], replace ? goodCharacters[i] : string.Empty);