// 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 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; } } } }
async Task <List <ImportMessage> > ImportFeed(StreamReader reader) { using (var xmlReader = XmlReader.Create(reader, new XmlReaderSettings() { })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { if (feedReader.ElementType == SyndicationElementType.Link) { var link = await feedReader.ReadLink(); _url = link.Uri.ToString(); } if (feedReader.ElementType == SyndicationElementType.Item) { try { var item = await feedReader.ReadItem(); PostItem post = new PostItem { Author = await _db.Authors.GetItem(a => a.AppUserName == _usr), Title = item.Title, Description = item.Title, Content = item.Description, Slug = await GetSlug(item.Title), Published = item.Published.DateTime, Status = SaveStatus.Publishing }; _msgs.Add(new ImportMessage { ImportType = ImportType.Post, Status = Status.Success, Message = post.Title }); await ImportPost(post); } catch (Exception ex) { _msgs.Add(new ImportMessage { ImportType = ImportType.Post, Status = Status.Error, Message = ex.Message }); } } } } return(await Task.FromResult(_msgs)); }
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; } } } }
async Task <List <ImportMessage> > ImportFeed(StreamReader reader) { using (var xmlReader = XmlReader.Create(reader, new XmlReaderSettings() { })) { var feedReader = new RssFeedReader(xmlReader); while (await feedReader.Read()) { if (feedReader.ElementType == SyndicationElementType.Link) { var link = await feedReader.ReadLink(); _url = link.Uri.ToString(); if (_url.ToLower().EndsWith("/rss")) { _url = _url.Substring(0, _url.Length - 4); } if (_url.EndsWith("/")) { _url = _url.Substring(0, _url.Length - 1); } } if (feedReader.ElementType == SyndicationElementType.Item) { try { var item = await feedReader.ReadItem(); PostItem post = new PostItem { Author = await _db.Authors.GetItem(a => a.AppUserName == _usr), Title = item.Title, Description = item.Title, Content = item.Description, Slugtitle = await GetSlug(item.Title), Published = item.Published.DateTime, Status = SaveStatus.Publishing }; if (item.Categories != null) { var blogCats = new List <string>(); foreach (var cat in item.Categories) { blogCats.Add(cat.Name); } post.Categories = string.Join(",", blogCats); } _msgs.Add(new ImportMessage { ImportType = ImportType.Post, Status = Status.Success, Message = post.Title }); await ImportPost(post); } catch (Exception ex) { _msgs.Add(new ImportMessage { ImportType = ImportType.Post, Status = Status.Error, Message = ex.Message }); } } } } return(await Task.FromResult(_msgs)); }
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); }