Files
MusicTagFixer/src/Program.cs
2026-02-02 15:33:30 +03:00

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);
}
}