From 88ce202de4029eb5787bce42df44f112741cef73 Mon Sep 17 00:00:00 2001 From: Max Holleman Date: Mon, 15 May 2023 15:53:08 +0200 Subject: [PATCH] Custom guideitem, cleaned models. Added favicon resolving. --- SharpRSS.sln | 12 ++++-- SharpRss/FeedCache.cs | 2 +- SharpRss/Models/CategoryModel.cs | 4 +- SharpRss/Models/FeedModel.cs | 57 ++++++++++++-------------- SharpRss/Models/IGuideItem.cs | 8 ---- SharpRss/RssService.cs | 2 +- WebSharpRSS/Bootstrapper.cs | 3 +- WebSharpRSS/Models/GuideItem.cs | 40 ------------------ WebSharpRSS/Models/GuideItemModel.cs | 43 +++++++++++++++++++ WebSharpRSS/Program.cs | 2 + WebSharpRSS/Shared/CategoryGuide.razor | 56 ++++++++++++++----------- WebSharpRSS/Shared/GuideItem.razor | 45 ++++++++++++++++++++ WebSharpRSS/Shared/SideGuide.razor | 16 ++++---- 13 files changed, 171 insertions(+), 119 deletions(-) delete mode 100644 SharpRss/Models/IGuideItem.cs delete mode 100644 WebSharpRSS/Models/GuideItem.cs create mode 100644 WebSharpRSS/Models/GuideItemModel.cs create mode 100644 WebSharpRSS/Shared/GuideItem.razor diff --git a/SharpRSS.sln b/SharpRSS.sln index 8932113..500e9cb 100644 --- a/SharpRSS.sln +++ b/SharpRSS.sln @@ -1,10 +1,13 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebSharpRSS", "WebSharpRSS\WebSharpRSS.csproj", "{749FE445-8D46-4631-BB57-FC648E22ADB6}" +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33627.172 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebSharpRSS", "WebSharpRSS\WebSharpRSS.csproj", "{749FE445-8D46-4631-BB57-FC648E22ADB6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharpRss", "SharpRss\SharpRss.csproj", "{DB3777BA-A383-4B83-AF65-DE51907CE75A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharpRss", "SharpRss\SharpRss.csproj", "{DB3777BA-A383-4B83-AF65-DE51907CE75A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToolQit", "ToolQit\ToolQit\ToolQit.csproj", "{BD905344-9DBF-4986-B853-E70B22848876}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ToolQit", "ToolQit\ToolQit\ToolQit.csproj", "{BD905344-9DBF-4986-B853-E70B22848876}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -25,4 +28,7 @@ Global {BD905344-9DBF-4986-B853-E70B22848876}.Release|Any CPU.ActiveCfg = Release|Any CPU {BD905344-9DBF-4986-B853-E70B22848876}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection EndGlobal diff --git a/SharpRss/FeedCache.cs b/SharpRss/FeedCache.cs index 62809cd..fd12ea6 100644 --- a/SharpRss/FeedCache.cs +++ b/SharpRss/FeedCache.cs @@ -16,7 +16,7 @@ namespace SharpRss public static async Task GetFeed(string urlKey) { - Log.Verbose("Request for: {UrlKey}", urlKey); + Log.Verbose("Fetching feed: {UrlKey}", urlKey); if (urlKey.IsNullEmptyWhiteSpace()) { Log.Error("RSS Url is empty!"); diff --git a/SharpRss/Models/CategoryModel.cs b/SharpRss/Models/CategoryModel.cs index bdf2dc8..5acbf6b 100644 --- a/SharpRss/Models/CategoryModel.cs +++ b/SharpRss/Models/CategoryModel.cs @@ -5,7 +5,7 @@ namespace SharpRss.Models /// /// To store and load data from file/database /// - public class CategoryModel : IGuideItem + public class CategoryModel { public CategoryModel(CategoryModel model) { @@ -20,7 +20,5 @@ namespace SharpRss.Models public string Name { get; set; } public HashSet Feeds { get; set; } - public bool IsSelected { get; set; } - public bool IsExpanded { get; set; } } } diff --git a/SharpRss/Models/FeedModel.cs b/SharpRss/Models/FeedModel.cs index 8bb4c93..c9def46 100644 --- a/SharpRss/Models/FeedModel.cs +++ b/SharpRss/Models/FeedModel.cs @@ -1,43 +1,40 @@ -using System.Dynamic; -using System.Linq; -using System.Threading.Tasks; -using CodeHollow.FeedReader; -using Serilog; -using ToolQit.Extensions; +using CodeHollow.FeedReader; namespace SharpRss.Models { - public class FeedModel : IGuideItem + public class FeedModel { public FeedModel(string rssUrl) { _rssUrl = rssUrl; - Task.Run(async () => Base = await FeedCache.GetFeed(_rssUrl)); + _fetchTask = FetchAsync(); + } + private Task _fetchTask; + + private async Task FetchAsync() + { + IsReady = false; + _feed = await FeedCache.GetFeed(_rssUrl); + IsReady = true; } - public Feed Base { get; private set; } - public bool IsSelected { get; set; } - public bool IsExpanded { get; set; } + private Feed? _feed; + public Feed Base { + get + { + if (_feed == null) + { + if (_fetchTask.IsFaulted) + { IsFaulted = _fetchTask.IsFaulted; return new Feed(); } + if (!(_fetchTask.Status == TaskStatus.Running || _fetchTask.Status == TaskStatus.WaitingForActivation)) + _fetchTask.Start(); + _fetchTask.Wait(); + } + return _feed ?? new Feed(); + } + } + public bool IsFaulted { get; private set; } public bool IsReady { get; private set; } private readonly string _rssUrl; - /*public async void Load(bool reload = false) - { - if (Base != null && !reload || !IsReady) return; - if (_rssUrl.IsNullEmptyWhiteSpace()) - { - Log.Error("RSS Url is empty!"); - return; - } - IsReady = false; - string feedUrl; - var urls = await FeedReader.GetFeedUrlsFromUrlAsync(_rssUrl); - if (!urls.Any()) - feedUrl = _rssUrl; - else - feedUrl = urls.First().Url; - Log.Verbose("Creating feed: {FeedUrl}", feedUrl); - Base = await FeedReader.ReadAsync(feedUrl); - IsReady = true; - }*/ } } diff --git a/SharpRss/Models/IGuideItem.cs b/SharpRss/Models/IGuideItem.cs deleted file mode 100644 index 0489b2f..0000000 --- a/SharpRss/Models/IGuideItem.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace SharpRss.Models -{ - public interface IGuideItem - { - public bool IsSelected { get; set; } - public bool IsExpanded { get; set; } - } -} \ No newline at end of file diff --git a/SharpRss/RssService.cs b/SharpRss/RssService.cs index c52a1ac..e9da302 100644 --- a/SharpRss/RssService.cs +++ b/SharpRss/RssService.cs @@ -22,7 +22,7 @@ namespace SharpRss private static HashSet feedSet = new HashSet() { new FeedModel("http://fedoramagazine.org/feed/"), - new FeedModel("https://www.nasa.gov/rss/dyn/breaking_news.rss") + new FeedModel("https://www.nasa.gov/rss/dyn/breaking_news.rss"), }; private static HashSet feedSet2 = new HashSet() { diff --git a/WebSharpRSS/Bootstrapper.cs b/WebSharpRSS/Bootstrapper.cs index 9beead8..e0a18ed 100644 --- a/WebSharpRSS/Bootstrapper.cs +++ b/WebSharpRSS/Bootstrapper.cs @@ -12,7 +12,8 @@ namespace WebSharpRSS public static void SetAppDefaultSettings(this DataContainer dataCon) { var paths = dataCon["Paths"]; - paths.Set("FaviconResolveUrl", "https://icons.duckduckgo.com/ip3/{0}.ico", false); + //paths.Set("FaviconResolveUrl", "https://icons.duckduckgo.com/ip3/{0}.ico", false); + paths.Set("FaviconResolveUrl", "http://www.google.com/s2/favicons?domain={0}", false); paths.Set("LogPath", Path.Combine(Environment.CurrentDirectory, "logs", "log_.json"), false); var dbSql = dataCon["SQL"]; diff --git a/WebSharpRSS/Models/GuideItem.cs b/WebSharpRSS/Models/GuideItem.cs deleted file mode 100644 index ede4c38..0000000 --- a/WebSharpRSS/Models/GuideItem.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Collections.Generic; -using CodeHollow.FeedReader; -using SharpRss.Models; - -namespace WebSharpRSS.Models -{ - public class GuideItem - { - public GuideItem(CategoryModel catModel) - { - _categoryModel = catModel; - Feeds = _categoryModel.Feeds; - } - - public GuideItem(FeedModel feedModel) - { - _feedModel = feedModel; - Feed = _feedModel.Base; - } - - private readonly CategoryModel? _categoryModel; - private readonly FeedModel? _feedModel; - - public string Title { get; set; } - public bool IsSelected { get; set; } - public string Icon { get; set; } - - // Category - public bool IsExpanded { get; set; } - public HashSet? Feeds { get; set; } - // Feed - public Feed? Feed { get; set; } - - // Functions - public async void ItemClick() - { - IsExpanded = !IsExpanded; - } - } -} \ No newline at end of file diff --git a/WebSharpRSS/Models/GuideItemModel.cs b/WebSharpRSS/Models/GuideItemModel.cs new file mode 100644 index 0000000..ab05e5a --- /dev/null +++ b/WebSharpRSS/Models/GuideItemModel.cs @@ -0,0 +1,43 @@ +using CodeHollow.FeedReader; +using MudBlazor; +using SharpRss.Models; +using ToolQit; + +namespace WebSharpRSS.Models +{ + public class GuideItemModel + { + public GuideItemModel(CategoryModel catModel) + { + CategoryModel = catModel; + Feeds = CategoryModel.Feeds.Where(x => !x.IsFaulted && x.Base != null).Select(x => new GuideItemModel(x)).ToHashSet(); + Title = CategoryModel.Name; + Icon = Icons.Material.Filled.RssFeed; + } + + public GuideItemModel(FeedModel feedModel) + { + if (feedModel.IsFaulted) + return; + FeedModel = feedModel; + Feed = FeedModel.Base; + Title = Feed.Title; + string faviconAdress = Feed.Link.Remove(Feed.Link.IndexOf("http"), Feed.Link.IndexOf("://") + 3); + FaviconUrl = string.Format(Caretaker.Settings["Paths"].GetString("FaviconResolveUrl"), faviconAdress); + } + + public readonly CategoryModel? CategoryModel; + public readonly FeedModel? FeedModel; + + public string Title { get; set; } = string.Empty; + public bool IsSelected { get; set; } + public string? Icon { get; set; } + public string? FaviconUrl { get; set; } + + // Category + public bool IsExpanded { get; set; } + public HashSet? Feeds { get; set; } + // Feed + public Feed? Feed { get; set; } + } +} \ No newline at end of file diff --git a/WebSharpRSS/Program.cs b/WebSharpRSS/Program.cs index 4a6e225..af892e4 100644 --- a/WebSharpRSS/Program.cs +++ b/WebSharpRSS/Program.cs @@ -5,8 +5,10 @@ using MudBlazor; using MudBlazor.Services; using Serilog; using SharpRss; +using SharpRss.Models; using ToolQit; using WebSharpRSS; +using WebSharpRSS.Models; Caretaker.Settings.SetAppDefaultSettings(); Bootstrapper.SetupLogging(); diff --git a/WebSharpRSS/Shared/CategoryGuide.razor b/WebSharpRSS/Shared/CategoryGuide.razor index 52ff5fd..e43774a 100644 --- a/WebSharpRSS/Shared/CategoryGuide.razor +++ b/WebSharpRSS/Shared/CategoryGuide.razor @@ -3,10 +3,10 @@ @using ToolQit @using ToolQit.Containers @using ToolQit.Extensions +@using WebSharpRSS.Models;