public async Task <FeedEntity> GetFeedAsyc(string url, string userId) { var feed = new FeedEntity(userId); feed.Items = new List <FeedItemEntity>(); feed.Url = url; using (var httpClient = _httpClientFactory.CreateClient()) { var stream = await httpClient.GetStreamAsync(url); using (var xmlReader = XmlReader.Create(stream, new XmlReaderSettings() { Async = true })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { switch (feedReader.ElementType) { case SyndicationElementType.Category: case SyndicationElementType.Person: case SyndicationElementType.Link: break; case SyndicationElementType.Item: var item = await feedReader.ReadItem(); var feedItem = new FeedItemEntity(feed.Id); feedItem.Title = item.Title; feedItem.Content = item.Description; feedItem.Url = item.Links.FirstOrDefault()?.Uri.ToString(); feed.Items.Add(feedItem); break; case SyndicationElementType.Image: var image = await feedReader.ReadImage(); feed.Image = image.Url.ToString(); break; default: var content = await feedReader.ReadContent(); if (content.Name.Equals("title", StringComparison.OrdinalIgnoreCase)) { feed.Title = content.Value; } if (content.Name.Equals("description", StringComparison.OrdinalIgnoreCase)) { feed.Description = content.Value; } break; } } } } return(feed); }
// 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 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 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 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 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 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); }
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; } } } }
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; }
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); }