public async Task <Publication> Run( [ActivityTrigger] PublicationConfiguration publicationConfiguration, ILogger logger) { logger.LogInformation($"Started {nameof(GetLatestPublicationFromWebActivity)} for { publicationConfiguration.PublicationSourceOwner } { publicationConfiguration.PublicationSourceName}."); Publication publication = new NullPublication(publicationConfiguration.PublicationSourceName); using (var xmlReader = XmlReader.Create(publicationConfiguration.PublicationSourceUrl, new XmlReaderSettings() { Async = true })) { var parser = new RssParser(); var reader = new RssFeedReader(xmlReader, parser); while (await reader.Read()) { if (reader.ElementType == SyndicationElementType.Item) { ISyndicationItem item = await reader.ReadItem(); publication = MapToPublication(publicationConfiguration, item); break; } } } logger.LogInformation($"Found publication on web for {publicationConfiguration.PublicationSourceName}: " + $"ID: {publication.Id}," + $"Date: {publication.PublicationDate:F}."); return(publication); }
public async Task <FeedItem[]> GetNewsFeed(CancellationToken cancelToken) { if (cancelToken.IsCancellationRequested) { var rssFeedItems = new List <FeedItem>(); using (var xmlReader = XmlReader.Create(_FeedUri, new XmlReaderSettings() { Async = true })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read().ConfigureAwait(false)) { if (feedReader.ElementType == Microsoft.SyndicationFeed.SyndicationElementType.Item) { ISyndicationItem item = await feedReader.ReadItem().ConfigureAwait(false); rssFeedItems.Add(item.ConvertToNewsItem()); } } } return(rssFeedItems.OrderByDescending(p => p.PublishDate).ToArray()); } else { return(null); } }
public FeedItem(ISyndicationItem item, SyndicationFormat sourceFormat) { Title = item.Title.Text; PubDate = item.PublishedDate.DateTime; Author = item.Authors[0].Name; Content = sourceFormat == SyndicationFormat.Atom10 ? item.Content.Text : item.Summary.Text; }
public async Task <List <SyndicationItem> > GetNewsAsync() { var items = new List <SyndicationItem>(); using (var xmlReader = XmlReader.Create("http://scripting.com/rss.xml", new XmlReaderSettings { Async = true })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { switch (feedReader.ElementType) { case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); items.Add(new SyndicationItem(item)); break; default: break; } } } return(items); }
private static async Task <List <SyndicationItem> > GetItemFeed() { var ItemFeed = new List <SyndicationItem>(); using (var http = new HttpClient()) { var strFeed = await http.GetStringAsync("http://www.minutoseguros.com.br/blog/feed/"); if (!string.IsNullOrWhiteSpace(strFeed)) { using (var xmlReader = XmlReader.Create(new StringReader(strFeed))) { xmlReader.Read(); var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { switch (feedReader.ElementType) { case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); ItemFeed.Add((SyndicationItem)item); break; } } } } } return(ItemFeed); }
public async Task <IActionResult> Get() { var feedUri = "http://www.dailyherald.com/rss/feed/?feed=news_top10"; var rssNewsItems = new List <FeedItem>(); using (var xmlReader = XmlReader.Create(feedUri, new XmlReaderSettings() { Async = true })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { if (feedReader.ElementType == SyndicationElementType.Item) { ISyndicationItem item = await feedReader.ReadItem(); rssNewsItems.Add(item.ConvertToNewsItem()); } } } var articlesByDate = rssNewsItems.OrderByDescending(p => p.PublishDate).ToArray(); return(Ok(articlesByDate)); }
public async Task <List <ISyndicationItem> > GetNewsFeed() { var rssNewsItems = new List <ISyndicationItem>(); var httpClient = new HttpClient() { Timeout = TimeSpan.FromMinutes(10) }; var xml = await httpClient.GetStringAsync(_feedUri); using (var xmlReader = XmlReader.Create(new StringReader(xml))) { XmlFeedReader feedReader = GetXmlFeedReader(xml, xmlReader); while (await feedReader.Read()) { try { if (feedReader.ElementType == SyndicationElementType.Item) { ISyndicationItem item = await feedReader.ReadItem(); rssNewsItems.Add(item); } } catch (Exception e) { } } } return(rssNewsItems.OrderByDescending(p => p.LastUpdated).ToList()); }
public static NewsItem ConvertToNewsItem(this ISyndicationItem item) { return(new NewsItem(title: item.Title, excerpt: item.Description.PlainTextTruncate(200), publishDate: item.Published.UtcDateTime, uri: item.Links.First().Uri.AbsoluteUri)); }
public async Task <NewsArticle[]> GetNewsFeedAsync(string feed) { var rssNewsItems = new List <NewsArticle>(); using (var xmlReader = XmlReader.Create(feed, new XmlReaderSettings() { Async = true })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read().ConfigureAwait(false)) { if (feedReader.ElementType == SyndicationElementType.Item) { ISyndicationItem item = await feedReader.ReadItem().ConfigureAwait(false); var lcTitle = item.Title.ToLower(); if (lcTitle.Contains("covid") || lcTitle.Contains("corona")) { rssNewsItems.Add(new NewsArticle() { Title = item.Title.ToString(), Excerpt = item.Description.ToString(), PublishDate = item.Published.DateTime, Uri = item.Links.FirstOrDefault().Uri //.AbsoluteUri for string }); } } } } return(rssNewsItems.OrderByDescending(p => p.PublishDate).ToArray()); }
public static NewsItem ConvertToNewsItem(this ISyndicationItem item) { return(new NewsItem(title: item.Title, content: item.Description, posted: item.Published.UtcDateTime, link: item.Links.First().Uri.AbsoluteUri)); }
// RSS Feed conversion. RSS has no summary private FeedEntry CreateFeedEntry(ISyndicationItem entry, Feed feed) { var link = GetLinkFromFeedEntry(entry.Links); var feedEntry = new FeedEntry() { FeedTitle = feed.Name, Id = entry.Id, Title = entry.Title, Summary = null, Description = entry.Description, LastUpdated = entry.LastUpdated, Published = entry.Published, Link = link }; if (feedEntry.Id == null) { feedEntry.Id = CreateIdFromFeedEntry(feedEntry); } //TODO: This could be better if (entry.Categories != null) { foreach (var category in entry.Categories) { feedEntry.Tags.Add(category.Name); } } return(feedEntry); }
public async Task <List <SyndicationItem> > GetNewsAsync(string url) { var items = new List <SyndicationItem>(); using (var xmlReader = XmlReader.Create(url, new XmlReaderSettings { Async = true })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { switch (feedReader.ElementType) { case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); items.Add(new SyndicationItem(item)); break; default: break; } } } await Task.Delay(5000); return(items); }
public FeedItem(ISyndicationItem item, DateTimeOffset recent) { Title = item.Title; Link = item.Links.FirstOrDefault(x => x.RelationshipType == RssLinkTypes.Alternate)?.Uri.ToString() ?? item.Id; Published = item.Published != default ? item.Published : item.LastUpdated; Recent = Published > recent; Description = item.Description; Links = item.Links .Where(x => !string.IsNullOrEmpty(x.MediaType)) .GroupBy(x => x.MediaType) .Select(x => x.First()) .ToDictionary(x => x.MediaType, x => x.Uri.ToString()); ISyndicationPerson person = item.Contributors.FirstOrDefault(x => x.RelationshipType == "author"); if (person != null) { Author = person.Name ?? person.Email; } AtomEntry atom = item as AtomEntry; if (atom != null && !string.IsNullOrEmpty(atom.Summary)) { Description = atom.Summary; } }
internal void DisplayItem(ISyndicationItem item) { Console.WriteLine("--- Item Read ---"); Console.WriteLine("Title: " + item.Title); Console.WriteLine("Description: " + item.Description); Console.WriteLine("PubDate: " + item.Published); Console.WriteLine(); }
// Read an RssFeed public static async Task CreateRssFeedReaderExample(string filePath) { // Create an XmlReader // Example: ..\tests\TestFeeds\rss20-2items.xml using (var xmlReader = XmlReader.Create(filePath, new XmlReaderSettings() { Async = true })) { // Instantiate an Rss20FeedReader using the XmlReader. // This will assign as default an Rss20FeedParser as the parser. var feedReader = new RssFeedReader(xmlReader); // // Read the feed while (await feedReader.Read()) { switch (feedReader.ElementType) { // Read category case SyndicationElementType.Category: ISyndicationCategory category = await feedReader.ReadCategory(); break; // Read Image case SyndicationElementType.Image: ISyndicationImage image = await feedReader.ReadImage(); break; // Read Item case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); break; // Read link case SyndicationElementType.Link: ISyndicationLink link = await feedReader.ReadLink(); break; // Read Person case SyndicationElementType.Person: ISyndicationPerson person = await feedReader.ReadPerson(); break; // Read content default: ISyndicationContent content = await feedReader.ReadContent(); break; } } } }
public static async Task <List <ComplexSyndication> > Get(params Uri[] url) { var parser = new RssParser(); var toBeProcessed = new List <Task <HttpResponseMessage> >(); var httpClient = HttpClientFactory.Get(); foreach (var u in url) { var t = httpClient.GetAsync(u); toBeProcessed.Add(t); } Task.WaitAll(toBeProcessed.ToArray()); var syndications = new List <ComplexSyndication>(); foreach (var result in toBeProcessed) { var res = result.Result; var resultContent = await res.Content.ReadAsStringAsync(); using (var xmlReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(resultContent)))) { var feedReader = new RssFeedReader(xmlReader); var syndication = new ComplexSyndication(); while (await feedReader.Read()) { switch (feedReader.ElementType) { case SyndicationElementType.Item: //ISyndicationContent is a raw representation of the feed ISyndicationContent content = await feedReader.ReadContent(); ISyndicationItem item = parser.CreateItem(content); ISyndicationContent outline = content.Fields.FirstOrDefault(f => f.Name == "source:outline"); var i = new ComplexSyndicationItem(item, outline); Replay.OnNext(i); syndication.Items.Add(i); break; default: break; } } syndications.Add(syndication); } } Replay.OnCompleted(); return(syndications); }
public override async Task <RSSEntity> GetEntityAsync() { try { var client = new HttpClient(); var stream = await client.GetStreamAsync(_feed); using (XmlReader reader = XmlReader.Create(stream)) { var feedReader = new RssFeedReader(reader); var result = new RSSEntity(); result.Items = new List <RSSEntityItem>(); while (await feedReader.Read() && result.Items.Count <= 3) { switch (feedReader.ElementType) { // Read category case SyndicationElementType.Category: //DON't Care about categories ISyndicationCategory category = await feedReader.ReadCategory(); break; // Read Image case SyndicationElementType.Image: //DON't Care about images ISyndicationImage image = await feedReader.ReadImage(); break; // Read Item case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); result.Items.Add(new RSSEntityItem { Title = item.Title, Summary = item.Description, Link = item.Links.FirstOrDefault().Uri.ToString() }); break; // Read link case SyndicationElementType.Link: //DON't Care aboutISyndicationLink link = await feedReader.ReadLink(); break; // Read Person case SyndicationElementType.Person: //DON't Care about ISyndicationPerson person = await feedReader.ReadPerson(); break; // Read content default: //DON't Care about ISyndicationContent content = await feedReader.ReadContent(); break; } } return(result); } } catch (Exception) { throw; } }
private async Task <bool> retrievePosts(Feed feed) { using (var xmlReader = XmlReader.Create("https://azurecomcdn.azureedge.net/en-us/blog/feed/", new XmlReaderSettings() { Async = true })) { // Instantiate an Rss20FeedReader using the XmlReader. // This will assign as default an Rss20FeedParser as the parser. var feedReader = new RssFeedReader(xmlReader); // // Read the feed while (await feedReader.Read()) { switch (feedReader.ElementType) { // Read category case SyndicationElementType.Category: ISyndicationCategory category = await feedReader.ReadCategory(); break; // Read Image case SyndicationElementType.Image: ISyndicationImage image = await feedReader.ReadImage(); break; // Read Item case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); break; // Read link case SyndicationElementType.Link: ISyndicationLink link = await feedReader.ReadLink(); break; // Read Person case SyndicationElementType.Person: ISyndicationPerson person = await feedReader.ReadPerson(); break; // Read content default: ISyndicationContent content = await feedReader.ReadContent(); break; } } } return(true); }
public static async Task TestReadFeedElements(XmlReader outerXmlReader) { using (var xmlReader = outerXmlReader) { var reader = new RssFeedReader(xmlReader); int items = 0; while (await reader.Read()) { switch (reader.ElementType) { case SyndicationElementType.Person: ISyndicationPerson person = await reader.ReadPerson(); Assert.True(person.Email == "John Smith"); break; case SyndicationElementType.Link: ISyndicationLink link = await reader.ReadLink(); Assert.True(link.Length == 123); Assert.True(link.MediaType == "testType"); Assert.True(link.Uri.OriginalString == "http://example.com/"); break; case SyndicationElementType.Image: ISyndicationImage image = await reader.ReadImage(); Assert.True(image.Title == "Microsoft News"); Assert.True(image.Description == "Test description"); Assert.True(image.Url.OriginalString == "http://2.bp.blogspot.com/-NA5Jb-64eUg/URx8CSdcj_I/AAAAAAAAAUo/eCx0irI0rq0/s1600/bg_Microsoft_logo3-20120824073001907469-620x349.jpg"); break; case SyndicationElementType.Item: items++; ISyndicationItem item = await reader.ReadItem(); if (items == 1) { Assert.True(item.Title == "Lorem ipsum 2017-07-06T20:25:00+00:00"); Assert.True(item.Description == "Exercitation sit dolore mollit et est eiusmod veniam aute officia veniam ipsum."); Assert.True(item.Links.Count() == 3); } else if (items == 2) { Assert.True(item.Title == "Lorem ipsum 2017-07-06T20:24:00+00:00"); Assert.True(item.Description == "Do ipsum dolore veniam minim est cillum aliqua ea."); Assert.True(item.Links.Count() == 3); } break; default: break; } } } }
private static async Task <List <object> > ParseExport(XmlReader xmlReader) { List <object> result = new List <object>(); { var feedReader = new AtomFeedReader(xmlReader); while (await feedReader.Read()) { switch (feedReader.ElementType) { // Read category case SyndicationElementType.Category: ISyndicationCategory category = await feedReader.ReadCategory(); result.Add(category); break; // Read Image case SyndicationElementType.Image: ISyndicationImage image = await feedReader.ReadImage(); result.Add(image); break; // Read Item case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); result.Add(item); break; // Read link case SyndicationElementType.Link: ISyndicationLink link = await feedReader.ReadLink(); result.Add(link); break; // Read Person case SyndicationElementType.Person: ISyndicationPerson person = await feedReader.ReadPerson(); result.Add(person); break; // Read content default: ISyndicationContent content = await feedReader.ReadContent(); result.Add(content); break; } } return(result); } }
private async Task <List <NewsItem> > GetFeedInternal() { var opml = XDocument.Load(_config.OpmlFile); var feedData = from item in opml.Descendants("outline") select new { Source = (string)item.Attribute("title"), XmlUrl = (string)item.Attribute("xmlUrl") }; var feed = new List <NewsItem>(); foreach (var currentFeed in feedData) { using (var xmlReader = XmlReader.Create(currentFeed.XmlUrl, new XmlReaderSettings() { Async = true })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { if (feedReader.ElementType == SyndicationElementType.Item) { ISyndicationItem item = await feedReader.ReadItem(); if (string.IsNullOrWhiteSpace(item.Description) || !item.Links.First().Uri.IsAbsoluteUri) { continue; } var uri = item.Links.First().Uri.AbsoluteUri; try { feed.Add(new NewsItem { Title = item.Title, Uri = uri, Excerpt = item.Description.PlainTextTruncate(120), PublishDate = item.Published.UtcDateTime, Source = currentFeed.Source ?? item.Contributors.First().Name ?? item.Contributors.First().Email, NewsType = GetNewsTypeForUri(uri) }); } catch (Exception ex) { _log.LogError(ex.ToString()); } } } } } return(feed.OrderByDescending(f => f.PublishDate).ToList()); }
public FeedItem(ISyndicationItem item, DateTimeOffset recent, Uri website, bool truncateDescription, IExecutionContext context) { Title = item.Title; ISyndicationLink firstLink = item.Links.FirstOrDefault(x => x.RelationshipType == RssLinkTypes.Alternate); if (firstLink != null) { Link = firstLink.Uri.IsAbsoluteUri ? firstLink.Uri.AbsoluteUri : new Uri(website, firstLink.Uri).AbsoluteUri; } else { Link = item.Id; } Published = item.Published != default ? item.Published : item.LastUpdated; Recent = Published > recent; Links = item.Links .Where(x => !string.IsNullOrEmpty(x.MediaType)) .GroupBy(x => x.MediaType) .Select(x => x.First()) .ToDictionary(x => x.MediaType, x => x.Uri.ToString()); ISyndicationPerson person = item.Contributors.FirstOrDefault(x => x.RelationshipType == "author"); if (person != null) { Author = person.Name ?? person.Email; } Description = item.Description; AtomEntry atom = item as AtomEntry; if (atom != null && !string.IsNullOrEmpty(atom.Summary)) { Description = atom.Summary; } if (truncateDescription) { try { // Use the first <p> if one is found HtmlParser htmlParser = new HtmlParser(); IHtmlDocument htmlDocument = htmlParser.ParseDocument(Description); IElement element = htmlDocument.QuerySelector("p"); if (element is object && !string.IsNullOrWhiteSpace(element.OuterHtml)) { Description = element.OuterHtml; } } catch (Exception ex) { context.LogWarning($"Error parsing HTML description for feed {Title}: {ex.Message}"); } } }
public static PocketEntry ToPocketEntry(this ISyndicationItem item) { Guard.Against.Null(item, nameof(item)); return(new PocketEntry( item.Title, item.Categories.FirstOrDefault()?.Name, pubDate: item.Published.UtcDateTime, link: item.Links.FirstOrDefault()?.Uri.OriginalString)); }
public static Event ConvertToEvent(this ISyndicationItem item) { return(new Event { Title = item.Title, Description = item.Description, Category = item.Categories.First().Name, Date = item.Published.Date }); }
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory logger, IConfiguration configuration) { //These are the four default services available at Configure app.Run(async context => { var items = new List <SyndicationItem>(); using (var xmlReader = XmlReader.Create("http://scripting.com/rss.xml", new XmlReaderSettings { Async = true })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { switch (feedReader.ElementType) { case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); items.Add(new SyndicationItem(item)); break; default: break; } } } var str = new StringBuilder(); str.Append("<ul>"); foreach (var i in items) { str.Append($"<li>{i.Description}</li>"); } str.Append("</ul>"); context.Response.Headers.Add("Content-Type", "text/html"); await context.Response.WriteAsync($@" <html> <head> <link rel=""stylesheet"" type=""text/css"" href=""http://fonts.googleapis.com/css?family=Germania+One""> <style> body {{ font-family: 'Germania One', serif; font-size: 24px; }} </style> </head> <body> {str.ToString()} </body> </html> "); }); }
static async Task MainAsync(string[] args) { var items = new List <SyndicationItem>(); using (var xmlReader = XmlReader.Create("http://scripting.com/rss.xml", new XmlReaderSettings { Async = true })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { switch (feedReader.ElementType) { case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); items.Add(new SyndicationItem(item)); break; default: break; } } } var str = new StringBuilder(); str.Append("<ul>"); foreach (var i in items) { str.Append($"<li>{i.Description}</li>"); } str.Append("</ul>"); var html = $@" <html> <head> <link rel=""stylesheet"" type=""text/css"" href=""http://fonts.googleapis.com/css?family=Germania+One""> <style> body {{ font-family: 'Germania One', serif; font-size: 24px; }} </style> </head> <body> {str.ToString()} </body> </html> "; var path = Path.Combine(Directory.GetCurrentDirectory(), "rss.html"); File.WriteAllText(path, html); }
public static List <Tuple <string, string, string, DateTimeOffset> > Latest5PostsFromRss(string filePath) { List <Tuple <string, string, string, DateTimeOffset> > result = new List <Tuple <string, string, string, DateTimeOffset> >(); using (var xmlReader = XmlReader.Create(filePath, new XmlReaderSettings())) { var feedReader = new RssFeedReader(xmlReader); while (feedReader.Read().Result) { switch (feedReader.ElementType) { // Read Item case SyndicationElementType.Item: ISyndicationItem item = feedReader.ReadItem().Result; //AsyncHelper.ci.GetResult(feedReader.ReadItem()); result.Add(new Tuple <string, string, string, DateTimeOffset>(item.Title, item.Links.First().Uri.ToString(), item.Description, item.Published)); break; #region MyRegion //// Read category //case SyndicationElementType.Category: // ISyndicationCategory category = await feedReader.ReadCategory(); // break; //// Read Image //case SyndicationElementType.Image: // ISyndicationImage image = await feedReader.ReadImage(); // break; //// Read link //case SyndicationElementType.Link: // ISyndicationLink link = await feedReader.ReadLink(); // break; //// Read Person //case SyndicationElementType.Person: // ISyndicationPerson person = await feedReader.ReadPerson(); // break; //// Read content //default: // ISyndicationContent content = await feedReader.ReadContent(); // break; #endregion } if (result.Count == 5) { break; } } } return(result); }
public ComplexSyndicationItem(ISyndicationItem item, ISyndicationContent outline = null) { Item = item; if (outline != null) { Outline = new Outline { Attributes = outline.Attributes.ToDictionary(x => x.Name, x => x.Value) }; } }
public TorrentzMovieInfo(ISyndicationItem item) { Link = item.Id; Date = item.PublishDate; Raw = item.Title; ParseTitle(item.Title); summary = item.Summary; ParseSummary(); }
public OutlineSyndicationItem(ISyndicationItem basic, ISyndicationContent outline) { Item = basic; if (outline != null) { Outline = new Outline { Text = outline.Attributes.FirstOrDefault(x => x.Name.Equals("text", StringComparison.OrdinalIgnoreCase))?.Value, Attributes = outline.Attributes.ToDictionary(x => x.Name, x => x.Value) }; } }