public async Task ReadSequential() { using (var xmlReader = XmlReader.Create(@"..\..\..\TestFeeds\rss20.xml", new XmlReaderSettings() { Async = true })) { var reader = new RssFeedReader(xmlReader); await reader.Read(); ISyndicationContent content = await reader.ReadContent(); content = await reader.ReadContent(); content = await reader.ReadContent(); } }
// 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); }
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 async Task CompareContents() { string filePath = @"..\..\..\TestFeeds\internetRssFeed.xml"; string res = null; using (var xmlReader = XmlReader.Create(filePath, new XmlReaderSettings() { Async = true })) { var reader = new RssFeedReader(xmlReader); var sw = new StringWriterWithEncoding(Encoding.UTF8); using (var xmlWriter = XmlWriter.Create(sw)) { var writer = new RssFeedWriter(xmlWriter); while (await reader.Read()) { switch (reader.ElementType) { case SyndicationElementType.Item: await writer.Write(await reader.ReadItem()); break; case SyndicationElementType.Person: await writer.Write(await reader.ReadPerson()); break; case SyndicationElementType.Image: await writer.Write(await reader.ReadImage()); break; default: await writer.Write(await reader.ReadContent()); break; } } await writer.Flush(); } res = sw.ToString(); } await CompareFeeds(new RssFeedReader(XmlReader.Create(filePath)), new RssFeedReader(XmlReader.Create(new StringReader(res)))); }
public async Task Echo() { string res = null; using (var xmlReader = XmlReader.Create(@"..\..\..\TestFeeds\rss20-2items.xml", new XmlReaderSettings() { Async = true })) { var reader = new RssFeedReader(xmlReader); var sw = new StringWriterWithEncoding(Encoding.UTF8); using (var xmlWriter = XmlWriter.Create(sw)) { var writer = new RssFeedWriter(xmlWriter); while (await reader.Read()) { switch (reader.ElementType) { case SyndicationElementType.Item: await writer.Write(await reader.ReadItem()); break; case SyndicationElementType.Person: await writer.Write(await reader.ReadPerson()); break; case SyndicationElementType.Image: await writer.Write(await reader.ReadImage()); break; default: await writer.Write(await reader.ReadContent()); break; } } await writer.Flush(); } res = sw.ToString(); Assert.True(res == "<?xml version=\"1.0\" encoding=\"utf-8\"?><rss version=\"2.0\"><channel><title asd=\"123\">Lorem ipsum feed for an interval of 1 minutes</title><description>This is a constantly updating lorem ipsum feed</description><link length=\"123\" type=\"testType\">http://example.com/</link><image><url>http://2.bp.blogspot.com/-NA5Jb-64eUg/URx8CSdcj_I/AAAAAAAAAUo/eCx0irI0rq0/s1600/bg_Microsoft_logo3-20120824073001907469-620x349.jpg</url><title>Microsoft News</title><link>http://www.microsoft.com/news</link><description>Test description</description></image><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Jul 2017 20:25:17 GMT</lastBuildDate><managingEditor>John Smith</managingEditor><pubDate>Thu, 06 Jul 2017 20:25:00 GMT</pubDate><copyright>Michael Bertolacci, licensed under a Creative Commons Attribution 3.0 Unported License.</copyright><ttl>60</ttl><item><title>Lorem ipsum 2017-07-06T20:25:00+00:00</title><enclosure url=\"http://www.scripting.com/mp3s/weatherReportSuite.mp3\" length=\"12216320\" type=\"audio/mpeg\" /><link>http://example.com/test/1499372700</link><guid>http://example.com/test/1499372700</guid><description>Exercitation sit dolore mollit et est eiusmod veniam aute officia veniam ipsum.</description><author>John Smith</author><pubDate>Thu, 06 Jul 2017 20:25:00 GMT</pubDate></item><item><title>Lorem ipsum 2017-07-06T20:24:00+00:00</title><link>http://example.com/test/1499372640</link><guid>http://example.com/test/1499372640</guid><enclosure url=\"http://www.scripting.com/mp3s/weatherReportSuite.mp3\" length=\"12216320\" type=\"audio/mpeg\" /><description>Do ipsum dolore veniam minim est cillum aliqua ea.</description><author>John Smith</author><pubDate>Thu, 06 Jul 2017 20:24:00 GMT</pubDate></item></channel></rss>"); } await RssReader.TestReadFeedElements(XmlReader.Create(new StringReader(res))); }
public RssContent() { using (var xmlReader = XmlReader.Create("C:/Users/Developer/Desktop.brisbane-city-council.rss", new XmlReaderSettings() { Async = true })) { var feedReader = new RssFeedReader(xmlReader); 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 List <ComplexSyndication> GetObservable(params Uri[] url) { var httpClient = HttpClientFactory.Get(); var feeds = url.ToObservable() .Select(u => Observable.FromAsync(() => httpClient.GetAsync(u))) .Merge(2); var syndications = new List <ComplexSyndication>(); var parser = new RssParser(); feeds.Subscribe(async msg => { var resultContent = await msg.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"); syndication.Items.Add(new ComplexSyndicationItem(item, outline)); break; default: break; } } syndications.Add(syndication); } }, ex => { }, () => { }); return(syndications); }
/// <summary> /// Feed Reader /// https://github.com/dotnet/SyndicationFeedReaderWriter/blob/master/examples/ReadRssItemWithCustomFieldsExample.cs /// </summary> /// <param name="filePath"></param> /// <returns></returns> public static async Task ReadAtomFeed(string filepath) { try { // // Create an XmlReader from file using (var xmlReader = XmlReader.Create(filepath, new XmlReaderSettings() { Async = true })) { var parser = new RssParser(); var feedReader = new RssFeedReader(xmlReader, parser); // // Read the feed while (await feedReader.Read()) { if (feedReader.ElementType == SyndicationElementType.Item) { // // Read the item as generic content ISyndicationContent content = await feedReader.ReadContent(); // // Parse the item if needed (unrecognized tags aren't available) // Utilize the existing parser ISyndicationItem item = parser.CreateItem(content); Console.WriteLine($"Item: {item.Title}"); // // Get <example:customElement> field ISyndicationContent customElement = content.Fields.FirstOrDefault(f => f.Name == "example:customElement"); if (customElement != null) { Console.WriteLine($"{customElement.Name}: {customElement.Value}"); } } } } } catch (Exception ex) { Console.WriteLine($"An error occurred: {ex.InnerException.Message}{Environment.NewLine}{ex.InnerException.ToString()}"); } }
public static async Task <List <ISyndicationContent> > RssReadFeedContent(XmlReader xmlReader) { var list = new List <ISyndicationContent>(); using (XmlReader xReader = xmlReader) { var reader = new RssFeedReader(xReader); while (await reader.Read()) { list.Add(await reader.ReadContent()); } } return(list); }
public async Task <Feed> GetFeed(string url) { var feed = new Feed(); feed.FeedUrl = url; using (XmlReader xmlReader = XmlReader.Create(feed.FeedUrl, new XmlReaderSettings() { Async = true })) { var reader = new RssFeedReader(xmlReader); while (await reader.Read()) { switch (reader.ElementType) { case SyndicationElementType.Content: var content = await reader.ReadContent(); if (content.Name == "title") { feed.Title = content.Value; } else if (content.Name == "description") { feed.Description = content.Value; } break; case SyndicationElementType.Image: var img = await reader.ReadImage(); feed.ImageUrl = img.Url.AbsoluteUri; break; case SyndicationElementType.Link: var link = await reader.ReadLink(); feed.Link = link.Uri.AbsoluteUri; break; } } } return(feed); }
public async Task ReadItemAsContent() { using (var xmlReader = XmlReader.Create(@"..\..\..\TestFeeds\rss20.xml", new XmlReaderSettings() { Async = true })) { var reader = new RssFeedReader(xmlReader); while (await reader.Read()) { if (reader.ElementType == SyndicationElementType.Item) { // Read as content ISyndicationContent content = await reader.ReadContent(); //ISyndicationItem item = await reader.ReadItem(); var fields = content.Fields.ToArray(); Assert.Equal(fields.Length, 6); Assert.Equal("title", fields[0].Name); Assert.False(string.IsNullOrEmpty(fields[0].Value)); Assert.Equal("description", fields[1].Name); Assert.False(string.IsNullOrEmpty(fields[1].Value)); Assert.Equal("link", fields[2].Name); Assert.False(string.IsNullOrEmpty(fields[2].Value)); Assert.Equal("guid", fields[3].Name); Assert.Equal(fields[3].Attributes.Count(), 1); Assert.False(string.IsNullOrEmpty(fields[3].Value)); Assert.Equal("creator", fields[4].Name); Assert.Equal("http://purl.org/dc/elements/1.1/", fields[4].Namespace); Assert.False(string.IsNullOrEmpty(fields[4].Value)); Assert.Equal("pubDate", fields[5].Name); Assert.False(string.IsNullOrEmpty(fields[5].Value)); } } } }
public static async Task ReadFeed(string filepath) { // // Create an XmlReader from file // Example: ..\tests\TestFeeds\rss20-2items.xml using (var xmlReader = XmlReader.Create(filepath, new XmlReaderSettings() { Async = true })) { var parser = new RssParser(); var feedReader = new RssFeedReader(xmlReader, parser); // // Read the feed while (await feedReader.Read()) { if (feedReader.ElementType == SyndicationElementType.Item) { // // Read the item as generic content ISyndicationContent content = await feedReader.ReadContent(); // // Parse the item if needed (unrecognized tags aren't available) // Utilize the existing parser ISyndicationItem item = parser.CreateItem(content); Console.WriteLine($"Item: {item.Title}"); // // Get <example:customElement> field ISyndicationContent customElement = content.Fields.FirstOrDefault(f => f.Name == "example:customElement"); if (customElement != null) { Console.WriteLine($"{customElement.Name}: {customElement.Value}"); } } } } }
private async Task ReadWhile() { using (var xmlReader = XmlReader.Create(@"..\..\..\TestFeeds\rss20.xml", new XmlReaderSettings() { Async = true })) { var reader = new RssFeedReader(xmlReader); while (await reader.Read()) { switch (reader.ElementType) { case SyndicationElementType.Link: ISyndicationLink link = await reader.ReadLink(); break; case SyndicationElementType.Item: ISyndicationItem item = await reader.ReadItem(); break; case SyndicationElementType.Person: ISyndicationPerson person = await reader.ReadPerson(); break; case SyndicationElementType.Image: ISyndicationImage image = await reader.ReadImage(); break; default: ISyndicationContent content = await reader.ReadContent(); break; } } } }
private async Task readFeed() { using (XmlReader xmlReader = XmlReader.Create("https://blogs.msdn.microsoft.com/dotnet/feed/", new XmlReaderSettings() { Async = true })) { var reader = new RssFeedReader(xmlReader); while (await reader.Read()) { if (reader.ElementType == SyndicationElementType.Item) { var content = await reader.ReadContent(); _articleList.Add(mapArticle(content)); } } } _lastFetchDate = DateTime.Now; }
public async Task <EmbedBuilder> TrackFeeds() { while (true) { foreach (var kvp in _subs) { if (kvp.Value.Count == 0) { continue; } if (!_lastPosts.TryGetValue(kvp.Key, out DateTime lastTime)) { lastTime = _lastPosts.AddOrUpdate(kvp.Key, DateTime.UtcNow, (k, old) => DateTime.UtcNow); } var rssUrl = kvp.Key; try { using (var xmlReader = XmlReader.Create(rssUrl, new XmlReaderSettings() { Async = true })) { var feedReader = new RssFeedReader(xmlReader); var embed = new EmbedBuilder() .WithAuthor(kvp.Key) .WithOkColor(); while (await feedReader.Read() && feedReader.ElementType != SyndicationElementType.Item) { switch (feedReader.ElementType) { case SyndicationElementType.Link: var uri = await feedReader.ReadLink(); embed.WithAuthor(kvp.Key, url: uri.Uri.AbsoluteUri); break; case SyndicationElementType.Content: var content = await feedReader.ReadContent(); break; case SyndicationElementType.Category: break; case SyndicationElementType.Image: ISyndicationImage image = await feedReader.ReadImage(); embed.WithThumbnailUrl(image.Url.AbsoluteUri); break; default: break; } } ISyndicationItem item = await feedReader.ReadItem(); if (item.Published.UtcDateTime <= lastTime) { continue; } var desc = item.Description.StripHTML(); lastTime = item.Published.UtcDateTime; var title = string.IsNullOrWhiteSpace(item.Title) ? "-" : item.Title; desc = Format.Code(item.Published.ToString()) + Environment.NewLine + desc; var link = item.Links.FirstOrDefault(); if (link != null) { desc = $"[link]({link.Uri}) " + desc; } var img = item.Links.FirstOrDefault(x => x.RelationshipType == "enclosure")?.Uri.AbsoluteUri ?? Regex.Match(item.Description, @"src=""(?<src>.*?)""").Groups["src"].ToString(); if (!string.IsNullOrWhiteSpace(img) && Uri.IsWellFormedUriString(img, UriKind.Absolute)) { embed.WithImageUrl(img); } embed.AddField(title, desc); //send the created embed to all subscribed channels var sendTasks = kvp.Value .Where(x => x.GuildConfig != null) .Select(x => _client.GetGuild(x.GuildConfig.GuildId) ?.GetTextChannel(x.ChannelId)) .Where(x => x != null) .Select(x => x.EmbedAsync(embed)); _lastPosts.AddOrUpdate(kvp.Key, item.Published.UtcDateTime, (k, old) => item.Published.UtcDateTime); await Task.WhenAll(sendTasks).ConfigureAwait(false); } } catch { } } await Task.Delay(10000); } }
public async Task <Channel9RssResult> Parse(Uri rssUri) { var result = new Channel9RssResult(); result.SourceUrl = rssUri; try { using (var client = new HttpClient()) { result.RawXml = await client.GetStringAsync(rssUri); using (var xmlReader = XmlReader.Create(new StringReader(result.RawXml), new XmlReaderSettings() { Async = false })) { var feedReader = new RssFeedReader(xmlReader); 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: // parse the syndication item ISyndicationItem item = await feedReader.ReadItem(); result.SyndicationItems.Add(item); // then construct a session info var si = new SessionInfo(); si.SessionID = item.Id.Substring(item.Id.LastIndexOf("/", StringComparison.InvariantCultureIgnoreCase) + 1); si.Title = item.Title; si.SessionSite = new Uri(item.Id); si.PublishDate = item.Published.DateTime; si.Presenter = item.Contributors.FirstOrDefault()?.Name; result.Sessions.Add(si); foreach (var v in item.Links) { if (!string.IsNullOrWhiteSpace(v.MediaType)) { si.VideoRecordings.Add(new VideoRecording() { SessionInfo = si, Url = v.Uri, MediaType = v.MediaType, Length = v.Length }); } } 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; } } } } } catch (Exception ex) { result.Exceptions = new List <Exception>(); result.Exceptions.Add(ex); } return(result); }
private async Task ProcessFeed(XmlReader reader) { // https://github.com/dotnet/SyndicationFeedReaderWriter var feedReader = new RssFeedReader(reader); var latest = this.feed.LatestDownload; while (await feedReader.Read()) { switch (feedReader.ElementType) { // Read category case SyndicationElementType.Category: _ = await feedReader.ReadCategory(); break; // Read Image case SyndicationElementType.Image: _ = await feedReader.ReadImage(); break; // Read Item case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); var lnk = item.Links.FirstOrDefault(l => l.RelationshipType == "enclosure"); var pubdate = item.Published.Year > 2000 ? item.Published : item.LastUpdated; if (lnk != null && pubdate > this.feed.LatestDownload) { await this.DownloadFile(lnk.Uri, this.feed.Name, pubdate, item.Title); if (pubdate > latest) { latest = item.Published; } } break; // Read link case SyndicationElementType.Link: _ = await feedReader.ReadLink(); break; // Read Person case SyndicationElementType.Person: _ = await feedReader.ReadPerson(); break; // Read content default: ISyndicationContent content = await feedReader.ReadContent(); if (string.IsNullOrWhiteSpace(this.feed.Name) && content.Name == "title") { // only set if not already set this.feed.Name = content.Value; } break; } } this.feed.LatestDownload = latest; }
public async Task <IEnumerable <Post> > ReadPostsAsync(string rssFeed, DateTime limit) { var key = rssFeed; if (Cache.TryGet(key, out var posts)) { return(posts); } var parser = new RssParser(); var ret = new List <Post>(); var page = 0; while (true) { page++; var url = page == 1 ? rssFeed : rssFeed + $"?paged={page}"; var response = await httpClient.GetAsync(url); var feedAsString = string.Empty; if (response.StatusCode != System.Net.HttpStatusCode.OK) { break; } else { feedAsString = await response.Content.ReadAsStringAsync(); } using (var memoryFeed = new MemoryStream(Encoding.UTF8.GetBytes(feedAsString))) using (var xmlReader = XmlReader.Create(memoryFeed, new XmlReaderSettings { Async = true })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { if (feedReader.ElementType == SyndicationElementType.Item) { var content = await feedReader.ReadContent(); var author = content.Fields.FirstOrDefault(f => f.Name == "creator"); var htmlContent = content.Fields.FirstOrDefault(f => f.Name == "encoded"); var item = parser.CreateItem(content); var post = new Post { Id = int.Parse(item.Id.Split('=')[1]), Title = item.Title, Content = Cleaner.CleanAnnoyingOriginalBlogCitation(htmlContent?.Value), Description = Cleaner.CleanAnnoyingOriginalBlogCitation(item.Description), Date = item.Published.DateTime, Path = item.Links.First()?.Uri.Segments.Last(), Tags = item.Categories.Select(e => e.Name).ToArray(), Author = author?.Value ?? string.Empty }; if (post.Date >= limit) { ret.Add(post); } } } if (ret.Any() && ret.Min(e => e.Date) < limit) { break; } } } Cache.Put(key, ret, TimeSpan.FromHours(1)); return(ret); }
public async Task <Feed> GetFeed() { if (cachedFeed != null) { return(cachedFeed); } if (string.IsNullOrWhiteSpace(feedPath)) { return(new Feed( "Latest news from Koasta", DateTime.Now, new List <FeedItem>() )); } var items = new List <FeedItem>(); string description = ""; DateTime pubDate = DateTime.Now; try { using var xmlReader = XmlReader.Create(feedPath, new XmlReaderSettings() { Async = true }); var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read().ConfigureAwait(false)) { switch (feedReader.ElementType) { // Read Item case SyndicationElementType.Item: var item = await feedReader.ReadItem().ConfigureAwait(false); items.Add(new FeedItem( item.Title, item.Links.FirstOrDefault()?.Uri?.ToString(), item.Description, item.Published.DateTime )); break; default: var content = await feedReader.ReadContent().ConfigureAwait(false); if (content.Name.Equals("description", StringComparison.OrdinalIgnoreCase)) { description = content.Value; } else if (content.Name.Equals("pubDate", StringComparison.OrdinalIgnoreCase)) { pubDate = DateTime.Parse(content.Value); } break; } } } catch (Exception) { return(new Feed( "Latest news from Koasta", DateTime.Now, new List <FeedItem>() )); } var ret = new Feed( description, pubDate, items.OrderByDescending(i => i.PublishDate.Ticks).ToList() ); cachedFeed = ret; return(ret); }
async static Task <List <Tuple <string, string, DateTimeOffset> > > Latest5PostsFromRssAsync(string filePath) { List <Tuple <string, string, DateTimeOffset> > result = new List <Tuple <string, string, DateTimeOffset> >(); using (var xmlReader = XmlReader.Create(filePath, new XmlReaderSettings() { Async = true })) { var feedReader = new RssFeedReader(xmlReader); 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(); result.Add(new Tuple <string, string, DateTimeOffset>(item.Title, item.Links.First().Uri.ToString(), item.Published)); 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; } if (result.Count == 5) { break; } } } return(result); }
public async Task <Podcast> ParseRssFeed(Podcast podcastData, bool isUpdate = false) { string title = string.Empty, imageUrl = string.Empty, description = string.Empty, author = string.Empty; DateTime pubDate = DateTime.MinValue, lastUpdateDate = DateTime.MinValue; List <ISyndicationItem> items = new List <ISyndicationItem>(); IEnumerable <PodcastItem> podcastItems = Enumerable.Empty <PodcastItem>(); Podcast podcast = null; using (var xmlReader = XmlReader.Create(podcastData.Url, new XmlReaderSettings { Async = true })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { switch (feedReader.ElementType) { case SyndicationElementType.Category: ISyndicationCategory category = await feedReader.ReadCategory(); break; case SyndicationElementType.Content: ISyndicationContent content = await feedReader.ReadContent(); if (content.Name == "title") { title = content.Value; } if (content.Name == "description") { description = content.Value; } if (content.Name == "author") { author = content.Value; } break; case SyndicationElementType.Image: ISyndicationImage image = await feedReader.ReadImage(); imageUrl = image.Url?.AbsoluteUri; break; case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); items.Add(item); break; case SyndicationElementType.Link: ISyndicationLink link = await feedReader.ReadLink(); break; case SyndicationElementType.Person: ISyndicationPerson person = await feedReader.ReadPerson(); break; case SyndicationElementType.None: default: break; } } pubDate = items.Max(item => item.Published.DateTime); if (isUpdate) { lastUpdateDate = podcastData.LastUpdateDate; podcastData.Author = author; podcastData.Title = title; podcastData.ImageUrl = imageUrl; podcastData.Description = description; podcastData.LastUpdateDate = pubDate; podcast = podcastData; await dataService.Update <Podcast>(podcast); } else { podcast = new Podcast(title, podcastData.Url, imageUrl, description, author) { LastUpdateDate = pubDate == DateTime.MinValue ? DateTime.Now : pubDate }; await dataService.Insert <Podcast>(podcast); } podcastItems = items.Select(item => new { item.Title, item.Description, Enclosure = item.Links.FirstOrDefault(linkItem => linkItem.RelationshipType == "enclosure"), PublishDate = item.Published.DateTime }).Select(data => new PodcastItem(data.Title, data.Description, data.Enclosure.Uri.OriginalString, data.Enclosure.Length, data.PublishDate, podcast.Id)) .Where(item => item.PublishDate > lastUpdateDate) .ToList(); await dataService.Insert(podcastItems); podcast.PodcastItems = podcastItems.ToList(); await dataService.Update(podcast); } return(podcast); }
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 parser = new RssParser(); var items = new List <OutlineSyndicationItem>(); using (var xmlReader = XmlReader.Create("https://www.nasa.gov/rss/dyn/Houston-We-Have-a-Podcast.rss", new XmlReaderSettings { Async = true })) { var feedReader = new RssFeedReader(xmlReader); 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"); items.Add(new OutlineSyndicationItem(item, outline)); break; default: break; } } } var str = new StringBuilder(); str.Append("<ul>"); foreach (var i in items) { str.Append($"<li>{i.Item.Published} - {i.Item.Description} - <span style=\"color:red;\">"); if (i.Outline != null) { str.Append("<ul>"); foreach (var o in i.Outline.Attributes) { str.Append($"<li>{o.Key} - {o.Value}</li>"); } str.Append("</ul>"); } str.Append("</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 void ReadRss() { string title = null; string description = null; string link = null; string category = null; string localstart = null; string localend = null; bool allday = false; string age = null; string cost = null; string venue = null; string venueaddress = null; using (var xmlReader = XmlReader.Create("C:/Users/Developer/Desktop/mob.rss", new XmlReaderSettings() { Async = true })) { var parser = new RssParser(); var feedReader = new RssFeedReader(xmlReader, parser); string[] attValues = new string[] { "title", "description", "link", "category", "localstart", "localend", "cdo-alldayevent" }; string[] custValues = new string[] { "Cost", "Age", "Venue", "Venue address" }; while (await feedReader.Read()) { if (feedReader.ElementType == SyndicationElementType.Item) { ISyndicationContent content = await feedReader.ReadContent(); ISyndicationItem item = parser.CreateItem(content); for (int i = 0; i < attValues.Length; i++) { ISyndicationContent value = content.Fields.FirstOrDefault(f => f.Name == attValues[i]); if (attValues[i] == "title") { title = value.Value; } else if (attValues[i] == "description") { description = WebUtility.HtmlDecode(value.Value); description = Regex.Replace(description, "<.*?>", String.Empty); } else if (attValues[i] == "link") { link = value.Value; } else if (attValues[i] == "category") { category = value.Value; } else if (attValues[i] == "localstart") { localstart = value.Value; } else if (attValues[i] == "localend") { localend = value.Value; } else if (attValues[i] == "cdo-alldayevent") { allday = Convert.ToBoolean(value.Value); } } var customFields = content.Fields.Where(f => f.Name == "customfield"); for (int i = 0; i < custValues.Length; i++) { var customatt = CustomFieldValue(customFields, custValues[i]); { if (custValues[i] == "Cost") { cost = customatt; } if (custValues[i] == "Age") { age = customatt; } if (custValues[i] == "Venue") { venue = customatt; } if (custValues[i] == "Venue address") { venueaddress = customatt; } } } RssContent.FillContent(title, description, link, category, localstart, localend, allday, cost, age, venue, venueaddress); Console.WriteLine("Title: " + RssContent.Title + Environment.NewLine + "Description: " + RssContent.Description + Environment.NewLine + "Link: " + RssContent.Link + Environment.NewLine + "Start Date: " + RssContent.StartDate + Environment.NewLine + "Start DateTime: " + RssContent.StartDateTime + Environment.NewLine + "End DateTime: " + RssContent.EndDateTime + Environment.NewLine + "All Day: " + RssContent.AllDay + Environment.NewLine + "Cost: " + RssContent.Cost + Environment.NewLine + "Age: " + RssContent.Age + Environment.NewLine + "Venue: " + RssContent.Venue + Environment.NewLine + "Address: " + RssContent.VenueAddress + Environment.NewLine); } } } string CustomFieldValue(IEnumerable <ISyndicationContent> customFields, string name) { var field = GetCustomFieldForName(customFields, name); return(field == null ? string.Empty : field.Value); } ISyndicationContent GetCustomFieldForName(IEnumerable <ISyndicationContent> customFields, string name) { foreach (var field in customFields) { foreach (var attribute in field.Attributes) { if (attribute.Name == "name" && attribute.Value == name) { return(field); } else { break; } } } return(null); } }