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 @@ public void should_add_tmdb_id() 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 @@ public class FileNameBuilder : IBuildFileNames 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 @@ public class FileNameBuilder : IBuildFileNames 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 @@ public string BuildFileName(Movie movie, MovieFile movieFile, NamingConfig namin 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 @@ public string GetMovieFolder(Movie movie, NamingConfig namingConfig = null) AddQualityTokens(tokenHandlers, movie, movieFile); AddMediaInfoTokens(tokenHandlers, movieFile); AddMovieFileTokens(tokenHandlers, movieFile); - AddTagsTokens(tokenHandlers, movieFile); + AddEditionTagsTokens(tokenHandlers, movieFile); } else { @@ -297,7 +281,7 @@ private string GetLanguageTitle(Movie movie, string isoCodes) 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 @@ private string ReplaceToken(Match match, Dictionary