diff --git a/README.md b/README.md index 63aae95..f31e1cc 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # The "podcast" Namespace -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 independent 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 +A wholistic rss namespace for podcasting that is meant to synthesize the fragmented world of podcast namespaces. The broad goal is to create a single, compact, efficient +namespace that is easily extensible, community controlled/authored and addresses the needs of the independent podcast industry now and in the future. +Our hope is that this namespace will become the framework that the independent podcast community needs to deliver new functionality to apps and aggregators. @@ -15,27 +15,20 @@ There is significant overlap amongst the many existing podcast namespaces. Each system and audience the metadata they need in the way they want it delivered. -## Goal #2 - Minimize Attributes and Sub-elements - -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 **\**, we would use **\**. This makes the corresponding -aggregator code easier and more linear. Sub-elements should be avoided if at all possible. - - -## Goal #3 - Keep "required" tags minimal +## Goal #2 - Keep "required" tags and attributes minimal The only required tags should be those that solve an overwhelming need in the industry. Requiring tags is a roadblock to adoption and should be avoided. Attributes should also only be required when they are key to the functionality of the tag. -## Goal #4 - Keep Exisiting Conventions +## Goal #3 - 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 **\** 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... to a point +## Goal #4 - Be General... to a point 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 @@ -44,7 +37,26 @@ this larger namespace. But, we don't want to be so general that the spec become ## The Guiding Principles -Our guiding principles for development of this namespace are the "[Rules for Standards Makers](http://scripting.com/2017/05/09/rulesForStandardsmakers.html)" by Dave Winer. Please read it before contributing if you aren't familiar with it. +Our guiding principles for development of this namespace are the "[Rules for Standards Makers](http://scripting.com/2017/05/09/rulesForStandardsmakers.html)" by Dave Winer. +Please read it before contributing if you aren't familiar with it. + + +## Official XMLNS Definition + +To see the formalized tags, the official definition file is [here](docs/1.0.md). + + +## Supporting Platforms and Apps + +To see a list of platforms and apps that currently implement some or all of these tags, see the list [here](docs/element-support.md). + + +## Example Feed + +There is an example feed [example.xml](example.xml) in this repository showing the podcastindex namespace side by side with the Apple itunes namespace. There is also +a "sandbox" feed where we experiment with tags while they are being hashed out. + +The url for that feed is: [https://noagendaassets.com/enc/pc20sandbox.xml](https://noagendaassets.com/enc/pc20sandbox.xml).

@@ -54,7 +66,7 @@ Our guiding principles for development of this namespace are the "[Rules for Sta
-- **\**[yes or no]**\** +- **\**[yes or no]**\** (formalized) Channel @@ -71,7 +83,7 @@ Our guiding principles for development of this namespace are the "[Rules for Sta
-- **\** +- **\** (formalized) Item @@ -84,26 +96,21 @@ Our guiding principles for development of this namespace are the "[Rules for Sta
-- **\** +- **\** Item - (optional | multiple) + (optional) - This element specifies a point in time during the podcast that can be linked to directly and optionally supplemented with additional content. - - Attributes: - - - `start` (required) Used to identify the starting point of the chapter within the podcast. Start time is expressed as seconds since the start time of the podcast. - - `title` (optional) Used as a user facing identifier for this chapter. - - `href` (optional) Points to a url containing additional user facing content, like an image or wiki entry. - - `type` (optional) This attribute is strongly encouraged if `href` is used so that apps can handle the external chapter content appropriately. + Links to an external file (see example file) containing chapter data for the episode. The mime type of the file should be given - JSON prefered, `application/json`. See + the [jsonChapters.md](chapters/jsonChapters.md) file for a description of the chapter file syntax. And, see the [example.json](chapters/example.json) example file for + a real world example.
- **\**[CountryCode(|Locality)]**\** - Channel (required | single) + Channel (optional | single) Item (optional | multiple) @@ -116,9 +123,11 @@ Our guiding principles for development of this namespace are the "[Rules for Sta - CountryCode: (required) The ISO 3166-1 alpha-2 country code, eg 'US'. (Note that the United Kingdom is 'GB', not 'UK'.) - Locality: (recommended) With a pipe separator from the countrycode, this is a humanly-readable place name as preferred by the podcast publisher. + The maximum recommended string length of the node value is 128 characters. +
-- **\** +- **\**[name of person]**** Channel or Item (optional | multiple) @@ -129,6 +138,8 @@ Our guiding principles for development of this namespace are the "[Rules for Sta - `img` (optional) This is the url of a picture or avatar of the person. - `href` (optional) Link to a relevant resource of information about the person. (eg. website, blog or wiki entry). + The maximum recommended string length of the node value is 128 characters. +
- **\**[email address or url]**\** @@ -143,22 +154,24 @@ Our guiding principles for development of this namespace are the "[Rules for Sta
-- **\**[uri of media asset]**\** +- **\** Channel (optional | single) Item (optional | multiple) - This element 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. There may be multiple alternateEnclosure elements in an item, but there must be no more than one in a channel. The presence of this element at the - channel level would be useful for adding a video/audio trailer or intro media that introduces the listener to the podcast. For instance, in a podcast of an audiobook, this could be the book's - introduction or preface. The alternateEnclosure element always refers to an "alternate" media version. The standard RSS enclosure element is always the default media to be - played. - - All attributes are required except for "stream". "stream" is a boolean attribute that indicates the uri points to a streaming media that is not downloadable. + This element 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. There may be multiple alternateEnclosure elements in an item, but there must be no more than one in a channel. The presence of this element at the channel level would be useful for adding a video/audio trailer or intro media that introduces the listener to the podcast. For instance, in a podcast of an audiobook, this could be the book's introduction or preface. The alternateEnclosure element always refers to an "alternate" media version. The standard RSS enclosure element is always the default media to be played. + + - `url` (required) This is the url to the media asset. + - `type` (required) Mime type of the media asset. + - `length` (required) Duration of media asset in seconds. + - `bitrate` (optional) Encoding bitrate of media asset. + - `title` (required) Alternate assets need a title since main title will apply to primary asset. + - `stream` (optional) Boolean attribute that indicates the uri points to a streaming media that is not downloadable.
-- **\**[the id string]**\** +- **\** Channel @@ -166,61 +179,45 @@ Our guiding principles for development of this namespace are the "[Rules for Sta See "ID's" in this document for an explanation. - All attributes are required. + - `platform` (required) This is the service slug of the platform. + - `id` (required) This is the unique identifier for this podcast on the respective platform. + - `url` (optional) A url to the page for this podcast on the respective platform.
-- **\**[url to a large image file]**\** +- **\** Channel or Item (optional | single) - This is assumed to point to an image that is 1000px or larger in size. The image must be square (1:1 ratio). The image content may differ from other images specified in - the feed where appropriate. + This points to a group of images, separated by commas - each with a pixel width declared after them. It is highly recommended that the images referenced + be square (1:1 ratio), as this is the industry standard for podcast album art, and what podcast apps expect to work with. The srcset attribute is designed + to work like the ```srcset``` attribute in the HTML5 specification. Suggested widths are 1500px, 600px, 300px and 150px. See the example feed in this + repo for an example of how this looks in practice. All attributes are required.
-- **\**[url to a medium image file]**\** - - Channel or Item - - (optional | single) - - This is assumed to point to an image that is 300px to 999px in size. - The image must be square (1:1 ratio). The image content may differ from other images specified in the feed where appropriate. - - All attributes are required. - -
- -- **\**[url to a small image file]**\** - - Channel or Item - - (optional | single) - - This is assumed to point to an image that is 299px or less in size. - The image must be square (1:1 ratio). The image content may differ from other images specified in the feed where appropriate. - - All attributes are required. - -
- -- **\**[url for the show at the platform]**\** +- **\**[user provided content to link]**\** Channel or Item (optional | multiple) - This element lists multiple possible donation/funding links for the podcast. The node value should contain the full url of the donation page. + This element lists multiple possible donation/funding links for the podcast. Attributes: + - `url` (required) Full url to the specific show on the funding platform. - `platform` (required) Identifies a payment or funding platform for the podcast. Service slugs should be recorded here in the repository. - - `title` (optional) Used as free form string from the podcast owner to show to the listeners. Ex. "Support us on Patreon!" + - `node value` (required) Used as free form string from the podcast owner to show to the listeners. Ex. "Support us on Patreon!" + + The maximum recommended string length of the node value is 128 characters.

@@ -236,6 +233,8 @@ Our guiding principles for development of this namespace are the "[Rules for Sta This element lists social media accounts for this podcast. The service slugs should be community written into the accompanying serviceslugs.txt file. + The maximum recommended string length of the node value is 128 characters. +
- **\**[category Name]**\** @@ -317,12 +316,4 @@ representing the platform, directory, host, app or service. The slugs will look - anchor - overcast -More should be added by the community as needed. This is just a starter list. - - -

- - -## Example feed - -There is an example feed (example.xml) in this repository showing the podcastindex namespace side by side with the Apple itunes namespace. +More should be added by the community as needed. This is just a starter list. The full list is [here](serviceslugs.txt). diff --git a/chapters/example.json b/chapters/example.json new file mode 100644 index 0000000..edb8c39 --- /dev/null +++ b/chapters/example.json @@ -0,0 +1,42 @@ +{ + "version": "1.0.0", + "chapters": + [ + { + "startTime": 0, + "title": "Intro" + }, + { + "startTime": 168, + "title": "Hearing Aids" + }, + { + "startTime": 260, + "title": "Progress Report" + }, + { + "startTime": 410, + "title": "Namespace", + "img": "https://noagendaassets.com/enc/1602976942.638_pc20feedss.jpg", + "url": "https://github.com/Podcastindex-org/podcast-namespace" + }, + { + "startTime": 3990, + "title": "Just Break Up", + "img": "https://noagendaassets.com/enc/1602977264.567_80ad58e16124df27.png", + "url": "https://twitter.com/justbreakuppod" + }, + { + "startTime": 5510, + "title": "The Big Players" + }, + { + "startTime": 5854, + "title": "Spread the Word" + }, + { + "startTime": 6089, + "title": "Outro" + } + ] +} \ No newline at end of file diff --git a/chapters/jsonChapters.md b/chapters/jsonChapters.md new file mode 100644 index 0000000..4319720 --- /dev/null +++ b/chapters/jsonChapters.md @@ -0,0 +1,19 @@ +This is the initial spec for a json chapter format that can be referenced in an RSS feed using the "podcast" namespace. + +The "chapters" property is an array of "chapter" objects taking this form: + +``` +{ + "startTime": 94, + "title": "Donation Segment", + "img": "http://example.com/podcast/episode/chapter_art2.jpg", + "url": "http://example.com/link/to/funding_platform" +} +``` + +Attributes: + + - `startTime` (required - float) The time, expressed in seconds with float precision for fractions of a second. + - `title` (required - string) The title of this chapter. + - `img` (optional - string) The url of an image to use as chapter art. + - `url` (optional - string) The url of a web page or supporting document that's related to the topic of this chapter. diff --git a/contributors.txt b/contributors.txt index a1ad1f7..470e02c 100644 --- a/contributors.txt +++ b/contributors.txt @@ -10,5 +10,8 @@ Todd Cochrane @PhoneBoy Ben Slinger Martin Mouritzen +Andy Beard -... add your name as you contribute! + + +... add your name as you contribute! \ No newline at end of file diff --git a/docs/1.0.md b/docs/1.0.md index 78a68b1..a544f3d 100644 --- a/docs/1.0.md +++ b/docs/1.0.md @@ -1,7 +1,9 @@ +# RSS Namespace Extension for Podcast (xmlns:podcast DTD) -# RSS Namespace Extension for Podcast +A wholistic RSS namespace for podcasting that is meant to synthesize the fragmented world of podcast namespaces. As elements are canonized, they will be added to this document so developers can begin implementation. The specifications below are considered locked and the team will prioritize backward compatibility. We are operating under the [Rules for Standards-Makers](http://scripting.com/2017/05/09/rulesForStandardsmakers.html). -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 independent 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 independent podcast community needs to deliver new functionality to apps and aggregators. +If your application generates RSS feeds and you implement one or more elements below, you will need to link this DTD in your XML. +`` # Podcast Tags Each tag below exists in the podcast namespace within the specified parent. All attributes are required unless explicitly specified as optional. diff --git a/docs/element-support.md b/docs/element-support.md new file mode 100644 index 0000000..8fceea8 --- /dev/null +++ b/docs/element-support.md @@ -0,0 +1,15 @@ +# Application Support by Element + +For elements that are included in the official [DTD](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md), we will highlight applications offering production support. + +# Elements + +## Transcript `` +1. [Buzzsprout](https://www.buzzsprout.com/blog/transcription-tools) +2. [Podcast Addict](https://podcastaddict.com/changelog/2020_14#section1) +3. [Podfriend](https://twitter.com/GoPodfriend/status/1316847938828742656) +4. [Podnews](https://podnews.net/rss) + +## Locked `` +1. [Buzzsprout](https://www.buzzsprout.com/) +2. [Podnews](https://podnews.net/rss) diff --git a/example.xml b/example.xml index 36e9f15..e0a89ba 100644 --- a/example.xml +++ b/example.xml @@ -1,8 +1,8 @@ - + Podcast Feed Template - This is a fake show that exists only as an example of the "podcastindex" namespace. + This is a fake show that exists only as an example of the "podcast" namespace. http://podcastindex.org http://blogs.law.harvard.edu/tech/rss en-US @@ -12,19 +12,23 @@ dave@podcastindex.org (Dave Jones) support@podcastindex.org (Tech Support) - https://raw.githubusercontent.com/Podcastindex-org/art-graphics-logos/master/pci_avatar.jpg + https://example.com/images/pci_avatar-massive.jpg Podcast Feed Template https://podcastindex.org + + yes + US|Columbus, OH + Dave Jones no episodic - US|Columbus, OH - https://raw.githubusercontent.com/Podcastindex-org/art-graphics-logos/master/pci_avatar.jpg - https://raw.githubusercontent.com/Podcastindex-org/art-graphics-logos/master/pci_avatar.jpg - https://raw.githubusercontent.com/Podcastindex-org/art-graphics-logos/master/pci_avatar.jpg - https://raw.githubusercontent.com/Podcastindex-org/art-graphics-logos/master/pci_avatar.jpg + https://example.com/images/pci_avatar-massive.jpg + News Commentary @@ -42,9 +46,9 @@ https://yeoldhostingprovider.com/podcast479923 https://myveryfirstpodcasthost.com/show251.xml - 1348299 - 39423340445 - 83043423 + + + https://example.com/pc20trailer.mp4 @@ -55,16 +59,18 @@ Fri, 09 Oct 2020 04:30:38 GMT adam@podcastindex.org (Adam Curry) https://podcastindex.org/ep0003/artMd.jpg - https://podcastindex.org/ep0003/artLg.jpg - https://podcastindex.org/ep0003/artMd.jpg - https://podcastindex.org/ep0003/artSm.jpg + no - https://podcastindex.org/ep0003/transcript.txt + Adam Curry Dave Jones https://podcastindex.org/ep0003/audio/podnews201009.m4a https://podcastindex.org/ep0003/audio/podnews201009.mp3 + @@ -75,9 +81,10 @@ Thu, 08 Oct 2020 04:30:38 GMT adam@podcastindex.org (Adam Curry) https://podcastindex.org/ep0002/artMd.jpg - https://podcastindex.org/ep0002/artLg.jpg - https://podcastindex.org/ep0002/artMd.jpg - https://podcastindex.org/ep0002/artSm.jpg + no https://podcastindex.org/ep0002/transcript_es.json https://podcastindex.org/ep0002/transcript.srt @@ -86,6 +93,7 @@ https://podcastindex.org/ep0002/audio/podnews201009.m4a https://podcastindex.org/ep0002/audio/podnews201009.mp3 + @@ -96,16 +104,19 @@ Wed, 07 Nov 2020 04:29:49 GMT adam@podcastindex.org (Adam Curry) https://podcastindex.org/ep0001/artMd.jpg - https://podcastindex.org/ep0001/artLg.jpg - https://podcastindex.org/ep0001/artMd.jpg - https://podcastindex.org/ep0001/artSm.jpg + no - https://podcastindex.org/ep0001/transcript.html + + Adam Curry Dave Jones https://podcastindex.org/ep0001/audio/podnews201009.m4a https://podcastindex.org/ep0001/audio/podnews201009.mp3 + diff --git a/serviceslugs.txt b/serviceslugs.txt index 3f733e2..d3774eb 100644 --- a/serviceslugs.txt +++ b/serviceslugs.txt @@ -1,48 +1,48 @@ -podcastindex -blubrry -captivate -rss.com -fireside -transistor -libsyn -overcast -podcastaddict -hypercatcher +acast +amazon anchor apple -google -podverse -podfriend -spotify -amazon -bitcoin -paypal -twitter -mastodon -slack -relayfm -buzzsprout -castos -podbean -simplecast -resonate -soundcloud -spreaker -podserve -podiant -backtracks audioboom -megaphone -whooshkaa -acast -redcircle -podcasts.com -omnystudio -podigee -shoutengine -pinecast -podomatic -zencast -podchaser -podiant +backtracks +bitcoin +blubrry +buzzsprout +captivate +castos +fireside +google +hypercatcher +libsyn +mastodon megafono +megaphone +omnystudio +overcast +paypal +pinecast +podbean +podcastaddict +podcastindex +podcasts.com +podchaser +podfriend +podiant +podigee +podnews +podomatic +podserve +podverse +redcircle +relayfm +resonate +rss.com +shoutengine +simplecast +slack +soundcloud +spotify +spreaker +transistor +twitter +whooshkaa +zencast