From e89de12a489da3c007ffb5e2909012a280d1b302 Mon Sep 17 00:00:00 2001 From: Brandon Shelley Date: Sun, 10 Mar 2024 17:28:46 -0700 Subject: [PATCH] Add 'always lowercase' and 'always uppercase' formatters to edition tags - Always lowercase ordinals (1st, 2nd, 10th, etc.) - Always uppercase special words (IMAX, 3D, SDR, HDR) in edition tags --- .../EditionTagsFixture.cs | 66 +++++++++++++++++++ .../Organizer/FileNameBuilder.cs | 18 ++++- 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/EditionTagsFixture.cs b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/EditionTagsFixture.cs index 08324f112..1c8d7b500 100644 --- a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/EditionTagsFixture.cs +++ b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/EditionTagsFixture.cs @@ -63,5 +63,71 @@ namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests Subject.BuildFileName(_movie, _movieFile) .Should().Be("South Park"); } + + [Test] + [TestCase("10th anniversary edition", "{Movie Title} [{edition tags}]", "South Park [10th anniversary edition]")] + [TestCase("10TH anniversary edition", "{Movie Title} [{edition tags}]", "South Park [10th anniversary edition]")] + [TestCase("10Th anniversary edition", "{Movie Title} [{edition tags}]", "South Park [10th anniversary edition]")] + [TestCase("10th anniversary edition", "{Movie Title} [{Edition Tags}]", "South Park [10th Anniversary Edition]")] + [TestCase("10TH anniversary edition", "{Movie Title} [{Edition Tags}]", "South Park [10th Anniversary Edition]")] + [TestCase("10Th anniversary edition", "{Movie Title} [{Edition Tags}]", "South Park [10th Anniversary Edition]")] + [TestCase("10th anniversary edition", "{Movie Title} [{EDITION TAGS}]", "South Park [10TH ANNIVERSARY EDITION]")] + [TestCase("10TH anniversary edition", "{Movie Title} [{EDITION TAGS}]", "South Park [10TH ANNIVERSARY EDITION]")] + [TestCase("10Th anniversary edition", "{Movie Title} [{EDITION TAGS}]", "South Park [10TH ANNIVERSARY EDITION]")] + public void should_always_lowercase_ordinals(string edition, string movieFormat, string expected) + { + _movieFile.Edition = edition; + _namingConfig.StandardMovieFormat = movieFormat; + + Subject.BuildFileName(_movie, _movieFile) + .Should().Be(expected); + } + + [Test] + [TestCase("imax", "{Movie Title} [{edition tags}]", "South Park [imax]")] + [TestCase("IMAX", "{Movie Title} [{edition tags}]", "South Park [imax]")] + [TestCase("Imax", "{Movie Title} [{edition tags}]", "South Park [imax]")] + [TestCase("imax", "{Movie Title} [{Edition Tags}]", "South Park [IMAX]")] + [TestCase("IMAX", "{Movie Title} [{Edition Tags}]", "South Park [IMAX]")] + [TestCase("Imax", "{Movie Title} [{Edition Tags}]", "South Park [IMAX]")] + [TestCase("imax", "{Movie Title} [{EDITION TAGS}]", "South Park [IMAX]")] + [TestCase("IMAX", "{Movie Title} [{EDITION TAGS}]", "South Park [IMAX]")] + [TestCase("Imax", "{Movie Title} [{EDITION TAGS}]", "South Park [IMAX]")] + + [TestCase("3d", "{Movie Title} [{edition tags}]", "South Park [3d]")] + [TestCase("3D", "{Movie Title} [{edition tags}]", "South Park [3d]")] + [TestCase("3d", "{Movie Title} [{Edition Tags}]", "South Park [3D]")] + [TestCase("3D", "{Movie Title} [{Edition Tags}]", "South Park [3D]")] + [TestCase("3d", "{Movie Title} [{EDITION TAGS}]", "South Park [3D]")] + [TestCase("3D", "{Movie Title} [{EDITION TAGS}]", "South Park [3D]")] + + [TestCase("hdr", "{Movie Title} [{edition tags}]", "South Park [hdr]")] + [TestCase("HDR", "{Movie Title} [{edition tags}]", "South Park [hdr]")] + [TestCase("Hdr", "{Movie Title} [{edition tags}]", "South Park [hdr]")] + [TestCase("hdr", "{Movie Title} [{Edition Tags}]", "South Park [HDR]")] + [TestCase("HDR", "{Movie Title} [{Edition Tags}]", "South Park [HDR]")] + [TestCase("Hdr", "{Movie Title} [{Edition Tags}]", "South Park [HDR]")] + [TestCase("hdr", "{Movie Title} [{EDITION TAGS}]", "South Park [HDR]")] + [TestCase("HDR", "{Movie Title} [{EDITION TAGS}]", "South Park [HDR]")] + [TestCase("Hdr", "{Movie Title} [{EDITION TAGS}]", "South Park [HDR]")] + + [TestCase("sdr", "{Movie Title} [{edition tags}]", "South Park [sdr]")] + [TestCase("SDR", "{Movie Title} [{edition tags}]", "South Park [sdr]")] + [TestCase("Sdr", "{Movie Title} [{edition tags}]", "South Park [sdr]")] + [TestCase("sdr", "{Movie Title} [{Edition Tags}]", "South Park [SDR]")] + [TestCase("SDR", "{Movie Title} [{Edition Tags}]", "South Park [SDR]")] + [TestCase("Sdr", "{Movie Title} [{Edition Tags}]", "South Park [SDR]")] + [TestCase("sdr", "{Movie Title} [{EDITION TAGS}]", "South Park [SDR]")] + [TestCase("SDR", "{Movie Title} [{EDITION TAGS}]", "South Park [SDR]")] + [TestCase("Sdr", "{Movie Title} [{EDITION TAGS}]", "South Park [SDR]")] + + public void should_always_uppercase_special_strings(string edition, string movieFormat, string expected) + { + _movieFile.Edition = edition; + _namingConfig.StandardMovieFormat = movieFormat; + + Subject.BuildFileName(_movie, _movieFile) + .Should().Be(expected); + } } } diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index 18914b3e1..7948b59d4 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -298,11 +298,27 @@ namespace NzbDrone.Core.Organizer return movie.Title; } + private string ToTitleCaseIgnoreOrdinals(string text) + { + return Regex.Replace(text, @"\b([0-9]{1,3}(?:st|th|rd|nd))\b", new MatchEvaluator((m) => m.Captures[0].Value.ToLower()), RegexOptions.IgnoreCase); + } + + private string ToTitleCaseAlwaysUpper(string text) + { + return Regex.Replace(text, @"\b(imax|3d|sdr|hdr)\b", new MatchEvaluator((m) => m.Captures[0].Value.ToUpper()), RegexOptions.IgnoreCase); + } + + private string ToEditionTitleCase(MovieFile movieFile) + { + var titleCase = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(movieFile.Edition.ToLower()); + return ToTitleCaseAlwaysUpper(ToTitleCaseIgnoreOrdinals(titleCase)); + } + private void AddEditionTagsTokens(Dictionary> tokenHandlers, MovieFile movieFile) { if (movieFile.Edition.IsNotNullOrWhiteSpace()) { - tokenHandlers["{Edition Tags}"] = m => Truncate(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(movieFile.Edition.ToLower()), m.CustomFormat); + tokenHandlers["{Edition Tags}"] = m => Truncate(ToEditionTitleCase(movieFile), m.CustomFormat); } }