mirror of
https://github.com/ckaczor/FeedCenter.git
synced 2026-02-16 18:47:28 -05:00
Improve Fever performance
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
using ChrisKaczor.FeverClient;
|
using ChrisKaczor.FeverClient;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -8,6 +9,8 @@ using FeedCenter.Feeds;
|
|||||||
|
|
||||||
namespace FeedCenter.Accounts;
|
namespace FeedCenter.Accounts;
|
||||||
|
|
||||||
|
using FeverFeedItem = ChrisKaczor.FeverClient.Models.FeedItem;
|
||||||
|
|
||||||
internal class FeverReader(Account account) : IAccountReader
|
internal class FeverReader(Account account) : IAccountReader
|
||||||
{
|
{
|
||||||
public async Task<int> GetProgressSteps(AccountReadInput accountReadInput)
|
public async Task<int> GetProgressSteps(AccountReadInput accountReadInput)
|
||||||
@@ -35,15 +38,17 @@ internal class FeverReader(Account account) : IAccountReader
|
|||||||
|
|
||||||
accountReadInput.IncrementProgress();
|
accountReadInput.IncrementProgress();
|
||||||
|
|
||||||
var allFeverFeedItems = (await feverClient.GetAllFeedItems()).ToList();
|
var allFeverFeedItems = await GetAllFeverFeedItems(feverClient);
|
||||||
|
|
||||||
accountReadInput.IncrementProgress();
|
accountReadInput.IncrementProgress();
|
||||||
|
|
||||||
|
var existingFeedsByRemoteId = accountReadInput.Entities.Feeds.Where(f => f.Account.Id == account.Id) .ToDictionary(f => f.RemoteId);
|
||||||
|
|
||||||
var transaction = accountReadInput.Entities.BeginTransaction();
|
var transaction = accountReadInput.Entities.BeginTransaction();
|
||||||
|
|
||||||
foreach (var feverFeed in feverFeeds)
|
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)
|
if (feed == null)
|
||||||
{
|
{
|
||||||
@@ -73,15 +78,15 @@ internal class FeverReader(Account account) : IAccountReader
|
|||||||
|
|
||||||
accountReadInput.IncrementProgress();
|
accountReadInput.IncrementProgress();
|
||||||
|
|
||||||
var feverFeedItems = allFeverFeedItems
|
var feverFeedItems = allFeverFeedItems.GetValueOrDefault(feverFeed.Id, []);
|
||||||
.Where(f => f.FeedId == feverFeed.Id)
|
|
||||||
.OrderByDescending(fi => fi.CreatedOnTime).ToList();
|
var existingFeedItemsByRemoteId = feed.Items.ToDictionary(fi => fi.RemoteId);
|
||||||
|
|
||||||
var sequence = 1;
|
var sequence = 1;
|
||||||
|
|
||||||
foreach (var feverFeedItem in feverFeedItems)
|
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)
|
if (feedItem == null)
|
||||||
{
|
{
|
||||||
@@ -134,6 +139,20 @@ internal class FeverReader(Account account) : IAccountReader
|
|||||||
return AccountReadResult.Success;
|
return AccountReadResult.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static async Task<Dictionary<int, List<FeverFeedItem>>> GetAllFeverFeedItems(FeverClient feverClient)
|
||||||
|
{
|
||||||
|
var allFeverFeedItems = new List<FeverFeedItem>();
|
||||||
|
|
||||||
|
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)
|
public async Task MarkFeedItemRead(string feedItemId)
|
||||||
{
|
{
|
||||||
var apiKey = account.Authenticate ? GetApiKey(account) : string.Empty;
|
var apiKey = account.Authenticate ? GetApiKey(account) : string.Empty;
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="ChrisKaczor.ApplicationUpdate" Version="1.0.7" />
|
<PackageReference Include="ChrisKaczor.ApplicationUpdate" Version="1.0.7" />
|
||||||
<PackageReference Include="ChrisKaczor.FeverClient" Version="1.0.2" />
|
<PackageReference Include="ChrisKaczor.FeverClient" Version="1.0.3" />
|
||||||
<PackageReference Include="ChrisKaczor.GenericSettingsProvider" Version="1.0.4" />
|
<PackageReference Include="ChrisKaczor.GenericSettingsProvider" Version="1.0.4" />
|
||||||
<PackageReference Include="ChrisKaczor.InstalledBrowsers" Version="1.0.4" />
|
<PackageReference Include="ChrisKaczor.InstalledBrowsers" Version="1.0.4" />
|
||||||
<PackageReference Include="ChrisKaczor.MinifluxClient" Version="1.0.3" />
|
<PackageReference Include="ChrisKaczor.MinifluxClient" Version="1.0.3" />
|
||||||
|
|||||||
Reference in New Issue
Block a user