The SyndicationFeed class supports both AttributeExtensions & ElementExtensions to add custom tags to the RSS feeds.
1: XNamespace itunesNS = "http://www.itunes.com/dtds/podcast-1.0.dtd";
2: string prefix = "itunes";
3:
4: var feed = new SyndicationFeed(title, description, new Uri(link));
5: feed.Categories.Add(new SyndicationCategory(category));
6: feed.AttributeExtensions.Add(new XmlQualifiedName(prefix,
7: "http://www.w3.org/2000/xmlns/"), itunesNS.NamespaceName);
8: feed.Copyright = new TextSyndicationContent(copyright);
9: feed.Language = "en-us";
10: feed.Copyright = new TextSyndicationContent(DateTime.Now.Year + " " + ownerName);
11: feed.ImageUrl = new Uri(imageUrl);
12: feed.LastUpdatedTime = DateTime.Now;
13: feed.Authors.Add(new SyndicationPerson() {Name=ownerName, Email=ownerEmail });
14: var extensions = feed.ElementExtensions;
15: extensions.Add(new XElement(itunesNS + "subtitle", subTitle).CreateReader());
16: extensions.Add(new XElement(itunesNS + "image",
17: new XAttribute("href", imageUrl)).CreateReader());
18: extensions.Add(new XElement(itunesNS + "author", ownerName).CreateReader());
19: extensions.Add(new XElement(itunesNS + "summary", description).CreateReader());
20: extensions.Add(new XElement(itunesNS + "category",
21: new XAttribute("text", category),
22: new XElement(itunesNS + "category",
23: new XAttribute("text", subCategory))).CreateReader());
24: extensions.Add(new XElement(itunesNS + "explicit", "no").CreateReader());
25: extensions.Add(new XDocument(
26: new XElement(itunesNS + "owner",
27: new XElement(itunesNS + "name", ownerName),
28: new XElement(itunesNS + "email", ownerEmail))).CreateReader());
29:
30: var feedItems = new List<SyndicationItem>();
31: foreach (var i in Items)
32: {
33: var item = new SyndicationItem(i.title, null, new Uri(link));
34: item.Summary = new TextSyndicationContent(i.summary);
35: item.Id = i.id;
36: if (i.publishedDate != null)
37: item.PublishDate = (DateTimeOffset)i.publishedDate;
38: item.Links.Add(new SyndicationLink() {
39: Title = i.title, Uri = new Uri(link),
40: Length = i.size, MediaType = i.mediaType });
41: var itemExt = item.ElementExtensions;
42: itemExt.Add(new XElement(itunesNS + "subtitle", i.subTitle).CreateReader());
43: itemExt.Add(new XElement(itunesNS + "summary", i.summary).CreateReader());
44: itemExt.Add(new XElement(itunesNS + "duration",
45: string.Format("{0}:{1:00}:{2:00}",
46: i.duration.Hours, i.duration.Minutes, i.duration.Seconds)
47: ).CreateReader());
48: itemExt.Add(new XElement(itunesNS + "keywords", i.keywords).CreateReader());
49: itemExt.Add(new XElement(itunesNS + "explicit", "no").CreateReader());
50: itemExt.Add(new XElement("enclosure", new XAttribute("url", i.url),
51: new XAttribute("length", i.size), new XAttribute("type", i.mediaType)));
52: feedItems.Add(item);
53: }
54:
55: feed.Items = feedItems;
If you're hosting your podcast feed within a MVC project, you can use the code from my previous post to stream it.
After you've verified your feed is solid & good to go, you can submit it to iTunes.