From 7fccabd47953136612a5095548c6d91cc7d9ca3a Mon Sep 17 00:00:00 2001 From: Joseph Milazzo Date: Sun, 13 Apr 2025 09:08:02 -0500 Subject: [PATCH] Fixed a bug where Genre/Tags read in from ComicInfo were being normalized when they shouldn't. --- API/Extensions/StringExtensions.cs | 6 +++--- API/Helpers/Builders/GenreBuilder.cs | 6 +++--- API/Helpers/Builders/TagBuilder.cs | 4 ++-- API/Helpers/GenreHelper.cs | 9 +++++++-- API/Helpers/TagHelper.cs | 22 +++++++++++++--------- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/API/Extensions/StringExtensions.cs b/API/Extensions/StringExtensions.cs index 138209e0d..28419921a 100644 --- a/API/Extensions/StringExtensions.cs +++ b/API/Extensions/StringExtensions.cs @@ -18,9 +18,9 @@ public static class StringExtensions // Remove all newline and control characters var sanitized = input - .Replace(Environment.NewLine, "") - .Replace("\n", "") - .Replace("\r", ""); + .Replace(Environment.NewLine, string.Empty) + .Replace("\n", string.Empty) + .Replace("\r", string.Empty); // Optionally remove other potentially unwanted characters sanitized = Regex.Replace(sanitized, @"[^\u0020-\u007E]", string.Empty); // Removes non-printable ASCII diff --git a/API/Helpers/Builders/GenreBuilder.cs b/API/Helpers/Builders/GenreBuilder.cs index 69e68f6c1..9b2f1590e 100644 --- a/API/Helpers/Builders/GenreBuilder.cs +++ b/API/Helpers/Builders/GenreBuilder.cs @@ -16,14 +16,14 @@ public class GenreBuilder : IEntityBuilder { Title = name.Trim().SentenceCase(), NormalizedTitle = name.ToNormalized(), - Chapters = new List(), - SeriesMetadatas = new List() + Chapters = [], + SeriesMetadatas = [] }; } public GenreBuilder WithSeriesMetadata(SeriesMetadata seriesMetadata) { - _genre.SeriesMetadatas ??= new List(); + _genre.SeriesMetadatas ??= []; _genre.SeriesMetadatas.Add(seriesMetadata); return this; } diff --git a/API/Helpers/Builders/TagBuilder.cs b/API/Helpers/Builders/TagBuilder.cs index 084171f54..623587fd1 100644 --- a/API/Helpers/Builders/TagBuilder.cs +++ b/API/Helpers/Builders/TagBuilder.cs @@ -16,8 +16,8 @@ public class TagBuilder : IEntityBuilder { Title = name.Trim().SentenceCase(), NormalizedTitle = name.ToNormalized(), - Chapters = new List(), - SeriesMetadatas = new List() + Chapters = [], + SeriesMetadatas = [] }; } diff --git a/API/Helpers/GenreHelper.cs b/API/Helpers/GenreHelper.cs index 1f7ca53d6..8580178d9 100644 --- a/API/Helpers/GenreHelper.cs +++ b/API/Helpers/GenreHelper.cs @@ -19,7 +19,12 @@ public static class GenreHelper public static async Task UpdateChapterGenres(Chapter chapter, IEnumerable genreNames, IUnitOfWork unitOfWork) { // Normalize genre names once and store them in a hash set for quick lookups - var normalizedGenresToAdd = new HashSet(genreNames.Select(g => g.ToNormalized())); + var normalizedToOriginal = genreNames + .Select(g => new { Original = g, Normalized = g.ToNormalized() }) + .GroupBy(x => x.Normalized) + .ToDictionary(g => g.Key, g => g.First().Original); + + var normalizedGenresToAdd = new HashSet(normalizedToOriginal.Keys); // Remove genres that are no longer in the new list var genresToRemove = chapter.Genres @@ -42,7 +47,7 @@ public static class GenreHelper // Find missing genres that are not in the database var missingGenres = normalizedGenresToAdd .Where(nt => !existingGenreTitles.ContainsKey(nt)) - .Select(title => new GenreBuilder(title).Build()) + .Select(nt => new GenreBuilder(normalizedToOriginal[nt]).Build()) .ToList(); // Add missing genres to the database diff --git a/API/Helpers/TagHelper.cs b/API/Helpers/TagHelper.cs index d05be7a32..c00d6ee8f 100644 --- a/API/Helpers/TagHelper.cs +++ b/API/Helpers/TagHelper.cs @@ -20,7 +20,13 @@ public static class TagHelper public static async Task UpdateChapterTags(Chapter chapter, IEnumerable tagNames, IUnitOfWork unitOfWork) { // Normalize tag names once and store them in a hash set for quick lookups - var normalizedTagsToAdd = new HashSet(tagNames.Select(t => t.ToNormalized())); + // Create a dictionary: normalized => original + var normalizedToOriginal = tagNames + .Select(t => new { Original = t, Normalized = t.ToNormalized() }) + .GroupBy(x => x.Normalized) // in case of duplicates + .ToDictionary(g => g.Key, g => g.First().Original); + + var normalizedTagsToAdd = new HashSet(normalizedToOriginal.Keys); var existingTagsSet = new HashSet(chapter.Tags.Select(t => t.NormalizedTitle)); var isModified = false; @@ -30,7 +36,7 @@ public static class TagHelper .Where(t => !normalizedTagsToAdd.Contains(t.NormalizedTitle)) .ToList(); - if (tagsToRemove.Any()) + if (tagsToRemove.Count != 0) { foreach (var tagToRemove in tagsToRemove) { @@ -47,7 +53,7 @@ public static class TagHelper // Find missing tags that are not already in the database var missingTags = normalizedTagsToAdd .Where(nt => !existingTagTitles.ContainsKey(nt)) - .Select(title => new TagBuilder(title).Build()) + .Select(nt => new TagBuilder(normalizedToOriginal[nt]).Build()) .ToList(); // Add missing tags to the database if any @@ -67,13 +73,11 @@ public static class TagHelper // Add the new or existing tags to the chapter foreach (var normalizedTitle in normalizedTagsToAdd) { - var tag = existingTagTitles[normalizedTitle]; + if (existingTagsSet.Contains(normalizedTitle)) continue; - if (!existingTagsSet.Contains(normalizedTitle)) - { - chapter.Tags.Add(tag); - isModified = true; - } + var tag = existingTagTitles[normalizedTitle]; + chapter.Tags.Add(tag); + isModified = true; } // Commit changes if modifications were made to the chapter's tags