SharpRSS/SharpRss/Services/RssService.cs

134 lines
5.4 KiB
C#
Raw Normal View History

2023-05-20 00:04:45 +02:00
using System;
2023-05-18 01:27:11 +02:00
using System.Collections.Generic;
using System.Linq;
2023-05-18 01:27:11 +02:00
using System.Threading.Tasks;
using CodeHollow.FeedReader;
2023-05-22 15:55:21 +02:00
using Serilog;
2023-05-18 01:27:11 +02:00
using SharpRss.Models;
2023-05-24 19:27:22 +02:00
using ToolQit.Extensions;
2023-05-18 01:27:11 +02:00
namespace SharpRss.Services
{
/// <summary>
2023-05-22 15:55:21 +02:00
/// Managing RSS feeds and groups.
2023-05-18 01:27:11 +02:00
/// </summary>
public class RssService : IDisposable
2023-05-18 01:27:11 +02:00
{
public RssService()
{
2023-05-23 15:04:02 +02:00
//SetupTestCategoriesAndFeedsAsync();
2023-05-18 01:27:11 +02:00
}
private readonly DatabaseService _dbService = new DatabaseService();
2023-05-23 15:04:02 +02:00
2023-05-24 19:27:22 +02:00
public async Task<HashSet<object>> GetGroupsFeedsAsync()
2023-05-23 15:04:02 +02:00
{
HashSet<object> items = new HashSet<object>();
items.UnionWith(await GetGroupsAsync());
items.UnionWith(await GetUngroupedFeedsAsync());
return items;
}
public async Task<bool> CreateGroupAsync(GroupModel group) => await _dbService.SetGroupAsync(group);
2023-05-22 15:55:21 +02:00
public async Task<HashSet<GroupModel>> GetGroupsAsync() => await _dbService.GetGroupsAsync();
public async Task<bool> AddFeed(string rssUrl, GroupModel? group = null)
{
bool result = false;
Feed fetched = await FetchFeed(rssUrl);
2023-05-22 15:55:21 +02:00
if (fetched == null)
return result;
FeedModel feedModel = new FeedModel(rssUrl)
{
Title = fetched.Title,
GroupId = group?.Id ?? string.Empty,
2023-05-22 15:55:21 +02:00
FeedType = fetched.Type.ToString(),
Description = fetched.Description,
Language = fetched.Language,
Copyright = fetched.Copyright,
DateAdded = DateTimeOffset.Now,
LastUpdated = DateTimeOffset.Now,
ImageUrl = fetched.ImageUrl,
OriginalDocument = fetched.OriginalDocument
2023-05-22 15:55:21 +02:00
};
result = await _dbService.SetFeedAsync(feedModel);
if (!result)
return result;
if (await AddFeedItems(fetched.Items, feedModel) == 0)
Log.Warning("No feed items added to feed: {FeedUrl}", feedModel.Url);
2023-05-22 15:55:21 +02:00
return result;
}
2023-05-25 15:48:56 +02:00
public async Task<HashSet<FeedModel>> GetFeedsAsync(string? groupId = null) => await _dbService.GetFeedsAsync(groupId);
2023-05-23 15:04:02 +02:00
public async Task<HashSet<FeedModel>> GetUngroupedFeedsAsync() => await _dbService.GetFeedsAsync("");
2023-05-24 19:27:22 +02:00
2023-05-25 15:48:56 +02:00
public async Task<HashSet<FeedItemModel>> GetFeedItemsAsync(string feedId, string? groupId = null) => await GetFeedItemsFromFeedsAsync(new[] { feedId }, groupId);
public async Task<HashSet<FeedItemModel>> GetFeedItemsFromFeedsAsync(string[] feedIds, string? groupId = null)
2023-05-24 19:27:22 +02:00
{
2023-05-25 15:48:56 +02:00
var items = await _dbService.GetFeedItemsAsync(feedIds);
2023-05-24 19:27:22 +02:00
GroupModel? group = null;
2023-05-25 15:48:56 +02:00
if (groupId != null)
2023-05-24 19:27:22 +02:00
{
2023-05-25 15:48:56 +02:00
var model = await _dbService.GetGroupsAsync(groupId);
2023-05-24 19:27:22 +02:00
if (model != null && model.Any()) group = model.FirstOrDefault();
}
// Update the items with the group data
if (group != null)
{
foreach (FeedItemModel feedItem in items)
feedItem.HexColor = group.HexColor;
}
return items;
}
private async Task<int> AddFeedItems(IList<FeedItem> items, FeedModel feedModel)
2023-05-22 15:55:21 +02:00
{
int result = 0;
if (!items.Any())
return result;
HashSet<FeedItemModel> itemModels = new HashSet<FeedItemModel>();
foreach (FeedItem item in items)
{
itemModels.Add(new FeedItemModel()
{
Id = item.Id,
FeedId = feedModel.Id,
Title = item.Title,
Description = item.Description,
Link = item.Link,
LastUpdated = DateTimeOffset.Now,
PublishingDate = item.PublishingDate != null ? new DateTimeOffset((DateTime)item.PublishingDate) : null,
Author = item.Author,
Categories = item.Categories.ToArray(),
Content = item.Content
});
}
result = await _dbService.SetFeedItemsAsync(itemModels);
return result;
}
private async Task<Feed> FetchFeed(string url)
{
var urls = await FeedReader.ParseFeedUrlsAsStringAsync(url);
string feedurl = url;
if (urls.Any())
feedurl = urls.First();
return await FeedReader.ReadAsync(feedurl);
}
2023-05-21 21:56:37 +02:00
private async void SetupTestCategoriesAndFeedsAsync()
2023-05-18 01:27:11 +02:00
{
var groupRes = await CreateGroupAsync(new GroupModel() { Name = "Test" });
groupRes = await CreateGroupAsync(new GroupModel() { Name = "News" });
groupRes = await CreateGroupAsync(new GroupModel() { Name = "Tech" });
groupRes = await CreateGroupAsync(new GroupModel() { Name = "Science" });
2023-05-22 15:55:21 +02:00
var groups = await GetGroupsAsync();
GroupModel testGroup = groups.Single(x => x.Name == "Test");
var res = await AddFeed("http://fedoramagazine.org/feed/", testGroup);
res = await AddFeed("https://www.nasa.gov/rss/dyn/breaking_news.rss", testGroup);
res = await AddFeed("https://journals.plos.org/plosone/feed/atom", testGroup);
res = await AddFeed("https://itsfoss.com/feed", testGroup);
2023-05-18 01:27:11 +02:00
}
public void Dispose()
{
_dbService.Dispose();
}
}
2023-05-18 01:27:11 +02:00
}