diff --git a/API/Schema/MangaContext/Chapter.cs b/API/Schema/MangaContext/Chapter.cs index 87c4d8c..6a9e45f 100644 --- a/API/Schema/MangaContext/Chapter.cs +++ b/API/Schema/MangaContext/Chapter.cs @@ -66,14 +66,26 @@ public class Chapter : Identifiable, IComparable }; } + /// /// Checks the filesystem if an archive at the ArchiveFilePath exists /// + /// + /// /// True if archive exists on disk - public bool CheckDownloaded() + /// Unable to load Chapter, Parent or Library + public async Task CheckDownloaded(MangaContext context, CancellationToken? token = null) { + if(await context.Chapters + .Include(c => c.ParentManga) + .ThenInclude(p => p.Library) + .FirstOrDefaultAsync(c => c.Key == this.Key, token??CancellationToken.None) is not { } chapter) + throw new KeyNotFoundException("Unable to find chapter"); + //TODO Log here - return File.Exists(FullArchiveFilePath); + this.Downloaded = File.Exists(chapter.FullArchiveFilePath); + await context.Sync(token??CancellationToken.None); + return this.Downloaded; } /// Placeholders: diff --git a/API/Tranga.cs b/API/Tranga.cs index f1114c1..395d42b 100644 --- a/API/Tranga.cs +++ b/API/Tranga.cs @@ -148,7 +148,7 @@ public static class Tranga if (RunningWorkers.TryGetValue(worker, out Task? task)) { BaseWorker[] newWorkers = task.Result; - Log.Debug($"Resulted in {newWorkers.Length} new Workers."); + Log.Debug($"{worker} created {newWorkers.Length} new Workers."); AddWorkers(newWorkers); } RunningWorkers.Remove(worker, out _); diff --git a/API/Workers/MangaDownloadWorkers/DownloadChapterFromMangaconnectorWorker.cs b/API/Workers/MangaDownloadWorkers/DownloadChapterFromMangaconnectorWorker.cs index 09460a9..767a1c4 100644 --- a/API/Workers/MangaDownloadWorkers/DownloadChapterFromMangaconnectorWorker.cs +++ b/API/Workers/MangaDownloadWorkers/DownloadChapterFromMangaconnectorWorker.cs @@ -35,6 +35,14 @@ public class DownloadChapterFromMangaconnectorWorker(MangaConnectorId c Log.Error("Could not get MangaConnectorId."); return []; //TODO Exception? } + + // Check if Chapter already exists... + if (await mangaConnectorId.Obj.CheckDownloaded(DbContext, CancellationToken)) + { + Log.Warn("Chapter already exists!"); + return []; + } + if (!Tranga.TryGetMangaConnector(mangaConnectorId.MangaConnectorName, out MangaConnector? mangaConnector)) { Log.Error("Could not get MangaConnector."); diff --git a/API/Workers/PeriodicWorkers/UpdateChaptersDownloadedWorker.cs b/API/Workers/PeriodicWorkers/UpdateChaptersDownloadedWorker.cs index 54e446a..97e3fe5 100644 --- a/API/Workers/PeriodicWorkers/UpdateChaptersDownloadedWorker.cs +++ b/API/Workers/PeriodicWorkers/UpdateChaptersDownloadedWorker.cs @@ -14,9 +14,19 @@ public class UpdateChaptersDownloadedWorker(TimeSpan? interval = null, IEnumerab protected override async Task DoWorkInternal() { Log.Debug("Checking chapter files..."); - List chapters = await DbContext.Chapters.Include(c => c.ParentManga).ToListAsync(CancellationToken); + List chapters = await DbContext.Chapters.ToListAsync(CancellationToken); Log.Debug($"Checking {chapters.Count} chapters..."); - chapters.ForEach(chapter => DbContext.Entry(chapter).Property(c => c.Downloaded).CurrentValue = chapter.CheckDownloaded()); + chapters.ForEach(async void (chapter) => + { + try + { + chapter.Downloaded = await chapter.CheckDownloaded(DbContext, CancellationToken); + } + catch (Exception exception) + { + Log.Error(exception); + } + }); if(await DbContext.Sync(CancellationToken) is { success: false } e) Log.Error($"Failed to save database changes: {e.exceptionMessage}");