Пример #1
0
        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();
            }
        }
Пример #2
0
    // 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;
                }
            }
        }
    }
Пример #3
0
        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);
        }
Пример #5
0
        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))));
        }
Пример #6
0
        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)));
        }
Пример #7
0
    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;
                }
            }
        }
    }
Пример #8
0
        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);
        }
Пример #9
0
        /// <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);
        }
Пример #11
0
        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);
        }
Пример #12
0
        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));
                    }
                }
            }
        }
Пример #13
0
    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;
                    }
                }
            }
        }
Пример #15
0
        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;
        }
Пример #16
0
        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);
            }
        }
Пример #17
0
        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);
        }
Пример #18
0
        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;
        }
Пример #19
0
        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);
        }
Пример #20
0
        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);
        }
Пример #21
0
        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);
        }
Пример #22
0
        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);
        }
Пример #23
0
        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>
                ");
            });
        }
Пример #24
0
        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);
            }
        }