From f69152959189dfd4eb2b4a10568b485370f1efc6 Mon Sep 17 00:00:00 2001 From: Glax Date: Thu, 27 Mar 2025 19:35:49 +0100 Subject: [PATCH] "Global"-Connector https://github.com/C9Glax/tranga-website/issues/50 --- API/Program.cs | 3 +- API/Schema/MangaConnectors/Global.cs | 55 ++++++++++++++++++++++++++++ API/Schema/PgsqlContext.cs | 1 + 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 API/Schema/MangaConnectors/Global.cs diff --git a/API/Program.cs b/API/Program.cs index e1cd4ac..02fcb1b 100644 --- a/API/Program.cs +++ b/API/Program.cs @@ -117,7 +117,8 @@ using (var scope = app.Services.CreateScope()) new Mangaworld(), new ManhuaPlus(), new Weebcentral(), - new Manganato() + new Manganato(), + new Global(scope.ServiceProvider.GetService()!) ]; MangaConnector[] newConnectors = connectors.Where(c => !context.MangaConnectors.Contains(c)).ToArray(); context.MangaConnectors.AddRange(newConnectors); diff --git a/API/Schema/MangaConnectors/Global.cs b/API/Schema/MangaConnectors/Global.cs new file mode 100644 index 0000000..52a89f3 --- /dev/null +++ b/API/Schema/MangaConnectors/Global.cs @@ -0,0 +1,55 @@ +namespace API.Schema.MangaConnectors; + +public class Global : MangaConnector +{ + private PgsqlContext context { get; init; } + public Global(PgsqlContext context) : base("Global", ["all"], [""], "") + { + this.context = context; + } + + public override (Manga, List?, List?, List?, List?)[] GetManga(string publicationTitle = "") + { + //Get all enabled Connectors + MangaConnector[] enabledConnectors = context.MangaConnectors.Where(c => c.Enabled && c.Name != "Global").ToArray(); + + //Create Task for each MangaConnector to search simulatneously + Task<(Manga, List?, List?, List?, List?)[]>[] tasks = + enabledConnectors.Select(c => + new Task<(Manga, List?, List?, List?, List?)[]>(() => c.GetManga(publicationTitle))).ToArray(); + foreach (var task in tasks) + task.Start(); + + //Wait for all tasks to finish + do + { + Thread.Sleep(50); + }while(tasks.Any(t => t.Status < TaskStatus.RanToCompletion)); + + //Concatenate all results into one + (Manga, List?, List?, List?, List?)[] ret = + tasks.Select(t => t.IsCompletedSuccessfully ? t.Result : []).ToArray().SelectMany(i => i).ToArray(); + return ret; + } + + public override (Manga, List?, List?, List?, List?)? GetMangaFromUrl(string url) + { + MangaConnector? mc = context.MangaConnectors.ToArray().FirstOrDefault(c => c.ValidateUrl(url)); + return mc?.GetMangaFromUrl(url) ?? null; + } + + public override (Manga, List?, List?, List?, List?)? GetMangaFromId(string publicationId) + { + return null; + } + + public override Chapter[] GetChapters(Manga manga, string language = "en") + { + return manga.MangaConnector?.GetChapters(manga) ?? []; + } + + internal override string[] GetChapterImageUrls(Chapter chapter) + { + return chapter.ParentManga?.MangaConnector?.GetChapterImageUrls(chapter) ?? []; + } +} \ No newline at end of file diff --git a/API/Schema/PgsqlContext.cs b/API/Schema/PgsqlContext.cs index a5ec743..f3f7717 100644 --- a/API/Schema/PgsqlContext.cs +++ b/API/Schema/PgsqlContext.cs @@ -25,6 +25,7 @@ public class PgsqlContext(DbContextOptions options) : DbContext(op { modelBuilder.Entity() .HasDiscriminator(c => c.Name) + .HasValue("Global") .HasValue("AsuraToon") .HasValue("Bato") .HasValue("MangaHere")