diff --git a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/FileNameBuilderFixture.cs b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/FileNameBuilderFixture.cs index 3457b047a..a042757e9 100644 --- a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/FileNameBuilderFixture.cs +++ b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/FileNameBuilderFixture.cs @@ -505,6 +505,28 @@ namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests .Should().Be("Linkin Park - Hybrid Theory - 06 - City Sushi [MP3-256]"); } + [TestCase("Some Escaped {{ String", "Some Escaped { String")] + [TestCase("Some Escaped }} String", "Some Escaped } String")] + [TestCase("Some Escaped {{Artist Name}} String", "Some Escaped {Artist Name} String")] + [TestCase("Some Escaped {{{Artist Name}}} String", "Some Escaped {Linkin Park} String")] + public void should_escape_token_in_format(string format, string expected) + { + _namingConfig.StandardTrackFormat = format; + + Subject.BuildTrackFileName(new List { _track1 }, _artist, _album, _trackFile) + .Should().Be(expected); + } + + [Test] + public void should_escape_token_in_title() + { + _namingConfig.StandardTrackFormat = "Some Unescaped {Artist Name} String"; + _artist.Name = "My {Quality Full} Title"; + + Subject.BuildTrackFileName(new List { _track1 }, _artist, _album, _trackFile) + .Should().Be("Some Unescaped My {Quality Full} Title String"); + } + [Test] public void use_file_name_when_sceneName_is_null() { diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index d1d9c0ec9..2f0202674 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -33,7 +33,7 @@ namespace NzbDrone.Core.Organizer private readonly ICached _absoluteTrackFormatCache; private readonly Logger _logger; - private static readonly Regex TitleRegex = new Regex(@"\{(?[- ._\[(]*)(?(?:[a-z0-9]+)(?:(?[- ._]+)(?:[a-z0-9]+))?)(?::(?[a-z0-9]+))?(?[- ._)\]]*)\}", + private static readonly Regex TitleRegex = new Regex(@"(?\{\{|\}\})|\{(?[- ._\[(]*)(?(?:[a-z0-9]+)(?:(?[- ._]+)(?:[a-z0-9]+))?)(?::(?[a-z0-9]+))?(?[- ._)\]]*)\}", RegexOptions.Compiled | RegexOptions.IgnoreCase); public static readonly Regex TrackRegex = new Regex(@"(?\{track(?:\:0+)?})",