diff --git a/Tranga-API/Program.cs b/Tranga-API/Program.cs index a044dd2..5681423 100644 --- a/Tranga-API/Program.cs +++ b/Tranga-API/Program.cs @@ -1,19 +1,21 @@ -using System.Text.Json; -using Tranga; + using Logging; +using Tranga; string applicationFolderPath = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Tranga-API"); string logsFolderPath = Path.Join(applicationFolderPath, "logs"); string logFilePath = Path.Join(logsFolderPath, $"log-{DateTime.Now:dd-M-yyyy-HH-mm-ss}.txt"); string settingsFilePath = Path.Join(applicationFolderPath, "data.json"); +Directory.CreateDirectory(applicationFolderPath); +Directory.CreateDirectory(logsFolderPath); + Console.WriteLine($"Logfile-Path: {logFilePath}"); Console.WriteLine($"Settings-File-Path: {settingsFilePath}"); Logger logger = new(new[] { Logger.LoggerType.FileLogger }, null, null, logFilePath); - -logger.WriteLine("Tranga_API", "Loading Taskmanager."); - + +logger.WriteLine("Tranga_CLI", "Loading Taskmanager."); TaskManager.SettingsData settings; if (File.Exists(settingsFilePath)) settings = TaskManager.LoadData(settingsFilePath); @@ -23,162 +25,98 @@ else TaskManager taskManager = new (settings, logger); var builder = WebApplication.CreateBuilder(args); +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); +builder.Services.AddControllers().AddNewtonsoftJson(); var app = builder.Build(); +app.UseSwagger(); +app.UseSwaggerUI(); +app.UseSwagger(); +app.UseSwaggerUI(); -app.MapGet("/GetConnectors", () => JsonSerializer.Serialize(taskManager.GetAvailableConnectors().Values.ToArray())); +app.MapGet("/GetAvailableControllers", () => taskManager.GetAvailableConnectors()); -app.MapGet("/GetPublications", (string connectorName, string? publicationName) => +app.MapGet("/GetKnownPublications", () => taskManager.GetAllPublications()); + +app.MapGet("/GetPublicationsFromConnector", (string connectorName, string title) => { - Connector connector = taskManager.GetConnector(connectorName); - - Publication[] publications; - if (publicationName is not null) - publications = connector.GetPublications(publicationName); - else - publications = connector.GetPublications(); - - return JsonSerializer.Serialize(publications); + Connector? connector = taskManager.GetAvailableConnectors().FirstOrDefault(con => con.Key == connectorName).Value; + if (connector is null) + return Array.Empty(); + if(title.Length < 4) + return Array.Empty(); + return taskManager.GetPublicationsFromConnector(connector, title); }); -app.MapGet("/ListTasks", () => JsonSerializer.Serialize(taskManager.GetAllTasks())); +app.MapGet("/Tasks/GetTaskTypes", () => Enum.GetNames(typeof(TrangaTask.Task))); -app.MapGet("/TaskTypes", () => + +app.MapPost("/Tasks/Create", (string taskType, string? connectorName, string? publicationId, string reoccurrenceTime, string? language) => { - string[] availableTasks = Enum.GetNames(typeof(TrangaTask.Task)); - return JsonSerializer.Serialize(availableTasks); + Publication? publication = taskManager.GetAllPublications().FirstOrDefault(pub => pub.internalId == publicationId); + TrangaTask.Task task = Enum.Parse(taskType); + taskManager.AddTask(task, connectorName, publication, TimeSpan.Parse(reoccurrenceTime), language??""); }); -app.MapGet("/CreateTask", - (TrangaTask.Task task, string? connectorName, string? publicationInternalId, TimeSpan reoccurrence, string? language) => - { - switch (task) - { - case TrangaTask.Task.UpdateKomgaLibrary: - taskManager.AddTask(TrangaTask.Task.UpdateKomgaLibrary, null, null, reoccurrence); - break; - case TrangaTask.Task.DownloadNewChapters: - try - { - Publication? publication = taskManager.GetAllPublications() - .FirstOrDefault(pub => pub.internalId == publicationInternalId); - - if (publication is null) - { - return JsonSerializer.Serialize($"Publication {publicationInternalId} is unknown."); - } - else - { - taskManager.AddTask(TrangaTask.Task.DownloadNewChapters, connectorName, publication, reoccurrence, language ?? ""); - return JsonSerializer.Serialize("Success"); - } - } - catch (Exception e) - { - return JsonSerializer.Serialize(e.Message); - } - - default: return JsonSerializer.Serialize("Not Implemented"); - } - - return JsonSerializer.Serialize("Not Implemented"); - }); - -app.MapGet("/RemoveTask", (TrangaTask.Task task, string? connectorName, string? publicationInternalId) => +app.MapPost("/Tasks/Delete", (string taskType, string? connectorName, string? publicationId) => { - switch (task) - { - case TrangaTask.Task.UpdateKomgaLibrary: - taskManager.DeleteTask(TrangaTask.Task.UpdateKomgaLibrary, null, null); - return JsonSerializer.Serialize("Success"); - case TrangaTask.Task.DownloadNewChapters: - Publication? publication = taskManager.GetAllPublications().FirstOrDefault(pub => pub.internalId == publicationInternalId); - if (publication is null) - JsonSerializer.Serialize($"Publication with id {publicationInternalId} is unknown."); - - taskManager.DeleteTask(TrangaTask.Task.DownloadNewChapters, connectorName, publication); - - return JsonSerializer.Serialize("Success"); - - default: return JsonSerializer.Serialize("Not Implemented"); - } + Publication? publication = taskManager.GetAllPublications().FirstOrDefault(pub => pub.internalId == publicationId); + TrangaTask.Task task = Enum.Parse(taskType); + taskManager.DeleteTask(task, connectorName, publication); }); -app.MapGet("/StartTask", (TrangaTask.Task task, string? connectorName, string? publicationInternalId) => +app.MapGet("/Tasks/GetList", () => taskManager.GetAllTasks()); + +app.MapPost("/Tasks/Start", (string taskType, string? connectorName, string? publicationId) => { - TrangaTask[] allTasks = taskManager.GetAllTasks(); - TrangaTask? taskToStart = allTasks.FirstOrDefault(tTask => - tTask.task == task && tTask.connectorName == connectorName && - tTask.publication?.internalId == publicationInternalId); - if(taskToStart is null) - JsonSerializer.Serialize($"Task with parameters {task} {connectorName} {publicationInternalId} is unknown."); - taskManager.ExecuteTaskNow(taskToStart!); - return JsonSerializer.Serialize("Success"); + TrangaTask.Task pTask = Enum.Parse(taskType); + TrangaTask? task = taskManager.GetAllTasks().FirstOrDefault(tTask => + tTask.task == pTask && tTask.publication?.internalId == publicationId && tTask.connectorName == connectorName); + if (task is null) + return; + taskManager.ExecuteTaskNow(task); }); -app.MapGet("/TaskQueue", () => +app.MapGet("/Tasks/GetRunningTasks", + () => taskManager.GetAllTasks().Where(task => task.state is TrangaTask.ExecutionState.Running)); + +app.MapGet("/Queue/GetList", + () => taskManager.GetAllTasks().Where(task => task.state is TrangaTask.ExecutionState.Enqueued)); + +app.MapPost("/Queue/Enqueue", (string taskType, string? connectorName, string? publicationId) => { - return JsonSerializer.Serialize(taskManager.GetAllTasks() - .Where(task => task.state is TrangaTask.ExecutionState.Enqueued or TrangaTask.ExecutionState.Running) - .ToArray()); + TrangaTask.Task pTask = Enum.Parse(taskType); + TrangaTask? task = taskManager.GetAllTasks().FirstOrDefault(tTask => + tTask.task == pTask && tTask.publication?.internalId == publicationId && tTask.connectorName == connectorName); + if (task is null) + return; + taskManager.AddTaskToQueue(task); }); -app.MapGet("/TaskEnqueue", (TrangaTask.Task task, string? connectorName, string? publicationInternalId) => +app.MapPost("/Queue/Dequeue", (string taskType, string? connectorName, string? publicationId) => { - TrangaTask[] allTasks = taskManager.GetAllTasks(); - TrangaTask? taskToEnqueue = allTasks.FirstOrDefault(tTask => - tTask.task == task && tTask.connectorName == connectorName && - tTask.publication?.internalId == publicationInternalId); - if(taskToEnqueue is null) - JsonSerializer.Serialize($"Task with parameters {task} {connectorName} {publicationInternalId} is unknown."); - taskManager.AddTaskToQueue(taskToEnqueue!); - return JsonSerializer.Serialize("Success"); + TrangaTask.Task pTask = Enum.Parse(taskType); + TrangaTask? task = taskManager.GetAllTasks().FirstOrDefault(tTask => + tTask.task == pTask && tTask.publication?.internalId == publicationId && tTask.connectorName == connectorName); + if (task is null) + return; + taskManager.RemoveTaskFromQueue(task); }); -app.MapGet("/TaskDequeue", (TrangaTask.Task task, string? connectorName, string? publicationInternalId) => -{ - TrangaTask[] allTasks = taskManager.GetAllTasks(); - TrangaTask? taskToDequeue = allTasks.FirstOrDefault(tTask => - tTask.task == task && tTask.connectorName == connectorName && - tTask.publication?.internalId == publicationInternalId); - if(taskToDequeue is null) - JsonSerializer.Serialize($"Task with parameters {task} {connectorName} {publicationInternalId} is unknown."); - taskManager.RemoveTaskFromQueue(taskToDequeue); - return JsonSerializer.Serialize("Success"); -}); +app.MapGet("/Settings/Get", () => new Settings(taskManager.settings)); -app.MapGet("/Settings", () => JsonSerializer.Serialize(new Settings(taskManager.settings))); - -app.MapGet("/EditSettings", (string downloadLocation, string komgaBaseUrl, string komgaAuthString) => -{ - taskManager.settings.downloadLocation = downloadLocation; - taskManager.settings.komga = new Komga(komgaBaseUrl, komgaAuthString, logger); -}); +app.MapPost("/Settings/Update", (string? downloadLocation, string? komgaUrl, string? komgaAuth) => taskManager.UpdateSettings(downloadLocation, komgaUrl, komgaAuth) ); app.Run(); -struct Settings +class Settings { - public Komga? komga { get; set; } - public string downloadLocation { get; set; } - public string settingsFilePath { get; set; } - public Settings(TaskManager.SettingsData data) - { - this.settingsFilePath = data.settingsFilePath; - this.downloadLocation = data.downloadLocation; - this.komga = data.komga; - } + public string downloadLocation { get; } + public Komga? komga { get; } - public Settings(string downloadLocation, string settingsFilePath, Komga komga) + public Settings(TaskManager.SettingsData settings) { - this.downloadLocation = downloadLocation; - this.settingsFilePath = settingsFilePath; - this.komga = komga; - } - - public void Update(string? newDownloadLocation = null, string? newSettingsFilePath = null, Komga? newKomga= null) - { - this.downloadLocation = newDownloadLocation ?? this.downloadLocation; - this.settingsFilePath = newSettingsFilePath ?? this.settingsFilePath; - this.komga = newKomga ?? this.komga; + this.downloadLocation = settings.downloadLocation; + this.komga = settings.komga; } } \ No newline at end of file diff --git a/Tranga-API/Properties/launchSettings.json b/Tranga-API/Properties/launchSettings.json index 773e2c3..fd6862f 100644 --- a/Tranga-API/Properties/launchSettings.json +++ b/Tranga-API/Properties/launchSettings.json @@ -3,8 +3,8 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:14826", - "sslPort": 44333 + "applicationUrl": "http://localhost:1716", + "sslPort": 44391 } }, "profiles": { @@ -12,7 +12,7 @@ "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, - "applicationUrl": "http://localhost:5119", + "applicationUrl": "http://localhost:5177", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } @@ -21,7 +21,7 @@ "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, - "applicationUrl": "https://localhost:7070;http://localhost:5119", + "applicationUrl": "https://localhost:7036;http://localhost:5177", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/Tranga-API/Tranga-API.csproj b/Tranga-API/Tranga-API.csproj index ade20c4..376581d 100644 --- a/Tranga-API/Tranga-API.csproj +++ b/Tranga-API/Tranga-API.csproj @@ -15,7 +15,14 @@ + + + + + + + diff --git a/Tranga-API/tasks.json b/Tranga-API/tasks.json deleted file mode 100644 index 8cbf4a7..0000000 --- a/Tranga-API/tasks.json +++ /dev/null @@ -1 +0,0 @@ -[{"reoccurrence":"00:00:00","lastExecuted":"2023-05-19T17:34:40.5349215+02:00","connectorName":"MangaDex","task":0,"publication":{"sortName":null,"description":null,"tags":null,"posterUrl":null,"year":null,"originalLanguage":null,"status":null,"folderName":null,"downloadUrl":null},"language":"en"}] \ No newline at end of file diff --git a/Tranga-CLI/Tranga_Cli.cs b/Tranga-CLI/Tranga_Cli.cs index 3f7e48e..72169e5 100644 --- a/Tranga-CLI/Tranga_Cli.cs +++ b/Tranga-CLI/Tranga_Cli.cs @@ -41,7 +41,7 @@ public static class Tranga_Cli while(tmpPath is null) tmpPath = Console.ReadLine(); if(tmpPath.Length > 0) - settings.downloadLocation = tmpPath; + settings.UpdateSettings(pDownloadLocation: tmpPath, null); Console.WriteLine($"Komga BaseURL [{settings.komga?.baseUrl}]:"); string? tmpUrl = Console.ReadLine(); @@ -73,8 +73,8 @@ public static class Tranga_Cli tmpPass += keyInfo.KeyChar; } } while (key != ConsoleKey.Enter); - - settings.komga = new Komga(tmpUrl, tmpUser, tmpPass, logger); + + settings.UpdateSettings(null, new Komga(tmpUrl, tmpUser, tmpPass, logger)); } logger.WriteLine("Tranga_CLI", "Loaded."); diff --git a/Tranga.sln b/Tranga.sln index f11d582..7bf8e4f 100644 --- a/Tranga.sln +++ b/Tranga.sln @@ -4,10 +4,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tranga", ".\Tranga\Tranga.c EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tranga-CLI", "Tranga-CLI\Tranga-CLI.csproj", "{4899E3B2-B259-479A-B43E-042D043E9501}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tranga-API", "Tranga-API\Tranga-API.csproj", "{6284C936-4E90-486B-BC46-0AFAD85AD8EE}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Logging", "Logging\Logging.csproj", "{415BE889-BB7D-426F-976F-8D977876A462}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tranga-API", "Tranga-API\Tranga-API.csproj", "{48F4E495-75BC-4402-8E03-DEC5B79D7E83}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -22,13 +22,13 @@ Global {4899E3B2-B259-479A-B43E-042D043E9501}.Debug|Any CPU.Build.0 = Debug|Any CPU {4899E3B2-B259-479A-B43E-042D043E9501}.Release|Any CPU.ActiveCfg = Release|Any CPU {4899E3B2-B259-479A-B43E-042D043E9501}.Release|Any CPU.Build.0 = Release|Any CPU - {6284C936-4E90-486B-BC46-0AFAD85AD8EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6284C936-4E90-486B-BC46-0AFAD85AD8EE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6284C936-4E90-486B-BC46-0AFAD85AD8EE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6284C936-4E90-486B-BC46-0AFAD85AD8EE}.Release|Any CPU.Build.0 = Release|Any CPU {415BE889-BB7D-426F-976F-8D977876A462}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {415BE889-BB7D-426F-976F-8D977876A462}.Debug|Any CPU.Build.0 = Debug|Any CPU {415BE889-BB7D-426F-976F-8D977876A462}.Release|Any CPU.ActiveCfg = Release|Any CPU {415BE889-BB7D-426F-976F-8D977876A462}.Release|Any CPU.Build.0 = Release|Any CPU + {48F4E495-75BC-4402-8E03-DEC5B79D7E83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48F4E495-75BC-4402-8E03-DEC5B79D7E83}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48F4E495-75BC-4402-8E03-DEC5B79D7E83}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48F4E495-75BC-4402-8E03-DEC5B79D7E83}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/Tranga/Connectors/MangaDex.cs b/Tranga/Connectors/MangaDex.cs index 56dcbee..cfaa60a 100644 --- a/Tranga/Connectors/MangaDex.cs +++ b/Tranga/Connectors/MangaDex.cs @@ -58,14 +58,12 @@ public class MangaDex : Connector : null; JsonArray altTitlesObject = attributes["altTitles"]!.AsArray(); - string[,] altTitles = new string[altTitlesObject.Count, 2]; - int titleIndex = 0; + Dictionary altTitlesDict = new(); foreach (JsonNode? altTitleNode in altTitlesObject) { JsonObject altTitleObject = (JsonObject)altTitleNode!; string key = ((IDictionary)altTitleObject).Keys.ToArray()[0]; - altTitles[titleIndex, 0] = key; - altTitles[titleIndex++, 1] = altTitleObject[key]!.GetValue(); + altTitlesDict.TryAdd(key, altTitleObject[key]!.GetValue()); } JsonArray tagsObject = attributes["tags"]!.AsArray(); @@ -84,16 +82,14 @@ public class MangaDex : Connector poster = relationships.FirstOrDefault(relationship => relationship!["type"]!.GetValue() == "cover_art")!["id"]!.GetValue(); } + Dictionary linksDict = new(); string[,]? links = null; if (attributes.ContainsKey("links") && attributes["links"] is not null) { JsonObject linksObject = attributes["links"]!.AsObject(); - links = new string[linksObject.Count, 2]; - int linkIndex = 0; foreach (string key in ((IDictionary)linksObject).Keys) { - links[linkIndex, 0] = key; - links[linkIndex++, 1] = linksObject[key]!.GetValue(); + linksDict.Add(key, linksObject[key]!.GetValue()); } } @@ -110,14 +106,13 @@ public class MangaDex : Connector Publication pub = new Publication( title, description, - altTitles, + altTitlesDict, tags.ToArray(), poster, - links, + linksDict, year, originalLanguage, status, - manga["id"]!.GetValue(), manga["id"]!.GetValue() ); publications.Add(pub); //Add Publication (Manga) to result diff --git a/Tranga/Publication.cs b/Tranga/Publication.cs index b5c18a2..e3470a0 100644 --- a/Tranga/Publication.cs +++ b/Tranga/Publication.cs @@ -9,34 +9,38 @@ public readonly struct Publication { public string sortName { get; } // ReSharper disable UnusedAutoPropertyAccessor.Global we need it, trust - [JsonIgnore]public string[,] altTitles { get; } + [JsonIgnore]public Dictionary altTitles { get; } // ReSharper disable trice MemberCanBePrivate.Global, trust public string? description { get; } public string[] tags { get; } public string? posterUrl { get; } - [JsonIgnore]public string[,]? links { get; } + [JsonIgnore]public Dictionary links { get; } public int? year { get; } public string? originalLanguage { get; } public string status { get; } public string folderName { get; } public string downloadUrl { get; } - public string internalId { get; } - public Publication(string sortName, string? description, string[,] altTitles, string[] tags, string? posterUrl, string[,]? links, int? year, string? originalLanguage, string status, string downloadUrl, string internalId) + public readonly struct ValueTuple + { + + } + + public Publication(string sortName, string? description, Dictionary altTitles, string[] tags, string? posterUrl, Dictionary? links, int? year, string? originalLanguage, string status, string downloadUrl) { this.sortName = sortName; this.description = description; this.altTitles = altTitles; this.tags = tags; this.posterUrl = posterUrl; - this.links = links; + this.links = links ?? new Dictionary(); this.year = year; this.originalLanguage = originalLanguage; this.status = status; this.downloadUrl = downloadUrl; this.folderName = string.Concat(sortName.Split(Path.GetInvalidPathChars().Concat(Path.GetInvalidFileNameChars()).ToArray())); - this.internalId = internalId; + this.internalId = Guid.NewGuid().ToString(); } /// Serialized JSON String for series.json diff --git a/Tranga/TaskExecutor.cs b/Tranga/TaskExecutor.cs index aa8ca7a..8f2c0d0 100644 --- a/Tranga/TaskExecutor.cs +++ b/Tranga/TaskExecutor.cs @@ -17,7 +17,7 @@ public static class TaskExecutor /// Current chapterCollection to update /// /// Is thrown when there is no Connector available with the name of the TrangaTask.connectorName - public static void Execute(TaskManager taskManager, TrangaTask trangaTask, Dictionary> chapterCollection, Logger? logger) + public static void Execute(TaskManager taskManager, TrangaTask trangaTask, Logger? logger) { //Only execute task if it is not already being executed. if (trangaTask.state == TrangaTask.ExecutionState.Running) @@ -37,13 +37,13 @@ public static class TaskExecutor switch (trangaTask.task) { case TrangaTask.Task.DownloadNewChapters: - DownloadNewChapters(connector!, (Publication)trangaTask.publication!, trangaTask.language, chapterCollection); + DownloadNewChapters(connector!, (Publication)trangaTask.publication!, trangaTask.language, ref taskManager._chapterCollection); break; case TrangaTask.Task.UpdateChapters: - UpdateChapters(connector!, (Publication)trangaTask.publication!, trangaTask.language, chapterCollection); + UpdateChapters(connector!, (Publication)trangaTask.publication!, trangaTask.language, ref taskManager._chapterCollection); break; case TrangaTask.Task.UpdatePublications: - UpdatePublications(connector!, chapterCollection); + UpdatePublications(connector!, ref taskManager._chapterCollection); break; case TrangaTask.Task.UpdateKomgaLibrary: UpdateKomgaLibrary(taskManager); @@ -75,7 +75,7 @@ public static class TaskExecutor /// /// Connector to receive Publications from /// - private static void UpdatePublications(Connector connector, Dictionary> chapterCollection) + private static void UpdatePublications(Connector connector, ref Dictionary> chapterCollection) { Publication[] publications = connector.GetPublications(); foreach (Publication publication in publications) @@ -90,9 +90,9 @@ public static class TaskExecutor /// Publication to check /// Language to receive chapters for /// - private static void DownloadNewChapters(Connector connector, Publication publication, string language, Dictionary> chapterCollection) + private static void DownloadNewChapters(Connector connector, Publication publication, string language, ref Dictionary> chapterCollection) { - List newChapters = UpdateChapters(connector, publication, language, chapterCollection); + List newChapters = UpdateChapters(connector, publication, language, ref chapterCollection); connector.DownloadCover(publication); //Check if Publication already has a Folder and a series.json @@ -116,7 +116,7 @@ public static class TaskExecutor /// Language to receive chapters for /// /// List of Chapters that were previously not in collection - private static List UpdateChapters(Connector connector, Publication publication, string language, Dictionary> chapterCollection) + private static List UpdateChapters(Connector connector, Publication publication, string language, ref Dictionary> chapterCollection) { List newChaptersList = new(); chapterCollection.TryAdd(publication, newChaptersList); //To ensure publication is actually in collection diff --git a/Tranga/TaskManager.cs b/Tranga/TaskManager.cs index 23f577a..6419f8f 100644 --- a/Tranga/TaskManager.cs +++ b/Tranga/TaskManager.cs @@ -10,7 +10,7 @@ namespace Tranga; /// public class TaskManager { - private readonly Dictionary> _chapterCollection = new(); + public Dictionary> _chapterCollection = new(); private readonly HashSet _allTasks; private bool _continueRunning = true; private readonly Connector[] _connectors; @@ -43,6 +43,15 @@ public class TaskManager taskChecker.Start(); } + public void UpdateSettings(string? downloadLocation, string? komgaUrl, string? komgaAuth) + { + Komga? komga = null; + if (komgaUrl is not null && komgaAuth is not null) + komga = new Komga(komgaUrl, komgaAuth, null); + settings.UpdateSettings(downloadLocation, komga); + ExportData(); + } + public TaskManager(SettingsData settings, Logger? logger = null) { this.logger = logger; @@ -106,7 +115,7 @@ public class TaskManager logger?.WriteLine(this.GetType().ToString(), $"Forcing Execution: {task}"); Task t = new Task(() => { - TaskExecutor.Execute(this, task, this._chapterCollection, logger); + TaskExecutor.Execute(this, task, logger); }); t.Start(); } @@ -154,7 +163,7 @@ public class TaskManager trangaTask.publication?.downloadUrl == publication?.downloadUrl)) { if(task != TrangaTask.Task.UpdatePublications) - _chapterCollection.Add((Publication)publication!, new List()); + _chapterCollection.TryAdd((Publication)publication!, new List()); _allTasks.Add(newTask); } } @@ -227,6 +236,17 @@ public class TaskManager _allTasks.CopyTo(ret); return ret; } + + public Publication[] GetPublicationsFromConnector(Connector connector, string? title = null) + { + Publication[] ret = connector.GetPublications(title ?? ""); + foreach (Publication publication in ret) + { + if(!_chapterCollection.Any(pub => pub.Key.sortName == publication.sortName)) + this._chapterCollection.TryAdd(publication, new List()); + } + return ret; + } /// All added Publications public Publication[] GetAllPublications() @@ -290,16 +310,19 @@ public class TaskManager private void ExportData() { logger?.WriteLine(this.GetType().ToString(), $"Exporting data to {settings.settingsFilePath}"); + + string serializedData = JsonConvert.SerializeObject(settings); + File.WriteAllText(settings.settingsFilePath, serializedData); } public class SettingsData { - public string downloadLocation { get; set; } + public string downloadLocation { get; private set; } public string settingsFilePath { get; } - public Komga? komga { get; set; } + public Komga? komga { get; private set; } public HashSet allTasks { get; } public SettingsData(string downloadLocation, string? settingsFilePath, Komga? komga, HashSet allTasks) @@ -311,5 +334,13 @@ public class TaskManager this.komga = komga; this.allTasks = allTasks; } + + public void UpdateSettings(string? pDownloadLocation, Komga? pKomga) + { + if(pDownloadLocation is not null) + this.downloadLocation = pDownloadLocation; + if(pKomga is not null) + this.komga = pKomga; + } } } \ No newline at end of file