From f3e7843150322d2f0b19fe7a9b0427a0791533c1 Mon Sep 17 00:00:00 2001 From: Qstick Date: Tue, 28 Jun 2022 21:58:32 -0500 Subject: [PATCH] New: Make Plex imdb tags conditional --- .../FileNameBuilderTests/IdFixture.cs | 22 ++++++++++++++- .../Organizer/FileNameBuilder.cs | 28 +++++-------------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/IdFixture.cs b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/IdFixture.cs index b8771bf9b..f9e294323 100644 --- a/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/IdFixture.cs +++ b/src/NzbDrone.Core.Test/OrganizerTests/FileNameBuilderTests/IdFixture.cs @@ -1,4 +1,4 @@ -using FizzWare.NBuilder; +using FizzWare.NBuilder; using FluentAssertions; using NUnit.Framework; using NUnit.Framework.Internal; @@ -47,5 +47,25 @@ namespace NzbDrone.Core.Test.OrganizerTests.FileNameBuilderTests Subject.GetMovieFolder(_movie) .Should().Be($"Movie Title ({_movie.TmdbId})"); } + + [Test] + public void should_add_imdb_tag() + { + _namingConfig.MovieFolderFormat = "{Movie Title} {imdb-{ImdbId}}"; + + Subject.GetMovieFolder(_movie) + .Should().Be($"Movie Title {{imdb-{_movie.ImdbId}}}"); + } + + [Test] + public void should_skip_imdb_tag_if_null() + { + _namingConfig.MovieFolderFormat = "{Movie Title} {imdb-{ImdbId}}"; + + _movie.ImdbId = null; + + Subject.GetMovieFolder(_movie) + .Should().Be($"Movie Title"); + } } } diff --git a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs index c62ef3ebe..3a80bec1d 100644 --- a/src/NzbDrone.Core/Organizer/FileNameBuilder.cs +++ b/src/NzbDrone.Core/Organizer/FileNameBuilder.cs @@ -38,20 +38,9 @@ namespace NzbDrone.Core.Organizer private readonly ICustomFormatService _formatService; 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(@"(?\{(?:imdb-))?\{(?[- ._\[(]*)(?(?:[a-z0-9]+)(?:(?[- ._]+)(?:[a-z0-9]+))?)(?::(?[a-z0-9|]+))?(?[-} ._)\]]*)\}", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); - private static readonly Regex TagsRegex = new Regex(@"(?\{tags(?:\:0+)?})", - RegexOptions.Compiled | RegexOptions.IgnoreCase); - - public static readonly Regex SeasonEpisodePatternRegex = new Regex(@"(?(?<=})[- ._]+?)?(?s?{season(?:\:0+)?}(?[- ._]?[ex])(?{episode(?:\:0+)?}))(?[- ._]+?(?={))?", - RegexOptions.Compiled | RegexOptions.IgnoreCase); - - public static readonly Regex AbsoluteEpisodePatternRegex = new Regex(@"(?(?<=})[- ._]+?)?(?{absolute(?:\:0+)?})(?[- ._]+?(?={))?", - RegexOptions.Compiled | RegexOptions.IgnoreCase); - - public static readonly Regex AirDateRegex = new Regex(@"\{Air(\s|\W|_)Date\}", RegexOptions.Compiled | RegexOptions.IgnoreCase); - public static readonly Regex MovieTitleRegex = new Regex(@"(?\{((?:(Movie|Original))(?[- ._])(Clean|Original)?(Title|Filename)(The)?)(?::(?[a-z0-9|]+))?\})", RegexOptions.Compiled | RegexOptions.IgnoreCase); @@ -61,11 +50,6 @@ namespace NzbDrone.Core.Organizer private static readonly Regex ScenifyRemoveChars = new Regex(@"(?<=\s)(,|<|>|\/|\\|;|:|'|""|\||`|~|!|\?|@|$|%|^|\*|-|_|=){1}(?=\s)|('|:|\?|,)(?=(?:(?:s|m)\s)|\s|$)|(\(|\)|\[|\]|\{|\})", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex ScenifyReplaceChars = new Regex(@"[\/]", RegexOptions.Compiled | RegexOptions.IgnoreCase); - //TODO: Support Written numbers (One, Two, etc) and Roman Numerals (I, II, III etc) - private static readonly Regex MultiPartCleanupRegex = new Regex(@"(?:\(\d+\)|(Part|Pt\.?)\s?\d+)$", RegexOptions.Compiled | RegexOptions.IgnoreCase); - - private static readonly char[] EpisodeTitleTrimCharacters = new[] { ' ', '.', '?' }; - private static readonly Regex TitlePrefixRegex = new Regex(@"^(The|An|A) (.*?)((?: *\([^)]+\))*)$", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex ReservedDeviceNamesRegex = new Regex(@"^(?:aux|com[1-9]|con|lpt[1-9]|nul|prn)\.", RegexOptions.Compiled | RegexOptions.IgnoreCase); @@ -133,7 +117,7 @@ namespace NzbDrone.Core.Organizer AddQualityTokens(tokenHandlers, movie, movieFile); AddMediaInfoTokens(tokenHandlers, movieFile); AddMovieFileTokens(tokenHandlers, movieFile); - AddTagsTokens(tokenHandlers, movieFile); + AddEditionTagsTokens(tokenHandlers, movieFile); AddCustomFormats(tokenHandlers, movie, movieFile, customFormats); var splitPatterns = pattern.Split(new char[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries); @@ -193,7 +177,7 @@ namespace NzbDrone.Core.Organizer AddQualityTokens(tokenHandlers, movie, movieFile); AddMediaInfoTokens(tokenHandlers, movieFile); AddMovieFileTokens(tokenHandlers, movieFile); - AddTagsTokens(tokenHandlers, movieFile); + AddEditionTagsTokens(tokenHandlers, movieFile); } else { @@ -297,7 +281,7 @@ namespace NzbDrone.Core.Organizer return movie.Title; } - private void AddTagsTokens(Dictionary> tokenHandlers, MovieFile movieFile) + private void AddEditionTagsTokens(Dictionary> tokenHandlers, MovieFile movieFile) { if (movieFile.Edition.IsNotNullOrWhiteSpace()) { @@ -497,6 +481,7 @@ namespace NzbDrone.Core.Organizer var tokenMatch = new TokenMatch { RegexMatch = match, + Tag = match.Groups["tag"].Value, Prefix = match.Groups["prefix"].Value, Separator = match.Groups["separator"].Value, Suffix = match.Groups["suffix"].Value, @@ -531,7 +516,7 @@ namespace NzbDrone.Core.Organizer if (!replacementText.IsNullOrWhiteSpace()) { - replacementText = tokenMatch.Prefix + replacementText + tokenMatch.Suffix; + replacementText = tokenMatch.Tag + tokenMatch.Prefix + replacementText + tokenMatch.Suffix; } return replacementText; @@ -598,6 +583,7 @@ namespace NzbDrone.Core.Organizer internal sealed class TokenMatch { public Match RegexMatch { get; set; } + public string Tag { get; set; } public string Prefix { get; set; } public string Separator { get; set; } public string Suffix { get; set; }