Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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());
        }
Пример #4
0
        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);
        }
Пример #5
0
        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;
                }
            }
        }