From 210958db350fae44dcf8db6d45a29ab6fd7a7950 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Tue, 22 Mar 2022 16:02:03 +0100 Subject: [PATCH] Code cleanup --- .gitignore | 3 +- .idea/.idea.AutoTag/.idea/indexLayout.xml | 2 +- AutoTag.cli/AlphaNumComparer.cs | 150 +++++++---------- AutoTag.cli/AutoTag.cli.csproj | 4 +- AutoTag.cli/AutoTag.cs | 195 +++++++++++----------- 5 files changed, 159 insertions(+), 195 deletions(-) diff --git a/.gitignore b/.gitignore index add57be..8e82755 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ bin/ obj/ /packages/ riderModule.iml -/_ReSharper.Caches/ \ No newline at end of file +/_ReSharper.Caches/ +.DS_Store diff --git a/.idea/.idea.AutoTag/.idea/indexLayout.xml b/.idea/.idea.AutoTag/.idea/indexLayout.xml index 27ba142..7b08163 100644 --- a/.idea/.idea.AutoTag/.idea/indexLayout.xml +++ b/.idea/.idea.AutoTag/.idea/indexLayout.xml @@ -1,6 +1,6 @@ - + diff --git a/AutoTag.cli/AlphaNumComparer.cs b/AutoTag.cli/AlphaNumComparer.cs index acfdebb..ff26aff 100644 --- a/AutoTag.cli/AlphaNumComparer.cs +++ b/AutoTag.cli/AlphaNumComparer.cs @@ -42,108 +42,80 @@ using System.Text; * Please compare against the latest Java version at http://www.DaveKoelle.com * to see the most recent modifications */ -namespace AutoTag.cli -{ - public class AlphanumComparator : IComparer - { - private enum ChunkType {Alphanumeric, Numeric}; - private bool InChunk(char ch, char otherCh) - { - var type = ChunkType.Alphanumeric; +namespace AutoTag.cli; - if (char.IsDigit(otherCh)) - { - type = ChunkType.Numeric; - } +public class AlphanumComparator : IComparer { + public int Compare(string x, string y) { + var s1 = x; + var s2 = y; + if (s1 == null || s2 == null) + return 0; - if (type == ChunkType.Alphanumeric && char.IsDigit(ch) - || type == ChunkType.Numeric && !char.IsDigit(ch)) - { - return false; - } + var thisMarker = 0; + var thatMarker = 0; - return true; - } + while (thisMarker < s1.Length || thatMarker < s2.Length) { + if (thisMarker >= s1.Length) + return -1; + if (thatMarker >= s2.Length) + return 1; - public int Compare(string x, string y) - { - var s1 = x; - var s2 = y; - if (s1 == null || s2 == null) - { - return 0; - } + var thisCh = s1[thisMarker]; + var thatCh = s2[thatMarker]; - var thisMarker = 0; - var thatMarker = 0; + var thisChunk = new StringBuilder(); + var thatChunk = new StringBuilder(); - while (thisMarker < s1.Length || thatMarker < s2.Length) - { - if (thisMarker >= s1.Length) - { - return -1; - } - else if (thatMarker >= s2.Length) - { - return 1; - } - var thisCh = s1[thisMarker]; - var thatCh = s2[thatMarker]; + while (thisMarker < s1.Length && (thisChunk.Length == 0 || InChunk(thisCh, thisChunk[0]))) { + thisChunk.Append(thisCh); + thisMarker++; - var thisChunk = new StringBuilder(); - var thatChunk = new StringBuilder(); + if (thisMarker < s1.Length) + thisCh = s1[thisMarker]; + } - while (thisMarker < s1.Length && (thisChunk.Length==0 ||InChunk(thisCh, thisChunk[0]))) - { - thisChunk.Append(thisCh); - thisMarker++; + while (thatMarker < s2.Length && (thatChunk.Length == 0 || InChunk(thatCh, thatChunk[0]))) { + thatChunk.Append(thatCh); + thatMarker++; - if (thisMarker < s1.Length) - { - thisCh = s1[thisMarker]; - } - } + if (thatMarker < s2.Length) + thatCh = s2[thatMarker]; + } - while (thatMarker < s2.Length && (thatChunk.Length==0 ||InChunk(thatCh, thatChunk[0]))) - { - thatChunk.Append(thatCh); - thatMarker++; + var result = 0; + // If both chunks contain numeric characters, sort them numerically + if (char.IsDigit(thisChunk[0]) && char.IsDigit(thatChunk[0])) { + var thisNumericChunk = Convert.ToInt32(thisChunk.ToString()); + var thatNumericChunk = Convert.ToInt32(thatChunk.ToString()); - if (thatMarker < s2.Length) - { - thatCh = s2[thatMarker]; - } - } + if (thisNumericChunk < thatNumericChunk) + result = -1; - var result = 0; - // If both chunks contain numeric characters, sort them numerically - if (char.IsDigit(thisChunk[0]) && char.IsDigit(thatChunk[0])) - { - var thisNumericChunk = Convert.ToInt32(thisChunk.ToString()); - var thatNumericChunk = Convert.ToInt32(thatChunk.ToString()); + if (thisNumericChunk > thatNumericChunk) + result = 1; + } + else { + result = string.Compare(thisChunk.ToString(), thatChunk.ToString(), StringComparison.Ordinal); + } - if (thisNumericChunk < thatNumericChunk) - { - result = -1; - } + if (result != 0) + return result; + } - if (thisNumericChunk > thatNumericChunk) - { - result = 1; - } - } - else - { - result = string.Compare(thisChunk.ToString(), thatChunk.ToString(), StringComparison.Ordinal); - } + return 0; + } - if (result != 0) - { - return result; - } - } + private static bool InChunk(char ch, char otherCh) { + var type = ChunkType.Alphanumeric; - return 0; - } - } -} \ No newline at end of file + if (char.IsDigit(otherCh)) + type = ChunkType.Numeric; + + return (type != ChunkType.Alphanumeric || !char.IsDigit(ch)) && (type != ChunkType.Numeric || char.IsDigit(ch)); + } + + private enum ChunkType { + Alphanumeric, + Numeric + } +} diff --git a/AutoTag.cli/AutoTag.cli.csproj b/AutoTag.cli/AutoTag.cli.csproj index 295c322..b2f20c3 100644 --- a/AutoTag.cli/AutoTag.cli.csproj +++ b/AutoTag.cli/AutoTag.cli.csproj @@ -2,11 +2,11 @@ Exe - netcoreapp3.1 + net60 - + diff --git a/AutoTag.cli/AutoTag.cs b/AutoTag.cli/AutoTag.cs index 3e63b7b..487bda5 100644 --- a/AutoTag.cli/AutoTag.cs +++ b/AutoTag.cli/AutoTag.cs @@ -2,130 +2,121 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; using static AutoTag.cli.Helpers; using TagFile = TagLib.File; -namespace AutoTag.cli { - internal static class AutoTag { - private static void Main(string[] args) { - if (args.Length != 3 || args[0] != "albums" && args[0] != "playlists") { - Console.WriteLine("Usage: autotag "); - Environment.Exit(1); +namespace AutoTag.cli; + +internal static class AutoTag { + private static void Main(string[] args) { + if (args.Length != 3 || args[0] != "albums" && args[0] != "playlists") { + Console.WriteLine("Usage: autotag "); + Environment.Exit(1); + } + + var type = args[0] == "albums" ? FolderType.Albums : FolderType.Playlists; + var inputDir = new Folder(args[1], type); + var outputDir = args[2]; + + switch (inputDir.Type) { + case FolderType.Albums: { + foreach (var track in Directory.EnumerateFiles(inputDir.Path, "*.*", SearchOption.AllDirectories).Where(IsAllowed)) { + Console.WriteLine("<- " + track); + + var tagFile = TagFile.Create(track); + if (tagFile.Tag.AlbumArtists.Length == 0) + tagFile.Tag.AlbumArtists = new[] { tagFile.Tag.Performers[0] }; + var outputFileDirectory = Path.Combine(outputDir, CleanFileName(tagFile.Tag.AlbumArtists[0]), CleanFileName(tagFile.Tag.Album)); + Directory.CreateDirectory(outputFileDirectory); + var outputFilePath = Path.Combine(outputDir, CleanFileName(tagFile.Tag.AlbumArtists[0]), CleanFileName(tagFile.Tag.Album), + CleanFileName($"{tagFile.Tag.Track}. {tagFile.Tag.Performers[0]} - {tagFile.Tag.Title}{Path.GetExtension(track)}")); + + if (tagFile.Tag.Disc != 0 && tagFile.Tag.Disc != 1) + outputFilePath = Path.Combine(outputDir, CleanFileName(tagFile.Tag.AlbumArtists[0]), CleanFileName(tagFile.Tag.Album), + CleanFileName($"Disc{tagFile.Tag.Disc} - {tagFile.Tag.Track}. {tagFile.Tag.Performers[0]} - {tagFile.Tag.Title}{Path.GetExtension(track)}")); + + tagFile.Save(); + File.Copy(track, outputFilePath, true); + + var newTagFile = TagFile.Create(outputFilePath); + newTagFile.Tag.Comment = null; + newTagFile.Tag.Genres = null; + newTagFile.Save(); + + Console.WriteLine("-> " + outputFilePath); + Console.WriteLine(); + } + + break; } + case FolderType.Playlists: { + foreach (var playlist in Directory.GetDirectories(inputDir.Path)) { + var tracks = Directory.EnumerateFiles(playlist, "*.*", SearchOption.AllDirectories).Where(IsAllowed).OrderBy(s => s, new AlphanumComparator()); - Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + uint i = 1; + var trackCount = tracks.Count(); + var playlistName = Path.GetFileName(playlist); - var type = args[0] == "albums" ? FolderType.Albums : FolderType.Playlists; - - var inputDir = new Folder(args[1], type); - var outputDir = args[2]; - - switch (inputDir.Type) { - case FolderType.Albums: { - foreach (var track in Directory.EnumerateFiles(inputDir.Path, "*.*", SearchOption.AllDirectories) - .Where(IsAllowed)) { + foreach (var track in tracks) { Console.WriteLine("<- " + track); - var tagFile = TagFile.Create(track); - if (tagFile.Tag.AlbumArtists.Length == 0) - tagFile.Tag.AlbumArtists = new[] {tagFile.Tag.Performers[0]}; - var outputFileDirectory = Path.Combine(outputDir, CleanFileName(tagFile.Tag.AlbumArtists[0]), - CleanFileName(tagFile.Tag.Album)); + var tagFile = TagFile.Create(track); + var outputFileDirectory = Path.Combine(outputDir, "Various Artists", CleanFileName(playlistName)); Directory.CreateDirectory(outputFileDirectory); - var outputFilePath = Path.Combine(outputDir, CleanFileName(tagFile.Tag.AlbumArtists[0]), - CleanFileName(tagFile.Tag.Album), - CleanFileName($"{tagFile.Tag.Track}. {tagFile.Tag.Performers[0]} - {tagFile.Tag.Title}{Path.GetExtension(track)}")); - if (tagFile.Tag.Disc != 0 && tagFile.Tag.Disc != 1) { - outputFilePath = Path.Combine(outputDir, CleanFileName(tagFile.Tag.AlbumArtists[0]), - CleanFileName(tagFile.Tag.Album), - CleanFileName($"Disc{tagFile.Tag.Disc} - {tagFile.Tag.Track}. {tagFile.Tag.Performers[0]} - {tagFile.Tag.Title}{Path.GetExtension(track)}")); - } + var outputFilePath = Path.Combine(outputDir, "Various Artists", CleanFileName(playlistName), + CleanFileName(tagFile.Tag.Performers.Length == 0 + ? $"{i}. {tagFile.Tag.Title}{Path.GetExtension(track)}" + : $"{i}. {tagFile.Tag.Performers[0]} - {tagFile.Tag.Title}{Path.GetExtension(track)}")); + + tagFile.Save(); File.Copy(track, outputFilePath, true); + var newTagFile = TagFile.Create(outputFilePath); - newTagFile.Tag.Comment = null; - newTagFile.Tag.Genres = null; + newTagFile.Tag.Comment = null; + newTagFile.Tag.Genres = null; + newTagFile.Tag.Album = playlistName; + newTagFile.Tag.Track = i++; + newTagFile.Tag.TrackCount = (uint)trackCount; + newTagFile.Tag.AlbumArtists = new[] { "Various Artists" }; + + if (newTagFile.Tag.Performers.Length == 0) + newTagFile.Tag.Performers = new[] { "Various Artists" }; + newTagFile.Save(); + Console.WriteLine("-> " + outputFilePath); Console.WriteLine(); } - - break; } - case FolderType.Playlists: { - foreach (var playlist in Directory.GetDirectories(inputDir.Path)) { - var tracks = Directory.EnumerateFiles(playlist, "*.*", SearchOption.AllDirectories) - .Where(IsAllowed) - .OrderBy(s => s, new AlphanumComparator()); - uint i = 1; - var trackCount = tracks.Count(); - var playlistName = Path.GetFileName(playlist); - - foreach (var track in tracks) { - Console.WriteLine("<- " + track); - var tagFile = TagFile.Create(track); - var outputFileDirectory = - Path.Combine(outputDir, "Various Artists", CleanFileName(playlistName)); - Directory.CreateDirectory(outputFileDirectory); - - var outputFilePath = Path.Combine(outputDir, "Various Artists", CleanFileName(playlistName), - CleanFileName(tagFile.Tag.Performers.Length == 0 - ? $"{i}. {tagFile.Tag.Title}{Path.GetExtension(track)}" - : $"{i}. {tagFile.Tag.Performers[0]} - {tagFile.Tag.Title}{Path.GetExtension(track)}")); - File.Copy(track, outputFilePath, true); - var newTagFile = TagFile.Create(outputFilePath); - newTagFile.Tag.Comment = null; - newTagFile.Tag.Genres = null; - newTagFile.Tag.Album = playlistName; - newTagFile.Tag.Track = i++; - newTagFile.Tag.TrackCount = (uint) trackCount; - newTagFile.Tag.AlbumArtists = new[] {"Various Artists"}; - - if (newTagFile.Tag.Performers.Length == 0) - newTagFile.Tag.Performers = new[] {"Various Artists"}; - - newTagFile.Save(); - Console.WriteLine("-> " + outputFilePath); - Console.WriteLine(); - } - } - - break; - } - default: throw new ArgumentOutOfRangeException(); + break; } + default: throw new ArgumentOutOfRangeException(); } } +} - internal class Folder { - public readonly string Path; - public readonly FolderType Type; +internal class Folder { + public readonly string Path; + public readonly FolderType Type; - public Folder(string path, FolderType type) { - Path = path; - Type = type; - } + public Folder(string path, FolderType type) { + Path = path; + Type = type; } +} - internal enum FolderType { - Albums, - Playlists +internal enum FolderType { + Albums, + Playlists +} + +internal static class Helpers { + private static readonly List AllowedFileTypes = new() { ".flac", ".opus", ".mp3", ".m4a" }; + + internal static bool IsAllowed(string filename) => AllowedFileTypes.Any(filename.EndsWith); + + internal static string CleanFileName(string fileName) { + return Path.GetInvalidFileNameChars().Aggregate(fileName, (current, c) => current.Replace(c.ToString(), string.Empty)).Replace(":", " -").Replace("\\", " "); } - - internal static class Helpers { - private static readonly List AllowedFileTypes = new List {".flac", ".opus", ".mp3", ".m4a"}; - - internal static bool IsAllowed(string filename) => AllowedFileTypes.Any(filename.EndsWith); - - internal static string CleanFileName(string fileName) { - return Path.GetInvalidFileNameChars() - .Aggregate(fileName, (current, c) => current.Replace(c.ToString(), string.Empty)) - .Replace(":", " -") - .Replace("\\", " "); - - //var tempBytes = Encoding.GetEncoding("ISO-8859-8").GetBytes(str); - //return Encoding.UTF8.GetString(tempBytes); - } - } -} \ No newline at end of file +}