From 4e3968f4b122558e95df66daad972a554947445e Mon Sep 17 00:00:00 2001 From: glax Date: Sun, 21 Sep 2025 16:27:43 +0200 Subject: [PATCH] Add RefreshLibrariesWorker.cs --- API/TrangaSettings.cs | 17 +++++++++++ ...DownloadChapterFromMangaconnectorWorker.cs | 22 ++++++++++---- .../StartNewChapterDownloadsWorker.cs | 10 ++++--- API/Workers/RefreshLibrariesWorker.cs | 29 +++++++++++++++++++ Tranga.sln.DotSettings | 4 ++- 5 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 API/Workers/RefreshLibrariesWorker.cs diff --git a/API/TrangaSettings.cs b/API/TrangaSettings.cs index bcbbe44..81656f1 100644 --- a/API/TrangaSettings.cs +++ b/API/TrangaSettings.cs @@ -1,5 +1,6 @@ using System.Runtime.InteropServices; using API.MangaDownloadClients; +using API.Workers; using Newtonsoft.Json; namespace API; @@ -54,6 +55,10 @@ public struct TrangaSettings() public int MaxConcurrentWorkers { get; set; } = Math.Max(Environment.ProcessorCount, 4); // Minimum of 4 Tasks, maximum of 1 per Core + public LibraryRefreshSetting LibraryRefreshSetting { get; set; } = LibraryRefreshSetting.AfterMangaFinished; + + public int RefreshLibraryWhileDownloadingEveryMinutes { get; set; } = 10; + public static TrangaSettings Load() { if (!File.Exists(SettingsFilePath)) @@ -125,4 +130,16 @@ public struct TrangaSettings() this.MaxConcurrentWorkers = value; Save(); } + + public void SetLibraryRefreshSetting(LibraryRefreshSetting setting) + { + this.LibraryRefreshSetting = setting; + Save(); + } + + public void SetRefreshLibraryWhileDownloadingEveryMinutes(int value) + { + this.RefreshLibraryWhileDownloadingEveryMinutes = value; + Save(); + } } \ No newline at end of file diff --git a/API/Workers/MangaDownloadWorkers/DownloadChapterFromMangaconnectorWorker.cs b/API/Workers/MangaDownloadWorkers/DownloadChapterFromMangaconnectorWorker.cs index c03a6b5..2ab6ab2 100644 --- a/API/Workers/MangaDownloadWorkers/DownloadChapterFromMangaconnectorWorker.cs +++ b/API/Workers/MangaDownloadWorkers/DownloadChapterFromMangaconnectorWorker.cs @@ -3,6 +3,7 @@ using System.Runtime.InteropServices; using API.MangaConnectors; using API.MangaDownloadClients; using API.Schema.MangaContext; +using API.Workers.PeriodicWorkers; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using SixLabors.ImageSharp; @@ -21,16 +22,16 @@ namespace API.Workers.MangaDownloadWorkers; public class DownloadChapterFromMangaconnectorWorker(MangaConnectorId chId, IEnumerable? dependsOn = null) : BaseWorkerWithContext(dependsOn) { - internal readonly string MangaConnectorIdId = chId.Key; + private readonly string _mangaConnectorIdId = chId.Key; protected override async Task DoWorkInternal() { - Log.Debug($"Downloading chapter for MangaConnectorId {MangaConnectorIdId}..."); + Log.Debug($"Downloading chapter for MangaConnectorId {_mangaConnectorIdId}..."); // Getting MangaConnector info if (await DbContext.MangaConnectorToChapter .Include(id => id.Obj) .ThenInclude(c => c.ParentManga) .ThenInclude(m => m.Library) - .FirstOrDefaultAsync(c => c.Key == MangaConnectorIdId, CancellationToken) is not { } mangaConnectorId) + .FirstOrDefaultAsync(c => c.Key == _mangaConnectorIdId, CancellationToken) is not { } mangaConnectorId) { Log.Error("Could not get MangaConnectorId."); return []; //TODO Exception? @@ -137,8 +138,19 @@ public class DownloadChapterFromMangaconnectorWorker(MangaConnectorId c Log.Debug($"Downloaded chapter {chapter}."); - return []; + bool refreshLibrary = await CheckLibraryRefresh(); + + return refreshLibrary? [new RefreshLibrariesWorker()] : []; } + + private async Task CheckLibraryRefresh() => Tranga.Settings.LibraryRefreshSetting switch + { + LibraryRefreshSetting.AfterAllFinished => (await StartNewChapterDownloadsWorker.GetMissingChapters(DbContext, CancellationToken)).Count == 0, + LibraryRefreshSetting.AfterMangaFinished => await DbContext.MangaConnectorToChapter.Include(chId => chId.Obj).Where(chId => chId.UseForDownload).AllAsync(chId => chId.Obj.Downloaded, CancellationToken), + LibraryRefreshSetting.AfterEveryChapter => true, + LibraryRefreshSetting.WhileDownloading => DateTime.UtcNow.Subtract(RefreshLibrariesWorker.LastRefresh).TotalMinutes > Tranga.Settings.RefreshLibraryWhileDownloadingEveryMinutes, + _ => true + }; private void ProcessImage(string imagePath) { @@ -232,5 +244,5 @@ public class DownloadChapterFromMangaconnectorWorker(MangaConnectorId c return true; } - public override string ToString() => $"{base.ToString()} {MangaConnectorIdId}"; + public override string ToString() => $"{base.ToString()} {_mangaConnectorIdId}"; } \ No newline at end of file diff --git a/API/Workers/PeriodicWorkers/StartNewChapterDownloadsWorker.cs b/API/Workers/PeriodicWorkers/StartNewChapterDownloadsWorker.cs index 05d386a..3aef412 100644 --- a/API/Workers/PeriodicWorkers/StartNewChapterDownloadsWorker.cs +++ b/API/Workers/PeriodicWorkers/StartNewChapterDownloadsWorker.cs @@ -18,10 +18,7 @@ public class StartNewChapterDownloadsWorker(TimeSpan? interval = null, IEnumerab Log.Debug("Checking for missing chapters..."); // Get missing chapters - List> missingChapters = await DbContext.MangaConnectorToChapter - .Include(id => id.Obj) - .Where(id => id.Obj.Downloaded == false && id.UseForDownload) - .ToListAsync(CancellationToken); + List> missingChapters = await GetMissingChapters(DbContext, CancellationToken); Log.Debug($"Found {missingChapters.Count} missing downloads."); @@ -37,4 +34,9 @@ public class StartNewChapterDownloadsWorker(TimeSpan? interval = null, IEnumerab return newWorkers.ToArray(); } + + internal static async Task>> GetMissingChapters(MangaContext ctx, CancellationToken cancellationToken) => await ctx.MangaConnectorToChapter + .Include(id => id.Obj) + .Where(id => id.Obj.Downloaded == false && id.UseForDownload) + .ToListAsync(cancellationToken); } \ No newline at end of file diff --git a/API/Workers/RefreshLibrariesWorker.cs b/API/Workers/RefreshLibrariesWorker.cs new file mode 100644 index 0000000..1e67bc9 --- /dev/null +++ b/API/Workers/RefreshLibrariesWorker.cs @@ -0,0 +1,29 @@ +using API.Schema.LibraryContext; +using API.Schema.LibraryContext.LibraryConnectors; +using Microsoft.EntityFrameworkCore; + +namespace API.Workers; + +public class RefreshLibrariesWorker(IEnumerable? dependsOn = null) : BaseWorkerWithContext(dependsOn) +{ + public static DateTime LastRefresh { get; set; } = DateTime.UnixEpoch; + + protected override async Task DoWorkInternal() + { + Log.Debug("Refreshing libraries..."); + LastRefresh = DateTime.UtcNow; + List libraries = await DbContext.LibraryConnectors.ToListAsync(CancellationToken); + foreach (LibraryConnector connector in libraries) + await connector.UpdateLibrary(CancellationToken); + Log.Debug("Libraries Refreshed..."); + return []; + } +} + +public enum LibraryRefreshSetting : byte +{ + AfterAllFinished = 0, + AfterMangaFinished = 1, + AfterEveryChapter = 2, + WhileDownloading = 3 +} \ No newline at end of file diff --git a/Tranga.sln.DotSettings b/Tranga.sln.DotSettings index 718e87a..f95497a 100644 --- a/Tranga.sln.DotSettings +++ b/Tranga.sln.DotSettings @@ -8,6 +8,7 @@ True True True + True True True True @@ -15,4 +16,5 @@ True True True - True \ No newline at end of file + True + True \ No newline at end of file