示例#1
0
        private ArticleModel FeedToArticleModel(ChildNode item, FeedModel fcm)
        {
            if (item == null || item.klub != null)
                return null;

            return ExecuteSafe(() =>
            {

                var a = ConstructArticleModel(fcm);

                a.Title = item.title;
                a.SubTitle = item.kicker;
                a.Teaser = item.text;
                a.LogicUri = item.linkURL;
                a.PublicUri = fcm.Source.PublicBaseUrl + item.docpath;

                if (item.teaserImageURL != null)
                {
                    var url = item.teaserImageURL;
                    if (url.Contains("w=320"))
                        url = url.Replace("w=320", "w=400");
                    a.LeadImage = new ImageContentModel() { Url = url };
                }

                return a;

            });
        }
示例#2
0
 public static void AddFeed(FeedModel fm, SourceModel source, bool isActive = false)
 {
     fm.Source = source;
     if (isActive)
         fm.Source.ActiveFeeds.Add(fm);
     fm.IsActive = isActive;
 }
示例#3
0
        public override Task<List<ArticleModel>> EvaluateFeed(FeedModel feedModel)
        {
            return ExecuteSafe(async () =>
            {
                var feed = await DownloadAsync(feedModel);
                var articlelist = new List<ArticleModel>();
                if (feed == null) return articlelist;

                var rootObj = JsonConvert.DeserializeObject<FeedRoot>(feed);

                if (rootObj == null)
                    LogHelper.Instance.Log(LogLevel.Error,
                        "BildHelper.EvaluateFeed failed: rootObj is null after deserialisation", this);
                else
                {
                    foreach (var children in rootObj.__childNodes__)
                    {
                        if (children.__childNodes__ != null)
                        {
                            foreach (var childNode in children.__childNodes__.Where(a => a.targetType == "article"))
                            {
                                var article = FeedToArticleModel(childNode, feedModel);
                                if (article != null)
                                    articlelist.Add(article);
                            }
                        }
                    }
                }
                return articlelist;
            });
        }
示例#4
0
        public ArticleModel FeedToArticleModel(NzzFeedArticle nfa, FeedModel scm)
        {
            if (nfa == null || !nfa.path.Contains("/api/")) return null;

            try
            {
                var a = ConstructArticleModel(scm);
                a.PublishDateTime = nfa.publicationDateTime;
                a.Title = nfa.title;
                a.SubTitle = nfa.subTitle;
                if (string.IsNullOrWhiteSpace(a.SubTitle) && nfa.title == "Was heute wichtig ist")
                    a.SubTitle = "Dieser Artikel wird laufend aktualisiert";

                a.LeadImage = LeadImageToImage(nfa.leadImage, scm);

                a.LogicUri = scm.Source.LogicBaseUrl + nfa.path.Substring("/api/".Length);
                var guid = nfa.path.Substring(nfa.path.LastIndexOf("/", StringComparison.Ordinal) + 1);
                a.PublicUri = scm.Source.PublicBaseUrl + guid;

                return a;
            }
            catch (Exception ex)
            {
                LogHelper.Instance.Log(LogLevel.Error, "NzzHelper.FeedToArticleModel failed", this, ex);
                return null;
            }
        }
示例#5
0
        public override Task<List<ArticleModel>> EvaluateFeed(FeedModel feedModel)
        {
            return ExecuteSafe(async () =>
            {
                var articlelist = new List<ArticleModel>();
                var feed = await DownloadAsync(feedModel);
                if (feed == null) return articlelist;

                feed = feed.Substring(feed.IndexOf(">", StringComparison.Ordinal));
                feed = feed.Substring(feed.IndexOf("<", StringComparison.Ordinal));
                feed = XmlHelper.RemoveXmlLvl(feed);

                feed = feed.Replace(" & ", " &amp; ");

                var channel = XmlHelper.Deserialize<Channel>(feed);

                if (channel == null)
                    LogHelper.Instance.Log(LogLevel.Error,
                        "BildHelper.EvaluateFeed failed: rootObj is null after deserialisation", this);
                else
                {
                    foreach (var children in channel.Item)
                    {
                        var article = FeedToArticleModel(children, feedModel);
                        if (article != null)
                            articlelist.Add(article);
                    }
                }
                return articlelist;
            });
        }
示例#6
0
        public override Task<List<ArticleModel>> EvaluateFeed(FeedModel feedModel)
        {
            return ExecuteSafe(async () =>
            {
                var feed = await DownloadAsync(feedModel);

                var articlelist = new List<ArticleModel>();
                if (feed == null) return articlelist;

                feed = feed.Substring(feed.IndexOf(">", StringComparison.Ordinal));
                feed = feed.Substring(feed.IndexOf("<", StringComparison.Ordinal));
                if (!RepairFeedXml(ref feed))
                    return articlelist;

                var zeitFeed = XmlHelper.Deserialize<Feed>(feed);
                if (zeitFeed == null)
                    LogHelper.Instance.Log(LogLevel.Error,
                        "ZeitHelper.EvaluateFeed failed: Feed is null after deserialisation", this);
                else
                {
                    foreach (var item in zeitFeed.References)
                    {
                        var article = FeedReferenceToArticleModel(item, feedModel);
                        if (article != null)
                            articlelist.Add(article);
                    }
                }
                return articlelist;
            });
        }
 protected ArticleModel ConstructArticleModel(FeedModel feed)
 {
     return new ArticleModel()
     {
         DownloadDateTime = DateTime.Now,
         Feed = feed
     };
 }
 public void Download(FeedModel model)
 {
     for (int index = 0; index < model.AllArticles.Count; index++)
     {
         var articleModel = model.AllArticles[index];
         if (articleModel.LeadImage != null)
             Download(articleModel.LeadImage, index < 15);
     }
 }
示例#9
0
        public ArticleModel FeedToArticleModel(HtmlNode hn, FeedModel feed)
        {
            if (hn == null) return null;

            try
            {
                var a = new ArticleModel();

                var linknode = hn.ChildNodes.Descendants("a").FirstOrDefault();
                if (linknode != null)
                {
                    a.PublicUri = linknode.GetAttributeValue("href", null);
                    a.LogicUri = a.PublicUri;

                    if (linknode.ChildNodes != null && linknode.ChildNodes.Any())
                    {
                        var img = linknode.ChildNodes[0];
                        a.LeadImage = new ImageContentModel() { Url = img.GetAttributeValue("src", null) };
                    }
                }
                else
                {
                    //newsticker
                    return null;
                }

                var titlenode = hn.ChildNodes.FirstOrDefault(atr => atr.GetAttributeValue("title", null) != null);
                if (titlenode != null)
                    a.Title = titlenode.GetAttributeValue("title", null);
                else
                    return null;

                if (a.Title.Contains(":"))
                {
                    a.SubTitle = a.Title.Substring(a.Title.IndexOf(":", StringComparison.Ordinal) + 1).Trim();
                    a.Title = a.Title.Substring(0, a.Title.IndexOf(":", StringComparison.Ordinal));
                }

                a.DownloadDateTime = DateTime.Now;
                a.Author = "Chefredaktor";

                return a;
            }
            catch (Exception ex)
            {
                LogHelper.Instance.Log(LogLevel.Error, "PostillonHelper.FeedToArticleModel failed", this, ex);
                return null;
            }
        }
示例#10
0
 public static void SetFeedActiveState(FeedModel fm, bool isActive)
 {
     if (isActive && !fm.Source.ActiveFeeds.Contains(fm))
     {
         fm.Source.ActiveFeeds.Add(fm);
         SetSourceActiveState(fm.Source, true);
     }
     else if (!isActive && fm.Source.ActiveFeeds.Contains(fm))
     {
         fm.Source.ActiveFeeds.Remove(fm);
         if (fm.Source.ActiveFeeds.Count == 0)
             SetSourceActiveState(fm.Source, false);
     }
     fm.IsActive = isActive;
 }
示例#11
0
 private ArticleModel FeedModelToArticleModel(feeditem item, FeedModel feedModel)
 {
     return ExecuteSafe(() =>
     {
         var am = ConstructArticleModel(feedModel);
         am.Title = item.title;
         am.LogicUri = item.targetUrl;
         am.PublicUri = item.targetUrl.Substring(0, item.targetUrl.IndexOf(".json", StringComparison.Ordinal)) + ".html";
         am.PublishDateTime = item.publicationDate;
         am.SubTitle = item.catchword;
         am.Teaser = item.lead;
         am.LeadImage = new ImageContentModel() {Url = item.img.src};
         return am;
     });
 }
示例#12
0
        private ArticleModel FeedToArticleModel(Item children, FeedModel fcm)
        {
            if (children == null)
                return null;

            return ExecuteSafe(() =>
            {
                var title = children.Title.Substring(0, children.Title.IndexOf(":", StringComparison.Ordinal));
                var subTitle = children.Title.Substring(children.Title.IndexOf(":", StringComparison.Ordinal) + 2);

                var bannedSubTitles = new[]
                {
                    "alle artikel",
                    "die wichtigsten artikel"
                };

                var bannedTitles = new[]
                {
                    "Newsblog",
                };

                var lowerSub = subTitle.ToLower();
                if (bannedSubTitles.Any(s => lowerSub.Contains(s)))
                    return null;

                if (bannedTitles.Any(s => title.Contains(s)))
                    return null;


                var a = ConstructArticleModel(fcm);
                a.Title = title;
                a.SubTitle = subTitle;
                a.Teaser = children.Description;
                a.PublishDateTime = DateTime.Parse(children.PubDate);
                a.PublicUri = children.Guid;
                a.LogicUri = children.Link;

                if (children.Enclosure != null)
                    a.LeadImage = new ImageContentModel() { Url = children.Enclosure.Url };

                a.Themes.Clear();
                a.AfterSaveFunc = () => AddThemesAsync(a, new[] { children.Category });

                return a;
            });
        }
示例#13
0
        public ArticleModel FeedToArticleModel(Entry2 nfa, FeedModel scm)
        {
            if (nfa == null) return null;

            return ExecuteSafe(() =>
            {
                if (nfa.articleType == "standard-article")
                {
                    var lowkicker = nfa.kicker.ToLower().Trim();
                    if (lowkicker.EndsWith("quiz") || nfa.kicker.Contains("test"))
                        return null;

                    var blockedIds = new[]
                    {
                        "6979480", //persönlichkeitstest
                        "6974764", //Quiz
                        "6948896", //Europa Quiz
                        "6979480", //persönlichkeitstest
                        "6979480", //persönlichkeitstest
                    };

                    if (blockedIds.Any(i => i == nfa.contentId))
                        return null;

                    var a = ConstructArticleModel(scm);
                    a.PublishDateTime = DateTime.Parse(nfa.timestamp);
                    a.Title = nfa.kicker;
                    a.SubTitle = nfa.headline;
                    a.Teaser = nfa.teaser;


                    if (nfa.images != null && nfa.images.Count > 3)
                        a.LeadImage = new ImageContentModel()
                        {
                            Url = nfa.images[3].src
                        };

                    a.LogicUri = scm.Source.LogicBaseUrl + nfa.contentId + ".json";
                    a.PublicUri = scm.Source.PublicBaseUrl + nfa.contentId;

                    return a;
                }
                return null;
            });
        }
示例#14
0
        public static async Task<ArticleModel> LoadForFeed(int id, FeedModel feed, ISqliteService sqliteService, IImageDownloadService imageDownloadService)
        {
            var arRepo = new GenericRepository<ArticleModel, ArticleEntity>(sqliteService);
            var imgRepo = new GenericRepository<ImageContentModel, ImageContentEntity>(sqliteService);

            var art = await arRepo.GetByIdAsync(id);
            var contents = await sqliteService.GetByCondition<ContentEntity>(s => s.ParentId == id && s.ContentType == (int)ContentType.LeadImage, s => s.Index, false, 1, 0);
            if (contents?.FirstOrDefault() != null)
            {
                var image = await imgRepo.GetByIdAsync(contents.FirstOrDefault().ContentId);
                art.LeadImage = image;

                if (art.LeadImage?.LoadingState < LoadingState.Loaded)
                    imageDownloadService.Download(art);
            }
            art.Feed = feed;
            return art;
        }
示例#15
0
        private void button1_Click(object sender, EventArgs e)
        {
            var sourceModel = JsonConvert.DeserializeObject<List<SourceModel>>(jsonInput.Text);

            foreach (var sourceConfigurationModel in sourceModel)
            {
                var doc = new HtmlAgilityPack.HtmlDocument();
                doc.LoadHtml(htmlInput.Text);

                List<HtmlNode> menu = doc.DocumentNode
                    .DescendantsAndSelf("aside")
                    .Where(
                        o => o.GetAttributeValue("id", null) == "leftMenu"
                    )
                    .ToList();

                if (menu.Count == 1)
                {
                    var menuItems = menu.First().Descendants("li")
                        .Where(
                            o => o.GetAttributeValue("class", null) == "category"
                        )
                        .ToList();

                    foreach (var menuItem in menuItems)
                    {
                        var a = menuItem.Descendants("a").FirstOrDefault();
                        if (a != null)
                        {
                            var feedModel = new FeedModel()
                            {
                                Url = sourceConfigurationModel.LogicBaseUrl + "api" + a.GetAttributeValue("href", null),
                                Name = a.InnerText,
                                Guid = Guid.NewGuid()
                            };
                            sourceConfigurationModel.Feeds.Add(feedModel);
                        }
                    }
                }
            }
            jsonOutput.Text = JsonConvert.SerializeObject(sourceModel, Formatting.Indented);
        }
 public async Task<bool> SetFeedActiveStateAsync(FeedModel feedModel, bool isActive)
 {
     return true;
 }
 public async Task<bool> SwitchFeedActiveStateAsync(FeedModel feedModel)
 {
     return true;
 }
示例#18
0
 public override Task<List<ArticleModel>> EvaluateFeed(FeedModel feedModel)
 {
     return ExecuteSafe(async () =>
     {
         var articlelist = new List<ArticleModel>();
         var feed = await DownloadAsync(feedModel);
         var f = JsonConvert.DeserializeObject<NzzFeed>(feed);
         articlelist.AddRange(f.articles.Select(am => FeedToArticleModel(am, feedModel)).Where(am => am != null));
         return articlelist;
     });
 }
        public ArticleRepositoryMock()
        {
            var article = GetSampleArticle();
            var article2 = GetSampleArticle();
            var sm = new SourceModel()
            {
                Abbreviation = "NZZ",
                Guid = Guid.NewGuid(),
                Source = Sources.Nzz,
                Name = "Neue Zürcher Zeitung",
                LogicBaseUrl = "http://api.nzz.ch/",
                PublicBaseUrl = "http://nzz.ch/",
                IsActive = true
            };
            var sm2 = new SourceModel()
            {
                Abbreviation = "BAZ",
                Guid = Guid.NewGuid(),
                Source = Sources.Nzz,
                Name = "Basler Zeitung",
                LogicBaseUrl = "http://api.nzz.ch/",
                PublicBaseUrl = "http://nzz.ch/",
                IsActive = false
            };
            var fm = new FeedModel()
            {
                Name = "Home",
                Guid = Guid.NewGuid(),
                Source = sm,
                Url = "home",
                AllArticles =
                {
                    article,
                    article2,
                    article
                }
            };
            var fm2 = new FeedModel()
            {
                Name = "Ausland",
                Guid = Guid.NewGuid(),
                Source = sm,
                Url = "ausland",
                AllArticles =
                {
                    article,
                    article2,
                    article
                }
            };
            sm.ActiveFeeds.Add(fm);
            sm.Feeds.Add(fm);
            sm.Feeds.Add(fm2);
            sm.Feeds.Add(fm2);

            _sources.Add(sm);
            _sources.Add(sm);
            _sources.Add(sm2);
            _sources.Add(sm2);
            _sources.Add(sm);
        }
示例#20
0
 private ImageContentModel LeadImageToImage(NzzLeadImage li, FeedModel feedModel)
 {
     if (li != null)
     {
         try
         {
             var uri = ParseImageUri(li.path);
             if (uri != null)
             {
                 return new ImageContentModel()
                 {
                     Text = new TextContentModel()
                     {
                         Content = HtmlConverter.CreateOnce(feedModel.Source.PublicBaseUrl).HtmlToParagraph(li.caption)
                     },
                     Url = uri
                 };
             }
         }
         catch (Exception ex)
         {
             LogHelper.Instance.Log(LogLevel.Error, "NzzHelper.LeadImageToImage deserialization failed", this, ex);
             return null;
         }
     }
     return null;
 }
示例#21
0
 private void SelectFeed(FeedModel model)
 {
     SimpleIoc.Default.GetInstance<FeedPageViewModel>().SelectFeed(model);
     _historyNavigationService.NavigateTo(PageKeys.Feed.ToString());
 }
示例#22
0
        public Task<bool> LoadFullFeedAsync(FeedModel fm)
        {
            return ExecuteSafe(async () =>
            {
                await LoadArticlesIntoFeed(fm);

                return true;
            });
        }
 public async Task<bool> LoadFullFeedAsync(FeedModel fm)
 {
     var article = GetSampleArticle();
     article.Feed = fm;
     fm.AllArticles.Add(article);
     fm.AllArticles.Add(article);
     fm.AllArticles.Add(article);
     fm.AllArticles.Add(article);
     fm.AllArticles.Add(article);
     fm.AllArticles.Add(article);
     fm.AllArticles.Add(article);
     return true;
 }
示例#24
0
        public override Task<List<ArticleModel>> EvaluateFeed(FeedModel feedModel)
        {
            return ExecuteSafe(async () =>
            {
                var articlelist = new List<ArticleModel>();
                var feed = await DownloadAsync(feedModel);
                if (feed == null) return articlelist;


                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(feed);

                List<HtmlNode> articles = doc.DocumentNode
                    .DescendantsAndSelf("div")
                    .Where(
                        o => o.GetAttributeValue("class", null) != null &&
                             o.GetAttributeValue("class", null).Contains("post-body")
                    )
                    .ToList();

                if (articles != null && articles.Any())
                {
                    foreach (var article in articles)
                    {
                        var res = FeedToArticleModel(article, feedModel);
                        if (res != null)
                            articlelist.Add(res);
                    }
                }

                return articlelist;
            });
        }
示例#25
0
        private ArticleModel FeedToArticleModel(Item nfa, FeedModel feedModel)
        {
            if (nfa == null || nfa.Link.Contains("/video/") || !nfa.Link.StartsWith("http://www.spiegel.de") || nfa.Link.Contains("/fotostrecke/"))
                return null;

            var bannedSubTitles = new[]
            {
                "alle artikel",
                "die wichtigsten artikel"
            };

            var bannedTitles = new[]
            {
                "Newsblog",
            };

            var title = "";
            var subTitle = "";
            string author = null;
            if (title.Contains(":"))
            {
                title = nfa.Title.Substring(0, nfa.Title.IndexOf(":", StringComparison.Ordinal));
                subTitle = nfa.Title.Substring(nfa.Title.IndexOf(":", StringComparison.Ordinal) + 2);
                if (subTitle.Contains("<li>"))
                {
                    author = subTitle.Substring(subTitle.IndexOf("<li>", StringComparison.Ordinal));
                    author = Regex.Replace(author, "<(\\/)*([a-zA-Z])+>", "");
                    author = author.Replace("Von", "");
                    author = author.Replace("von", "").Trim();
                    subTitle = subTitle.Substring(0, subTitle.IndexOf("<li>", StringComparison.Ordinal));
                }
            }
            else
            {
                title = nfa.Title;
            }

            var lowerSub = subTitle.ToLower();
            if (bannedSubTitles.Any(s => lowerSub.Contains(s)))
                return null;

            if (bannedTitles.Any(s => title.Contains(s)))
                return null;

            var link = nfa.Link;
            if (link.Contains("#ref=rss"))
                link = link.Replace("#ref=rss", "");
            var a = ConstructArticleModel(feedModel);
            a.Title = title;
            a.SubTitle = subTitle.Trim();
            a.Teaser = nfa.Description;
            a.Author = author;
            a.PublishDateTime = DateTime.Parse(nfa.PubDate);
            a.PublicUri = nfa.Link;
            a.LogicUri = link;

            a.Themes.Clear();
            a.AfterSaveFunc = async () => await AddThemesAsync(a, new[] {nfa.Category});

            var imagEndings = new[] {"img", "png", "giv", "jpg", "jpeg"};
            if (nfa.Enclosure != null && ((nfa.Enclosure.Type != null && nfa.Enclosure.Type.Contains("image")) || imagEndings.Any(s => nfa.Enclosure.Url.EndsWith(s))))
            {
                var url = nfa.Enclosure.Url;
                if (url.Contains("thumbsmall"))
                {
                    url = url.Replace("thumbsmall", "hppano");
                }
                a.LeadImage = new ImageContentModel { Url = url };
            }

            return a;
        }
示例#26
0
        public override Task<List<ArticleModel>> EvaluateFeed(FeedModel feedModel)
        {
            return ExecuteSafe(async () =>
            {
                var feed = await DownloadAsync(feedModel);

                var articlelist = new List<ArticleModel>();
                if (feed == null) return articlelist;

                var f = JsonConvert.DeserializeObject<feed[]>(feed);
                feed articlefeed = f.FirstOrDefault(i => i.type == "teaser");
                if (articlefeed != null)
                {
                    articlelist.AddRange(articlefeed.items.Where(i => i.type == "teaser")
                        .Select(i => FeedModelToArticleModel(i, feedModel))
                        .Where(am => am != null));
                }

                return articlelist;
            });
        }
示例#27
0
 public Task<bool> SwitchFeedActiveStateAsync(FeedModel feedModel)
 {
     return SetFeedActiveStateAsync(feedModel, !SourceManager.GetFeedActiveState(feedModel));
 }
示例#28
0
 public async void SelectFeed(FeedModel obj)
 {
     Feed = obj;
     await _articleRepository.LoadFullFeedAsync(obj);
 }
示例#29
0
 public Task<bool> SetFeedActiveStateAsync(FeedModel feedModel, bool isActive)
 {
     SourceManager.SetFeedActiveState(feedModel, isActive);
     _sourceCacheEntity.IsEnabledDictionary[feedModel.Guid] = isActive;
     return SaveCache();
 }
示例#30
0
        private async Task LoadArticlesIntoFeed(FeedModel feed, int max = -1)
        {
            if (max == -1)
                max = 100;
            for (int i = 0; i < max; i++)
            {
                if (feed.AllArticles.Count <= i)
                {
                    var stringGuid = feed.Guid.ToString();
                    var realmax = max == 0 ? 0 : max - i;
                    var relations = await _sqliteService.GetByCondition<FeedArticleRelationEntity>(s => s.FeedGuid == stringGuid, s => s.Index, false, realmax, i);

                    foreach (var feedArticleRelationEntity in relations)
                    {
                        var article = await LoadHelper.LoadForFeed(feedArticleRelationEntity.ArticleId, feed, _sqliteService, _imageDownloadService);
                        feed.AllArticles.Add(article);
                    }
                }

                _imageDownloadService.Download(feed);

                //no more entries 
                if (feed.AllArticles.Count <= i)
                    return;
            }
        }