public void AssetManagement() { if (AvailableBibles.Count == 0) { Console.WriteLine("This program requires at least one bible to be installed. Please Install at least once"); } else { Console.WriteLine("Displaying Installed bibles: "); DisplayAvailableBibles(); } Console.WriteLine("\n1. Add a Bible\n2. Remove a Bible\n3. Remove All Bibles and Data\nPress any other key to go back to main menu\nEnter your choice : "); switch (Console.ReadLine()[0]) { case '1': Console.WriteLine("Fetching data from server. Please wait..."); BibleLink[] list = null; int files; try { list = DisplayDownloadable(); } catch (Exception e) { Console.WriteLine(e.Message); } if (list == null || list.Length == 0) { Console.WriteLine("Could not connect to the server... "); } else { Console.WriteLine("Enter the ID(s) of the bible to download (Multiple IDs are to be separted by space"); files = 0; object lockobject = new object(); foreach (string Id in Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries)) { if (int.TryParse(Id, out int x) && x >= 1 && x <= list.Length) { BibleLink link = list[--x]; if (AvailableBibles.Contains(link)) { Console.WriteLine($"File {AssetFileName(link)} already exists"); } else { Console.WriteLine($"Downloading file: {AssetFileName(link)}"); ConsoleProgressBar progressBar = new ConsoleProgressBar((byte)(Console.WindowWidth / 2)); try { Bible downloadedbible = Bible.ExtractBible(link.DownloadStreamAsync(OnDownloadProgress, OnDownloadComplete).Result); SaveFileAsJson(downloadedbible, AssetFileName(downloadedbible)); files++; AvailableBibles.Add(link); Console.WriteLine("\nFile is saved successfully"); } catch (Exception e) { Debug.WriteLine(e.Message); Console.WriteLine("\n\nUnexpected Error"); } void OnDownloadProgress(object o, DownloadProgressChangedEventArgs e) { lock (lockobject) { progressBar.Percentage = (byte)e.ProgressPercentage; progressBar.Write(); } } void OnDownloadComplete(object o, DownloadDataCompletedEventArgs e) { lock (lockobject) { progressBar.Percentage = 100; progressBar.Write(); } Console.WriteLine("\nFile Download Complete."); } } } else { Console.WriteLine($"Ignoring Invalid input {Id}"); } } Console.WriteLine($"Downloaded {files} file(s) Successfully"); } break; case '2': Console.WriteLine("Enter the ID(s) of the bible to remove (Multiple IDs are to be separted by space"); files = 0; foreach (string Id in Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries)) { if (int.TryParse(Id, out int x) && x >= 1 && x <= AvailableBibles.Count) { BibleLink link = AvailableBibles[--x]; try { File.Delete(AssetFilePath(AssetFileName(link))); files++; Console.WriteLine($"Removed {AssetFileName(link)}"); _ = AvailableBibles.Remove(link); } catch (Exception e) { Console.WriteLine(e.Message); } } else { Console.WriteLine($"Ignoring Invalid input {Id}"); } } Console.WriteLine($"Removed {files} file(s) Successfully"); break; case '3': Console.WriteLine("This will delete all the content of this tool. Are you sure (y/n)?"); char confirm = Console.ReadLine()[0]; if (confirm == 'Y' || confirm == 'y') { DeleteAllAssets(); Console.WriteLine("All assets removed"); ExitPressed = true; } else { Console.WriteLine("Delete process skipped."); } break; default: Console.WriteLine("Returning to main menu"); break; } if (!ExitPressed) { SaveAssetLog(); } void DisplayAvailableBibles() { int choice = 1; ConsoleTable table = new ConsoleTable("ID", "Title", "Language", "Version", "Location"); foreach (BibleLink link in AvailableBibles) { _ = table.AddRow(choice++, link.Title, link.Language, link.AionianEdition ? "Aionian" : "Standard", AssetFilePath(AssetFileName(link))); } table.Write(); } BibleLink[] DisplayDownloadable() { (BibleLink Link, ulong SizeInBytes)[] results = BibleLink.GetAllUrlsFromWebsite(); ConsoleTable table = new ConsoleTable("ID", "Title", "Language", "Size", "|", "ID", "Title", "Language", "Size"); for (int i = 0; i < results.Length; i += 2) { BibleLink link = results[i].Link; BibleLink lin2 = results[i + 1].Link; Debug.WriteLine($"link={AssetFileName(link)}; lin2={AssetFileName(lin2)};\n{link.Equals(lin2)} : {link.CompareTo(lin2)}\n\n"); _ = table.AddRow(i + 1, link.Title, link.Language, $"{results[i].SizeInBytes / 1048576.0f:0.000} MB", "|", i + 2, lin2.Title, lin2.Language, $"{results[i + 1].SizeInBytes / 1048576.0f:0.000} MB"); } table.Options.EnableCount = false; table.Write(); List <BibleLink> links = new List <BibleLink>(); foreach ((BibleLink Link, ulong SizeInBytes) in results) { links.Add(Link); } return(links.ToArray()); }