From 187dd79b9c9ddb27e8eebfb6f6dfa4ef8dd1c3ee Mon Sep 17 00:00:00 2001 From: nuxen Date: Tue, 3 Jun 2025 15:27:31 +0200 Subject: [PATCH] Fixed: Allow opening curly bracket as prefix in naming format --- .../EditionTagsFixture.cs | 26 +++++++++++++++-- .../FileNameBuilderTests/IdFixture.cs | 29 ++++++++++++++++--- .../Organizer/FileNameBuilder.cs | 2 +- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/EditionTagsFixture.cs b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/EditionTagsFixture.cs index 7c4766ae69..592b9b1526 100644 --- a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/EditionTagsFixture.cs +++ b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/EditionTagsFixture.cs @@ -27,7 +27,7 @@ public void Setup() .With(m => m.Title = "Movie Title") .Build(); - _movieFile = new MovieFile { Quality = new QualityModel(), ReleaseGroup = "RadarrTest" }; + _movieFile = new MovieFile { Quality = new QualityModel(), ReleaseGroup = "RadarrTest", Edition = "Uncut" }; _namingConfig = NamingConfig.Default; _namingConfig.RenameMovies = true; @@ -47,15 +47,17 @@ public void Setup() [Test] public void should_add_edition_tag() { - _movieFile.Edition = "Uncut"; _namingConfig.StandardMovieFormat = "{Movie Title} [{Edition Tags}]"; Subject.BuildFileName(_movie, _movieFile) .Should().Be("Movie Title [Uncut]"); } + [TestCase("{Movie Title} {Edition Tags}")] + [TestCase("{Movie Title} {{Edition Tags}}")] [TestCase("{Movie Title} {edition-{Edition Tags}}")] - public void should_conditional_hide_edition_tags_in_plex_format(string movieFormat) + [TestCase("{Movie Title} {{edition-{Edition Tags}}}")] + public void should_conditional_hide_edition_tags(string movieFormat) { _movieFile.Edition = ""; _namingConfig.StandardMovieFormat = movieFormat; @@ -64,6 +66,24 @@ public void should_conditional_hide_edition_tags_in_plex_format(string movieForm .Should().Be("Movie Title"); } + [TestCase("{Movie Title} {{Edition Tags}}")] + public void should_handle_edition_curly_brackets(string movieFormat) + { + _namingConfig.StandardMovieFormat = movieFormat; + + Subject.BuildFileName(_movie, _movieFile) + .Should().Be("Movie Title {Uncut}"); + } + + [TestCase("{Movie Title} {{edition-{Edition Tags}}}")] + public void should_handle_edition_tag_curly_brackets(string movieFormat) + { + _namingConfig.StandardMovieFormat = movieFormat; + + Subject.BuildFileName(_movie, _movieFile) + .Should().Be("Movie Title {{edition-Uncut}}"); + } + [TestCase("1st anniversary edition", "{Movie Title} [{Edition Tags}]", "Movie Title [1st Anniversary Edition]")] [TestCase("2nd Anniversary edition", "{Movie Title} [{Edition Tags}]", "Movie Title [2nd Anniversary Edition]")] [TestCase("3rd anniversary Edition", "{Movie Title} [{Edition Tags}]", "Movie Title [3rd Anniversary Edition]")] diff --git a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/IdFixture.cs b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/IdFixture.cs index 955633039c..e7f3e51541 100644 --- a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/IdFixture.cs +++ b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/IdFixture.cs @@ -56,15 +56,36 @@ public void should_add_imdb_tag() .Should().Be($"Movie Title {{imdb-{_movie.ImdbId}}}"); } - [Test] - public void should_skip_imdb_tag_if_null() + [TestCase("{Movie Title} {imdb-{ImdbId}}")] + [TestCase("{Movie Title} {imdbid-{ImdbId}}")] + [TestCase("{Movie Title} {{imdb-{ImdbId}}}")] + [TestCase("{Movie Title} {{imdbid-{ImdbId}}}")] + public void should_skip_imdb_tag_if_null(string movieFormat) { - _namingConfig.MovieFolderFormat = "{Movie Title} {imdb-{ImdbId}}"; + _namingConfig.MovieFolderFormat = movieFormat; _movie.ImdbId = null; Subject.GetMovieFolder(_movie) - .Should().Be($"Movie Title"); + .Should().Be("Movie Title"); + } + + [TestCase("{Movie Title} {{imdb-{ImdbId}}}")] + public void should_handle_imdb_tag_curly_brackets(string movieFormat) + { + _namingConfig.MovieFolderFormat = movieFormat; + + Subject.GetMovieFolder(_movie) + .Should().Be($"Movie Title {{{{imdb-{_movie.ImdbId}}}}}"); + } + + [TestCase("{Movie Title} {{tmdb-{TmdbId}}}")] + public void should_handle_tmdb_tag_curly_brackets(string movieFormat) + { + _namingConfig.MovieFolderFormat = movieFormat; + + Subject.GetMovieFolder(_movie) + .Should().Be($"Movie Title {{{{tmdb-{_movie.TmdbId}}}}}"); } } } diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index 3c1eb85078..2c899630e4 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -38,7 +38,7 @@ public class FileNameBuilder : IBuildFileNames private readonly ICustomFormatCalculationService _formatCalculator; private readonly Logger _logger; - private static readonly Regex TitleRegex = new Regex(@"(?\{(?:imdb-|edition-))?\{(?[- ._\[(]*)(?(?:[a-z0-9]+)(?:(?[- ._]+)(?:[a-z0-9]+))?)(?::(?[ ,a-z0-9|+-]+(?[-} ._)\]]*)\}", + private static readonly Regex TitleRegex = new Regex(@"(?\{(?[-{ ._\[(]*)(?:imdb(?:id)?-|edition-))?\{(?[-{ ._\[(]*)(?(?:[a-z0-9]+)(?:(?[- ._]+)(?:[a-z0-9]+))?)(?::(?[ ,a-z0-9|+-]+(?[-} ._)\]]*)\}", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); public static readonly Regex ReleaseYearRegex = new Regex(@"\{[\[\(]?Release[- ._]Year[\]\)]?\}", RegexOptions.Compiled | RegexOptions.IgnoreCase);