step 3 refacotr

Signed-off-by: mbrucedogs <mbrucedogs@gmail.com>
This commit is contained in:
mbrucedogs 2025-07-24 13:34:12 -05:00
parent fbaba1427a
commit 02159a1420

View File

@ -18,6 +18,12 @@ namespace SongCrawler
class Program class Program
{ {
// Properties to store commonly used values from args
private static string Controller { get; set; }
private static string SongsFolderPath { get; set; }
private static string[] Args { get; set; }
private static FireSharp.FirebaseClient FirebaseClient { get; set; }
private static Guid GuidFromString(string input) private static Guid GuidFromString(string input)
{ {
using (MD5 md5 = MD5.Create()) using (MD5 md5 = MD5.Create())
@ -61,6 +67,20 @@ namespace SongCrawler
} }
} }
private static void InitializeFromArgs(string[] args)
{
Args = args;
if (args.Length > 0)
{
Controller = args[0];
}
if (args.Length > 1)
{
SongsFolderPath = args[1];
}
FirebaseClient = CreateFirebaseClient();
}
// Additional helper methods for more refactoring // Additional helper methods for more refactoring
private static List<T> LoadFirebaseData<T>(FireSharp.FirebaseClient client, string path) where T : class private static List<T> LoadFirebaseData<T>(FireSharp.FirebaseClient client, string path) where T : class
{ {
@ -70,7 +90,7 @@ namespace SongCrawler
} }
catch catch
{ {
return convertToList(client.Get(path).Body); return convertToList<T>(client.Get(path).Body);
} }
} }
@ -160,60 +180,59 @@ namespace SongCrawler
static void Main(string[] args) static void Main(string[] args)
{ {
InitializeFromArgs(args);
if (args.Count() == 3) if (args.Count() == 3)
{ {
DeleteSongs(args); DeleteSongs();
} }
else else
{ {
CrawlSongs(args); CrawlSongs();
} }
} }
private static void CrawlSongs(string[] args) private static void CrawlSongs()
{ {
//string [] test = { "mbrucedogs", "z://" }; //string [] test = { "mbrucedogs", "z://" };
//args = test; //args = test;
var debug = false; var debug = false;
ValidateArgs(args, 2, "usage: songcrawler partyid songspath"); ValidateArgs(Args, 2, "usage: songcrawler partyid songspath");
if (args.Length != 2) return; if (Args.Length != 2) return;
string controller = args[0]; string songsPath = GetControllerPath(Controller, "songs");
string songpath = args[1]; string favoritesPath = GetControllerPath(Controller, "favorites");
FireSharp.FirebaseClient client = CreateFirebaseClient(); string disabledPath = GetControllerPath(Controller, "disabled");
string songsPath = GetControllerPath(controller, "songs");
string favoritesPath = GetControllerPath(controller, "favorites");
string disabledPath = GetControllerPath(controller, "disabled");
Console.WriteLine("Loading current library"); Console.WriteLine("Loading current library");
List<Song> songs = new List<Song>(); List<Song> songs = new List<Song>();
List<Song> disabled = LoadFirebaseData<Song>(client, disabledPath); List<Song> disabled = LoadFirebaseData<Song>(FirebaseClient, disabledPath);
List<Song> favorited = LoadFirebaseData<Song>(client, favoritesPath); List<Song> favorited = LoadFirebaseData<Song>(FirebaseClient, favoritesPath);
client.Set(songsPath, songs); FirebaseClient.Set(songsPath, songs);
List<string> files = GetAllMusicFiles(songpath); List<string> files = GetAllMusicFiles(SongsFolderPath);
ProcessFilesToSongs(files, songs, debug: debug, debugLimit: 1000); ProcessFilesToSongs(files, songs, debug: debug, debugLimit: 1000);
//sync all favorite, history, disabled //sync all favorite, history, disabled
SyncSongProperties(songs, favorited, song => song.Favorite = true); SyncSongProperties(songs, favorited, song => song.Favorite = true);
SyncSongProperties(songs, disabled, song => song.Disabled = true); SyncSongProperties(songs, disabled, song => song.Disabled = true);
client.Set(songsPath, songs); FirebaseClient.Set(songsPath, songs);
//string test = string.Format("controllers/{0}/testsongs", controller); //string test = string.Format("controllers/{0}/testsongs", Controller);
//Dictionary<string, Song> testSongs = new Dictionary<string, Song>(); //Dictionary<string, Song> testSongs = new Dictionary<string, Song>();
//foreach (Song s in songs) //foreach (Song s in songs)
//{ //{
// testSongs[s.Guid] = s; // testSongs[s.Guid] = s;
//} //}
//client.Set(test, testSongs); //FirebaseClient.Set(test, testSongs);
var created = songs.Select(s => new CreatedSong(File.GetCreationTime(s.Path), s)).ToList(); var created = songs.Select(s => new CreatedSong(File.GetCreationTime(s.Path), s)).ToList();
var first200 = created.Where(s => s.created != null).OrderByDescending(s => s.created).Take(200); var first200 = created.Where(s => s.created != null).OrderByDescending(s => s.created).Take(200);
var added = first200.Select(s => new PathOnly(path: s.song.Path)).ToList(); var added = first200.Select(s => new PathOnly(path: s.song.Path)).ToList();
string newSongs = GetControllerPath(controller, "newSongs"); string newSongs = GetControllerPath(Controller, "newSongs");
client.Set(newSongs, added); FirebaseClient.Set(newSongs, added);
} }
private class PathOnly private class PathOnly
@ -226,41 +245,38 @@ namespace SongCrawler
} }
} }
private static List<Song> convertToList(dynamic json) private static List<T> convertToList<T>(dynamic json) where T : class
{ {
dynamic data = JsonConvert.DeserializeObject<dynamic>(json); dynamic data = JsonConvert.DeserializeObject<dynamic>(json);
var list = new List<Song>(); var list = new List<T>();
foreach (var itemDynamic in data) foreach (var itemDynamic in data)
{ {
var fjson = itemDynamic.Value.ToString(); var fjson = itemDynamic.Value.ToString();
var f = JsonConvert.DeserializeObject<Song>(fjson); var f = JsonConvert.DeserializeObject<T>(fjson);
list.Add(f); list.Add(f);
} }
return list; return list;
} }
private static void DeleteSongs(string[] args) private static void DeleteSongs()
{ {
ValidateArgs(args, 3, "usage: songcrawler partyid songspath delete"); ValidateArgs(Args, 3, "usage: songcrawler partyid songspath delete");
if (args.Length != 3) return; if (Args.Length != 3) return;
string controller = args[0]; string firepath = GetControllerPath(Controller, "songs");
string songpath = args[1];
FireSharp.FirebaseClient client = CreateFirebaseClient();
string firepath = GetControllerPath(controller, "songs");
Console.WriteLine("Deleting Songs ..."); Console.WriteLine("Deleting Songs ...");
List<Song> songs = new List<Song>(); List<Song> songs = new List<Song>();
client.Set(firepath, songs); FirebaseClient.Set(firepath, songs);
} }
private static void fixNewSongs(FireSharp.FirebaseClient client, String controller) private static void fixNewSongs()
{ {
string songsPath = GetControllerPath(controller, "songs"); string songsPath = GetControllerPath(Controller, "songs");
string newSongsPath = GetControllerPath(controller, "newSongs"); string newSongsPath = GetControllerPath(Controller, "newSongs");
List<Song> songs = client.Get(songsPath).ResultAs<List<Song>>(); List<Song> songs = FirebaseClient.Get(songsPath).ResultAs<List<Song>>();
List<Song> newSongs = client.Get(newSongsPath).ResultAs<List<Song>>(); List<Song> newSongs = FirebaseClient.Get(newSongsPath).ResultAs<List<Song>>();
List<Song> updated = new List<Song>(); List<Song> updated = new List<Song>();
foreach (Song n in newSongs){ foreach (Song n in newSongs){
@ -270,20 +286,20 @@ namespace SongCrawler
updated.Add(found); updated.Add(found);
} }
} }
client.Set(newSongsPath, updated); FirebaseClient.Set(newSongsPath, updated);
} }
private static void fixHistory(FireSharp.FirebaseClient client, String controller) private static void fixHistory()
{ {
string historyPath = GetControllerPath(controller, "history"); string historyPath = GetControllerPath(Controller, "history");
List<History> history = null; List<History> history = null;
try try
{ {
history = client.Get(historyPath).ResultAs<List<History>>(); history = FirebaseClient.Get(historyPath).ResultAs<List<History>>();
} }
catch catch
{ {
dynamic data = JsonConvert.DeserializeObject<dynamic>(client.Get(historyPath).Body); dynamic data = JsonConvert.DeserializeObject<dynamic>(FirebaseClient.Get(historyPath).Body);
history = new List<History>(); history = new List<History>();
foreach (var itemDynamic in data) foreach (var itemDynamic in data)
{ {
@ -292,7 +308,7 @@ namespace SongCrawler
history.Add(f); history.Add(f);
} }
} }
client.Set(historyPath, history); FirebaseClient.Set(historyPath, history);
} }
public class CreatedSong public class CreatedSong
{ {
@ -306,23 +322,20 @@ namespace SongCrawler
} }
private static void CrawlNoDupeSongs(string[] args) private static void CrawlNoDupeSongs()
{ {
ValidateArgs(args, 2, "usage: songcrawler partyid songspath"); ValidateArgs(Args, 2, "usage: songcrawler partyid songspath");
if (args.Length != 2) return; if (Args.Length != 2) return;
string controller = args[0]; string firepath = GetControllerPath(Controller, "songs");
string songpath = args[1];
FireSharp.FirebaseClient client = CreateFirebaseClient();
string firepath = GetControllerPath(controller, "songs");
Console.WriteLine("Loading current library"); Console.WriteLine("Loading current library");
List<Song> songs = new List<Song>(); List<Song> songs = new List<Song>();
List<string> files = GetAllMusicFiles(songpath); List<string> files = GetAllMusicFiles(SongsFolderPath);
ProcessFilesToSongs(files, songs, checkDuplicates: true); ProcessFilesToSongs(files, songs, checkDuplicates: true);
Console.WriteLine(string.Format("{0:000000}/{1} unique songs", songs.Count(), files.Count())); Console.WriteLine(string.Format("{0:000000}/{1} unique songs", songs.Count(), files.Count()));
client.Set(firepath, songs); FirebaseClient.Set(firepath, songs);
} }
private static void FindDuplicates(string[] args) private static void FindDuplicates(string[] args)
@ -337,16 +350,14 @@ namespace SongCrawler
var dupes = FindDuplicateSongs(songs); var dupes = FindDuplicateSongs(songs);
File.WriteAllText(@"D:\dupliates.json", JsonConvert.SerializeObject(dupes.OrderBy(o => o.Key))); File.WriteAllText(@"D:\dupliates.json", JsonConvert.SerializeObject(dupes.OrderBy(o => o.Key)));
} }
private static void DisableDuplicates(string[] args) private static void DisableDuplicates()
{ {
ValidateArgs(args, 1, "usage: songcrawler partyid songspath"); ValidateArgs(Args, 1, "usage: songcrawler partyid songspath");
if (args.Length != 1) return; if (Args.Length != 1) return;
string controller = args[0]; string firepath = GetControllerPath(Controller, "songs");
FireSharp.FirebaseClient client = CreateFirebaseClient();
string firepath = GetControllerPath(controller, "songs");
Console.WriteLine("Loading current library"); Console.WriteLine("Loading current library");
List<Song> songs = client.Get(firepath).ResultAs<List<Song>>(); List<Song> songs = FirebaseClient.Get(firepath).ResultAs<List<Song>>();
var dupes = FindDuplicateSongs(songs, song => !song.Disabled && song.Path.Contains(".mp4")); var dupes = FindDuplicateSongs(songs, song => !song.Disabled && song.Path.Contains(".mp4"));
@ -358,7 +369,7 @@ namespace SongCrawler
duplicateGroup[i].Disabled = true; duplicateGroup[i].Disabled = true;
} }
} }
client.Set(firepath, songs); FirebaseClient.Set(firepath, songs);
} }
private static Song MakeSong(string filepath) private static Song MakeSong(string filepath)