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
+}