/// <summary> /// Removes feedItems for a given feed from the list of feedItems. /// </summary> /// <param name="feed">The feed for which the articles should be removed</param> private void RemoveFeedItems(Feed feed) { var counter = 0; foreach (var article in feed.Items) { while (counter < FeedItems.Count && FeedItems[counter].Link != article.Link) { counter++; } if (counter == FeedItems.Count) { break; } else { FeedItems.RemoveAt(counter); if (counter > 0) { counter--; } } } // ReSharper Disable All OnPropertyChanged("HasFeedItems"); // ReSharper Restore All }
public (string Title, List <Article> Articles) Fetch(string feed) { try { var feedId = feed.Md5(); SyndicationFeed sf = null; string title = null; CodeHollow.FeedReader.Feed cfeed = null; try { sf = SyndicationFeed.Load(XmlReader.Create(feed)); title = sf?.Title?.Text; } catch { cfeed = CodeHollow.FeedReader.FeedReader.ReadAsync(feed).Result; title = cfeed?.Title; } if (string.IsNullOrWhiteSpace(title)) { this.logger.LogWarning($"The title of feed({feed}) is null or white space."); return(null, null); } using (var connection = this.helper.GetDbConnection()) { if (sf != null) { return(title, this.helper.ParseArticles(sf, feedId, connection)); } else { return(title, this.helper.ParseArticles(cfeed, feedId, connection)); } } } catch (Exception e) { this.logger.LogError(e, $"failed to add {feed}"); } return(null, null); }
/// <summary> /// Removes a feed from the list of feeds. /// After that the articles from that feed are also removed from the list of articles. /// </summary> /// <param name="url">URL of the feed to be removed</param> public void RemoveFeed(string url) { Feed feedToBeRemoved = null; for (var i = 0; i < RssFeeds.Count; i++) { if (RssFeeds[i].Link == url) { feedToBeRemoved = RssFeeds[i]; RssFeeds.Remove(feedToBeRemoved); } } if (feedToBeRemoved == null) { return; } RemoveFeedItems(feedToBeRemoved); }
public List <Article> ParseArticles(CodeHollow.FeedReader.Feed feed, string feedId, IDbConnection connection) { if (feed == null || feed.Items == null || !feed.Items.Any()) { NiologManager.CreateLogger().Warn() .Message("Feed is empty, so no articles.") .Write(); return(null); } var articleDao = new ArticleDao(connection); var articles = new List <Article>(); foreach (var item in feed.Items) { var articleUrl = item?.Link; var articleTitle = item?.Title; if (string.IsNullOrWhiteSpace(articleUrl) || string.IsNullOrWhiteSpace(articleTitle)) { continue; } var articleId = feedId + articleUrl.Md5(); var content = this.Simplify(item.Content); Article article = new Article { Id = articleId, Url = articleUrl, FeedId = feedId, Title = articleTitle, Summary = content, Published = item.PublishingDate ?? DateTime.Now, Updated = item.PublishingDate ?? DateTime.Now, Keyword = string.Join(',', item.Categories), Content = content, Contributors = item.Author, Authors = item.Author }; articles.Add(article); try { if (articleDao.GetArticle(articleId) == null) { articleDao.InsertArticle(article); } else { articleDao.UpdateArticle(article); } } catch (Exception e) { NiologManager.CreateLogger().Error() .Message($"error occured when insert {articleUrl}") .Exception(e) .Write(); } } return(articles); }