using UniversalTagEditor.Helpers; using UniversalTagEditor.Types; using MetaBrainz.MusicBrainz; namespace UniversalTagEditor; class Program { static async Task Main(string[] args) { string albumInfo = ""; string albumCover = ""; string format = ""; string workingDirectory = ""; bool fixTags = false; bool enhanceStructure = false; var query = new Query("NavidromeMetadataRecovery1", "1.0"); var query2 = new Query("NavidromeMetadataRecovery2", "1.0"); var query3 = new Query("NavidromeMetadataRecovery3", "1.0"); var query4 = new Query("NavidromeMetadataRecovery4", "1.0"); for (int i = 0; i < args.Length; i++) { switch (args[i]) { case "-w": if (i + 1 < args.Length) workingDirectory = args[i + 1]; i++; break; case "-a": if (i + 1 < args.Length) albumInfo = args[i + 1]; i++; break; case "-f": if (i + 1 < args.Length) format = args[i + 1]; i++; break; case "-c": if (i + 1 < args.Length) albumCover = args[i + 1]; i++; break; case "--fix-tags": fixTags = true; break; case "--enhance-structure": enhanceStructure = true; break; } } TrackInfo[] records; AlbumInfo album = new(); if (albumInfo != "") { records = CsvParser.ParseCsvTable(Path.Combine(workingDirectory, albumInfo)); album = new() { Tracks = records }; } if (albumCover != "") album.Cover = Path.Combine(workingDirectory, albumCover); List files = new(); files.AddRange(Directory.GetFiles(workingDirectory, $"*.{format}")); if (!enhanceStructure) { string[] directories = Directory.GetDirectories(workingDirectory); foreach(string directory in directories) files.AddRange(Directory.GetFiles(directory, $"*.{format}")); } Func, Query, Task> cycle = async (List chunk, Query query) => { for (int i = 0; i < chunk.Count; i++) { if (fixTags) await TagEditor.Fix(chunk[i], query, enhanceStructure, format); else TagEditor.Edit(chunk[i], album, i); Console.WriteLine($"{i+1}. {chunk[i]} successfully edited"); } }; if ((int)(files.Count / 4) > 1) { Thread thread = new Thread(async () => await cycle(files.GetRange(0, (int)(files.Count / 4)), query)) { IsBackground = true }; thread.Start(); Thread thread2 = new Thread(async () => await cycle(files.GetRange((int)(files.Count / 4), (int)(files.Count / 4)), query2)) { IsBackground = true }; thread2.Start(); if ((int)(files.Count / 4) >= 3) { Thread thread3 = new Thread(async () => await cycle(files.GetRange(((int)(files.Count / 4) * 2), (int)(files.Count / 4)), query3)) { IsBackground = true }; thread3.Start(); } if ((int)(files.Count / 4) >= 4) { Thread thread4 = new Thread(async () => await cycle(files.GetRange(((int)(files.Count / 4) * 3), files.Count - ((int)(files.Count / 4) * 3)), query4)) { IsBackground = true }; thread4.Start(); } Console.WriteLine("Waiting for threads complete"); Console.ReadKey(); } else await cycle(files, query); } }