diff --git a/Emby.Dlna/PlayTo/DlnaHttpClient.cs b/Emby.Dlna/PlayTo/DlnaHttpClient.cs
index 8b983e9e3d..8454c1afd3 100644
--- a/Emby.Dlna/PlayTo/DlnaHttpClient.cs
+++ b/Emby.Dlna/PlayTo/DlnaHttpClient.cs
@@ -31,6 +31,9 @@ namespace Emby.Dlna.PlayTo
_httpClientFactory = httpClientFactory;
}
+ [GeneratedRegex("(&(?![a-z]*;))")]
+ private static partial Regex EscapeAmpersandRegex();
+
private static string NormalizeServiceUrl(string baseUrl, string serviceUrl)
{
// If it's already a complete url, don't stick anything onto the front of it
@@ -128,12 +131,5 @@ namespace Emby.Dlna.PlayTo
// Have to await here instead of returning the Task directly, otherwise request would be disposed too soon
return await SendRequestAsync(request, cancellationToken).ConfigureAwait(false);
}
-
- ///
- /// Compile-time generated regular expression for escaping ampersands.
- ///
- /// Compiled regular expression.
- [GeneratedRegex("(&(?![a-z]*;))")]
- private static partial Regex EscapeAmpersandRegex();
}
}
diff --git a/Emby.Naming/Audio/AlbumParser.cs b/Emby.Naming/Audio/AlbumParser.cs
index 86a5641531..73424a1345 100644
--- a/Emby.Naming/Audio/AlbumParser.cs
+++ b/Emby.Naming/Audio/AlbumParser.cs
@@ -10,7 +10,7 @@ namespace Emby.Naming.Audio
///
/// Helper class to determine if Album is multipart.
///
- public class AlbumParser
+ public partial class AlbumParser
{
private readonly NamingOptions _options;
@@ -23,6 +23,9 @@ namespace Emby.Naming.Audio
_options = options;
}
+ [GeneratedRegex(@"([-\.\(\)]|\s+)")]
+ private static partial Regex CleanRegex();
+
///
/// Function that determines if album is multipart.
///
@@ -42,13 +45,9 @@ namespace Emby.Naming.Audio
// Normalize
// Remove whitespace
- filename = filename.Replace('-', ' ');
- filename = filename.Replace('.', ' ');
- filename = filename.Replace('(', ' ');
- filename = filename.Replace(')', ' ');
- filename = Regex.Replace(filename, @"\s+", " ");
+ filename = CleanRegex().Replace(filename, " ");
- ReadOnlySpan trimmedFilename = filename.TrimStart();
+ ReadOnlySpan trimmedFilename = filename.AsSpan().TrimStart();
foreach (var prefix in _options.AlbumStackingPrefixes)
{
diff --git a/Emby.Naming/TV/SeriesResolver.cs b/Emby.Naming/TV/SeriesResolver.cs
index 307a840964..d8fa417436 100644
--- a/Emby.Naming/TV/SeriesResolver.cs
+++ b/Emby.Naming/TV/SeriesResolver.cs
@@ -7,14 +7,15 @@ namespace Emby.Naming.TV
///
/// Used to resolve information about series from path.
///
- public static class SeriesResolver
+ public static partial class SeriesResolver
{
///
/// Regex that matches strings of at least 2 characters separated by a dot or underscore.
/// Used for removing separators between words, i.e turns "The_show" into "The show" while
/// preserving namings like "S.H.O.W".
///
- private static readonly Regex _seriesNameRegex = new Regex(@"((?[^\._]{2,})[\._]*)|([\._](?[^\._]{2,}))", RegexOptions.Compiled);
+ [GeneratedRegex(@"((?[^\._]{2,})[\._]*)|([\._](?[^\._]{2,}))")]
+ private static partial Regex SeriesNameRegex();
///
/// Resolve information about series from path.
@@ -37,7 +38,7 @@ namespace Emby.Naming.TV
if (!string.IsNullOrEmpty(seriesName))
{
- seriesName = _seriesNameRegex.Replace(seriesName, "${a} ${b}").Trim();
+ seriesName = SeriesNameRegex().Replace(seriesName, "${a} ${b}").Trim();
}
return new SeriesInfo(path)
diff --git a/Emby.Naming/Video/VideoListResolver.cs b/Emby.Naming/Video/VideoListResolver.cs
index 6209cd46f4..51f29cf088 100644
--- a/Emby.Naming/Video/VideoListResolver.cs
+++ b/Emby.Naming/Video/VideoListResolver.cs
@@ -12,9 +12,13 @@ namespace Emby.Naming.Video
///
/// Resolves alternative versions and extras from list of video files.
///
- public static class VideoListResolver
+ public static partial class VideoListResolver
{
- private static readonly Regex _resolutionRegex = new Regex("[0-9]{2}[0-9]+[ip]", RegexOptions.IgnoreCase | RegexOptions.Compiled);
+ [GeneratedRegex("[0-9]{2}[0-9]+[ip]", RegexOptions.IgnoreCase)]
+ private static partial Regex ResolutionRegex();
+
+ [GeneratedRegex(@"^\[([^]]*)\]")]
+ private static partial Regex CheckMultiVersionRegex();
///
/// Resolves alternative versions and extras from list of video files.
@@ -131,7 +135,7 @@ namespace Emby.Naming.Video
if (videos.Count > 1)
{
- var groups = videos.GroupBy(x => _resolutionRegex.IsMatch(x.Files[0].FileNameWithoutExtension)).ToList();
+ var groups = videos.GroupBy(x => ResolutionRegex().IsMatch(x.Files[0].FileNameWithoutExtension)).ToList();
videos.Clear();
foreach (var group in groups)
{
@@ -201,7 +205,7 @@ namespace Emby.Naming.Video
// The CleanStringParser should have removed common keywords etc.
return testFilename.IsEmpty
|| testFilename[0] == '-'
- || Regex.IsMatch(testFilename, @"^\[([^]]*)\]", RegexOptions.Compiled);
+ || CheckMultiVersionRegex().IsMatch(testFilename);
}
}
}
diff --git a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
index ea980b9929..0b65bf921e 100644
--- a/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
+++ b/Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
@@ -24,7 +24,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
///
/// Class MovieResolver.
///
- public class MovieResolver : BaseVideoResolver