Example #1
0
        private void ParsePodcastMeta(XElement e, PodcastRaw podcastRaw)
        {
            switch (e.Name.ToString().ToLower())
            {
            case "title":
                podcastRaw.Title = e.Value;
                break;

            case "link":
                podcastRaw.LinkWebsiteURL = e.Value;
                break;

            case "language":
                podcastRaw.Language = e.Value;
                break;

            case "description":
                podcastRaw.Description = e.Value;
                break;

            case "category":
                podcastRaw.Category = e.Value;
                break;

            case "pubdate":
                podcastRaw.PubDate = e.Value;
                break;

            case "lastbuilddate":
                podcastRaw.LastBuildDate = e.Value;
                break;

            case "image":
                if (e.HasElements)
                {
                    XElement x = e.Elements("url").FirstOrDefault();
                    if (x != null && !x.IsEmpty)
                    {
                        podcastRaw.ImageURL = x.Value;
                    }
                }
                break;

            case "copyright":
                podcastRaw.Copyright = e.Value;
                break;

            case "webmaster":
                podcastRaw.Webmaster = e.Value;
                break;

            case "managingeditor":
                podcastRaw.ManagingEditor = e.Value;
                break;

            case "generator":
                podcastRaw.FeedGenerator = e.Value;
                break;
            }
        }
Example #2
0
        public PodcastRaw ParseNewPodcast(XElement channel)
        {
            PodcastRaw podcastRaw = new PodcastRaw();

            foreach (var e in channel.Elements())
            {
                ParsePodcastMeta(e, podcastRaw);
                ParsePodcastMetaAtom(e, podcastRaw);
                ParsePodcastMetaItunes(e, podcastRaw);
            }

            return(podcastRaw);
        }
Example #3
0
        private async Task <List <EpisodeRaw> > MultipageEpisodeListAsync(PodcastRaw praw)
        {
            List <EpisodeRaw> episodes = new List <EpisodeRaw>();
            string            next     = praw.LinkFeedNextPageURL;

            while (!string.IsNullOrEmpty(next))
            {
                PodcastRaw p = await GetPodcastRawAsync(next);

                episodes.AddRange(p.Episodes);
                next = p.LinkFeedNextPageURL;
            }
            return(episodes);
        }
Example #4
0
        public async Task <PodcastRaw> GetPodcastRawAsync(string url)
        {
            PodcastRaw podcast = new PodcastRaw();

            podcast.LinkFeedURL = url.ToLower();
            ParserPodcastRaw pparse = new ParserPodcastRaw();
            ParserEpisodeRaw eparse = new ParserEpisodeRaw();

            XElement root = await LoadWebFeedAsync(url);

            var channel = root.Descendants("channel").FirstOrDefault();

            podcast = pparse.ParseNewPodcast(channel);

            var items = root.Descendants("item");

            podcast.Episodes = eparse.ParseNewEpisodeRawList(items);

            return(podcast);
        }
Example #5
0
        public async Task <Podcast> GetPodcastAsync(string url)
        {
            PodcastRaw praw = await GetPodcastRawAsync(url);

            praw.Episodes.AddRange(await MultipageEpisodeListAsync(praw));

            ParserPodcast pparse = new ParserPodcast();
            ParserEpisode eparse = new ParserEpisode();

            Podcast podcast = pparse.ParsePodcast(praw);

            if (praw.Episodes.Count > 0)
            {
                podcast.Episodes = eparse.ParseEpisodeList(praw.Episodes);

                if (podcast.HasFeedAlt)
                {
                    List <EpisodeRaw> altepisodes = new List <EpisodeRaw>();
                    foreach (var af in podcast.FeedAlt)
                    {
                        PodcastRaw pr = await GetPodcastRawAsync(af.URL);

                        pr.Episodes.AddRange(await MultipageEpisodeListAsync(pr));
                        altepisodes.AddRange(pr.Episodes);
                    }
                    foreach (var e in podcast.Episodes)
                    {
                        e.MediaContentAlt = new List <MediaItem>();
                        foreach (var i in altepisodes.Where(x => x.guid == e.GUID))
                        {
                            e.MediaContentAlt.Add(eparse.ParseMediaItem(i));
                        }
                    }
                }
            }

            return(podcast);
        }
Example #6
0
        private void ParsePodcastMetaAtom(XElement e, PodcastRaw podcastRaw)
        {
            if (e.Name.ToString().ToLower() == "{" + FeedNamespaceCollection.atom + "}link" && e.HasAttributes && e.Attribute("rel") != null)
            {
                switch (e.Attribute("rel").Value)
                {
                case "alternate":
                    if (podcastRaw.LinkAlternateFeeds == null)
                    {
                        podcastRaw.LinkAlternateFeeds = new List <AlternateFeed>();
                    }
                    podcastRaw.LinkAlternateFeeds.Add(new AlternateFeed()
                    {
                        Title = e.Attribute("title").Value, URL = e.Attribute("href").Value
                    });
                    break;

                case "next":
                    podcastRaw.LinkFeedNextPageURL = e.Attribute("href").Value;
                    break;

                case "first":
                    podcastRaw.LinkFeedFirstPageURL = e.Attribute("href").Value;
                    break;

                case "last":
                    podcastRaw.LinkFeedLastPageURL = e.Attribute("href").Value;
                    break;

                case "payment":
                    if (e.HasAttributes && e.Attribute("href") != null && e.Attribute("title") != null)
                    {
                        if (podcastRaw.LinkPayments == null)
                        {
                            podcastRaw.LinkPayments = new List <Payment>();
                        }
                        podcastRaw.LinkPayments.Add(new Payment()
                        {
                            URL = e.Attribute("href").Value, Title = e.Attribute("title").Value
                        });
                    }
                    break;
                }
            }
            if (e.Name.ToString().ToLower() == "{" + FeedNamespaceCollection.atom + "}contributor" && e.HasElements)
            {
                Contributor c = new Contributor();
                foreach (var i in e.Elements())
                {
                    if (i.Name.ToString().ToLower() == "{" + FeedNamespaceCollection.atom + "}name")
                    {
                        c.Name = i.Value;
                    }
                    if (i.Name.ToString().ToLower() == "{" + FeedNamespaceCollection.atom + "}uri")
                    {
                        c.URI = i.Value;
                    }
                }
                if (c.Name != null && c.Name != "")
                {
                    if (podcastRaw.Contributors == null)
                    {
                        podcastRaw.Contributors = new List <Contributor>();
                    }
                    podcastRaw.Contributors.Add(c);
                }
            }
        }
Example #7
0
        private void ParsePodcastMetaItunes(XElement e, PodcastRaw podcastRaw)
        {
            switch (e.Name.ToString().ToLower())
            {
            case "{" + FeedNamespaceCollection.itunes + "}subtitle":
                podcastRaw.ItunesSubtitle = e.Value;
                break;

            case "{" + FeedNamespaceCollection.itunes + "}author":
                podcastRaw.ItunesAuthor = e.Value;
                break;

            case "{" + FeedNamespaceCollection.itunes + "}summary":
                podcastRaw.ItunesSummary = e.Value;
                break;

            case "{" + FeedNamespaceCollection.itunes + "}keywords":
                if (e.Value != "")
                {
                    if (podcastRaw.ItunesKeywords == null)
                    {
                        podcastRaw.ItunesKeywords = new List <string>();
                    }
                    string   k  = e.Value;
                    string[] kk = k.Split(',');
                    foreach (var kkk in kk)
                    {
                        podcastRaw.ItunesKeywords.Add(kkk.Trim().ToLower());
                    }
                }
                break;

            case "{" + FeedNamespaceCollection.itunes + "}category":
                if (e.HasAttributes && e.Attribute("text") != null && e.Attribute("text").Value != "")
                {
                    ItunesCategory c = new ItunesCategory();
                    c.Name = e.Attribute("text").Value;
                    if (e.HasElements)
                    {
                        c.SubCategorys = new List <string>();
                        foreach (var cc in e.Elements())
                        {
                            if (cc.HasAttributes && cc.Attribute("text") != null && cc.Attribute("text").Value != "")
                            {
                                c.SubCategorys.Add(cc.Attribute("text").Value);
                            }
                        }
                    }
                    if (podcastRaw.ItunesCategorys == null)
                    {
                        podcastRaw.ItunesCategorys = new List <ItunesCategory>();
                    }
                    podcastRaw.ItunesCategorys.Add(c);
                }
                break;

            case "{" + FeedNamespaceCollection.itunes + "}owner":
                if (e.HasElements)
                {
                    ItunesOwner io = new ItunesOwner();
                    foreach (var o in e.Elements())
                    {
                        if (o.Name.ToString().ToLower() == "{" + FeedNamespaceCollection.itunes + "}name")
                        {
                            io.Name = o.Value;
                        }
                        if (o.Name.ToString().ToLower() == "{" + FeedNamespaceCollection.itunes + "}email")
                        {
                            io.EMail = o.Value;
                        }
                    }
                    if (io.Name != null && io.Name != "")
                    {
                        podcastRaw.ItunesOwner = io;
                    }
                }
                break;

            case "{" + FeedNamespaceCollection.itunes + "}image":
                if (e.HasAttributes && e.Attribute("href") != null && e.Attribute("href").Value != "")
                {
                    podcastRaw.ItunesImageURL = e.Attribute("href").Value;
                }
                break;
            }
        }
Example #8
0
        public Podcast ParsePodcast(PodcastRaw praw)
        {
            Podcast podcast = new Podcast();

            podcast.Title  = praw.Title;
            podcast.Author = praw.ItunesAuthor;

            if (!string.IsNullOrEmpty(praw.LinkWebsiteURL))
            {
                podcast.WebsiteURL = praw.LinkWebsiteURL.ToLower();
            }

            if (!string.IsNullOrEmpty(praw.ItunesImageURL))
            {
                podcast.ImageURL = praw.ItunesImageURL.ToLower();
                podcast.ImageURI = new Uri(podcast.ImageURL);
            }
            else
            {
                if (!string.IsNullOrEmpty(praw.ImageURL))
                {
                    podcast.ImageURL = praw.ImageURL.ToLower();
                    podcast.ImageURI = new Uri(podcast.ImageURL);
                }
            }

            podcast.Language  = praw.Language;
            podcast.Copyright = praw.Copyright;

            DateTime lastbuilddate;

            if (DateTime.TryParse(praw.PubDate, out lastbuilddate))
            {
                podcast.LastBuild = lastbuilddate;
            }
            else
            {
                podcast.LastBuild = DateTime.Now;
            }

            podcast.FeedAlt = praw.LinkAlternateFeeds;
            if (podcast.HasFeedAlt)
            {
                foreach (var f in podcast.FeedAlt)
                {
                    f.URL = f.URL.ToLower();
                }
            }

            podcast.Subtitle    = praw.ItunesSubtitle;
            podcast.Summary     = praw.ItunesSummary;
            podcast.Description = praw.Description;
            podcast.Keywords    = praw.ItunesKeywords;
            podcast.Categorys   = praw.ItunesCategorys;

            podcast.Contributors = praw.Contributors;
            if (podcast.HasContributors)
            {
                foreach (var c in podcast.Contributors)
                {
                    if (!string.IsNullOrEmpty(c.URI))
                    {
                        c.URI = c.URI.ToLower();
                    }
                }
            }

            podcast.PaymentLinks = praw.LinkPayments;
            if (podcast.HasPaymentLinks)
            {
                foreach (var p in podcast.PaymentLinks)
                {
                    p.URL = p.URL.ToLower();
                }
            }

            return(podcast);
        }