public override async Task <List <DBCard> > GetCardsAsync(DBSubscription subscription) { var items = new List <DBCard>(); using (var xmlReader = XmlReader.Create(new StringReader(await BaseClient.GetStringAsync(new RestRequest($"https://www.reddit.com{subscription.SourceId}"))), new XmlReaderSettings { Async = true })) { var feedReader = new AtomFeedReader(xmlReader); while (await feedReader.Read()) { switch (feedReader.ElementType) { case SyndicationElementType.Item: var item = await feedReader.ReadItem(); var card = new DBCard { CardId = item.Id, Text = item.Title, Header = item.Categories.First().Label, Timestamp = item.LastUpdated, OriginalUrl = item.Links.First().Uri.AbsoluteUri }; items.Add(card); break; } } } return(items); }
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 <SubscriptionUpdate[]> CheckRssForUpdatesAsync(Subscription subscription, CancellationToken cancellationToken) { var url = subscription.Url; var response = await _httpClient.GetAsync(new HttpRequestMessage(HttpMethod.Get, url), cancellationToken); if (!response.IsSuccessStatusCode) { var content = await response.Content.ReadAsStringAsync(); throw new ResponseException($"Failed to check for subscription update of {url}. Response code: {response.StatusCode}, Response: {content}"); } var updates = new List <SubscriptionUpdate>(); // https://github.com/dotnet/SyndicationFeedReaderWriter using (var xmlReader = XmlReader.Create(await response.Content.ReadAsStreamAsync(), new XmlReaderSettings() { Async = true })) { // TODO: auto detect Atom vs Rss var feedReader = new AtomFeedReader(xmlReader); while (await feedReader.Read()) { switch (feedReader.ElementType) { case SyndicationElementType.Item: ISyndicationItem item = await feedReader.ReadItem(); var date = item.Published; var title = item.Title ?? $"update by {subscription.Name}"; var link = item.Links.FirstOrDefault()?.Uri?.ToString() ?? subscription.Url; updates.Add(new SubscriptionUpdate { Subscription = subscription, Name = subscription.Name, LastUpdated = date, Message = title, Url = link }); break; } } } return(updates.ToArray()); }
public override async Task <List <DBCard> > GetCardsAsync(DBSubscription subscription) { var items = new List <DBCard>(); using (var xmlReader = XmlReader.Create(new StringReader(await BaseClient.GetStringAsync(new RestRequest($"https://www.youtube.com/feeds/videos.xml?channel_id={subscription.SourceId}"))), new XmlReaderSettings { Async = true })) { var feedReader = new AtomFeedReader(xmlReader); while (await feedReader.Read()) { switch (feedReader.ElementType) { case SyndicationElementType.Item: var item = await feedReader.ReadItem(); var id = item.Id.Split(":").Last(); var card = new DBCard { CardId = item.Id, Text = item.Title, Header = item.Contributors.FirstOrDefault()?.Name, Timestamp = item.Published, OriginalUrl = $"https://www.youtube.com/embed/{id}?autoplay=1&modestbranding=0&rel=0" }; items.Add(card); break; } } } return(items); }
public async Task <AtomPage> ReadAtomPage(Stream stream) { using var xmlReader = XmlReader.Create(stream, new XmlReaderSettings { Async = true }); var feedReader = new AtomFeedReader(xmlReader); var entries = new List <AtomEntry>(); Uri?nextPageUri = null, previousPageUri = null, realTimeNotificationUri = null; while (await feedReader.Read()) { await ProcessElementAsync(); } return(new AtomPage( nextArchivePageUri: nextPageUri, previousArchivePageUri: previousPageUri, realTimeNotificationUri: realTimeNotificationUri, entries: entries )); async Task ProcessElementAsync() { switch (feedReader.ElementType) { case SyndicationElementType.Item: await ProcessItemElementAsync(); break; case SyndicationElementType.Link: await ProcessLinkElementAsync(); break; } } async Task ProcessItemElementAsync() { var item = (Microsoft.SyndicationFeed.Atom.AtomEntry) await feedReader.ReadItem(); var atomEntry = new AtomEntry( id: item.Id, published: item.Published, contentType: item.ContentType, payload: item.Description ); entries.Insert(0, atomEntry); } async Task ProcessLinkElementAsync() { ISyndicationLink link = await feedReader.ReadLink(); switch (link.RelationshipType) { case "next-archive" when nextPageUri == null: nextPageUri = link.Uri; break; case "prev-archive" when previousPageUri == null: previousPageUri = link.Uri; break; case "notifications" when realTimeNotificationUri == null: realTimeNotificationUri = link.Uri; break; } } }