Esempio n. 1
0
        /// <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
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        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);
        }