From 2d32d740a40b87a876007b0fe46f32f2009471e6 Mon Sep 17 00:00:00 2001 From: Chris Kaczor Date: Sat, 22 Nov 2025 12:07:05 -0500 Subject: [PATCH] Improve Fever performance --- Application/Accounts/FeverReader.cs | 31 +++++++++++++++++++++++------ Application/FeedCenter.csproj | 2 +- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/Application/Accounts/FeverReader.cs b/Application/Accounts/FeverReader.cs index 64de34f..2f48c04 100644 --- a/Application/Accounts/FeverReader.cs +++ b/Application/Accounts/FeverReader.cs @@ -1,5 +1,6 @@ using ChrisKaczor.FeverClient; using System; +using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; @@ -8,6 +9,8 @@ using FeedCenter.Feeds; namespace FeedCenter.Accounts; +using FeverFeedItem = ChrisKaczor.FeverClient.Models.FeedItem; + internal class FeverReader(Account account) : IAccountReader { public async Task GetProgressSteps(AccountReadInput accountReadInput) @@ -35,15 +38,17 @@ internal class FeverReader(Account account) : IAccountReader accountReadInput.IncrementProgress(); - var allFeverFeedItems = (await feverClient.GetAllFeedItems()).ToList(); + var allFeverFeedItems = await GetAllFeverFeedItems(feverClient); accountReadInput.IncrementProgress(); + var existingFeedsByRemoteId = accountReadInput.Entities.Feeds.Where(f => f.Account.Id == account.Id) .ToDictionary(f => f.RemoteId); + var transaction = accountReadInput.Entities.BeginTransaction(); foreach (var feverFeed in feverFeeds) { - var feed = accountReadInput.Entities.Feeds.FirstOrDefault(f => f.RemoteId == feverFeed.Id.ToString() && f.Account.Id == account.Id); + var feed = existingFeedsByRemoteId.GetValueOrDefault(feverFeed.Id.ToString(), null); if (feed == null) { @@ -73,15 +78,15 @@ internal class FeverReader(Account account) : IAccountReader accountReadInput.IncrementProgress(); - var feverFeedItems = allFeverFeedItems - .Where(f => f.FeedId == feverFeed.Id) - .OrderByDescending(fi => fi.CreatedOnTime).ToList(); + var feverFeedItems = allFeverFeedItems.GetValueOrDefault(feverFeed.Id, []); + + var existingFeedItemsByRemoteId = feed.Items.ToDictionary(fi => fi.RemoteId); var sequence = 1; foreach (var feverFeedItem in feverFeedItems) { - var feedItem = feed.Items.FirstOrDefault(f => f.RemoteId == feverFeedItem.Id.ToString()); + var feedItem = existingFeedItemsByRemoteId.GetValueOrDefault(feverFeedItem.Id.ToString(), null); if (feedItem == null) { @@ -134,6 +139,20 @@ internal class FeverReader(Account account) : IAccountReader return AccountReadResult.Success; } + private static async Task>> GetAllFeverFeedItems(FeverClient feverClient) + { + var allFeverFeedItems = new List(); + + await foreach (var page in feverClient.GetAllFeedItems()) + { + allFeverFeedItems.AddRange(page); + } + + var grouped = allFeverFeedItems.OrderByDescending(fi => fi.CreatedOnTime).GroupBy(fi => fi.FeedId); + + return grouped.ToDictionary(g => g.Key, g => g.ToList()); + } + public async Task MarkFeedItemRead(string feedItemId) { var apiKey = account.Authenticate ? GetApiKey(account) : string.Empty; diff --git a/Application/FeedCenter.csproj b/Application/FeedCenter.csproj index 82e5737..e07412b 100644 --- a/Application/FeedCenter.csproj +++ b/Application/FeedCenter.csproj @@ -25,7 +25,7 @@ - +