forked from TheLanc3/MusicTagFixer
114 lines
3.9 KiB
C#
114 lines
3.9 KiB
C#
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<string> 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<List<string>, Query, Task> cycle = async (List<string> 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);
|
|
}
|
|
} |