2023-05-15 20:42:42 +02:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
2023-05-15 15:53:08 +02:00
|
|
|
using CodeHollow.FeedReader;
|
|
|
|
using MudBlazor;
|
2023-05-18 20:15:31 +02:00
|
|
|
using Serilog;
|
2023-05-15 15:53:08 +02:00
|
|
|
using SharpRss.Models;
|
2023-05-18 20:15:31 +02:00
|
|
|
using SharpRss.Services;
|
2023-05-15 15:53:08 +02:00
|
|
|
using ToolQit;
|
|
|
|
|
|
|
|
namespace WebSharpRSS.Models
|
|
|
|
{
|
2023-05-15 20:42:42 +02:00
|
|
|
public class TreeItemData
|
2023-05-15 15:53:08 +02:00
|
|
|
{
|
2023-05-18 20:15:31 +02:00
|
|
|
public TreeItemData(CategoryModel catModel, RssService rssService)
|
2023-05-15 15:53:08 +02:00
|
|
|
{
|
2023-05-18 20:15:31 +02:00
|
|
|
_service = rssService;
|
2023-05-15 15:53:08 +02:00
|
|
|
CategoryModel = catModel;
|
2023-05-18 20:15:31 +02:00
|
|
|
Initialize();
|
2023-05-15 15:53:08 +02:00
|
|
|
}
|
|
|
|
|
2023-05-18 20:15:31 +02:00
|
|
|
public TreeItemData(FeedModel feedModel, RssService rssService)
|
2023-05-15 15:53:08 +02:00
|
|
|
{
|
2023-05-18 20:15:31 +02:00
|
|
|
_service = rssService;
|
2023-05-15 15:53:08 +02:00
|
|
|
FeedModel = feedModel;
|
2023-05-19 14:40:57 +02:00
|
|
|
|
2023-05-18 20:15:31 +02:00
|
|
|
Initialize();
|
2023-05-15 15:53:08 +02:00
|
|
|
}
|
|
|
|
|
2023-05-18 20:15:31 +02:00
|
|
|
private readonly RssService _service;
|
2023-05-15 15:53:08 +02:00
|
|
|
public readonly CategoryModel? CategoryModel;
|
|
|
|
public readonly FeedModel? FeedModel;
|
2023-05-18 20:15:31 +02:00
|
|
|
private HashSet<FeedModel> _feedModels;
|
2023-05-15 15:53:08 +02:00
|
|
|
|
|
|
|
public string Title { get; set; } = string.Empty;
|
|
|
|
public bool IsSelected { get; set; }
|
|
|
|
public string? Icon { get; set; }
|
|
|
|
public string? FaviconUrl { get; set; }
|
2023-05-16 14:12:36 +02:00
|
|
|
|
2023-05-15 15:53:08 +02:00
|
|
|
// Category
|
2023-05-18 20:15:31 +02:00
|
|
|
public bool HasChild => _feedModels != null && _feedModels.Any();
|
2023-05-15 15:53:08 +02:00
|
|
|
public bool IsExpanded { get; set; }
|
2023-05-15 20:42:42 +02:00
|
|
|
public HashSet<TreeItemData>? Feeds { get; set; }
|
2023-05-15 15:53:08 +02:00
|
|
|
// Feed
|
2023-05-18 20:15:31 +02:00
|
|
|
public Feed? Feed { get; private set; }
|
2023-05-16 14:12:36 +02:00
|
|
|
public int FeeditemCount
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
if (CategoryModel != null && Feeds != null)
|
|
|
|
{
|
|
|
|
int feedsCount = 0;
|
|
|
|
foreach (var item in Feeds)
|
|
|
|
{
|
|
|
|
if (item.Feed != null)
|
|
|
|
feedsCount += item.FeeditemCount;
|
|
|
|
}
|
|
|
|
return feedsCount;
|
|
|
|
}
|
|
|
|
else if (Feed != null)
|
|
|
|
return Feed.Items.Count;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
2023-05-18 20:15:31 +02:00
|
|
|
|
|
|
|
private async void Initialize()
|
|
|
|
{
|
|
|
|
if (CategoryModel != null)
|
|
|
|
{
|
|
|
|
Title = CategoryModel.Name;
|
|
|
|
Icon = Icons.Material.Filled.Category;
|
|
|
|
_feedModels = await _service.GetFeedsAsync(CategoryModel);
|
|
|
|
if (_feedModels.Any())
|
|
|
|
Feeds = _feedModels.Select(x => new TreeItemData(x, _service)).OrderBy(x => x.Title).ToHashSet();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (FeedModel != null)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
Feed = await _service.GetFeedAsync(FeedModel.FeedUrl);
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
Log.Error(e, "Error fetching feed: {FeedUrl}", FeedModel.FeedUrl);
|
|
|
|
Feed = null;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Icon = Icons.Material.Filled.RssFeed;
|
|
|
|
Title = Feed.Title;
|
|
|
|
string faviconAddress = Feed.Link.Remove(Feed.Link.IndexOf("http", StringComparison.Ordinal), Feed.Link.IndexOf("://", StringComparison.Ordinal) + 3);
|
|
|
|
FaviconUrl = string.Format(Caretaker.Settings["Paths"].GetString("FaviconResolveUrl"), faviconAddress);
|
|
|
|
}
|
|
|
|
}
|
2023-05-15 15:53:08 +02:00
|
|
|
}
|
|
|
|
}
|