diff --git a/README.md b/README.md index 4f62ff8..d075311 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,26 @@ # 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 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. +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. -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. -The podcast namespace is part of the larger "Podcasting 2.0" project which exists to bring control of podcasting's protocols back into the hands of the open podcasting community. A good overview can be found here: [Podcasting 2.0](podcasting2.0.md) +The podcast namespace is part of the larger "Podcasting 2.0" project which exists to bring control of podcasting's +protocols back into the hands of the open podcasting community. A good overview can be found here: +[Podcasting 2.0](podcasting2.0.md) * [Official XMLNS Definition](docs/1.0.md) the official definition of all formalized tags. -* List of platforms and apps that currently implement some or all of these tags: [Supporting Platforms and Apps](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. -* [Other recommendations](docs/other-recommendations.md) when creating RSS podcast feeds. +* List of platforms and apps that currently implement some or all of these + tags: [Supporting Platforms and Apps](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. * [Other recommendations](docs/other-recommendations.md) + when creating RSS podcast feeds.

@@ -22,26 +28,32 @@ The podcast namespace is part of the larger "Podcasting 2.0" project which exist ## Current Roadmap -**Phase 1** - [Closed] Comment period closed on `11/15/2020` and [5 tags](https://github.com/Podcastindex-org/podcast-namespace#phase-1-closed-on-111520) were **formalized**. +**Phase 1** - [Closed] Comment period closed on `11/15/2020` and [5 tags](#phase-1-closed-on-111520) were +**formalized**. -**Phase 2** - [Closed] Comment period closed on `1/31/2021` and [4 tags](https://github.com/Podcastindex-org/podcast-namespace#phase-2-closed-on-13121) were **formalized**. +**Phase 2** - [Closed] Comment period closed on `1/31/2021` and [4 tags](#phase-2-closed-on-13121) were **formalized**. -**Phase 3** - [Closed] Comment period closed on `6/1/2021` and [5 tags](https://github.com/Podcastindex-org/podcast-namespace#phase-3-closed-on-6121) were **formalized**. +**Phase 3** - [Closed] Comment period closed on `6/1/2021` and [5 tags](#phase-3-closed-on-6121) were **formalized**. -**Phase 4** - [Closed] Comment period closed on `12/1/2021` and [3 tags](https://github.com/Podcastindex-org/podcast-namespace#phase-4-closed-on-1212021) were **formalized**. +**Phase 4** - [Closed] Comment period closed on `12/1/2021` and [3 tags](#phase-4-closed-on-1212021) were +**formalized**. -**Phase 5** - [Closed] Comment period closed on `7/15/2022` and [2 tags](https://github.com/Podcastindex-org/podcast-namespace#phase-5-closed-as-of-7152022) were **formalized**. +**Phase 5** - [Closed] Comment period closed on `7/15/2022` and [2 tags](#phase-5-closed-as-of-7152022) were +**formalized**. -**Phase 6** - [Open] Comment period is now open as of `9/28/2022`. Proposals are welcome. The following tags are being considered: [Phase 6 tag list](https://github.com/Podcastindex-org/podcast-namespace/discussions?discussions_q=is%3Aopen+label%3Aphase6) +**Phase 6** - [Closed] Comment period closed on `6/1/2023` and [6 tags](#phase-6-closed-as-of-612023) were +**formalized**.

## Legend -**Formalized** - This tag is frozen and listed in the XMLNS document. Any future changes to it's definition must maintain backwards compatibility. +**Formalized** - This tag is frozen and listed in the XMLNS document. Any future changes to it's definition must +maintain backwards compatibility. -**Finalized** - The tag is structurally stable and implementation testing should be considered safe. Any breaking changes will be widely communicated. +**Finalized** - The tag is structurally stable and implementation testing should be considered safe. Any breaking +changes will be widely communicated. **Open** - The tag/phase is open for discussion and collaboration. @@ -49,7 +61,8 @@ The podcast namespace is part of the larger "Podcasting 2.0" project which exist **Optional** - This tag or attribute may be left out. -**Recommended** - This tag or attribute is technically optional, but is strongly recommended to be present for the tag to function as fully intended. +**Recommended** - This tag or attribute is technically optional, but is strongly recommended to be present for the +tag to function as fully intended.

@@ -57,19 +70,24 @@ The podcast namespace is part of the larger "Podcasting 2.0" project which exist ## Tag Adoption Process -To be adopted as an official part of the namespace, there must be consensus around a tag's usefulness and either commitment to adoption by at least 1 host and 1 app, or a recognition -that the tag is already being used in the wild. +To be adopted as an official part of the namespace, there must be consensus around a tag's usefulness and either +commitment to adoption by at least 1 host and 1 app, or a recognition that the tag is already being used in the wild. -It is ALWAYS ok to delay a tag to a future Phase if there is any concern about it. That is to be expected and encouraged. +It is ALWAYS ok to delay a tag to a future Phase if there is any concern about it. That is to be expected and +encouraged. -When a Phase comes to a close, there will be a full review of any tags currently open for comment and questions will be asked to gather consensus before final adoption. No tags -will be adopted by fiat, or if there are unresolved questions. They will just be moved to the next Phase for further comment and refinement. +When a Phase comes to a close, there will be a full review of any tags currently open for comment and questions will +be asked to gather consensus before final adoption. No tags will be adopted by fiat, or if there are unresolved +questions. They will just be moved to the next Phase for further comment and refinement. -Tags that are proposals or rough ideas should be expected to have syntax problems or typos. Those should be refined away as they are worked on. If they are not, that is a good idea -that the tag in question isn't being seen as useful and should be considered for dropping. +Tags that are proposals or rough ideas should be expected to have syntax problems or typos. Those should be refined +away as they are worked on. If they are not, that is a good idea that the tag in question isn't being seen as +useful and should be considered for dropping. -We are not a "standards body". It is a community driven project where all stake holders are encouraged to participate, so that many voices are heard. This is an open-source -project to be built fully in the open. Discussions also take place on [podcastindex.social](https://podcastindex.social) where anyone is free to register and participate. +We are not a "standards body". It is a community driven project where all stake holders are encouraged to +participate, so that many voices are heard. This is an open-source project to be built fully in the open. +Discussions also take place on [podcastindex.social](https://podcastindex.social) where anyone is free to register +and participate.

@@ -77,28 +95,33 @@ project to be built fully in the open. Discussions also take place on [podcasti ### 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. +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 - 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. +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 #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 +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 #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 -this larger namespace. But, we don't want to be so general that the spec becomes overly complicated. A beautiful, "perfect" spec is not important. Solving real problems is. +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. But, we don't want to be so general that the spec becomes overly complicated. A +beautiful, "perfect" spec is not important. Solving real problems is.

@@ -106,7 +129,8 @@ this larger namespace. But, we don't want to be so general that the spec become ## Copying information -The "podcast" namespace is [dedicated to the public domain using CC0 v1.0](COPYING.txt) so as to remove all barriers to adoption, development and contribution. +The "podcast" namespace is [dedicated to the public domain using CC0 v1.0](COPYING.txt) so as to remove all barriers +to adoption, development and contribution.

@@ -118,8 +142,8 @@ The "podcast" namespace is [dedicated to the public domain using CC0 v1.0](COPYI
-The following tags have been formally adopted into the namespace. They are fully documented in the XMLNS document located [here](docs/1.0.md). Please see that file for -full implementation details. +The following tags have been formally adopted into the namespace. They are fully documented in the XMLNS document +located [here](docs/1.0.md). Please see that file for full implementation details. - **\**
- **\**
@@ -133,8 +157,8 @@ full implementation details.
-The following tags have been formally adopted into the namespace. They are fully documented in the XMLNS document located [here](docs/1.0.md). Please see that file for -full implementation details. +The following tags have been formally adopted into the namespace. They are fully documented in the XMLNS document +located [here](docs/1.0.md). Please see that file for full implementation details. - **\**
- **\**
@@ -148,8 +172,8 @@ full implementation details.
-The following tags have been formally adopted into the namespace. They are fully documented in the XMLNS document located [here](docs/1.0.md). Please see that file for -full implementation details. +The following tags have been formally adopted into the namespace. They are fully documented in the XMLNS document +located [here](docs/1.0.md). Please see that file for full implementation details. - **\**
- **\**
@@ -165,8 +189,8 @@ full implementation details.
-The following tags have been formally adopted into the namespace. They are fully documented in the XMLNS document located [here](docs/1.0.md). Please see that file for -full implementation details. +The following tags have been formally adopted into the namespace. They are fully documented in the XMLNS document +located [here](docs/1.0.md). Please see that file for full implementation details. - **\**
- **\**
@@ -179,30 +203,32 @@ full implementation details.
-The following tags have been formally adopted into the namespace. They are fully documented in the XMLNS document located [here](docs/1.0.md). Please see that file for -full implementation details. +The following tags have been formally adopted into the namespace. They are fully documented in the XMLNS document +located [here](docs/1.0.md). Please see that file for full implementation details. - **\**
- **\**

-## Phase 6 (Open as of 9/28/2022) +## Phase 6 (Closed as of 6/1/2023) -Tags [listed here](https://github.com/Podcastindex-org/podcast-namespace/labels/phase6) are under consideration for inclusion in this phase. New tag submissions are welcome. - -Additionally, the following tags have been formally adopted into the namespace in this phase: +The following tags have been formally adopted into the namespace. They are fully documented in the XMLNS document +located [here](docs/1.0.md). Please see that file for full implementation details. - **\**
- -They are fully documented in the XMLNS document located [here](docs/1.0.md). Please see that file for full implementation details. - +- **\**
+- **\**
+- **\**
+- **\**
+- **\**

## Other Proposals -A list of the current proposed tags can be found in the issues section [here](https://github.com/Podcastindex-org/podcast-namespace/labels/proposal). +A list of the current proposed tags can be found in the issues +section [here](https://github.com/Podcastindex-org/podcast-namespace/labels/proposal).

diff --git a/docs/1.0.md b/docs/1.0.md index b3bc88f..e778341 100644 --- a/docs/1.0.md +++ b/docs/1.0.md @@ -1,7 +1,14 @@ # RSS Namespace Extension for Podcasting (Tag Specification) -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. 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). -The namespace for this extension is `https://podcastindex.org/namespace/1.0`. Clients which recognize this namespace must also recognize `https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md` as identical. The suggested tag prefix for use in XML is `podcast`, but clients should support alternate prefixes for this namespace. If your application generates RSS feeds and you implement one or more elements below, you will need to link this document in your XML: +The namespace for this extension is `https://podcastindex.org/namespace/1.0`. Clients which recognize this namespace +must also recognize `https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md` as identical. The +suggested tag prefix for use in XML is `podcast`, but clients should support alternate prefixes for this namespace. +If your application generates RSS feeds and you implement one or more elements below, you will need to link this +document in your XML: ```xml @@ -34,17 +41,25 @@ The namespace for this extension is `https://podcastindex.org/namespace/1.0`. Cl - [Social Interact](#social-interact) - [Block](#block) - [Txt](#txt) +- [Remote Item](#remote-item) +- [Podroll](#podroll) +- [Update Frequency](#update-frequency) +- [Podping](#podping) +- [Value Time Split](#value-time-split)

# Podcast Tags -Each tag below exists in the podcast namespace within the specified parent. All attributes are required unless explicitly specified as optional. Anywhere the url of a hyper-text based resource is specified, it must be given as `https:` and not `http:`. +Each tag below exists in the podcast namespace within the specified parent. All attributes are required unless +explicitly specified as optional. Anywhere the url of a hyper-text based resource is specified, it must be given as +`https:` and not `http:`.



## Transcript ``

-This tag is used to link to a transcript or closed captions file. Multiple tags can be present for multiple transcript formats. +This tag is used to link to a transcript or closed captions file. Multiple tags can be present for multiple +transcript formats. Detailed file format information and example files are [here](../transcripts/transcripts.md). @@ -57,11 +72,15 @@ Detailed file format information and example files are [here](../transcripts/tra ### Attributes - **url (required):** URL of the podcast transcript. - - **type (required):** Mime type of the file such as `text/plain`, `text/html`, `text/vtt`, `application/json`, `application/x-subrip` + - **type (required):** Mime type of the file such as `text/plain`, `text/html`, `text/vtt`, `application/json`, + `application/x-subrip` - - **language (optional):** The language of the linked transcript. If there is no language attribute given, the linked file is assumed to be the same language that is specified by the RSS `` element. + - **language (optional):** The language of the linked transcript. If there is no language attribute given, the + linked file is assumed to be the same language that is specified by the RSS `` element. - - **rel (optional):** If the rel="captions" attribute is present, the linked file is considered to be a closed captions file, regardless of what the mime type is. In that scenario, time codes are assumed to be present in the file in some capacity. + - **rel (optional):** If the rel="captions" attribute is present, the linked file is considered to be a closed + captions file, regardless of what the mime type is. In that scenario, time codes are assumed to be present in + the file in some capacity. ### Examples @@ -74,7 +93,12 @@ Detailed file format information and example files are [here](../transcripts/tra ``` ```xml - + ``` ```xml @@ -87,7 +111,9 @@ Detailed file format information and example files are [here](../transcripts/tra



## Locked ``

-This tag may be set to `yes` or `no`. The purpose is to tell other podcast hosting 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. +This tag may be set to `yes` or `no`. The purpose is to tell other podcast hosting 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. ### Parent   `` @@ -99,7 +125,9 @@ This tag may be set to `yes` or `no`. The purpose is to tell other podcast hosti   The node value must be "yes" or "no". ### Attributes - - **owner (optional):** The owner attribute is 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. + - **owner (optional):** The owner attribute is 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. ### Examples ```xml @@ -115,7 +143,8 @@ This tag may be set to `yes` or `no`. The purpose is to tell other podcast hosti



## Funding ``

-This tag lists possible donation/funding links for the podcast. The content of the tag is the recommended string to be used with the link. +This tag lists possible donation/funding links for the podcast. The content of the tag is the recommended string to +be used with the link. ### Parent   `` @@ -124,8 +153,8 @@ This tag lists possible donation/funding links for the podcast. The content of t   Multiple ### Node value -  This is a free form string supplied by the creator which they expect to be displayed in the app next to the link. Please do not exceed `128 characters` for the node value or it may be -truncated by aggregators. +  This is a free form string supplied by the creator which they expect to be displayed in the app next to the +link. Please do not exceed `128 characters` for the node value or it may be truncated by aggregators. ### Attributes - **url (required):** The URL to be followed to fund the podcast. @@ -144,9 +173,17 @@ truncated by aggregators.



## Chapters ``

-Links to an external file (see example file) containing chapter data for the episode. See the [jsonChapters.md](https://github.com/Podcastindex-org/podcast-namespace/blob/main/chapters/jsonChapters.md) file for a description of the chapter file syntax. And, see the [example.json](https://github.com/Podcastindex-org/podcast-namespace/blob/main/chapters/example.json) example file for a real world example. +Links to an external file (see example file) containing chapter data for the episode. See the [jsonChapters.md] +(https://github.com/Podcastindex-org/podcast-namespace/blob/main/chapters/jsonChapters.md) file for a description of +the chapter file syntax. And, see the [example.json](https://github. +com/Podcastindex-org/podcast-namespace/blob/main/chapters/example.json) example file for a real world example. -Benefits with this approach are that chapters do not require altering audio files, and the chapters can be edited after publishing, since they are a separate file that can be requested on playback (or cached with download). JSON chapter information also allows chapters to be displayed by a wider range of playback tools, including web browsers (which typically have no access to ID3 tags), thus greatly simplifying chapter support; and images can be retrieved on playback, rather than bloating the filesize of the audio. The data held is compatible with normal ID3 tags, thus requiring no additional work for the publisher. +Benefits with this approach are that chapters do not require altering audio files, and the chapters can be edited +after publishing, since they are a separate file that can be requested on playback (or cached with download). JSON +chapter information also allows chapters to be displayed by a wider range of playback tools, including web browsers +(which typically have no access to ID3 tags), thus greatly simplifying chapter support; and images can be retrieved +on playback, rather than bloating the filesize of the audio. The data held is compatible with normal ID3 tags, thus +requiring no additional work for the publisher. ### Parent   `` @@ -168,8 +205,10 @@ Benefits with this approach are that chapters do not require altering audio file



## Soundbite ``

-Points to one or more soundbites within a podcast episode. The intended use includes episodes previews, discoverability, audiogram generation, episode highlights, etc. It should be assumed that the -audio/video source of the soundbite is the audio/video given in the item's [``](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) element. +Points to one or more soundbites within a podcast episode. The intended use includes episodes previews, +discoverability, audiogram generation, episode highlights, etc. It should be assumed that the audio/video source of +the soundbite is the audio/video given in the item's [``](https://cyber.harvard.edu/rss/rss. +html#ltenclosuregtSubelementOfLtitemgt) element. ### Parent   `` @@ -178,8 +217,10 @@ audio/video source of the soundbite is the audio/video given in the item's [`


## Person ``

-This element specifies a person of interest to the podcast. It is primarily intended to identify people like hosts, co-hosts and guests. Although, it is flexible enough to allow fuller credits to be given using the roles and groups that are listed in the [Podcast Taxonomy Project](https://podcasttaxonomy.com/) +This element specifies a person of interest to the podcast. It is primarily intended to identify people like hosts, +co-hosts and guests. Although, it is flexible enough to allow fuller credits to be given using the roles and groups +that are listed in the [Podcast Taxonomy Project](https://podcasttaxonomy.com/) ### Parent   `` (for a podcast) or `` (for an individual episode) -It is suggested that `` is always populated, and `` is populated where needed for an individual episode. Where present, people information in `` wholly replaces all information from the ``. +It is suggested that `` is always populated, and `` is populated where needed for an individual +episode. Where present, people information in `` wholly replaces all information from the ``. -Publishers are expected to use the `podcast:person` element in the `` parent to set the _regular_ people involved in the podcast: the detail that would be expected to be seen in an overview of the show. +Publishers are expected to use the `podcast:person` element in the `` parent to set the _regular_ people +involved in the podcast: the detail that would be expected to be seen in an overview of the show. -Publishers are expected to use the `podcast:person` in the `` parent to **replace** all existing information for an individual episode. +Publishers are expected to use the `podcast:person` in the `` parent to **replace** all existing information +for an individual episode. #### For example: _Terry and June_ -The fictional podcast _Terry and June_ is normally hosted by Terry Scott and June Whitfield. Within ``, Terry Scott and June Whitfield are listed as the hosts. A podcast directory, or podcast app, should show Terry Scott and June Whitfield as the hosts of this show. +The fictional podcast _Terry and June_ is normally hosted by Terry Scott and June Whitfield. Within ``, +Terry Scott and June Whitfield are listed as the hosts. A podcast directory, or podcast app, should show Terry Scott +and June Whitfield as the hosts of this show. -For one episode, _Terry and June_ was hosted by Reginald Marsh and June Whitfield (Terry was away). In this case, the `` for this episode should contain Reginald Marsh and June Whitfield as the hosts of this episode. A podcast app, when playing this episode, should show only Reginald Marsh and June Whitfield as the hosts of this episode. Because people information in `` replaces all existing people information in ``, Terry Scott should not be visible as a host of this episode. +For one episode, _Terry and June_ was hosted by Reginald Marsh and June Whitfield (Terry was away). In this case, +the `` for this episode should contain Reginald Marsh and June Whitfield as the hosts of this episode. A +podcast app, when playing this episode, should show only Reginald Marsh and June Whitfield as the hosts of this +episode. Because people information in `` replaces all existing people information in ``, Terry Scott +should not be visible as a host of this episode. #### For example: _Big Daddy_ -The fictional podcast _Big Daddy Interviews_ is hosted by Big Daddy, a wrestler. Within ``, Big Daddy is listed as the host. A podcast directory, or podcast app, should show Big Daddy as the host of this show. +The fictional podcast _Big Daddy Interviews_ is hosted by Big Daddy, a wrestler. Within ``, Big Daddy is +listed as the host. A podcast directory, or podcast app, should show Big Daddy as the host of this show. -For one episode, _Big Daddy Interviews_ had a guest of Sid James. In this case, the `` for this episode should contain Sid James as a guest, **and** Big Daddy as the host of this episode. Because people information in `` replaces all existing people information in ``, Big Daddy should be re-stated as the host of this episode. +For one episode, _Big Daddy Interviews_ had a guest of Sid James. In this case, the `` for this episode should +contain Sid James as a guest, **and** Big Daddy as the host of this episode. Because people information in `` +replaces all existing people information in ``, Big Daddy should be re-stated as the host of this episode. ### Count   Multiple ### Node value -  This is the full name or alias of the person. This value cannot be blank. Please do not exceed `128 characters` for the node value or it may be truncated by aggregators. +  This is the full name or alias of the person. This value cannot be blank. Please do not exceed `128 +characters` for the node value or it may be truncated by aggregators. ### Attributes - - **role:** (optional) Used to identify what role the person serves on the show or episode. This should be a reference to an official role within the Podcast Taxonomy Project list (see below). If `role` is missing then "host" is assumed. - - **group:** (optional) This should be a reference to an official group within the Podcast Taxonomy Project list. If `group` is not present, then "cast" is assumed. + - **role:** (optional) Used to identify what role the person serves on the show or episode. This should be a + reference to an official role within the Podcast Taxonomy Project list (see below). If `role` is missing then + "host" is assumed. + - **group:** (optional) This should be a reference to an official group within the Podcast Taxonomy Project list. + If `group` is not present, then "cast" is assumed. - **img:** (optional) This is the url of a picture or avatar of the person. - - **href:** (optional) The url to a relevant resource of information about the person, such as a homepage or third-party profile platform. Please see the [example feed](https://github.com/Podcastindex-org/podcast-namespace/blob/main/example.xml) for possible choices of what to use here. + - **href:** (optional) The url to a relevant resource of information about the person, such as a homepage or + third-party profile platform. Please see the [example feed](https://github. + com/Podcastindex-org/podcast-namespace/blob/main/example.xml) for possible choices of what to use here. -The `role` and `group` attributes are case-insensitive. So, "Host" is the same as "host", and "Cover Art Designer" is the same as "cover art designer". +The `role` and `group` attributes are case-insensitive. So, "Host" is the same as "host", and "Cover Art Designer" +is the same as "cover art designer". -The full taxonomy list is [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/taxonomy.json) as a json file. +The full taxonomy list is [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/taxonomy.json) as a +json file. ### Examples ```xml -John Smith +John Smith ``` ```xml -Jane Doe +Jane Doe ``` ```xml -Alice Brown +Alice Brown ``` ```xml -Alice Brown +Alice Brown ``` ```xml -Becky Smith +Becky Smith ``` @@ -264,8 +347,10 @@ The full taxonomy list is [here](https://github.com/Podcastindex-org/podcast-nam



## Location ``

-This tag is intended to describe the location of editorial focus for a podcast's content (i.e. "what place is this podcast about?"). The tag has many use cases and is one of the more complex ones. You -are **highly encouraged** to read the full [implementation document](https://github.com/Podcastindex-org/podcast-namespace/blob/main/location/location.md) before starting to code for it. +This tag is intended to describe the location of editorial focus for a podcast's content (i.e. "what place is this +podcast about?"). The tag has many use cases and is one of the more complex ones. You are **highly encouraged** to +read the full [implementation document](https://github. +com/Podcastindex-org/podcast-namespace/blob/main/location/location.md) before starting to code for it. ### Parent   `` or `` @@ -274,8 +359,9 @@ are **highly encouraged** to read the full [implementation document](https://git   Single ### Node Value -  This is a free-form string meant to be a human readable location. It may conform to conventional location verbiage (i.e. "Austin, TX"), but it shouldn't be depended on to be parseable in any specific -way. This value cannot be blank. Please do not exceed `128 characters` for the node value or it may be truncated by aggregators. +  This is a free-form string meant to be a human readable location. It may conform to conventional location +verbiage (i.e. "Austin, TX"), but it shouldn't be depended on to be parseable in any specific way. This value +cannot be blank. Please do not exceed `128 characters` for the node value or it may be truncated by aggregators. ### Attributes - **geo:** (recommended) This is a latitude and longitude given in "geo" notation (i.e. "geo:30.2672,97.7431"). @@ -299,7 +385,8 @@ way. This value cannot be blank. Please do not exceed `128 characters` for the



## Season ``

-This element allows for identifying which episodes in a podcast are part of a particular "season", with an optional season name attached. +This element allows for identifying which episodes in a podcast are part of a particular "season", with an optional +season name attached. ### Parent   `` @@ -311,7 +398,9 @@ This element allows for identifying which episodes in a podcast are part of a pa   The node value is an integer, and represents the season "number". It is required. ### Attributes - - **name:** (optional) - This is the "name" of the season. If this attribute is present, applications are free to **not** show the season number to the end user, and may use it simply for chronological sorting and grouping purposes. + - **name:** (optional) - This is the "name" of the season. If this attribute is present, applications are free to + **not** show the season number to the end user, and may use it simply for chronological sorting and grouping + purposes. Please do not exceed `128 characters` for the name attribute. @@ -337,7 +426,8 @@ Please do not exceed `128 characters` for the name attribute.



## Episode ``

-This element exists largely for compatibility with the `season` tag. But, it also allows for a similar idea to what "name" functions as in that element. +This element exists largely for compatibility with the `season` tag. But, it also allows for a similar idea to what +"name" functions as in that element. ### Parent   `` @@ -349,10 +439,13 @@ This element exists largely for compatibility with the `season` tag. But, it al   The node value is a decimal number. It is required. ### Attributes - - **display:** (optional) - If this attribute is present, podcast apps and aggregators are encouraged to show its value instead of the purely numerical node value. This attribute is a string. + - **display:** (optional) - If this attribute is present, podcast apps and aggregators are encouraged to show its + value instead of the purely numerical node value. This attribute is a string. -The episode numbers are decimal, so numbering such as `100.5` is acceptable if there was a special mini-episode published between two other episodes. In that scenario, the number would help with proper -chronological sorting, while the `display` attribute could specify an alternate special "number" (a moniker) to display for the episode in a podcast player app UI. +The episode numbers are decimal, so numbering such as `100.5` is acceptable if there was a special mini-episode +published between two other episodes. In that scenario, the number would help with proper chronological sorting, +while the `display` attribute could specify an alternate special "number" (a moniker) to display for the episode in +a podcast player app UI. Please do not exceed `32 characters` for the display attribute. @@ -378,10 +471,13 @@ Please do not exceed `32 characters` for the display attribute.



## Trailer ``

-This element is used to define the location of an audio or video file to be used as a trailer for the entire podcast or a specific season. There can be more than one trailer present in the channel of the -feed. This element is basically just like an [``](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) with the extra `pubdate` and `season` attributes added. +This element is used to define the location of an audio or video file to be used as a trailer for the entire podcast +or a specific season. There can be more than one trailer present in the channel of the feed. This element is +basically just like an [``](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) +with the extra `pubdate` and `season` attributes added. -If there is more than one trailer tag present in the channel, the most recent one (according to its `pubdate`) should be chosen as the preview by default within podcast apps. +If there is more than one trailer tag present in the channel, the most recent one (according to its `pubdate`) +should be chosen as the preview by default within podcast apps. ### Parent   `` @@ -390,25 +486,39 @@ If there is more than one trailer tag present in the channel, the most recent on   Multiple ### Node Value -  The node value is a string, which is the title of the trailer. It is required. Please do not exceed `128 characters` for the node value or it may be truncated by aggregators. +  The node value is a string, which is the title of the trailer. It is required. Please do not exceed `128 +characters` for the node value or it may be truncated by aggregators. ### Attributes - **url:** (required) This is a url that points to the audio or video file to be played. This attribute is a string. - **pubdate:** (required) The date the trailer was published. This attribute is an RFC2822 formatted date string. - **length:** (recommended) The length of the file in bytes. This attribute is a number. - **type:** (recommended) The mime type of the file. This attribute is a string. - - **season:** (optional) If this attribute is present it specifies that this trailer is for a particular season number. This attribute is a number. + - **season:** (optional) If this attribute is present it specifies that this trailer is for a particular season + number. This attribute is a number. -If the `season` attribute is present, it must be a number that matches the format of the `` tag. So, for a podcast that has 3 published seasons, a new `` tag can -be put in the channel to later be matched up with a `4` tag when it is published within a new ``. +If the `season` attribute is present, it must be a number that matches the format of the `` tag. So, +for a podcast that has 3 published seasons, a new `` tag can be put in the channel to +later be matched up with a `4` tag when it is published within a new ``. #### Examples ```xml -Coming April 1st, 2021 +Coming April 1st, 2021 ``` ```xml -Season 4: Race for the Whitehouse +Season 4: Race for the Whitehouse (later matches with) @@ -420,8 +530,11 @@ be put in the channel to later be matched up with a `4


## License ``

-This element defines a license that is applied to the audio/video content of a single episode, or the audio/video of the podcast as a whole. Custom licenses must always include a url attribute. Implementors are encouraged -to read the license tag companion [document](https://github.com/Podcastindex-org/podcast-namespace/blob/main/proposal-docs/license/license.md) for a more complete picture of what this tag is intended to accomplish. +This element defines a license that is applied to the audio/video content of a single episode, or the audio/video of +the podcast as a whole. Custom licenses must always include a url attribute. Implementors are encouraged to read +the license tag companion [document](https://github. +com/Podcastindex-org/podcast-namespace/blob/main/proposal-docs/license/license.md) for a more complete picture of +what this tag is intended to accomplish. ### Parent   `` or `` @@ -430,11 +543,14 @@ to read the license tag companion [document](https://github.com/Podcastindex-org   Single ### Node Value -  The node value must be a lower-cased reference to a license "identifier" defined in the [SPDX License List](https://spdx.org/licenses/) file if the license being used is a well-known, public license. Or, if it is a custom license, it -must be a free form abbreviation of the name of the license as you reference it publicly. Please do not exceed `128 characters` for the node value or it may be truncated by aggregators. +  The node value must be a lower-cased reference to a license "identifier" defined in the [SPDX License List] +(https://spdx.org/licenses/) file if the license being used is a well-known, public license. Or, if it is a custom +license, it must be a free form abbreviation of the name of the license as you reference it publicly. Please do not +exceed `128 characters` for the node value or it may be truncated by aggregators. ### Attributes - - **url:** (optional) This is a url that points to the full, legal language of the license being referenced. This attribute is optional for well-known public licenses. For new, or custom licenses it is required. + - **url:** (optional) This is a url that points to the full, legal language of the license being referenced. This + attribute is optional for well-known public licenses. For new, or custom licenses it is required. ### Examples ```xml @@ -450,10 +566,15 @@ must be a free form abbreviation of the name of the license as you reference it



## Alternate Enclosure ``

-This element is meant to provide different versions of, or companion media to the main [``](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) file. This could be an audio only version of a video podcast to allow apps to switch back and forth between audio/video, -lower (or higher) bitrate versions for bandwidth constrained areas, alternative codecs for different device platforms, alternate URI schemes and download types such as IPFS or WebTorrent, commentary tracks or supporting source clips, etc. -This is a complex tag, so implementors are highly encouraged to read the companion [document](https://github.com/Podcastindex-org/podcast-namespace/blob/main/proposal-docs/alternateEnclosure/alternateEnclosure.md) for a fuller understanding of how -this tag works and what it is capable of. +This element is meant to provide different versions of, or companion media to the main [``](https://cyber. +harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) file. This could be an audio only version of a video +podcast to allow apps to switch back and forth between audio/video, lower (or higher) bitrate versions for bandwidth +constrained areas, alternative codecs for different device platforms, alternate URI schemes and download types such +as IPFS or WebTorrent, commentary tracks or supporting source clips, etc. + +This is a complex tag, so implementors are highly encouraged to read the companion [document](https://github. +com/Podcastindex-org/podcast-namespace/blob/main/proposal-docs/alternateEnclosure/alternateEnclosure.md) for a +fuller understanding of how this tag works and what it is capable of. ### Parent   `` @@ -462,19 +583,28 @@ this tag works and what it is capable of.   Multiple ### Node Value -  The node value must be one or more `` elements that each define a uri where the media file can be downloaded or streamed. A single, optional `` element may also be included -to allow for file integrity checking. +  The node value must be one or more `` elements that each define a uri where the media file +can be downloaded or streamed. A single, optional `` element may also be included to allow for +file integrity checking. ### Attributes - **type:** (required) Mime type of the media asset. - **length:** (recommended) Length of the file in bytes. - **bitrate:** (optional) Average encoding bitrate of the media asset, expressed in bits per second. - **height:** (optional) Height of the media asset for video formats. - - **lang:** (optional) An [IETF language tag (BCP 47)](https://en.wikipedia.org/wiki/BCP_47) code identifying the language of this media. - - **title:** (optional) A human-readable string identifying the name of the media asset. Should be limited to 32 characters for UX. - - **rel:** (optional) Provides a method of offering and/or grouping together different media elements. If not set, or set to "default", the media will be grouped with the enclosure and assumed to be an alternative to the enclosure's encoding/transport. This attribute can and should be the same for items with the same content encoded by different means. Should be limited to 32 characters for UX. - - **codecs:** (optional) An [RFC 6381](https://tools.ietf.org/html/rfc6381) string specifying the codecs available in this media. - - **default:** (optional) Boolean specifying whether or not the given media is the same as the file from the enclosure element and should be the preferred media element. The primary reason to set this is to offer alternative transports for the enclosure. If not set, this should be assumed to be false. + - **lang:** (optional) An [IETF language tag (BCP 47)](https://en.wikipedia.org/wiki/BCP_47) code identifying the + language of this media. + - **title:** (optional) A human-readable string identifying the name of the media asset. Should be limited to 32 + characters for UX. + - **rel:** (optional) Provides a method of offering and/or grouping together different media elements. If not set, + or set to "default", the media will be grouped with the enclosure and assumed to be an alternative to the + enclosure's encoding/transport. This attribute can and should be the same for items with the same content encoded + by different means. Should be limited to 32 characters for UX. + - **codecs:** (optional) An [RFC 6381](https://tools.ietf.org/html/rfc6381) string specifying the codecs available + in this media. + - **default:** (optional) Boolean specifying whether or not the given media is the same as the file from the + enclosure element and should be the preferred media element. The primary reason to set this is to offer + alternative transports for the enclosure. If not set, this should be assumed to be false. ### Examples ```xml @@ -522,8 +652,9 @@ to allow for file integrity checking.



## Source ``

-This element defines a uri location for a `` media file. It is meant to be used as a child of the `` element. At least one `` element must be -present within every `` element. +This element defines a uri location for a `` media file. It is meant to be used as a +child of the `` element. At least one `` element must be present within +every `` element. ### Parent   `` @@ -533,7 +664,8 @@ present within every `` element. ### Attributes - **uri:** (required) This is the uri where the media file resides. - - **contentType:** (optional) This is a string that declares the mime-type of the file. It is useful if the transport mechanism is different than the file being delivered, as is the case with a torrents. + - **contentType:** (optional) This is a string that declares the mime-type of the file. It is useful if the + transport mechanism is different than the file being delivered, as is the case with a torrents. ### Examples ```xml @@ -550,7 +682,8 @@ present within every `` element.



## Integrity ``

-This element defines a method of verifying integrity of the media given either an [SRI-compliant integrity string](https://www.w3.org/TR/SRI/) (preferred) or a base64 encoded PGP signature. This element is optional within a +This element defines a method of verifying integrity of the media given either an [SRI-compliant integrity string] +(https://www.w3.org/TR/SRI/) (preferred) or a base64 encoded PGP signature. This element is optional within a `` element. It allows to ensure that the file has not been tampered with. ### Parent @@ -577,16 +710,27 @@ This element defines a method of verifying integrity of the media given either a



## Guid ``

-This element is used to declare a unique, global identifier for a podcast. The value is a UUIDv5, and is easily generated from the RSS feed url, with the **protocol scheme and trailing slashes stripped off**, combined with a unique "podcast" namespace which has a UUID of `ead4c236-bf58-58c6-a2c6-a6b28d128cb6`. Tools like [this one](https://www.uuidtools.com/v5) can help generate these values by hand. Or, language libraries like [this one](https://github.com/sporkmonger/uuidtools) in Ruby are widely available. Specifically for podcasts, [this tool from RSS Blue](https://tools.rssblue.com/podcast-guid) can help generate a GUID by hand. +This element is used to declare a unique, global identifier for a podcast. The value is a UUIDv5, and is easily +generated from the RSS feed url, with the **protocol scheme and trailing slashes stripped off**, combined with a +unique "podcast" namespace which has a UUID of `ead4c236-bf58-58c6-a2c6-a6b28d128cb6`. Tools like [this one] +(https://www.uuidtools.com/v5) can help generate these values by hand. Or, language libraries like [this one] +(https://github.com/sporkmonger/uuidtools) in Ruby are widely available. Specifically for podcasts, [this tool from +RSS Blue](https://tools.rssblue.com/podcast-guid) can help generate a GUID by hand. -A podcast gets assigned a podcast:guid once in its lifetime using its current feed url (at the time of assignment) as the seed value. That GUID is then meant to follow the podcast from then on, for the duration of its life, even if the feed url changes. This means that when a podcast moves from one hosting platform to another, its podcast:guid should be discovered by the new host and imported into the new platform for inclusion into the feed. +A podcast gets assigned a podcast:guid once in its lifetime using its current feed url (at the time of assignment) +as the seed value. That GUID is then meant to follow the podcast from then on, for the duration of its life, even if +the feed url changes. This means that when a podcast moves from one hosting platform to another, its podcast:guid +should be discovered by the new host and imported into the new platform for inclusion into the feed. -Using this pattern, podcasts can maintain a consistent identity across the open RSS ecosystem without a central authority. +Using this pattern, podcasts can maintain a consistent identity across the open RSS ecosystem without a central +authority. **Tips:** -* All podcasts in the Podcast Index have already been assigned a GUID; but if one exists in the RSS feed, that value is canonical. +* All podcasts in the Podcast Index have already been assigned a GUID; but if one exists in the RSS feed, that value + is canonical. * You can programmatically spot a GUID: it is 36 characters long, and contains four hyphen characters. -* Be aware that Amazon Music also uses separate UUIDv5 identifiers within their podcast directory, which are calculated differently and unrelated to this specification. +* Be aware that Amazon Music also uses separate UUIDv5 identifiers within their podcast directory, which are + calculated differently and unrelated to this specification. * The following regular expression (regex) will match a GUID: ```re [0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}` @@ -601,9 +745,6 @@ Using this pattern, podcasts can maintain a consistent identity across the open ### Node Value   The node value is a UUIDv5 string. -### Attributes -  There are no attributes for this tag. - ### Examples Example GUID for feed url `mp3s.nashownotes.com/pc20rss.xml`: ```xml @@ -617,30 +758,39 @@ Example GUID for feed url `podnews.net/rss`: ### Guid-enabled fast-follow share links -  The `podcast:guid` value above enables podcasters to produce a link that can share a podcast on a variety of different platforms. +  The `podcast:guid` value above enables podcasters to produce a link that can share a podcast on a variety of +different platforms.   The format of the link is `https://(a podcast website link)#fastfollow-(type):(a podcast guid)`   `type` is currently `podcast`, but may be extended in future. -  A working example is https://podnews.net/podcast/i8xe9/listen#fastfollow-podcast:9b024349-ccf0-5f69-a609-6b82873eab3c or the QR code given below. +  A working example is https://podnews.net/podcast/i8xe9/listen#fastfollow-podcast:9b024349-ccf0-5f69-a609 +-6b82873eab3c or the QR code given below.   ![podnews-qr](https://user-images.githubusercontent.com/231941/127796108-d819de43-6c0e-4c7b-9579-ed1f19989443.png) -  When scanned on a mobile phone's camera app, this link will go to the specified podcast website. Behavior of this website is up to the creator: some may use a default homepage, others may sniff the useragent and open a default podcast app on a device. In the working example, above, an iPhone user may be taken to Apple Podcasts; an Android user may be taken to Google Podcasts; and another device will be given a page with a player. +  When scanned on a mobile phone's camera app, this link will go to the specified podcast website. Behavior of +this website is up to the creator: some may use a default homepage, others may sniff the useragent and open a +default podcast app on a device. In the working example, above, an iPhone user may be taken to Apple Podcasts; an +Android user may be taken to Google Podcasts; and another device will be given a page with a player. -  When scanned on a QR code reader inside a podcast app, like [CurioCaster](https://curiocaster.com/), the app can parse the `podcast:guid` value from the URL, allowing the podcast to be opened within the application. +  When scanned on a QR code reader inside a podcast app, like [CurioCaster](https://curiocaster.com/), the app +can parse the `podcast:guid` value from the URL, allowing the podcast to be opened within the application.



## Value ``

-This element designates the cryptocurrency or payment layer that will be used, the transport method for transacting the payments, and a suggested amount denominated in the given cryptocurrency. +This element designates the cryptocurrency or payment layer that will be used, the transport method for transacting +the payments, and a suggested amount denominated in the given cryptocurrency. -This element can exist at either the `` or `` level. When it exists at the `` level, it should be treated as an "override" of whatever is defined at the `` level. +This element can exist at either the `` or `` level. When it exists at the `` level, it should +be treated as an "override" of whatever is defined at the `` level. -This is a complex tag, so implementors are HIGHLY encouraged to read the companion [document](https://github.com/Podcastindex-org/podcast-namespace/blob/main/value/value.md) for a complete understanding of how +This is a complex tag, so implementors are HIGHLY encouraged to read the companion [document](https://github. +com/Podcastindex-org/podcast-namespace/blob/main/value/value.md) for a complete understanding of how this tag works and what it is capable of. ### Parent @@ -671,15 +821,17 @@ this tag works and what it is capable of.



## Value Recipient ``

-The `valueRecipient` tag designates various destinations for payments to be sent to during consumption of the enclosed media. Each recipient is considered to receive a "split" of the total payment according to the number of shares given -in the `split` attribute. +The `valueRecipient` tag designates various destinations for payments to be sent to during consumption of the +enclosed media. Each recipient is considered to receive a "split" of the total payment according to the number of +shares given in the `split` attribute. This element may only exist within a parent `` element. There is no limit on how many `valueRecipient` elements can be present in a given `` element. -This is a complex tag, so implementors are HIGHLY encouraged to read the companion [document](https://github.com/Podcastindex-org/podcast-namespace/blob/main/value/value.md) for a complete understanding of how -this tag works and what it is capable of. +This is a complex tag, so implementors are HIGHLY encouraged to read the companion [document](https://github. +com/Podcastindex-org/podcast-namespace/blob/main/value/value.md) for a complete understanding of how this tag works +and what it is capable of. ### Parent   `` @@ -690,7 +842,8 @@ this tag works and what it is capable of. ### Attributes - **name** (recommended) A free-form string that designates who or what this recipient is. - **customKey** (optional) The name of a custom record key to send along with the payment. - - **customValue** (optional) A custom value to pass along with the payment. This is considered the value that belongs to the `customKey`. + - **customValue** (optional) A custom value to pass along with the payment. This is considered the value that + belongs to the `customKey`. - **type** (required) A slug that represents the type of receiving address that will receive the payment. - **address** (required) This denotes the receiving address of the payee. - **split** (required) The number of shares of the payment this recipient will receive. @@ -732,12 +885,16 @@ this tag works and what it is capable of.



## Medium ``

-The `medium` tag tells the an application what the content contained within the feed IS, as opposed to what the content is ABOUT in the case of a category. This allows a podcast app to -modify it's behavior or UI to give a better experience to the user for this content. For example, if a podcast has `music` an app may choose to -reset playback speed to 1x and adjust it's EQ settings to be better for music vs. spoken word. +The `medium` tag tells an application what the content contained within the feed IS, as opposed to what the +content is ABOUT in the case of a category. This allows a podcast app to modify it's behavior or UI to give a +better experience to the user for this content. For example, if a podcast has +`music` an app may choose to reset playback speed to 1x and adjust it's EQ settings +to be better for music vs. spoken word. -Accepted medium names are curated within a list maintained by the community as new mediums are discovered over time. Newly proposed mediums should require some level of -justification to be added to this list. One may argue and/or prove use of a new medium even for only one application, should it prove different enough from existing mediums to have meaning. +Accepted medium names are curated within a list maintained by the community as new mediums are discovered over time. +Newly proposed mediums should require some level of justification to be added to this list. One may argue and/or +prove use of a new medium even for only one application, should it prove different enough from existing mediums to +have meaning. ### Parent   `` @@ -747,33 +904,107 @@ justification to be added to this list. One may argue and/or prove use of a new ### Node Value The node value is a string denoting one of the following possible values: -- `podcast` (default) - Describes a feed for a podcast show. If no `medium` tag is present in the channel, this medium is assumed. +- `podcast` (default) - Describes a feed for a podcast show. If no `medium` tag is present in the channel, this + medium is assumed. - `music` - A feed of music organized into an "album" with each item a song within the album. -- `video` - Like a "podcast" but used in a more visual experience. Something akin to a dedicated video channel like would be found on YouTube. -- `film` - Specific types of videos with one item per feed. This is different than a `video` medium because the content is considered to be cinematic; like a movie or documentary. +- `video` - Like a "podcast" but used in a more visual experience. Something akin to a dedicated video channel like + would be found on YouTube. +- `film` - Specific types of videos with one item per feed. This is different than a `video` medium because the + content is considered to be cinematic; like a movie or documentary. - `audiobook` - Specific types of audio with one item per feed, or where items represent chapters within the book. -- `newsletter` - Describes a feed of curated written articles. Newsletter articles now sometimes have an spoken version audio enclosure attached. -- `blog` - Describes a feed of informally written articles. Similar to `newsletter` but more informal as in a traditional blog platform style. +- `newsletter` - Describes a feed of curated written articles. Newsletter articles now sometimes have an spoken + version audio enclosure attached. +- `blog` - Describes a feed of informally written articles. Similar to `newsletter` but more informal as in a + traditional blog platform style. + +### List Mediums +In addition to the above mediums, each medium also has a counterpart "list" variant, where the original medium name +is suffixed by the letter "L" to indicate that it is a "List" of that type of content. For example, `podcast` would +become `podcastL`, `music` would become `musicL`, `audiobook` would become `audiobookL`, etc. + +There is also a dedicated list medium for mixed content: +- `mixed` - This list medium type describes a feed of ``'s that point to different remote medium + types. For instance, a single list feed might point to music, podcast and audiobook items in other feeds. An + example would be a personal consumption history feed. + +A "list" medium feed should not be expected to have regular ``'s,``'s, or any future +similar new item type. Rather, a "List" feed is intended to exclusively contain one or more ``'s, +allowing one to reference a feed by its `` and the guid of an item. ### Examples -Example use for a "podcast": +Example use for a standard "podcast" feed: ```xml podcast ``` -Example use for "music": +Example use for a "music" feed: ```xml music ``` +Example use for a "music" playlist feed: +```xml + + + Picking the Hits 2.0! + All the hits played on the Podcasting 2.0 show. + https://podcastindex.org + en-US + Wed, 07 Jun 2023 04:30:38 GMT + + https://example.com/images/pci_avatar-massive.jpg + + + 3f2a8e4e-263a-51aa-9d3d-0d71f82a1564 + musicL + https://example.com/images/pci_avatar-massive.jpg + + + + + + + + + + + + + + + +``` +



## Images ``

-This tag, when present, allows for specifying many different image sizes in a compact way at either the episode or channel level. The syntax is borrowed from -the HTML5 [srcset](https://html.spec.whatwg.org/multipage/images.html#srcset-attributes) syntax. It allows for describing multiple image sources with width and -pixel hints directly in the attribute. Although the HTML5 `srcset` attribute allows relative urls, absolute urls are required in this tag - since the feed url may not represent an appropriate base url for relativization. +This tag, when present, allows for specifying many different image sizes in a compact way at either the episode or +channel level. The syntax is borrowed from the HTML5 [srcset](https://html.spec.whatwg.org/multipage/images. +html#srcset-attributes) syntax. It allows for describing multiple image sources with width and pixel hints directly +in the attribute. Although the HTML5 `srcset` attribute allows relative urls, absolute urls are required in this +tag - since the feed url may not represent an appropriate base url for relativization. ### Parent   `` or `` @@ -782,8 +1013,8 @@ pixel hints directly in the attribute. Although the HTML5 `srcset` attribute al   Single ### Attributes - - **srcset** (required) A string that denotes each image url followed by a space and the pixel width, with each one separated by a comma. See the example - for a clear view of the syntax. + - **srcset** (required) A string that denotes each image url followed by a space and the pixel width, with each one + separated by a comma. See the example for a clear view of the syntax. ### Examples Example of specifying four different image sizes: @@ -801,13 +1032,15 @@ Example of specifying four different image sizes:



## Live Item ``

-The `liveItem` tag is used for a feed to deliver a live audio or video stream to podcast apps. It takes the same format as a standard `` episode tag, and all tags that are -allowed as children of a normal `` are also allowed as children of ``. Note that "allowed" is not the same as "supported". So, just like a normal ``, -you cannot depend on all apps to support all tags within ``, especially when the function of the tag is not obvious. For instance, including an `` -tag in a live item is probably a waste of time since apps will not know what to do with that value in the context of live media. +The `liveItem` tag is used for a feed to deliver a live audio or video stream to podcast apps. It takes the same +format as a standard `` episode tag, and all tags that are allowed as children of a normal `` are also +allowed as children of ``. Note that "allowed" is not the same as "supported". So, just like a +normal ``, you cannot depend on all apps to support all tags within ``, especially when the +function of the tag is not obvious. For instance, including an `` tag in a live item is probably a +waste of time since apps will not know what to do with that value in the context of live media. -This tag will also make use of the [podping](https://podping.cloud) notification network. A podping notification SHOULD be sent out by the host when the live stream starts, to let -apps know. +This tag will also make use of the [podping](https://podping.cloud) notification network. A podping notification +SHOULD be sent out by the host when the live stream starts, to let apps know. ### Parent   `` @@ -818,31 +1051,46 @@ apps know. ### Node Value All tags that are valid as children of a standard `` tag are also valid as children here. -When specifying the audio/video source, the [``](#alternate-enclosure) tag is highly encouraged since it gives the broadest coverage of possible stream types and is -explicit in it's communication of what transport protocol and media codecs are being used. In addition to [``](#alternate-enclosure), a standard [``](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) should also -be given as a fallback to support podcast apps that don't yet implement [``](#alternate-enclosure). Regardless of which enclosure tag is used, feed owners must be conscious -of the fact that choosing a non-mainstream streaming protocol/codec will limit the number of apps that can play the content. For that reason, it's highly recommended to use only the two most widely supported -protocols (mp3 and mp4/h.264) to ensure compatibility with the broadest number of apps on various platforms. Choosing a streaming format that is outside of this narrow list might exclude many -apps from playing your content. As broader adoption of HLS, Opus, etc. becomes apparent, this recommendation will change to include newer formats. +When specifying the audio/video source, the [``](#alternate-enclosure) tag is highly +encouraged since it gives the broadest coverage of possible stream types and is explicit in it's communication of +what transport protocol and media codecs are being used. In addition to [``] +(#alternate-enclosure), a standard [``](https://cyber.harvard.edu/rss/rss. +html#ltenclosuregtSubelementOfLtitemgt) should also be given as a fallback to support podcast apps that don't yet +implement [``](#alternate-enclosure). -The [``](#content-link) tag is also required to be present, to ensure that listeners have a fallback option in case their chosen app cannot play the given content stream directly. In -most instances this will just be a link to an HTML page that can play the live stream. Such a page can reside on the podcaster's own website, a page provided by their hosting company or a third party -platform they have chosen to use. Podcasters who live stream to multiple platforms at once can also use the [``](#content-link) tag to provide links to those other platforms. +Regardless of which enclosure tag is used, feed +owners must be conscious of the fact that choosing a non-mainstream streaming protocol/codec will limit the number +of apps that can play the content. For that reason, it's highly recommended to use only the two most widely +supported protocols (mp3 and mp4/h.264) to ensure compatibility with the broadest number of apps on various +platforms. Choosing a streaming format that is outside of this narrow list might exclude many apps from playing +your content. As broader adoption of HLS, Opus, etc. becomes apparent, this recommendation will change to include +newer formats. -A robust, well-written `` tag will include all three of: [``](#alternate-enclosure), [``](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) +The [``](#content-link) tag is also required to be present, to ensure that listeners have a +fallback option in case their chosen app cannot play the given content stream directly. In most instances this will +just be a link to an HTML page that can play the live stream. Such a page can reside on the podcaster's own website, +a page provided by their hosting company or a third party platform they have chosen to use. Podcasters who live +stream to multiple platforms at once can also use the [``](#content-link) tag to provide links +to those other platforms. + +A robust, well-written `` tag will include all three of: [``] +(#alternate-enclosure), [``](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) and [``](#content-link) to ensure the broadest interopability with podcast apps. -The function of `` within a live item tag is the same as it is within a regular item. If the `` of a `` changes, it MUST be considered a new stream by -podcast apps. +The function of `` within a live item tag is the same as it is within a regular item. If the `` of a +`` changes, it MUST be considered a new stream by podcast apps. ### Attributes - **status** (required) A string that must be one of `pending`, `live` or `ended`. - - **start** (required) A string representing an ISO8601 timestamp that denotes the time when the stream is intended to start. - - **end** (required) A string representing an ISO8601 timestamp that denotes the time when the stream is intended to end. + - **start** (required) A string representing an ISO8601 timestamp that denotes the time when the stream is intended + to start. + - **end** (recommended) A string representing an ISO8601 timestamp that denotes the time when the stream is intended + to end. -The `start` and `end` attributes denote when the live stream "should" start and end. But, real life dictates that those times might not be adhered to. Apps are therefore encouraged -not to rely solely on those times as anything more than an approximation. The canonical way to know if a stream has started is with the `status` attribute. If `status` is "live" then -the stream has started. +The `start` and `end` attributes denote when the live stream "should" start and end. But, real life dictates that +those times might not be adhered to. Apps are therefore encouraged not to rely solely on those times as anything +more than an approximation. The canonical way to know if a stream has started is with the `status` attribute. If +`status` is "live" then the stream has started. ### Examples A complete example: @@ -858,9 +1106,12 @@ A complete example: https://example.com/images/live/pci_avatar-small.jpg 300w, https://example.com/images/live/pci_avatar-tiny.jpg 150w" /> - Adam Curry - Dave Jones - Becky Smith + Adam Curry + Dave Jones + Becky Smith @@ -886,12 +1137,14 @@ A bare bones example:



## Content Link ``

-The `contentLink` tag is used to indicate that the content begin delivered by the parent element can be found at an external location -instead of, or in addition to, being delivered directly to the tag itself within an app. In most instances it is used as a fallback link for the user -to use when the app itself can't handle a certain content delivery directly. +The `contentLink` tag is used to indicate that the content begin delivered by the parent element can be found at an +external location instead of, or in addition to, being delivered directly to the tag itself within an app. In most +instances it is used as a fallback link for the user to use when the app itself can't handle a certain content +delivery directly. -For instance, perhaps a podcast feed specifies a `` to deliver a live stream to apps. The feed may also give a `` -pointing to YouTube and Twitch versions of the live stream as well, just in case the listener uses an app that doesn't fully support live streaming content. +For instance, perhaps a podcast feed specifies a `` to deliver a live stream to apps. The feed +may also give a `` pointing to YouTube and Twitch versions of the live stream as well, just in +case the listener uses an app that doesn't fully support live streaming content. Currently this tag is only indicated for use in the `` tag. In the future, its use will be expanded. @@ -902,7 +1155,8 @@ Currently this tag is only indicated for use in the `` tag. I   Multiple ### Node Value -The node value is a free form string meant to explain to the user where this content link points and/or the nature of it's purpose. +The node value is a free form string meant to explain to the user where this content link points and/or the nature +of it's purpose. ### Attributes - **href** (required) A string that is the uri pointing to content outside of the application. @@ -921,17 +1175,18 @@ The node value is a free form string meant to explain to the user where this con



## Social Interact ``

-The `socialInteract` tag allows a podcaster to attach the url of a "root post" of a comment thread to an episode. This "root post" -is treated as the canonical location of where the comments and discussion around this episode will take place. This can be thought -of as the "official" social media comment space for this episode. If a protocol such as "activitypub" is used, or some other -protocol that allows programmatic API access, these comments can be directly pulled into the app, and replies can be posted back to -the thread from the app itself. +The `socialInteract` tag allows a podcaster to attach the url of a "root post" of a comment thread to an episode. +This "root post" is treated as the canonical location of where the comments and discussion around this episode will +take place. This can be thought of as the "official" social media comment space for this episode. If a protocol +such as "activitypub" is used, or some other protocol that allows programmatic API access, these comments can be +directly pulled into the app, and replies can be posted back to the thread from the app itself. -If multiple `socialInteract` tags are given for an ``, the `priority` attribute is strongly recommended to give the app an -indication as to which comments to display first. +If multiple `socialInteract` tags are given for an ``, the `priority` attribute is strongly recommended to +give the app an indication as to which comments to display first. -This tag can also be used as a signal to platforms and apps that the podcaster does not want public comments shown alongside this -episode. For this purpose a `protocol` value of "disabled" can be specified, with no other attributes or node value present. +This tag can also be used as a signal to platforms and apps that the podcaster does not want public comments shown +alongside this episode. For this purpose a `protocol` value of "disabled" can be specified, with no other +attributes or node value present. ### Parent   `` @@ -944,19 +1199,35 @@ episode. For this purpose a `protocol` value of "disabled" can be specified, wi - **protocol** (required) The [protocol](/socialprotocols.txt) in use for interacting with the comment root post. - **accountId** (recommended) The account id (on the commenting platform) of the account that created this root post. - **accountUrl** (optional) The public url (on the commenting platform) of the account that created this root post. -- **priority** (optional) When multiple socialInteract tags are present, this integer gives order of priority. A - lower number means higher priority. +- **priority** (optional) When multiple socialInteract tags are present, this integer gives order of priority. A + lower number means higher priority. Example (simple): ```xml - + ``` Example (complex): ```xml - - + + ``` Example (disabled): @@ -964,18 +1235,20 @@ Example (disabled): ``` -* For **activitypub**, Mastodon or Pleroma's posting API returns a URI (a fully-formed URL with a GUID in it), and a URL (the HTML page where the comment lives). While both of these are acceptable values for the `uri` field referenced in the `socialInteract` specification, we'd recommend using the URI value. +* For **activitypub**, Mastodon or Pleroma's posting API returns a URI (a fully-formed URL with a GUID in it), and a + URL (the HTML page where the comment lives). While both of these are acceptable values for the `uri` field + referenced in the `socialInteract` specification, we'd recommend using the URI value.



## Block ``

-This element allows a podcaster to express which platforms are allowed to publicly display this feed and its contents. -In its basic form, it is a direct drop-in replacement for the `` tag, but allows for greater flexibility -by the inclusion of the `id` attribute and by including multiple copies of itself in the feed. +This element allows a podcaster to express which platforms are allowed to publicly display this feed and its +contents. In its basic form, it is a direct drop-in replacement for the `` tag, but allows for greater +flexibility by the inclusion of the `id` attribute and by including multiple copies of itself in the feed. -Platforms should not ingest a feed for public display/use if their slug exists in the `id` of a `yes` block tag, or if -an unbounded `yes` block tag exists (meaning block all public ingestion). Conversely, if a platform finds their slug in -the `id` of a `no` block tag, they are free to ingest that feed for public display/usage. +Platforms should not ingest a feed for public display/use if their slug exists in the `id` of a `yes` block tag, or +if an unbounded `yes` block tag exists (meaning block all public ingestion). Conversely, if a platform finds their +slug in the `id` of a `no` block tag, they are free to ingest that feed for public display/usage. In plain language, the sequence of discovery an ingesting platform should use is as follows: @@ -991,7 +1264,8 @@ In plain language, the sequence of discovery an ingesting platform should use is   Multiple ### Attributes - - **id** (optional) A single entry from the [service slug list](https://github.com/Podcastindex-org/podcast-namespace/blob/main/serviceslugs.txt). + - **id** (optional) A single entry from the [service slug list](https://github. + com/Podcastindex-org/podcast-namespace/blob/main/serviceslugs.txt). ### Node value   The node value must be "yes" or "no". @@ -1025,9 +1299,11 @@ In plain language, the sequence of discovery an ingesting platform should use is



## Txt ``

-This element holds free-form text and is modeled after the DNS "[TXT](https://en.wikipedia.org/wiki/TXT_record)" record. It's meant to allow for usages that might be -niche or otherwise not rise to the level of needing a dedicated tag. Just like TXT records in DNS allowed for new things -like [SPF](https://en.wikipedia.org/wiki/Sender_Policy_Framework#Implementation) to evolve, this tag can allow novel techniques to be created and sandboxed without a formalization process. +This element holds free-form text and is modeled after the DNS "[TXT](https://en.wikipedia.org/wiki/TXT_record)" +record. It's meant to allow for usages that might be niche or otherwise not rise to the level of needing a +dedicated tag. Just like TXT records in DNS allowed for new things like [SPF](https://en.wikipedia. +org/wiki/Sender_Policy_Framework#Implementation) to evolve, this tag can allow novel techniques to be created and +sandboxed without a formalization process. ### Parent   `` or `` @@ -1036,23 +1312,23 @@ like [SPF](https://en.wikipedia.org/wiki/Sender_Policy_Framework#Implementation)   Multiple ### Attributes -- **purpose** (optional) A service specific string that will be used to denote what purpose this tag serves. This could - be something like "example.com" if it's a third party hosting platform needing to insert this - data, or something like "verify", "release" or any other free form bit of info that is - useful to the end consumer that needs it. The free form nature of this tag requires that this - attribute is also free formed. This value should not exceed `128 characters`. +- **purpose** (optional) A service specific string that will be used to denote what purpose this tag serves. This + could be something like "example.com" if it's a third party hosting platform needing to insert this data, or + something like "verify", "release" or any other free form bit of info that is useful to the end consumer that + needs it. The free form nature of this tag requires that this attribute is also free formed. This value should not + exceed `128 characters`. ### Purposes -The following are a list of strings known to be in common use. This list is in no way exhaustive. As new purposes come into -common use, this list will be updated by the community to reflect that. +The following are a list of strings known to be in common use. This list is in no way exhaustive. As new purposes +come into common use, this list will be updated by the community to reflect that. -- `verify` - The node value is expected to contain a string that is given by a third party platform to a podcaster in - order to prove that they are the owner of the feed and are in control of it. This is meant to replace the - need for emails to exist in feeds. See example section below. +- `verify` - The node value is expected to contain a string that is given by a third party platform to a podcaster + in order to prove that they are the owner of the feed and are in control of it. This is meant to replace the need + for emails to exist in feeds. See example section below. ### Node value -  This is a free form string. Please do not exceed `4000 characters` for the node value or it may be truncated by - aggregators. +  This is a free form string. Please do not exceed `4000 characters` for the node value or it may be +truncated by aggregators. ### Examples ```xml @@ -1066,3 +1342,289 @@ common use, this list will be updated by the community to reflect that. ```xml 2022-10-26T04:45:30.742Z ``` + + + +



+## Remote Item +``

+This element provides a way to "point" to another feed or an `` in another feed in order to obtain some sort +of data that the other feed or feed item has. This allows a podcast app to know where to go and fetch the data +being requested. What data is being requested is determined by the parent item. For instance, if the parent item +is a `` element, then the remote feed's `` metadata is needed. + +Using the `feedGuid` attribute is the preferred way to address a remote feed since, but there are times when an app +may not have access to a list of resolvable ``'s. In that case, it can be beneficial to include the +`feedUrl` attribute for those cases as a fallback. If both are present and the app is capable the `feedGuid` should +be resolved and used. + +### Parent +  `` or `` or `` + +### Count +  Multiple + +### Attributes +- **feedGuid** (required) The `` of the remote feed being pointed to. +- **feedUrl** (optional) The url of the remote feed being pointed to. +- **itemGuid** (optional) If this remote item element is intended to point to an `` in the remote feed, this + attribute should contain the value of the `` of that ``. +- **medium** (optional) If the feed being pointed to is not of medium type 'podcast', this attribute should contain + it's `` type from the [list](#medium) of types available in this document. The reason this is + helpful is to give the app a heads up on what type of data this is expected to be since that may affect the way it + approaches fetch and display. + +### Examples +```xml + +``` + +```xml + +``` + +```xml + +``` + + + +



+## Podroll +``

+This element allows for a podcaster to include references to one or more podcasts in it's `` as a way of +"recommending" other podcasts to their listener. + +### Parent +  `` + +### Count +  Single + +### Node value +  The node value must be one or more `` elements. + +### Example +```xml + + + + + +``` + + + +



+## Update Frequency +``

+This element allows a podcaster to express their intended release schedule as structured data and text. + +### Parent +`` + +### Count +Single + +### Node value +The node value is a free-form string, which might be displayed alongside other information about the podcast. Please +do not exceed `128 characters` for the node value or it may be truncated by aggregators. + +### Attributes +* **complete (optional):** Boolean specifying if the podcast has no intention to release further episodes. If not + set, this should be assumed to be false. +* **dtstart (optional):** The `date` or `datetime` the recurrence rule begins as an [ISO8601-fornmatted] + (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) string. If the + `rrule` contains a value for `COUNT`, then this attribute is required. If the `rrule` contains a value for `UNTIL`, + then the value of this attribute must be formatted to the same date/datetime standard. +* **rrule (recommended):** A recurrence rule as defined in [iCalendar RFC 5545 Section 3.3.10](https://www. + rfc-editor.org/rfc/rfc5545#section-3.3.10). + +### Examples +Recreating most of Apple Podcasts Connect’s “Update Frequency” values is easily achieved: +```xml +Daily + +Weekly + +Biweekly + +Monthly + +Bimonthly + +Monthly + +Yearly +``` + +However, greater precision can be easily communicated: +```xml +Every weekday + +Every Monday and Wednesday + +Every friday the 13th + + + Every year on American Thanksgiving + +``` + +Limited-run podcasts can indicate when they’ll go on hiatus by setting an UNTIL date or a COUNT: +```xml + + Every other Monday for 10 episodes starting on Aug 28, 2023 + + + + Every Monday until Dec 31, 2023 + +``` + +Podcasts currently on hiatus can indicate their intention to resume production by setting a DTSTART value in the future: +```xml + + Weekly, starting in 2025 + +``` + +Complete podcasts with no intention to release further episodes: +```xml +That’s all folks! +``` + + + +



+## Podping +``

+This element allows feed owners to signal to aggregators that the feed sends out +[`Podping`](https://github.com/Podcastindex-org/podping) notifications when changes are made to it, reducing the +need for frequent speculative feed polling. + +### Parent +  `` + +### Count +  Single + +## Examples +```xml + +``` + + + +



+## Value Time Split +``

+This element allows different value splits for a certain period of time. It is a combination of the concept of + and where a start time and a duration is supplied with alternative value +recipients. The alternative value recipients are not required to be remote, as the recipients may not have an RSS +feed/item of their own to reference. + +The `` element allows time-based changes of value recipient information during playback of a +feed's enclosure content. + +This can either contain one or more `` tags *or* exactly one `` tag. If +a `` tag is present, the `remotePercentage` attribute can be defined to control how much the +remote value block's `` tags will receive as a whole on top of the default, non-fee +`` tags. + +If the remote value block contains any `` tags, they should be ignored even if the +`remoteStartTime` indicates it's in a position that would invoke them. When referencing a remote value block, only +the root level block splits should be used and any `` children are to be ignored. + +Fees from the default `` tags should remain to be calculated before anything is taken out +from ``. + +### Parent +  `` + +### Count +  Multiple + +### Node Value +  A single `` element OR one or more `` elements. + +### Attributes +- `startTime` (required) - The time, in seconds, to stop using the currently active value recipient information and + start using the value recipient information contained in this element. +- `duration` (required) - How many seconds the playback app should use this element's value recipient information + before switching back to the value recipient information of the parent feed. +- `remoteStartTime` (optional) - The time in the remote item where the value split begins. Allows the timestamp to + be set correctly in value metadata. If not defined, defaults to 0. +- `remotePercentage` (optional) - The percentage of the payment the remote recipients will receive if a + `` is present. If not defined, defaults to 100. If the value is less than 0, 0 is assumed. + If the value is greater than 100, 100 is assumed. + +### Example (Remote Item) +```xml + + + Metal Showcase + A great playlist of my favorite metal tracks. + https://example.com/rss-metal-showcase.xml + en + Fri, 21 Apr 2023 18:56:30 -0500 + music + + Special interview with Torcon VII + ... + + + + + + + + + + + + + + + +``` + +### Example (Locally Specified) +```xml + + + Cool Pod + This is a cool pod + https://example.com/rss-cool-pod.xml + en + Fri, 21 Apr 2023 18:56:30 -0500 + podcast + + Adam Hates the word "pod" (and I do, too) + ... + + + + + + + + + + + + + + + + + +``` \ No newline at end of file diff --git a/proposal-docs/updateFrequency/updateFrequency.md b/proposal-docs/updateFrequency/updateFrequency.md index a457ae8..f602379 100644 --- a/proposal-docs/updateFrequency/updateFrequency.md +++ b/proposal-docs/updateFrequency/updateFrequency.md @@ -27,8 +27,8 @@ The node value is a free-form string, which might be displayed alongside other i ## Attributes * **complete (optional):** Boolean specifying if the podcast has no intention to release further episodes. If not set, this should be assumed to be false. -* **dtstart (optional):** The `date` or `datetime` the recurrence rule begins. If the `rrule` contains a value for `COUNT`, then this attribute is required. If the `rrule` contains a value for `UNTIL`, then the value of this attribute must be formatted to the same date/datetime standard. -* **rrule (recommended):** A recurrence rule as defined in [iCalendar RFC 5545 Section 3.3.10](https://www.rfc-editor.org/rfc/rfc5545#section-3.3.10). Podcasters should not be expected to be able to write a valid recurrence rule themselves. There are [several libraries](https://github.com/topics/rrule) to generate valid recurrence rules from form data or natural language text inputs. +* **dtstart (optional):** The `date` or `datetime` the recurrence rule begins as an [ISO8601-fornmatted](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) string. If the `rrule` contains a value for `COUNT`, then this attribute is required. If the `rrule` contains a value for `UNTIL`, then the value of this attribute must be formatted to the same date/datetime standard. +* **rrule (recommended):** A recurrence rule as defined in [iCalendar RFC 5545 Section 3.3.10](https://www.rfc-editor.org/rfc/rfc5545#section-3.3.10). ## Examples @@ -51,13 +51,18 @@ However, greater precision can be easily communicated: Every year on American Thanksgiving ``` -Limited-run series can set expectations clearly: +Limited-run podcasts can indicate when they’ll go on hiatus by setting an UNTIL date or a COUNT: ```xml -Every other Monday for 10 episodes starting on Aug 28, 2023 -Every Monday until Dec 31, 2023 +Every other Monday for 10 episodes starting on Aug 28, 2023 +Every Monday until Dec 31, 2023 ``` -Completed series with no intention to release further episodes: +Podcasts currently on hiatus can indicate their intention to resume production by setting a DTSTART value in the future: ```xml -That’s all folks! +Weekly, starting in 2025 +``` + +Complete podcasts with no intention to release further episodes: +```xml +That’s all folks! ```