From a2d8eed6124670060a7e95dca1f76edfd50e12bd Mon Sep 17 00:00:00 2001 From: CodeConscious <50596087+codeconscious@users.noreply.github.com> Date: Mon, 27 Jan 2025 11:09:22 +0900 Subject: [PATCH 1/6] Normalize renamed files' new names --- src/AudioTagger.Console/Operations/MediaFileRenamer.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/AudioTagger.Console/Operations/MediaFileRenamer.cs b/src/AudioTagger.Console/Operations/MediaFileRenamer.cs index 67ae3bf..bc378a0 100644 --- a/src/AudioTagger.Console/Operations/MediaFileRenamer.cs +++ b/src/AudioTagger.Console/Operations/MediaFileRenamer.cs @@ -207,7 +207,7 @@ private static bool RenameSingleFile( return false; } - MediaFilePathInfo oldPathInfo = new(workingPath, file.FileInfo.FullName); + var oldPathInfo = new MediaFilePathInfo(workingPath, file.FileInfo.FullName); string newArtistDir = useArtistDirectory ? GenerateSafeDirectoryName(file) @@ -215,8 +215,8 @@ private static bool RenameSingleFile( string newAlbumDir = useAlbumDirectory && useArtistDirectory && file.Album.HasText() ? IoUtilities.SanitizePath(file.Album) : string.Empty; - string newFileName = GenerateFileNameUsingPattern(file, populatedTagNames, matchedRenamePattern); - MediaFilePathInfo newPathInfo = new(workingPath, [newArtistDir, newAlbumDir], newFileName); + string newFileName = GenerateFileName(file, populatedTagNames, matchedRenamePattern).Normalize(); + var newPathInfo = new MediaFilePathInfo(workingPath, [newArtistDir, newAlbumDir], newFileName); if (oldPathInfo.FullFilePath(true) == newPathInfo.FullFilePath(true)) { @@ -271,7 +271,7 @@ private static bool RenameSingleFile( /// Generates and returns a new filename by replacing placeholders within the rename /// pattern (e.g., `%ALBUM%`) with actual tag data from the `MediaFile`. /// - static string GenerateFileNameUsingPattern( + static string GenerateFileName( MediaFile file, ICollection fileTagNames, string renamePattern) From c42335b3e0bc62443b345d2e4700efbab4f0f98d Mon Sep 17 00:00:00 2001 From: CodeConscious <50596087+codeconscious@users.noreply.github.com> Date: Mon, 27 Jan 2025 12:55:26 +0900 Subject: [PATCH 2/6] Add Rider files --- src/.idea/.idea.AudioTagger/.idea/.gitignore | 13 +++++++++++++ src/.idea/.idea.AudioTagger/.idea/.name | 1 + src/.idea/.idea.AudioTagger/.idea/indexLayout.xml | 8 ++++++++ src/.idea/.idea.AudioTagger/.idea/vcs.xml | 6 ++++++ 4 files changed, 28 insertions(+) create mode 100644 src/.idea/.idea.AudioTagger/.idea/.gitignore create mode 100644 src/.idea/.idea.AudioTagger/.idea/.name create mode 100644 src/.idea/.idea.AudioTagger/.idea/indexLayout.xml create mode 100644 src/.idea/.idea.AudioTagger/.idea/vcs.xml diff --git a/src/.idea/.idea.AudioTagger/.idea/.gitignore b/src/.idea/.idea.AudioTagger/.idea/.gitignore new file mode 100644 index 0000000..1bcedf4 --- /dev/null +++ b/src/.idea/.idea.AudioTagger/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/.idea.AudioTagger.iml +/modules.xml +/projectSettingsUpdater.xml +/contentModel.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/src/.idea/.idea.AudioTagger/.idea/.name b/src/.idea/.idea.AudioTagger/.idea/.name new file mode 100644 index 0000000..9722465 --- /dev/null +++ b/src/.idea/.idea.AudioTagger/.idea/.name @@ -0,0 +1 @@ +AudioTagger \ No newline at end of file diff --git a/src/.idea/.idea.AudioTagger/.idea/indexLayout.xml b/src/.idea/.idea.AudioTagger/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/src/.idea/.idea.AudioTagger/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/.idea/.idea.AudioTagger/.idea/vcs.xml b/src/.idea/.idea.AudioTagger/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/src/.idea/.idea.AudioTagger/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file From 10d24927c3611d82f3539db5cb1bc2a5c4ec050d Mon Sep 17 00:00:00 2001 From: CodeConscious <50596087+codeconscious@users.noreply.github.com> Date: Sat, 1 Feb 2025 22:49:54 +0900 Subject: [PATCH 3/6] Use normalization form C --- src/AudioTagger.Console/Operations/MediaFileRenamer.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/AudioTagger.Console/Operations/MediaFileRenamer.cs b/src/AudioTagger.Console/Operations/MediaFileRenamer.cs index bc378a0..cddde67 100644 --- a/src/AudioTagger.Console/Operations/MediaFileRenamer.cs +++ b/src/AudioTagger.Console/Operations/MediaFileRenamer.cs @@ -215,7 +215,8 @@ private static bool RenameSingleFile( string newAlbumDir = useAlbumDirectory && useArtistDirectory && file.Album.HasText() ? IoUtilities.SanitizePath(file.Album) : string.Empty; - string newFileName = GenerateFileName(file, populatedTagNames, matchedRenamePattern).Normalize(); + string newFileName = GenerateFileName(file, populatedTagNames, matchedRenamePattern) + .Normalize(NormalizationForm.FormC); var newPathInfo = new MediaFilePathInfo(workingPath, [newArtistDir, newAlbumDir], newFileName); if (oldPathInfo.FullFilePath(true) == newPathInfo.FullFilePath(true)) From 183312e658c6ede02bb511090f84623e569e9115 Mon Sep 17 00:00:00 2001 From: CodeConscious <50596087+codeconscious@users.noreply.github.com> Date: Sat, 1 Feb 2025 23:05:52 +0900 Subject: [PATCH 4/6] Add normalization form as a setting --- .../Operations/MediaFileRenamer.cs | 23 +++++++++++++++---- .../UserSettings/Settings.cs | 3 +++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/AudioTagger.Console/Operations/MediaFileRenamer.cs b/src/AudioTagger.Console/Operations/MediaFileRenamer.cs index cddde67..6d0a77f 100644 --- a/src/AudioTagger.Console/Operations/MediaFileRenamer.cs +++ b/src/AudioTagger.Console/Operations/MediaFileRenamer.cs @@ -60,12 +60,22 @@ public void Start( return; } + var normalizationForm = settings.Renaming.NormalizationForm.Trim() switch + { + "D" => NormalizationForm.FormD, + "KD" => NormalizationForm.FormKD, + "KC" => NormalizationForm.FormKC, + _ => NormalizationForm.FormC + }; + printer.Print($"Normalization form is {normalizationForm}."); + RenameFiles( eligibleMediaFiles, workingDirectory, printer, settings.Renaming.Patterns, - settings.Renaming.UseAlbumDirectories); + settings.Renaming.UseAlbumDirectories, + normalizationForm); var deletedDirs = DeleteEmptySubDirectories(workingDirectory.FullName, printer); PrintDeletedDirectories(deletedDirs, printer); @@ -96,7 +106,8 @@ private static void RenameFiles( DirectoryInfo workingDirectory, IPrinter printer, IEnumerable renamePatterns, - bool useAlbumDirectories) + bool useAlbumDirectories, + NormalizationForm normalizationForm) { var isCancelRequested = false; var doConfirm = true; @@ -131,6 +142,7 @@ private static void RenameFiles( workingDirectory.FullName, useArtistDirectory, useAlbumDirectories, + normalizationForm, ref doConfirm, renamePatterns); } @@ -181,6 +193,7 @@ private static bool RenameSingleFile( string workingPath, bool useArtistDirectory, bool useAlbumDirectory, + NormalizationForm normalizationForm, ref bool doConfirm, IEnumerable renamePatterns) { @@ -210,13 +223,13 @@ private static bool RenameSingleFile( var oldPathInfo = new MediaFilePathInfo(workingPath, file.FileInfo.FullName); string newArtistDir = useArtistDirectory - ? GenerateSafeDirectoryName(file) + ? GenerateSafeDirectoryName(file).Normalize(normalizationForm) : string.Empty; string newAlbumDir = useAlbumDirectory && useArtistDirectory && file.Album.HasText() - ? IoUtilities.SanitizePath(file.Album) + ? IoUtilities.SanitizePath(file.Album).Normalize(normalizationForm) : string.Empty; string newFileName = GenerateFileName(file, populatedTagNames, matchedRenamePattern) - .Normalize(NormalizationForm.FormC); + .Normalize(normalizationForm); var newPathInfo = new MediaFilePathInfo(workingPath, [newArtistDir, newAlbumDir], newFileName); if (oldPathInfo.FullFilePath(true) == newPathInfo.FullFilePath(true)) diff --git a/src/AudioTagger.Library/UserSettings/Settings.cs b/src/AudioTagger.Library/UserSettings/Settings.cs index 9945ccc..dd67da0 100644 --- a/src/AudioTagger.Library/UserSettings/Settings.cs +++ b/src/AudioTagger.Library/UserSettings/Settings.cs @@ -99,6 +99,9 @@ public sealed record Renaming [JsonPropertyName("useAlbumDirectories")] public bool UseAlbumDirectories { get; init; } = false; + [JsonPropertyName("normalizationForm")] + public string NormalizationForm { get; init; } = "C"; + [JsonPropertyName("ignoredDirectories")] public ImmutableList? IgnoredDirectories { get; init; } } From b3815507338eb3b58a6929412f8a4c9d44556c6b Mon Sep 17 00:00:00 2001 From: CodeConscious <50596087+codeconscious@users.noreply.github.com> Date: Sun, 2 Feb 2025 12:30:59 +0900 Subject: [PATCH 5/6] Minor tweaks --- src/AudioTagger.Console/Operations/MediaFileRenamer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/AudioTagger.Console/Operations/MediaFileRenamer.cs b/src/AudioTagger.Console/Operations/MediaFileRenamer.cs index 6d0a77f..8c7a634 100644 --- a/src/AudioTagger.Console/Operations/MediaFileRenamer.cs +++ b/src/AudioTagger.Console/Operations/MediaFileRenamer.cs @@ -67,7 +67,7 @@ public void Start( "KC" => NormalizationForm.FormKC, _ => NormalizationForm.FormC }; - printer.Print($"Normalization form is {normalizationForm}."); + printer.Print($"Filename normalization form is {normalizationForm}."); RenameFiles( eligibleMediaFiles, @@ -117,7 +117,7 @@ private static void RenameFiles( for (int i = 0; i < mediaFiles.Count; i++) { - MediaFile file = mediaFiles.ElementAt(i); + var file = mediaFiles.ElementAt(i); if (file.Title.Length == 0) { From c4f159528e7be05f24c232b8e4e745224e8be5ff Mon Sep 17 00:00:00 2001 From: CodeConscious <50596087+codeconscious@users.noreply.github.com> Date: Sun, 2 Feb 2025 12:34:51 +0900 Subject: [PATCH 6/6] Add method XML comment --- src/AudioTagger.Library/UserSettings/Settings.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/AudioTagger.Library/UserSettings/Settings.cs b/src/AudioTagger.Library/UserSettings/Settings.cs index dd67da0..b926933 100644 --- a/src/AudioTagger.Library/UserSettings/Settings.cs +++ b/src/AudioTagger.Library/UserSettings/Settings.cs @@ -99,6 +99,14 @@ public sealed record Renaming [JsonPropertyName("useAlbumDirectories")] public bool UseAlbumDirectories { get; init; } = false; + /// + /// The Unicode normalization form to use for renamed filenames. + /// Valid values are `C`, `D`, `KC`, and `KD`. + /// `C` is used by default is no valid value is provided. + /// + /// Reference: https://unicode.org/reports/tr15/ + /// Reference: https://en.wikipedia.org/wiki/Unicode_equivalence + /// [JsonPropertyName("normalizationForm")] public string NormalizationForm { get; init; } = "C";