예제 #1
0
        private Article mapArticle(ISyndicationContent item)
        {
            var a = new Article();

            a.Id      = item.Fields.FirstOrDefault(f => f.Name == "guid")?.Value;
            a.Title   = item.Fields.FirstOrDefault(f => f.Name == "title")?.Value;
            a.Content = item.Fields.FirstOrDefault(f => f.Name == "encoded")?.Value;
            string pubDate = item.Fields.FirstOrDefault(f => f.Name == "pubDate")?.Value;

            if (DateTime.TryParse(pubDate, out DateTime date))
            {
                a.DatePublished = date;
            }
            a.Creator     = item.Fields.FirstOrDefault(f => f.Name == "creator")?.Value;
            a.Description = item.Fields.FirstOrDefault(f => f.Name == "description")?.Value;
            Regex regex;

            regex         = new Regex("<a[^>]+>Read more</a>");
            a.Description = regex.Replace(a.Description, "");

            regex = new Regex(@"(<img[^>])src=""(https?://[^""]+)""", RegexOptions.Multiline);
            foreach (Match match in regex.Matches(a.Content))
            {
                var url = $"/Home/Resource?ResourceId={match.Groups[2].Value}";
                a.Content = a.Content.Replace(match.Value, $@"{match.Groups[1].Value}src=""{url}""");
                a.ResourcesUrl.Add(url);
            }
            return(a);
        }
예제 #2
0
        public async Task WriteContent()
        {
            ISyndicationContent content = null;

            //
            // Read
            using (var xmlReader = XmlReader.Create(@"..\..\..\TestFeeds\CustomXml.xml"))
            {
                RssFeedReader reader = new RssFeedReader(xmlReader);
                content = await reader.ReadContent();
            }

            //
            // Write
            StringBuilder sb = new StringBuilder();

            using (var xmlWriter = XmlWriter.Create(sb))
            {
                var writer = new RssFeedWriter(xmlWriter);

                await writer.Write(content);

                await writer.Flush();
            }

            string res = sb.ToString();

            Assert.True(res == "<?xml version=\"1.0\" encoding=\"utf-16\"?><rss version=\"2.0\"><channel><NewItem><enclosure url=\"http://www.scripting.com/mp3s/weatherReportSuite.mp3\" length=\"12216320\" type=\"audio/mpeg\" /><title>Lorem ipsum 2017-07-06T20:25:00+00:00</title><description>Exercitation sit dolore mollit et est eiusmod veniam aute officia veniam ipsum.</description><link>http://example.com/test/1499372700</link><guid isPermaLink=\"true\">http://example.com/test/1499372700</guid><pubDate>Thu, 06 Jul 2017 20:25:00 GMT</pubDate></NewItem></channel></rss>");
        }
예제 #3
0
        public static async Task <List <ISyndicationContent> > RssFeedReader()
        {
            ///Wired Sitesindeki Rss beslemesinden son haberlerin linklerini ve başlıklarını çekiyoruz
            string feedUri = "https://www.wired.com/feed/rss";
            List <ISyndicationContent> contentList = new List <ISyndicationContent>();

            using (var xmlReader = XmlReader.Create(feedUri, new XmlReaderSettings()
            {
                Async = true
            }))
            {
                var feedReader = new RssFeedReader(xmlReader);

                while (await feedReader.Read())
                {
                    ISyndicationContent content = await feedReader.ReadContent();

                    if (content.Name == "item")
                    {
                        contentList.Add(content);
                    }
                }
            }

            return(contentList);
        }
예제 #4
0
        public async Task <FeedDto> RetrieveFeed(Uri uri)
        {
            string title = "";
            var    items = new List <ISyndicationItem>();

            using (var client = new HttpClient())
                using (var stream = await client.GetStreamAsync(uri).ConfigureAwait(false))
                    using (var xmlReader = XmlReader.Create(stream, new XmlReaderSettings {
                        Async = true
                    }))
                    {
                        var feedReader = GetReader(xmlReader);
                        while (await feedReader.Read().ConfigureAwait(false))
                        {
                            switch (feedReader.ElementType)
                            {
                            case SyndicationElementType.Item:
                                items.Add(await feedReader.ReadItem().ConfigureAwait(false));
                                break;

                            case SyndicationElementType.Content:
                                ISyndicationContent content = await feedReader.ReadContent().ConfigureAwait(false);

                                if (content.Name == "title")
                                {
                                    title = content.Value;
                                }
                                break;
                            }
                        }
                    }

            return(new FeedDto(title, items.Select(x => new FeedItemDto(x.Links.FirstOrDefault()?.Uri, x.Published,
                                                                        RemoveHtmlTags(x.Title), RemoveHtmlTags(x.Description))).ToArray()));
        }
        public static void WriteSyndicationContent(this XmlWriter writer, ISyndicationContent content, string defaultNs)
        {
            string ns = content.Namespace ?? defaultNs;

            //
            // Write opening
            if (ns != null)
            {
                XmlUtils.SplitName(content.Name, out string prefix, out string localName);

                prefix = writer.LookupPrefix(ns) ?? prefix;

                if (prefix != null)
                {
                    writer.WriteStartElement(prefix, localName, ns);
                }
                else
                {
                    writer.WriteStartElement(localName, ns);
                }
            }
            else
            {
                writer.WriteStartElement(content.Name);
            }

            //
            // Write attributes
            if (content.Attributes != null)
            {
                foreach (var a in content.Attributes)
                {
                    writer.WriteSyndicationAttribute(a);
                }
            }

            //
            // Write value
            if (content.Value != null)
            {
                writer.WriteString(content.Value);
            }
            //
            // Write Fields
            else
            {
                if (content.Fields != null)
                {
                    foreach (var field in content.Fields)
                    {
                        writer.WriteSyndicationContent(field, defaultNs);
                    }
                }
            }

            //
            // Write closing
            writer.WriteEndElement();
        }
예제 #6
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);
        }
예제 #7
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;
                }
            }
        }
    }
예제 #8
0
        public async Task ReadItemContent()
        {
            using (XmlReader xmlReader = XmlReader.Create(@"..\..\..\TestFeeds\simpleAtomFeed.xml", new XmlReaderSettings {
                Async = true
            }))
            {
                var reader = new AtomFeedReader(xmlReader);

                while (await reader.Read())
                {
                    if (reader.ElementType == SyndicationElementType.Item)
                    {
                        ISyndicationContent content = await reader.ReadContent();

                        var fields = content.Fields.ToArray();

                        Assert.True(fields.Length == 12);

                        Assert.True(fields[0].Name == "title");
                        Assert.False(string.IsNullOrEmpty(fields[0].Value));

                        Assert.True(fields[1].Name == "link");
                        Assert.True(fields[1].Attributes.Count() > 0);

                        Assert.True(fields[2].Name == "link");
                        Assert.True(fields[2].Attributes.Count() > 0);

                        Assert.True(fields[3].Name == "id");
                        Assert.False(string.IsNullOrEmpty(fields[3].Value));

                        Assert.True(fields[4].Name == "updated");
                        Assert.False(string.IsNullOrEmpty(fields[4].Value));

                        Assert.True(fields[5].Name == "published");
                        Assert.False(string.IsNullOrEmpty(fields[5].Value));

                        Assert.True(fields[6].Name == "source");
                        Assert.True(fields[6].Fields.Count() > 0);

                        Assert.True(fields[7].Name == "author");
                        Assert.True(fields[7].Fields.Count() > 0);

                        Assert.True(fields[8].Name == "contributor");
                        Assert.True(fields[8].Fields.Count() > 0);

                        Assert.True(fields[9].Name == "contributor");
                        Assert.True(fields[9].Fields.Count() > 0);

                        Assert.True(fields[10].Name == "rights");
                        Assert.False(string.IsNullOrEmpty(fields[10].Value));

                        Assert.True(fields[11].Name == "content");
                        Assert.False(string.IsNullOrEmpty(fields[11].Value));
                    }
                }
            }
        }
        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);
        }
예제 #10
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);
            }
        }
예제 #11
0
 private void SetFeedNameIfNotSet(Feed feed, ISyndicationContent content)
 {
     if (string.IsNullOrWhiteSpace(feed.Name))
     {
         if (content.Name == "title")
         {
             feed.Name = content.Value;
         }
     }
 }
예제 #12
0
        public ISyndicationImage ParseImage(string value)
        {
            ISyndicationContent content = ParseContent(value);

            if (content.Name != AtomElementNames.Logo && content.Name != AtomElementNames.Icon)
            {
                throw new FormatException("Invalid Atom Image");
            }

            return(CreateImage(content));
        }
예제 #13
0
        public IAtomEntry ParseEntry(string value)
        {
            ISyndicationContent content = ParseContent(value);

            if (content.Name != AtomElementNames.Entry)
            {
                throw new FormatException("Invalid Atom feed");
            }

            return(CreateEntry(content));
        }
        public virtual async Task <T> ReadValue <T>()
        {
            ISyndicationContent content = await ReadContent();

            if (!Parser.TryParseValue(content.Value, out T value))
            {
                throw new FormatException();
            }

            return(value);
        }
예제 #15
0
        public ISyndicationLink ParseLink(string value)
        {
            ISyndicationContent content = ParseContent(value);

            if (content.Name != AtomElementNames.Link)
            {
                throw new FormatException("Invalid Atom Link");
            }

            return(CreateLink(content));
        }
예제 #16
0
 public ComplexSyndicationItem(ISyndicationItem item, ISyndicationContent outline = null)
 {
     Item = item;
     if (outline != null)
     {
         Outline = new Outline
         {
             Attributes = outline.Attributes.ToDictionary(x => x.Name, x => x.Value)
         };
     }
 }
        public virtual ISyndicationLink CreateLink(ISyndicationContent content)
        {
            if (content == null)
            {
                throw new ArgumentNullException(nameof(content));
            }

            //
            // Title
            string title = content.Value;

            //
            // Url
            Uri    uri = null;
            string url = content.Attributes.GetRss("url");

            if (url != null)
            {
                if (!TryParseValue(url, out uri))
                {
                    throw new FormatException("Invalid url attribute");
                }
            }
            else
            {
                if (!TryParseValue(content.Value, out uri))
                {
                    throw new FormatException("Invalid url");
                }

                title = null;
            }

            //
            // Length
            long length = 0;

            TryParseValue(content.Attributes.GetRss("length"), out length);

            //
            // Type
            string type = content.Attributes.GetRss("type");

            //
            // rel
            string rel = (content.Name == RssElementNames.Link) ? RssLinkTypes.Alternate : content.Name;

            return(new SyndicationLink(uri, rel)
            {
                Title = title,
                Length = length,
                MediaType = type
            });
        }
예제 #18
0
        public ISyndicationPerson ParsePerson(string value)
        {
            ISyndicationContent content = ParseContent(value);

            if (content.Name != AtomContributorTypes.Author && content.Name != AtomContributorTypes.Contributor)
            {
                throw new FormatException("Invalid Atom person");
            }

            return(CreatePerson(content));
        }
예제 #19
0
 public OutlineSyndicationItem(ISyndicationItem basic, ISyndicationContent outline)
 {
     Item = basic;
     if (outline != null)
     {
         Outline = new Outline
         {
             Text       = outline.Attributes.FirstOrDefault(x => x.Name.Equals("text", StringComparison.OrdinalIgnoreCase))?.Value,
             Attributes = outline.Attributes.ToDictionary(x => x.Name, x => x.Value)
         };
     }
 }
        public ISyndicationImage ParseImage(string value)
        {
            ISyndicationContent content = ParseContent(value);

            if (content.Name != RssElementNames.Image ||
                content.Namespace != RssConstants.Rss20Namespace)
            {
                throw new FormatException("Invalid Rss Image");
            }

            return(CreateImage(content));
        }
        public ISyndicationLink ParseLink(string value)
        {
            ISyndicationContent content = ParseContent(value);

            if (content.Name != RssElementNames.Link ||
                content.Namespace != RssConstants.Rss20Namespace)
            {
                throw new FormatException("Invalid Rss link");
            }

            return(CreateLink(content));
        }
        public ISyndicationCategory ParseCategory(string value)
        {
            ISyndicationContent content = ParseContent(value);

            if (content.Name != RssElementNames.Category ||
                content.Namespace != RssConstants.Rss20Namespace)
            {
                throw new FormatException("Invalid Rss category");
            }

            return(CreateCategory(content));
        }
예제 #23
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;
                }
            }
        }
    }
        public ISyndicationPerson ParsePerson(string value)
        {
            ISyndicationContent content = ParseContent(value);

            if ((content.Name != RssElementNames.Author &&
                 content.Name != RssElementNames.ManagingEditor) ||
                content.Namespace != RssConstants.Rss20Namespace)
            {
                throw new FormatException("Invalid Rss Person");
            }

            return(CreatePerson(content));
        }
        private async Task <List <ChapterUpdateBucket> > GetUpdatedChapterBucketList()
        {
            List <ChapterUpdateBucket> allUpdatedChapterBuckets = new();

            DbResult <IEnumerable <NovelInfo> > result = await this.mediator.Send(new NovelInfos.GetAllNovelsInfo());

            if (!result.TryGetValue(out IEnumerable <NovelInfo>?allNovelsInfo))
            {
                return(new List <ChapterUpdateBucket>());
            }

            // Retrieve all updated chapters
            foreach (NovelInfo novelInfo in allNovelsInfo)
            {
                ChapterUpdateBucket temp = new(novelInfo);

                using XmlReader reader = XmlReader.Create(novelInfo.SyndicationUri, new XmlReaderSettings { Async = true, });
                RssFeedReader feedReader = new(reader);

                while (await feedReader.Read())
                {
                    if (feedReader.ElementType == SyndicationElementType.Item)
                    {
                        ISyndicationItem item = await feedReader.ReadItem();

                        ChapterUpdateItem chapterUpdateItem = item.ToChapterUpdateItem();
                        if (chapterUpdateItem.Id == novelInfo.MostRecentChapterId || chapterUpdateItem.Id == null)
                        {
                            break;
                        }
                        chapterUpdateItem.Description = chapterUpdateItem.Description.FromHtmlToDiscordMarkdown();
                        temp.ChapterUpdateItems.Add(chapterUpdateItem);
                    }
                    else if (feedReader.ElementType == SyndicationElementType.Content)
                    {
                        ISyndicationContent content = await feedReader.ReadContent();

                        if (content.Name.Equals("title") && !content.Value.Equals(temp.Novel.Name))
                        {
                            temp.NewTitle = content.Value;
                        }
                    }
                }
                if (temp.ChapterUpdateItems.Any())
                {
                    allUpdatedChapterBuckets.Add(temp);
                }
            }

            return(allUpdatedChapterBuckets);
        }
예제 #26
0
        public virtual ISyndicationPerson CreatePerson(ISyndicationContent content)
        {
            if (content == null)
            {
                throw new ArgumentNullException(nameof(content));
            }

            string name  = null;
            string email = null;
            string uri   = null;

            foreach (var field in content.Fields)
            {
                // content does not contain atom's namespace. So if we receibe a different namespace we will ignore it.
                if (field.Namespace != AtomConstants.Atom10Namespace)
                {
                    continue;
                }

                switch (field.Name)
                {
                //
                // Name
                case AtomElementNames.Name:
                    name = field.Value;
                    break;

                //
                // Email
                case AtomElementNames.Email:
                    email = field.Value;
                    break;

                //
                // Uri
                case AtomElementNames.Uri:
                    uri = field.Value;
                    break;

                //
                // Unrecognized field
                default:
                    break;
                }
            }

            return(new SyndicationPerson(name, email, content.Name)
            {
                Uri = uri
            });
        }
        public void AddField(ISyndicationContent field)
        {
            if (field == null)
            {
                throw new ArgumentNullException(nameof(field));
            }

            if (_children.IsReadOnly)
            {
                _children = _children.ToList();
            }

            _children.Add(field);
        }
예제 #28
0
        public virtual ISyndicationImage CreateImage(ISyndicationContent content)
        {
            if (content == null)
            {
                throw new ArgumentNullException(nameof(content));
            }

            if (!TryParseValue(content.Value, out Uri uri))
            {
                throw new FormatException("Invalid Atom image url");
            }

            return(new SyndicationImage(uri, content.Name));
        }
예제 #29
0
        public virtual ISyndicationCategory CreateCategory(ISyndicationContent content)
        {
            if (content == null)
            {
                throw new ArgumentNullException(nameof(content));
            }

            if (content.Value == null)
            {
                throw new FormatException("Invalid Rss category name");
            }

            return(new SyndicationCategory(content.Value));
        }
예제 #30
0
        public virtual ISyndicationPerson CreatePerson(ISyndicationContent content)
        {
            if (content == null)
            {
                throw new ArgumentNullException(nameof(content));
            }

            if (string.IsNullOrEmpty(content.Value))
            {
                throw new ArgumentNullException("Content value is required");
            }

            return(new SyndicationPerson(null, content.Value, content.Name));
        }