pull/15/head
Dave Jones 2020-10-09 11:24:50 -05:00
rodzic b362ed137e
commit 8533dbd4ab
4 zmienionych plików z 704 dodań i 1 usunięć

111
README.md
Wyświetl plik

@ -1,2 +1,111 @@
# podcastindex-namespace
A wholistic rss namespace for podcasting
A wholistic rss namespace for podcasting that is meant to synthesize the fragmented world of podcast namespaces. The broad goal is to create one namespace
to rule them all, that is easily extensible, community controlled/authored and addresses the needs of the indie podcast industry now and in the future.
The large podcast platforms have shown virtually no interest in extending their namespaces for new functionality in many years. Our hope is that this namespace
will become the framework that the indie podcast community needs to deliver new functionality to apps and aggregators.
## Goal #1 - Eliminate Redundancy
There is significant overlap amongst the many existing podcast namespaces. Each platform and publisher has created their own namespace to give their respective
system and audience the metadata they need in the way they want it delivered.
## Goal #2 - Avoid Attributes
Attributes in xml elements should be used only where absolutely needed. The preference is to create a new element type, rather than reuse the same element with
different attributes. For example, instead of using **\<podcastindex:image type="Large">**, we would use **\<podcastindex:imageLarge>**. This makes the corresponding
aggregator code easier and more linear.
## Goal #3 - Use RSS Native Elements
The RSSv2.0 specification already has a robust set of defined elements. We should aim to use those instead of creating new ones. Instead of creating a **\<podcastindex:owner>**
element, we can use the already existing **\<managingEditor>** element that contains both name and email address. In situations like item-level images, where the RSS
spec never defined that element, it is appropriate to define new ones.
## Goal #4 - Keep Exisiting Conventions
Reinventing the wheel helps nobody. When at all possible, existing conventions should be maintained. For example, it would make sense to turn **\<podcastindex:explicit>** into
a unary element, where it's existence is taken as a "yes" and it's absence as a "no". But, that has never been the standard. And, given as how this namespace will probably
sit alongside at least one other namespace, it makes sense to keep existing conventions in place.
## Goal #5 - Be General
There is no way to address every possible metadata point that each platform would want. That is not the aim. Instead we focus on defining the elements that would be useful
to the broadest set of apps, publishers, platforms and aggregators. Individual parties can keep their respective supplemental namespaces small and targeted as an adjunct to
this larger namespace.
## Element List (current)
- **\<podcastindex:imageLarge>**[url to a large image file]**\</podcastindex:imageLarge>** - This is assumed to point to an image that is 1000px or larger in size
- **\<podcastindex:imageMedium>**[url to a medium image file]**\</podcastindex:imageMedium>** - This is assumed to point to an image that is 300px to 999px in size
- **\<podcastindex:imageSmall>**[url to a small image file]**\</podcastindex:imageSmall>** - This is assumed to point to an image that is 299px or less in size
- **\<podcastindex:category>**[Category Name]**\</podcastindex:category>** - This is a channel-level element. See "Categories" in this document for an explanation. There can be up to a total of 9 categories defined.
- **\<podcastindex:location>**[CountryCode|Locality]**\</podcastindex:location>** - The country code and locality name given with a pipe as a separator
- **\<podcastindex:locked>**[yes|no]**\</podcastindex:locked>** - This is a channel-level element. This tells other podcast platforms whether they are allowed to import this feed. A value of "yes" means that any attempt to import
this feed into a new platform should be rejected. It is expected that podcast hosting providers will enable a toggle in their GUI to allow their users to turn
feed transfer lock on or off.
- **\<podcastindex:email>**[email address]**\</podcastindex:email>** - This is a channel-level element. An email address that can be used to verify ownership of this feed during move and import operations. This could be a public email or a
virtual email address at the hosting provider that redirects to the owner's true email address.
- **\<podcastindex:previousUrl>**[url this feed was imported from]**\</podcastindex:previousUrl>** - This is a channel-level element. Lists the previous url of this feed before it was imported. Any time a feed is moved, an additional **\<podcastindex:previousUrl>** element
should be added to the channel, to create a paper trail of all the previous urls this feed has lived at. This way, aggregators can easily deduplicate their feed lists.
- **\<podcastindex:newFeedUrl>**[url this feed was imported from]**\</podcastindex:newFeedUrl>** - This is a channel-level element. If the feed moved, or was imported to a different hosting platform, this element can specify the new location.
- **\<podcastindex:id platform="[host slug]">**[the id string]**\</podcastindex:id>** - This is a channel-level element. See "ID's" in this document for an explanation.
## Element List (proposed)
- **\<podcastindex:captions>** - This is an item-level element to contain information about closed captions within the episode.
- **\<podcastindex:alternateEnclosure type="[mime type]" length="[(int)]" bitrate="[(float)]" [live]>**[uri of media asset]**\</podcastindex:alternateEnclosure>** - This is an item-level element that is meant to provide alternate versions of an enclosure, such as low or
high bitrate, or alternate formats or alternate uri schemes, like IPFS or live streaming.
## Categories
There can be a maximum of 9 category elements defined in a feed. Any number greater than that should be discarded.
Category names are defined in the accompanying "categories.json" file
in this repository. They should be referenced in the element by their textual name. The characters can be in any case. This list of categories aims to replicate the current
standard but also eliminate as much as possible compound, heirarchical naming and the use of ampersands. Thus, "Health & Fitness" becomes "Health" and "Fitness" as two distinct categories.
And, "Religion & Spirituality" becomes two separate categories. Again, they are different things that don't always go together. Splitting them allows for more flexible combinations. And,
avoiding ampersands makes xml encoding errors less likely.
## Verification, importing and moving
If the "locked" element is present and set to "yes", podcasting hosts and platforms should not allow importing of this feed until the **\<podcastindex:email>** or other defined feed owner (such as **\<managingEditor>**) is
contacted and subsequently sets the "locked" element to "no" or removes it from the feed.
The **\<podcastindex:previousUrl>** element acts like a relay header in an email envelope. Each time a feed is imported, an additional **\<podcastindex:previousUrl>** should be added, and all previous ones preserved.
Once a successful import has taken place, the **\<podcastindex:newFeedUrl>** element can be put in the old feed as a pointer to the new location.
## ID's
Their can be multiple **\<podcastindex:id>** elements to indicate a listing on multiple platforms, directories, hosts, apps and services. If no "platform" attribute is given, the id string in the element is
considered to be the registered Podcastindex.org ID. If the "platform" attribute is present, the element's value is taken as the ID of this podcast on that respective platform. The following slugs
can be used:
- blubrry
- captivate
- fireside
- transistor
- libsyn
- itunes
- google
- spotify
- anchor
More should be added over time by the community as needed. This is just a starter list.
## Example feed
There is an example feed in this repository showing the podcastindex namespace side by side with the Apple itunes namespace.

432
categories.json 100644
Wyświetl plik

@ -0,0 +1,432 @@
{
"Categories": [
{
"id": 1,
"name": "Arts"
},
{
"id": 2,
"name": "Books"
},
{
"id": 3,
"name": "Design"
},
{
"id": 4,
"name": "Fashion"
},
{
"id": 5,
"name": "Beauty"
},
{
"id": 6,
"name": "Food"
},
{
"id": 7,
"name": "Performing"
},
{
"id": 8,
"name": "Visual"
},
{
"id": 9,
"name": "Business"
},
{
"id": 10,
"name": "Careers"
},
{
"id": 11,
"name": "Entrepreneurship"
},
{
"id": 12,
"name": "Investing"
},
{
"id": 13,
"name": "Management"
},
{
"id": 14,
"name": "Marketing"
},
{
"id": 15,
"name": "Non-Profit"
},
{
"id": 16,
"name": "Comedy"
},
{
"id": 17,
"name": "Interviews"
},
{
"id": 18,
"name": "Improv"
},
{
"id": 19,
"name": "Stand-Up"
},
{
"id": 20,
"name": "Education"
},
{
"id": 21,
"name": "Courses"
},
{
"id": 22,
"name": "How-To"
},
{
"id": 23,
"name": "Language"
},
{
"id": 24,
"name": "Learning"
},
{
"id": 25,
"name": "Self-Improvement"
},
{
"id": 26,
"name": "Fiction"
},
{
"id": 27,
"name": "Drama"
},
{
"id": 28,
"name": "History"
},
{
"id": 29,
"name": "Health"
},
{
"id": 30,
"name": "Fitness"
},
{
"id": 31,
"name": "Alternative"
},
{
"id": 32,
"name": "Medicine"
},
{
"id": 33,
"name": "Mental"
},
{
"id": 34,
"name": "Nutrition"
},
{
"id": 35,
"name": "Sexuality"
},
{
"id": 36,
"name": "Kids"
},
{
"id": 37,
"name": "Family"
},
{
"id": 38,
"name": "Parenting"
},
{
"id": 39,
"name": "Pets"
},
{
"id": 40,
"name": "Animals"
},
{
"id": 41,
"name": "Stories"
},
{
"id": 42,
"name": "Leisure"
},
{
"id": 43,
"name": "Animation"
},
{
"id": 44,
"name": "Manga"
},
{
"id": 45,
"name": "Automotive"
},
{
"id": 46,
"name": "Aviation"
},
{
"id": 47,
"name": "Crafts"
},
{
"id": 48,
"name": "Games"
},
{
"id": 49,
"name": "Hobbies"
},
{
"id": 50,
"name": "Home"
},
{
"id": 51,
"name": "Garden"
},
{
"id": 52,
"name": "Video-Games"
},
{
"id": 53,
"name": "Music"
},
{
"id": 54,
"name": "Commentary"
},
{
"id": 55,
"name": "News"
},
{
"id": 56,
"name": "Daily"
},
{
"id": 57,
"name": "Entertainment"
},
{
"id": 58,
"name": "Government"
},
{
"id": 59,
"name": "Politics"
},
{
"id": 60,
"name": "Buddhism"
},
{
"id": 61,
"name": "Christianity"
},
{
"id": 62,
"name": "Hinduism"
},
{
"id": 63,
"name": "Islam"
},
{
"id": 64,
"name": "Judaism"
},
{
"id": 65,
"name": "Religion"
},
{
"id": 66,
"name": "Spirituality"
},
{
"id": 67,
"name": "Science"
},
{
"id": 68,
"name": "Astronomy"
},
{
"id": 69,
"name": "Chemistry"
},
{
"id": 70,
"name": "Earth"
},
{
"id": 71,
"name": "Life"
},
{
"id": 72,
"name": "Mathematics"
},
{
"id": 73,
"name": "Natural"
},
{
"id": 74,
"name": "Nature"
},
{
"id": 75,
"name": "Physics"
},
{
"id": 76,
"name": "Social"
},
{
"id": 77,
"name": "Society"
},
{
"id": 78,
"name": "Culture"
},
{
"id": 79,
"name": "Documentary"
},
{
"id": 80,
"name": "Personal"
},
{
"id": 81,
"name": "Journals"
},
{
"id": 82,
"name": "Philosophy"
},
{
"id": 83,
"name": "Places"
},
{
"id": 84,
"name": "Travel"
},
{
"id": 85,
"name": "Relationships"
},
{
"id": 86,
"name": "Sports"
},
{
"id": 87,
"name": "Baseball"
},
{
"id": 88,
"name": "Basketball"
},
{
"id": 89,
"name": "Cricket"
},
{
"id": 90,
"name": "Fantasy"
},
{
"id": 91,
"name": "Football"
},
{
"id": 92,
"name": "Golf"
},
{
"id": 93,
"name": "Hockey"
},
{
"id": 94,
"name": "Rugby"
},
{
"id": 95,
"name": "Running"
},
{
"id": 96,
"name": "Soccer"
},
{
"id": 97,
"name": "Swimming"
},
{
"id": 98,
"name": "Tennis"
},
{
"id": 99,
"name": "Volleyball"
},
{
"id": 100,
"name": "Wilderness"
},
{
"id": 101,
"name": "Wrestling"
},
{
"id": 102,
"name": "Technology"
},
{
"id": 103,
"name": "True Crime"
},
{
"id": 104,
"name": "TV"
},
{
"id": 105,
"name": "Film"
},
{
"id": 106,
"name": "After-Shows"
},
{
"id": 107,
"name": "Reviews"
}
]
}

91
example.xml 100644
Wyświetl plik

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:podcastindex="https://github.com/Podcastindex-org/podcastindex-namespace" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
<channel>
<title>Podcast Feed Template</title>
<description>This is a fake show that exists only as an example of the "podcastindex" namespace.</description>
<link>http://podcastindex.org</link>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<language>en-US</language>
<generator>Freedom Controller</generator>
<pubDate>Thu, 08 Oct 2020 18:51:15 +0000</pubDate>
<lastBuildDate>Thu, 08 Oct 2020 18:51:15 +0000</lastBuildDate>
<managingEditor>dave@podcastindex.org (Dave Jones)</managingEditor>
<webMaster>support@podcastindex.org (Tech Support)</webMaster>
<image>
<url>https://raw.githubusercontent.com/Podcastindex-org/art-graphics-logos/master/pci_avatar.jpg</url>
<title>Podcast Feed Template</title>
<link>https://podcastindex.org</link>
</image>
<itunes:author>Dave Jones</itunes:author>
<itunes:explicit>no</itunes:explicit>
<itunes:type>episodic</itunes:type>
<podcastindex:location>US|Washington</podcastindex:location>
<itunes:image>https://raw.githubusercontent.com/Podcastindex-org/art-graphics-logos/master/pci_avatar.jpg</itunes:image>
<podcastindex:imageLarge>https://raw.githubusercontent.com/Podcastindex-org/art-graphics-logos/master/pci_avatar.jpg</podcastindex:imageLarge>
<podcastindex:imageMedium>https://raw.githubusercontent.com/Podcastindex-org/art-graphics-logos/master/pci_avatar.jpg</podcastindex:imageMedium>
<podcastindex:imageSmall>https://raw.githubusercontent.com/Podcastindex-org/art-graphics-logos/master/pci_avatar.jpg</podcastindex:imageSmall>
<podcastindex:category>News</podcastindex:category>
<podcastindex:category>Commentary</podcastindex:category>
<podcastindex:category>Technology</podcastindex:category>
<itunes:category text="News"/>
<itunes:category text="Technology"/>
<podcastindex:locked>yes</podcastindex:locked>
<podcastindex:email>podcast83043423@blubrry.com</podcastindex:email>
<podcastindex:previousUrl>https://yeoldhostingprovider.com/podcast479923</podcastindex:previousUrl>
<podcastindex:previousUrl>https://myveryfirstpodcasthost.com/show251.xml</podcastindex:previousUrl>
<podcastindex:id>1348299</podcastindex:id>
<podcastindex:id platform="itunes">39423340445</podcastindex:id>
<podcastindex:id platform="blubrry">83043423</podcastindex:id>
<item>
<title>Episode 3 - The Future</title>
<description>&lt;p&gt;Everything at this level will become the rss description text for this item.&lt;/p&gt;</description>
<link>https://podcastindex.org/ep0003</link>
<guid isPermaLink="true">http://podcastindex.org/ep0003</guid>
<pubDate>Fri, 09 Oct 2020 04:30:38 GMT</pubDate>
<author>adam@podcastindex.org (Adam Curry)</author>
<author>dave@podcastindex.org (Dave Jones)</author>
<itunes:image>https://podcastindex.org/ep0003/artMd.jpg</itunes:image>
<podcastindex:imageLarge>https://podcastindex.org/ep0003/artLg.jpg</podcastindex:imageLarge>
<podcastindex:imageMedium>https://podcastindex.org/ep0003/artMd.jpg</podcastindex:imageMedium>
<podcastindex:imageSmall>https://podcastindex.org/ep0003/artSm.jpg</podcastindex:imageSmall>
<itunes:explicit>no</itunes:explicit>
<enclosure url="https://mp3s.nashownotes.com/PC20-03-2020-09-18-Final.mp3" length="62407829" type="audio/mpeg"/>
</item>
<item>
<title>Episode 2 - The Return</title>
<description>&lt;p&gt;Everything at this level will become the rss description text for this item.&lt;/p&gt;</description>
<link>https://podcastindex.org/ep0002</link>
<guid isPermaLink="true">http://podcastindex.org/ep0002</guid>
<pubDate>Thu, 08 Oct 2020 04:30:38 GMT</pubDate>
<author>adam@podcastindex.org (Adam Curry)</author>
<author>dave@podcastindex.org (Dave Jones)</author>
<itunes:image>https://podcastindex.org/ep0002/artMd.jpg</itunes:image>
<podcastindex:imageLarge>https://podcastindex.org/ep0002/artLg.jpg</podcastindex:imageLarge>
<podcastindex:imageMedium>https://podcastindex.org/ep0002/artMd.jpg</podcastindex:imageMedium>
<podcastindex:imageSmall>https://podcastindex.org/ep0002/artSm.jpg</podcastindex:imageSmall>
<itunes:explicit>no</itunes:explicit>
<enclosure url="https://mp3s.nashownotes.com/PC20-02-2020-09-11-Final.mp3" length="59902895" type="audio/mpeg"/>
</item>
<item>
<title>Episode 1 - The Beginning</title>
<description>&lt;p&gt;Everything at this level will become the rss description text for this item.&lt;/p&gt;</description>
<link>http://podcastindex.org/ep0001</link>
<guid isPermaLink="true">http://podcastindex.org/ep0001</guid>
<pubDate>Wed, 07 Nov 2020 04:29:49 GMT</pubDate>
<author>adam@podcastindex.org (Adam Curry)</author>
<author>dave@podcastindex.org (Dave Jones)</author>
<itunes:image>https://podcastindex.org/ep0001/artMd.jpg</itunes:image>
<podcastindex:imageLarge>https://podcastindex.org/ep0001/artLg.jpg</podcastindex:imageLarge>
<podcastindex:imageMedium>https://podcastindex.org/ep0001/artMd.jpg</podcastindex:imageMedium>
<podcastindex:imageSmall>https://podcastindex.org/ep0001/artSm.jpg</podcastindex:imageSmall>
<itunes:explicit>no</itunes:explicit>
<enclosure url="https://mp3s.nashownotes.com/PC20-01-2020-08-28-Final.mp3" length="61222288" type="audio/mpeg"/>
</item>
</channel>
</rss>

Wyświetl plik

@ -0,0 +1,71 @@
xmlns:a10="http://www.w3.org/2005/Atom"
xmlns:acast="https://schema.acast.com/1.0/"
xmlns:addthis="https://www.addthis.com/help/api-spec"
xmlns:admin="http://webns.net/mvcb/"
xmlns:anchor="https://anchor.fm/xmlns"
xmlns:atom10="http://www.w3.org/2005/Atom"
xmlns:atom="http://w3.org/2005/Atom"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:b="http://www.google.com/2005/gml/b"
xmlns:bitlove="http://bitlove.org"
xmlns:blogChannel="http://backend.userland.com/blogChannelModule"
xmlns:castbox="http://castbox.fm/dtds/podcast-1.0.dtd"
xmlns:cba="https://cba.fro.at/help#feeds"
xmlns:cc="http://backend.userland.com/creativeCommonsRssModule"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:cc="http://web.resource.org/cc/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
xmlns:data="http://www.google.com/2005/gml/data"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:expr="http://www.google.com/2005/gml/expr">
xmlns:fb="http://www.facebook.com/2008/fbml"
xmlns:fb="https://www.facebook.com/2008/fbml"
xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"
xmlns:feedpress="https://feed.press/xmlns"
xmlns:fh="http://purl.org/syndication/history/1.0"
xmlns:fireside="http://fireside.fm/modules/rss/fireside"
xmlns:forbrowser="http://counterfolk.com/ken/extrav/audio/newitemcontent.css"
xmlns:fyyd="https://fyyd.de/fyyd-ns/"
xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
xmlns:georss="http://www.georss.org/georss"
xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"
xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0/play-podcasts.xsd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"
xmlns:itunes="http://www.itunes.com/dtds/Podcast-1.0.dtd"
xmlns:itunes="https://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:itunesu="http://www.itunesu.com/feed"
xmlns:iweb="http://www.apple.com/iweb"
xmlns:media="http://search.yahoo.com/mrss/"
xmlns:media="http://www.rssboard.org/media-rss"
xmlns:npr="https://www.npr.org/rss/"
xmlns:nprml="https://api.npr.org/nprml"
xmlns:og="http://opengraphprotocol.org/schema/"
xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"
xmlns:pinecast="https://pinecast.com/rss-dtd/1.0/"
xmlns:pingback="https://podping.info/specification/1"
xmlns:podaccess="https://access.acast.com/schema/1.0/"
xmlns:podaccess="https://schema-access.acast.com/1.0/"
xmlns:podfm="http://podfm.ru/RSS/extension"
xmlns:psc="http://podlove.org/simple-chapters"
xmlns:rawvoice="http://www.rawvoice.com/rawvoiceRssModule/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rp="https://w3id.org/rp/v1"
xmlns:s="http://purl.org/steeple"
xmlns:serif="http://www.serif.com/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:sms="http://sms.csx.cam.ac.uk/rss"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:soundon="http://soundon.fm/spec/podcast-1.0"
xmlns:spotify="http://www.spotify.com/ns/rss"
xmlns:spotify="https://www.spotify.com/ns/rss"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:thr="http://purl.org/syndication/thread/1.0"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xlink="https://www.w3.org/1999/xlink"