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; } }
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); }
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); }
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); }
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); }
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); } } }
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; } }
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); }