diff --git a/API/Schema/Jobs/DownloadNewChaptersJob.cs b/API/Schema/Jobs/DownloadNewChaptersJob.cs index 6cc82b8..b00472e 100644 --- a/API/Schema/Jobs/DownloadNewChaptersJob.cs +++ b/API/Schema/Jobs/DownloadNewChaptersJob.cs @@ -12,11 +12,22 @@ public class DownloadNewChaptersJob(ulong recurrenceMs, string mangaId, string? protected override IEnumerable RunInternal(PgsqlContext context) { - Manga m = Manga ?? context.Manga.Find(MangaId)!; - MangaConnector connector = m.MangaConnector ?? context.MangaConnectors.Find(m.MangaConnectorId)!; - Chapter[] newChapters = connector.GetNewChapters(m); + /* + * For some reason, directly using Manga from above instead of finding it again causes DBContext to consider + * Manga as a new entity and Postgres throws a Duplicate PK exception. + * m.MangaConnector does not have this issue (IDK why). + */ + Manga m = context.Manga.Find(MangaId)!; + MangaConnector connector = context.MangaConnectors.Find(m.MangaConnectorId)!; + // This gets all chapters that are not downloaded + Chapter[] allNewChapters = connector.GetNewChapters(m); + + // This filters out chapters that are not downloaded but already exist in the DB + string[] chapterIds = context.Chapters.Where(chapter => chapter.ParentMangaId == m.MangaId).Select(chapter => chapter.ChapterId).ToArray(); + Chapter[] newChapters = allNewChapters.Where(chapter => !chapterIds.Contains(chapter.ChapterId)).ToArray(); context.Chapters.AddRangeAsync(newChapters).Wait(); context.SaveChangesAsync().Wait(); - return newChapters.Select(chapter => new DownloadSingleChapterJob(chapter.ChapterId, this.JobId)); + + return allNewChapters.Select(chapter => new DownloadSingleChapterJob(chapter.ChapterId, this.JobId)); } } \ No newline at end of file