From f28691e48d615eff74ca8411fe04b819de8c09d0 Mon Sep 17 00:00:00 2001 From: Erik Frantz <39980629+BardezAnAvatar@users.noreply.github.com> Date: Tue, 23 Sep 2025 16:39:25 -0500 Subject: [PATCH] New: Add MovieCollectionThe Naming Token (#11145) --- .../MediaManagement/Naming/NamingModal.tsx | 5 ++ .../CollectionTheFixture.cs | 90 +++++++++++++++++++ .../Organizer/FileNameBuilder.cs | 1 + 3 files changed, 96 insertions(+) create mode 100644 src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/CollectionTheFixture.cs diff --git a/frontend/src/Settings/MediaManagement/Naming/NamingModal.tsx b/frontend/src/Settings/MediaManagement/Naming/NamingModal.tsx index 7fd115f15d..44debc2a8c 100644 --- a/frontend/src/Settings/MediaManagement/Naming/NamingModal.tsx +++ b/frontend/src/Settings/MediaManagement/Naming/NamingModal.tsx @@ -114,6 +114,11 @@ const movieTokens = [ example: 'The Movie Collection', footNotes: '1', }, + { + token: '{Movie CollectionThe}', + example: 'Movie Collection, The', + footNotes: '1', + }, { token: '{Movie Certification}', example: 'R' }, { token: '{Release Year}', example: '2009' }, ]; diff --git a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/CollectionTheFixture.cs b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/CollectionTheFixture.cs new file mode 100644 index 0000000000..7cb2a0032a --- /dev/null +++ b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/CollectionTheFixture.cs @@ -0,0 +1,90 @@ +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.Movies; +using NzbDrone.Core.Organizer; +using NzbDrone.Core.Qualities; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests +{ + [TestFixture] + public class CollectionTheFixture : CoreTest + { + private Movie _movie; + private MovieFile _movieFile; + private NamingConfig _namingConfig; + + [SetUp] + public void Setup() + { + _movie = Builder + .CreateNew() + .With(e => e.Title = "Movie Title") + .Build(); + + _movieFile = new MovieFile { Quality = new QualityModel(Quality.HDTV720p), ReleaseGroup = "RadarrTest" }; + + _namingConfig = NamingConfig.Default; + _namingConfig.RenameMovies = 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("The Badger Collection", "Badger Collection, The")] + [TestCase("The Mover Collection", "Mover Collection, The")] + [TestCase("A Stupid Collection", "Stupid Collection, A")] + [TestCase("An Astounding Collection", "Astounding Collection, An")] + [TestCase("The Amazing Animal-Hero Collection (2001)", "Amazing Animal-Hero Collection, The (2001)")] + [TestCase("A Different Movie (AU)", "Different Movie, A (AU)")] + [TestCase("The Repairer (ZH) (2015)", "Repairer, The (ZH) (2015)")] + [TestCase("The Eighth Sense 2 (Thai)", "Eighth Sense 2, The (Thai)")] + [TestCase("The Astonishing Jog (Latin America)", "Astonishing Jog, The (Latin America)")] + [TestCase("The Hampster Pack (B&F)", "Hampster Pack, The (B&F)")] + [TestCase("The Gasm: I (Almost) Got Away With It (1900)", "Gasm - I (Almost) Got Away With It, The (1900)")] + public void should_get_expected_title_back(string collection, string expected) + { + SetCollectionName(_movie, collection); + _namingConfig.StandardMovieFormat = "{Movie CollectionThe}"; + + Subject.BuildFileName(_movie, _movieFile) + .Should().Be(expected); + } + + [TestCase("A")] + [TestCase("Anne")] + [TestCase("Theodore")] + [TestCase("3%")] + public void should_not_change_title(string collection) + { + SetCollectionName(_movie, collection); + _namingConfig.StandardMovieFormat = "{Movie CollectionThe}"; + + Subject.BuildFileName(_movie, _movieFile) + .Should().Be(collection); + } + + private void SetCollectionName(Movie movie, string collectionName) + { + var metadata = new MovieMetadata() + { + CollectionTitle = collectionName, + }; + movie.MovieMetadata = new Core.Datastore.LazyLoaded(metadata); + movie.MovieMetadata.Value.CollectionTitle = collectionName; + } + } +} diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index e99bfe554a..e8aa4b99e9 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -268,6 +268,7 @@ private void AddMovieTokens(Dictionary> tokenHa tokenHandlers["{Movie Certification}"] = m => movie.MovieMetadata.Value.Certification ?? string.Empty; tokenHandlers["{Movie Collection}"] = m => Truncate(movie.MovieMetadata.Value.CollectionTitle, m.CustomFormat) ?? string.Empty; + tokenHandlers["{Movie CollectionThe}"] = m => Truncate(TitleThe(movie.MovieMetadata.Value.CollectionTitle), m.CustomFormat) ?? string.Empty; } private string GetLanguageTitle(Movie movie, string isoCodes)