podcast-namespace/docs/1.0.md

752 wiersze
34 KiB
Markdown
Czysty Zwykły widok Historia

2021-05-28 13:09:04 +00:00
# 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).
2021-05-14 20:32:46 +00:00
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:
2021-04-19 03:35:20 +00:00
```xml
2021-01-26 20:09:35 +00:00
<rss version="2.0" xmlns:podcast="https://podcastindex.org/namespace/1.0">
```
# Podcast Tags
Each tag below exists in the podcast namespace within the specified parent. All attributes are required unless explicitly specified as optional.
2020-10-22 17:01:29 +00:00
Anywhere the url of a hyper-text based resource is specified, it must be given as `https:` and not `http:`.
2020-10-19 16:46:30 +00:00
2021-02-02 22:10:44 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
## Transcript
2021-09-02 13:55:52 +00:00
`<podcast:transcript>`<br><br>
This tag is used to link to a transcript or closed captions file. Multiple tags can be present for multiple transcript formats.
2021-09-02 13:55:52 +00:00
Detailed file format information and example files are [here](../transcripts/transcripts.md).
2021-09-02 13:55:52 +00:00
### Parent
&nbsp; `<item>`
2020-12-27 20:40:34 +00:00
2021-09-02 13:55:52 +00:00
### Count
&nbsp; Multiple
### Attributes
2021-07-07 14:31:16 +00:00
- **url (required):** URL of the podcast transcript.
2021-07-07 14:31:16 +00:00
- **type (required):** Mime type of the file such as `text/plain`, `text/html`, `application/srt`, `text/vtt`, `application/json`
2020-10-22 15:31:34 +00:00
- **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 `<language>` element.
2020-10-22 15:31:34 +00:00
- **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.
2021-09-02 13:55:52 +00:00
### Examples
2021-09-02 15:45:12 +00:00
```xml
<podcast:transcript url="https://example.com/episode1/transcript.html" type="text/html" />
```
2021-09-02 15:45:12 +00:00
```xml
<podcast:transcript url="https://example.com/episode1/transcript.srt" type="text/srt" rel="captions" />
```
2021-09-02 15:45:12 +00:00
```xml
<podcast:transcript url="https://example.com/episode1/transcript.json" type="application/json" language="es" rel="captions" />
```
2021-09-02 15:45:12 +00:00
```xml
<podcast:transcript url="https://example.com/episode1/transcript.vtt" type="text/vtt" />
```
2020-10-19 16:46:30 +00:00
2021-02-02 22:10:44 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
## Locked
2021-09-02 13:55:52 +00:00
`<podcast:locked>`<br><br>
This tag may be set to `yes` or `no`. The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of `yes` means that any attempt to import this feed into a new platform should be rejected.
2020-10-22 15:28:50 +00:00
2021-09-02 13:55:52 +00:00
### Parent
&nbsp; `<channel>`
2021-09-02 13:55:52 +00:00
### Count
&nbsp; Single
2020-12-27 20:40:34 +00:00
2021-09-02 13:55:52 +00:00
### Node value
&nbsp; The node value must be "yes" or "no".
### Attributes
2021-07-07 14:31:16 +00:00
- **owner (required):** 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. This is a critical element, and it is expected that podcast hosting providers (if not providing virtual addresses) will allow setting this element's value in their GUI with an emphasis to their users of how important it is to have this be a valid, working email address.
2021-09-02 13:55:52 +00:00
### Examples
2021-09-02 15:45:12 +00:00
```xml
<podcast:locked owner="email@example.com">yes</podcast:locked>
```
2021-09-02 15:45:12 +00:00
```xml
<podcast:locked owner="email@example.com">no</podcast:locked>
```
2020-10-19 16:46:30 +00:00
2021-02-02 22:10:44 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
## Funding
2021-09-02 13:55:52 +00:00
`<podcast:funding>`<br><br>
2020-10-22 15:28:50 +00:00
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.
2021-09-02 13:55:52 +00:00
### Parent
&nbsp; `<channel>`
2021-09-02 13:55:52 +00:00
### Count
&nbsp; Multiple
2020-12-27 20:40:34 +00:00
2021-09-02 13:55:52 +00:00
### Node value
&nbsp; 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
2021-07-07 14:31:16 +00:00
- **url (required):** The URL to be followed to fund the podcast.
2021-09-02 13:55:52 +00:00
### Examples
2021-09-02 15:45:12 +00:00
```xml
<podcast:funding url="https://www.example.com/donations">Support the show!</podcast:funding>
```
2020-11-15 22:38:28 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:funding url="https://www.example.com/members">Become a member!</podcast:funding>
```
2020-11-03 21:33:12 +00:00
2021-02-02 22:10:44 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2020-11-03 21:33:12 +00:00
## Chapters
2021-09-02 13:55:52 +00:00
`<podcast:chapters>`<br><br>
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.
2020-11-03 21:33:12 +00:00
2021-09-02 13:55:52 +00:00
### Parent
&nbsp; `<item>`
2020-11-03 21:33:12 +00:00
2021-09-02 13:55:52 +00:00
### Count
&nbsp; Single
2020-12-27 20:40:34 +00:00
2021-09-02 13:55:52 +00:00
### Attributes
2021-07-07 14:31:16 +00:00
- **url (required):** The URL where the chapters file is located.
- **type (required):** Mime type of file - JSON prefered, 'application/json+chapters'.
2020-11-03 21:33:12 +00:00
2021-09-02 13:55:52 +00:00
### Examples
2021-09-02 15:45:12 +00:00
```xml
<podcast:chapters url="https://example.com/episode1/chapters.json" type="application/json+chapters" />
```
2020-11-12 17:58:32 +00:00
2021-02-02 22:10:44 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2020-11-12 17:58:32 +00:00
## Soundbite
2021-09-02 13:55:52 +00:00
`<podcast:soundbite>`<br><br>
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 `<enclosure>` element.
2020-11-12 17:58:32 +00:00
2021-09-02 13:55:52 +00:00
### Parent
&nbsp; `<item>`
2020-11-12 17:58:32 +00:00
2021-09-02 13:55:52 +00:00
### Count
&nbsp; Multiple
2020-12-27 20:40:34 +00:00
2021-09-02 13:55:52 +00:00
### Node value
&nbsp; This is a free form string from the podcast creator to specify a title for the soundbite. If the podcaster does not provide a value for the soundbite title, then leave the value blank, and podcast apps can decide to use the episode title or some other placeholder value in its place. Please do not exceed `128 characters`
2021-09-02 13:55:52 +00:00
for the node value or it may be truncated by aggregators.
### Attributes
2021-07-07 14:31:16 +00:00
- **startTime (required):** The time where the soundbite begins
- **duration (required):** How long is the soundbite (recommended between 15 and 120 seconds)
2020-11-12 17:58:32 +00:00
2021-09-02 13:55:52 +00:00
### Examples
2021-09-02 15:45:12 +00:00
```xml
<podcast:soundbite startTime="73.0" duration="60.0" />
```
2020-11-12 17:58:32 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:soundbite startTime="1234.5" duration="42.25">Why the Podcast Namespace Matters</podcast:soundbite>
```
2020-11-12 17:58:32 +00:00
2021-02-02 21:18:32 +00:00
2021-02-02 22:10:44 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2021-02-02 21:18:32 +00:00
## Person
2021-09-02 13:55:52 +00:00
`<podcast:person>`<br><br>
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/)
2021-02-02 21:18:32 +00:00
2021-09-02 13:55:52 +00:00
### Parent
&nbsp; `<item>` or `<channel>`
2021-02-02 21:18:32 +00:00
2021-09-02 13:55:52 +00:00
### Count
&nbsp; Multiple
2021-02-02 21:18:32 +00:00
2021-09-02 13:55:52 +00:00
### Node value
&nbsp; 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.
2021-02-02 21:18:32 +00:00
2021-09-02 13:55:52 +00:00
### Attributes
2021-02-02 21:18:32 +00:00
- **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.
2021-02-02 21:37:15 +00:00
- **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.
2021-02-02 21:18:32 +00:00
- **img:** (optional) This is the url of a picture or avatar of the person.
2021-02-02 21:44:34 +00:00
- **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.
2021-02-02 21:18:32 +00:00
2021-02-02 21:40:57 +00:00
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".
2021-02-02 21:18:32 +00:00
2021-02-02 21:44:34 +00:00
The full taxonomy list is [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/taxonomy.json) as a json file.
2021-02-02 21:18:32 +00:00
2021-09-02 13:55:52 +00:00
### Examples
2021-09-02 15:45:12 +00:00
```xml
<podcast:person href="https://example.com/johnsmith/blog" img="http://example.com/images/johnsmith.jpg">John Smith</podcast:person>
```
2021-02-02 21:18:32 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:person role="guest" href="https://www.imdb.com/name/nm0427852888/" img="http://example.com/images/janedoe.jpg">Jane Doe</podcast:person>
```
2021-02-02 21:18:32 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:person role="guest" href="https://www.wikipedia/alicebrown" img="http://example.com/images/alicebrown.jpg">Alice Brown</podcast:person>
```
2021-02-02 21:18:32 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:person group="writing" role="guest" href="https://www.wikipedia/alicebrown" img="http://example.com/images/alicebrown.jpg">Alice Brown</podcast:person>
```
2021-02-02 21:18:32 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:person group="visuals" role="Cover Art Designer" href="https://example.com/artist/beckysmith">Becky Smith</podcast:person>
```
2021-02-02 21:37:15 +00:00
2021-02-03 22:04:35 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2021-02-03 22:04:35 +00:00
## Location
2021-09-02 13:55:52 +00:00
`<podcast:location>`<br><br>
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.
2021-02-03 22:04:35 +00:00
2021-09-02 13:55:52 +00:00
### Parent
&nbsp; `<item>` or `<channel>`
2021-02-03 22:04:35 +00:00
2021-09-02 13:55:52 +00:00
### Count
&nbsp; Single
2021-02-03 22:04:35 +00:00
2021-09-02 13:55:52 +00:00
### Node Value
&nbsp; 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.
2021-02-03 22:04:35 +00:00
2021-09-02 13:55:52 +00:00
### Attributes
2021-02-03 22:55:27 +00:00
- **geo:** (recommended) This is a latitude and longitude given in "geo" notation (i.e. "geo:30.2672,97.7431").
2021-02-03 22:04:35 +00:00
- **osm:** (recommended) The Open Street Map identifier of this place, given using the OSM notation (i.e. "R113314")
2021-09-02 13:55:52 +00:00
### Examples
2021-09-02 15:45:12 +00:00
```xml
<podcast:location geo="geo:30.2672,97.7431" osm="R113314">Austin, TX</podcast:location>
```
2021-02-03 22:04:35 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:location geo="geo:33.51601,-86.81455" osm="R6930627">Birmingham Civil Rights Museum</podcast:location>
```
2021-02-03 22:04:35 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:location geo="geo:-27.86159,153.3169" osm="W43678282">Dreamworld (Queensland)</podcast:location>
```
2021-02-03 22:25:46 +00:00
2021-02-04 14:44:28 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2021-02-04 14:44:28 +00:00
## Season
2021-09-02 13:55:52 +00:00
`<podcast:season>`<br><br>
2021-02-04 14:54:19 +00:00
This element allows for identifying which episodes in a podcast are part of a particular "season", with an optional season name attached.
2021-02-04 14:44:28 +00:00
2021-09-02 13:55:52 +00:00
### Parent
&nbsp; `<item>`
2021-02-04 14:44:28 +00:00
2021-09-02 13:55:52 +00:00
### Count
&nbsp; Single
2021-02-04 14:44:28 +00:00
2021-09-02 13:55:52 +00:00
### Node Value
&nbsp; The node value is an integer, and represents the season "number". It is required.
2021-02-04 14:44:28 +00:00
2021-09-02 13:55:52 +00:00
### Attributes
2021-02-04 14:52:59 +00:00
- **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.
2021-02-04 14:44:28 +00:00
Please do not exceed `128 characters` for the name attribute.
2021-09-02 13:55:52 +00:00
### Examples
2021-09-02 15:45:12 +00:00
```xml
<podcast:season>5</podcast:season>
```
2021-02-04 15:48:36 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:season name="Race for the Whitehouse 2020">3</podcast:season>
```
2021-02-04 14:44:28 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:season name="Egyptology: The 19th Century">1</podcast:season>
```
2021-02-04 15:15:46 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:season name="The Yearling - Chapter 3">3</podcast:season>
```
2021-02-04 15:48:36 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2021-02-04 15:48:36 +00:00
## Episode
2021-09-02 15:45:12 +00:00
`<podcast:episode>`<br><br>
2021-02-04 15:48:36 +00:00
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.
2021-09-02 15:45:12 +00:00
### Parent
&nbsp; `<item>`
2021-02-04 15:48:36 +00:00
2021-09-02 15:45:12 +00:00
### Count
&nbsp; Single
2021-02-04 15:48:36 +00:00
2021-09-02 15:45:12 +00:00
### Node Value
&nbsp; The node value is a decimal number. It is required.
2021-02-04 15:48:36 +00:00
2021-09-02 15:45:12 +00:00
### Attributes
2021-07-22 15:52:20 +00:00
- **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.
2021-02-04 15:48:36 +00:00
2021-09-02 15:45:12 +00:00
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.
2021-02-04 15:48:36 +00:00
2021-02-04 15:54:04 +00:00
Please do not exceed `32 characters` for the display attribute.
2021-02-04 15:48:36 +00:00
2021-09-02 15:45:12 +00:00
### Examples
```xml
<podcast:episode>3</podcast:episode>
```
2021-02-04 15:48:36 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:episode>315.5</podcast:episode>
```
2021-02-04 15:48:36 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:episode display="Ch.3">204</podcast:episode>
```
2021-02-04 15:50:25 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:episode display="Day 5">9</podcast:episode>
```
2021-06-02 00:17:23 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2021-06-02 00:17:23 +00:00
## Trailer
2021-09-02 15:45:12 +00:00
`<podcast:trailer>`<br><br>
2021-06-02 00:17:23 +00:00
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 `<enclosure>` with the extra `pubdate` and `season` attributes added.
2021-09-02 15:45:12 +00:00
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.
2021-06-02 00:17:23 +00:00
2021-09-02 15:45:12 +00:00
### Parent
&nbsp; `<channel>`
2021-06-02 00:17:23 +00:00
2021-09-02 15:45:12 +00:00
### Count
&nbsp; Multiple
2021-06-02 00:17:23 +00:00
2021-09-02 15:45:12 +00:00
### Node Value
&nbsp; 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
2021-06-02 00:17:23 +00:00
- **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.
2021-09-02 15:45:12 +00:00
If the `season` attribute is present, it must be a number that matches the format of the `<podcast:season>` tag. So, for a podcast that has 3 published seasons, a new `<podcast:trailer season="4">` tag can
be put in the channel to later be matched up with a `<podcast:season>4<podcast:season>` tag when it is published within a new `<item>`.
2021-06-02 00:17:23 +00:00
#### Examples
```xml
<podcast:trailer pubdate="Thu, 01 Apr 2021 08:00:00 EST" url="https://example.org/trailers/teaser" length="12345678" type="audio/mp3">Coming April 1st, 2021</podcast:trailer>
```
```xml
<podcast:trailer pubdate="Thu, 01 Apr 2021 08:00:00 EST" url="https://example.org/trailers/season4teaser" length="12345678" type="video/mp4" season="4">Season 4: Race for the Whitehouse</podcast:trailer>
(later matches with)
<podcast:season name="Race for the Whitehouse">4</podcast:season>
```
2021-06-07 16:07:48 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2021-06-07 16:07:48 +00:00
## License
2021-09-02 15:45:12 +00:00
`<podcast:license>`<br><br>
2021-06-07 16:10:44 +00:00
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.
2021-06-07 16:07:48 +00:00
2021-09-02 15:45:12 +00:00
### Parent
&nbsp; `<channel>` or `<item>`
2021-06-07 16:07:48 +00:00
2021-09-02 15:45:12 +00:00
### Count
&nbsp; Single
2021-06-07 16:07:48 +00:00
2021-09-02 15:45:12 +00:00
### Node Value
&nbsp; 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.
2021-06-07 16:07:48 +00:00
2021-09-02 15:45:12 +00:00
### Attributes
2021-06-07 16:07:48 +00:00
- **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.
2021-09-02 15:45:12 +00:00
### Examples
```xml
<podcast:license>cc-by-4.0</podcast:license>
```
2021-06-07 16:07:48 +00:00
2021-09-02 15:45:12 +00:00
```xml
<podcast:license url="https://example.org/mypodcastlicense/full.pdf">my-podcast-license-v1</podcast:license>
```
2021-06-08 16:25:15 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2021-06-08 16:25:15 +00:00
## Alternate Enclosure
2021-09-02 15:45:12 +00:00
`<podcast:alternateEnclosure>`<br><br>
2021-06-08 16:25:15 +00:00
This element is meant to provide different versions of, or companion media to the main `<enclosure>` 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.
2021-06-08 19:06:22 +00:00
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
2021-06-08 19:08:13 +00:00
this tag works and what it is capable of.
2021-06-08 16:25:15 +00:00
2021-09-02 15:45:12 +00:00
### Parent
&nbsp; `<item>`
2021-06-08 16:25:15 +00:00
2021-09-02 15:45:12 +00:00
### Count
&nbsp; Multiple
2021-06-08 16:25:15 +00:00
2021-09-02 15:45:12 +00:00
### Node Value
&nbsp; The node value must be one or more `<podcast:source>` elements that each define a uri where the media file can be downloaded or streamed. A single, optional `<podcast:integrity>` element may also be included
2021-06-08 16:29:47 +00:00
to allow for file integrity checking.
2021-06-08 16:25:15 +00:00
2021-09-02 15:45:12 +00:00
### Attributes
2021-06-08 16:25:15 +00:00
- **type:** (required) Mime type of the media asset.
- **length:** (required) Length of the file in bytes.
- **bitrate:** (optional) Encoding bitrate of media asset.
- **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.
2021-09-02 15:45:12 +00:00
### Examples
2021-06-08 16:25:15 +00:00
```xml
<enclosure url="https://example.com/file-0.mp3" length="43200000" type="audio/mpeg" />
2021-06-08 16:25:15 +00:00
<podcast:alternateEnclosure type="audio/mpeg" length="43200000" bitrate="128000" default="true" title="Standard">
<podcast:source uri="https://example.com/file-0.mp3" />
<podcast:source uri="ipfs://someRandomMpegFile" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="audio/opus" length="32400000" bitrate="96000" title="High quality">
<podcast:source uri="https://example.com/file-high.opus" />
<podcast:source uri="ipfs://someRandomHighBitrateOpusFile" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="audio/aac" length="54000000" bitrate="160000" title="High quality AAC">
<podcast:source uri="https://example.com/file-proprietary.aac" />
<podcast:source uri="ipfs://someRandomProprietaryAACFile" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="audio/opus" length="5400000" bitrate="16000" title="Low bandwidth">
<podcast:source uri="https://example.com/file-low.opus" />
<podcast:source uri="ipfs://someRandomLowBitrateOpusFile" />
</podcast:alternateEnclosure>
```
```xml
<podcast:alternateEnclosure type="audio/mpeg" length="2490970" bitrate="160707.74">
<podcast:source uri="https://example.com/file-0.mp3" />
<podcast:source uri="ipfs://QmdwGqd3d2gFPGeJNLLCshdiPert45fMu84552Y4XHTy4y" />
<podcast:source uri="https://example.com/file-0.torrent" contentType="application/x-bittorrent" />
<podcast:source uri="http://example.onion/file-0.mp3" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="video/mp4" length="10562995" bitrate="681483.55" height="1080">
<podcast:source uri="https://example.com/file-1080.mp4" />
<podcast:source uri="ipfs://QmfQKJcp2xdByEt8mzWr1AJUhwvb9rdWPoacvdq2roDhgh" />
<podcast:source uri="https://example.com/file-1080.torrent" contentType="application/x-bittorrent" />
<podcast:source uri="http://example.onion/file-1080.mp4" />
</podcast:alternateEnclosure>
```
2021-09-02 15:45:12 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2021-06-08 16:25:15 +00:00
## Source
2021-09-02 15:45:12 +00:00
`<podcast:source>`<br><br>
2021-06-08 16:32:23 +00:00
This element defines a uri location for a `<podcast:alternateEnclosure>` media file. It is meant to be used as a child of the `<podcast:alternateEnclosure>` element. At least one `<podcast:source>` element must be
2021-06-08 19:06:22 +00:00
present within every `<podcast:alternateEnclosure>` element.
2021-06-08 16:25:15 +00:00
2021-09-02 15:45:12 +00:00
### Parent
&nbsp; `<podcast:alternateEnclosure>`
2021-06-08 16:25:15 +00:00
2021-09-02 15:45:12 +00:00
### Count
&nbsp; Multiple
2021-06-08 16:25:15 +00:00
2021-09-02 15:45:12 +00:00
### Attributes
2021-06-08 19:06:22 +00:00
- **uri:** (required) This is the uri where the media file resides.
2021-06-09 15:26:50 +00:00
- **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.
2021-06-08 16:25:15 +00:00
2021-09-02 15:45:12 +00:00
### Examples
2021-06-08 16:25:15 +00:00
```xml
<podcast:alternateEnclosure type="video/mp4" length="7924786" bitrate="511276.52" height="720">
<podcast:source uri="https://example.com/file-720.mp4" />
<podcast:source uri="ipfs://QmX33FYehk6ckGQ6g1D9D3FqZPix5JpKstKQKbaS8quUFb" />
<podcast:source uri="https://example.com/file-720.torrent" contentType="application/x-bittorrent" />
<podcast:source uri="http://example.onion/file-720.mp4" />
</podcast:alternateEnclosure>
```
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2021-06-08 16:25:15 +00:00
## Integrity
2021-09-02 15:45:12 +00:00
`<podcast:integrity>`<br><br>
2021-06-08 19:06:22 +00:00
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
`<podcast:alternateEnclosure>` element. It allows to ensure that the file has not been tampered with.
2021-06-08 16:25:15 +00:00
2021-09-02 15:45:12 +00:00
### Parent
&nbsp; `<podcast:alternateEnclosure>`
2021-06-08 16:25:15 +00:00
2021-09-02 15:45:12 +00:00
### Count
&nbsp; Single
2021-06-08 16:25:15 +00:00
2021-09-02 15:45:12 +00:00
### Attributes
2021-06-08 16:25:15 +00:00
- **type:** (required) Type of integrity, either "sri" or "pgp-signature".
- **value:** (required) Value of the sri string or base64 encoded pgp signature.
2021-09-02 15:45:12 +00:00
### Examples
2021-06-08 16:25:15 +00:00
```xml
<podcast:alternateEnclosure type="video/mp4" length="7924786" bitrate="511276.52" height="720">
<podcast:source uri="https://example.com/file-720.mp4" />
<podcast:source uri="ipfs://QmX33FYehk6ckGQ6g1D9D3FqZPix5JpKstKQKbaS8quUFb" />
<podcast:integrity type="sri" value="sha384-ExVqijgYHm15PqQqdXfW95x+Rs6C+d6E/ICxyQOeFevnxNLR/wtJNrNYTjIysUBo" />
</podcast:alternateEnclosure>
```
2021-06-12 17:31:27 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2021-06-12 17:31:27 +00:00
## Guid
2021-09-02 15:45:12 +00:00
`<podcast:guid>`<br><br>
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.
2021-06-12 17:31:27 +00:00
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.
2021-06-12 17:31:27 +00:00
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.
* You can programmatically spot a GUID: it is 36 characters long, and contains four hyphen characters.
2021-11-08 07:59:54 +00:00
* 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}`
```
2021-09-02 15:45:12 +00:00
### Parent
&nbsp; `<channel>`
2021-06-12 17:31:27 +00:00
2021-09-02 15:45:12 +00:00
### Count
&nbsp; Single
2021-06-12 17:31:27 +00:00
2021-09-02 15:45:12 +00:00
### Node Value
&nbsp; The node value is a UUIDv5 string.
2021-06-12 17:31:27 +00:00
2021-09-02 15:45:12 +00:00
### Attributes
&nbsp; There are no attributes for this tag.
2021-06-12 17:31:27 +00:00
2021-09-02 15:45:12 +00:00
### Examples
2021-06-12 17:31:27 +00:00
Example GUID for feed url `mp3s.nashownotes.com/pc20rss.xml`:
```xml
<podcast:guid>917393e3-1b1e-5cef-ace4-edaa54e1f810</podcast:guid>
```
Example GUID for feed url `podnews.net/rss`:
```xml
<podcast:guid>9b024349-ccf0-5f69-a609-6b82873eab3c</podcast:guid>
```
2021-09-02 15:45:12 +00:00
### Guid-enabled fast-follow share links
2021-09-02 15:45:12 +00:00
&nbsp; The `podcast:guid` value above enables podcasters to produce a link that can share a podcast on a variety of different platforms.
2021-09-02 15:45:12 +00:00
&nbsp; The format of the link is `https://(a podcast website link)#fastfollow-(type):(a podcast guid)`
2021-09-02 15:45:12 +00:00
&nbsp; `type` is currently `podcast`, but may be extended in future.
2021-09-02 15:45:12 +00:00
&nbsp; A working example is https://podnews.net/podcast/i8xe9/listen#fastfollow-podcast:9b024349-ccf0-5f69-a609-6b82873eab3c or the QR code given below.
2021-09-02 15:45:12 +00:00
&nbsp; ![podnews-qr](https://user-images.githubusercontent.com/231941/127796108-d819de43-6c0e-4c7b-9579-ed1f19989443.png)
2021-09-02 15:45:12 +00:00
&nbsp; 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.
2021-09-01 22:22:48 +00:00
2021-09-02 15:45:12 +00:00
&nbsp; 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.
2021-09-01 22:22:48 +00:00
2021-09-01 22:25:48 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2021-09-01 22:22:48 +00:00
## Value
2021-09-02 13:36:12 +00:00
`<podcast:value>`<br><br>
2021-09-01 22:22:48 +00:00
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 `<channel>` or `<item>` level. When it exists at the `<item>` level, it should be treated as an "override" of whatever is defined at the `<channel>` 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 tag works and what it is capable of.
2021-09-02 13:34:29 +00:00
### Parent
2021-09-02 13:38:01 +00:00
&nbsp; `<channel>` or `<item>`
2021-09-01 22:22:48 +00:00
2021-09-02 13:34:29 +00:00
### Count
2021-09-02 13:38:01 +00:00
&nbsp; Single
2021-09-01 22:22:48 +00:00
2021-09-02 13:34:29 +00:00
### Node Value
2021-09-02 13:38:01 +00:00
&nbsp; The node value must be one or more `<podcast:valueRecipient>` elements.
2021-09-01 22:22:48 +00:00
2021-09-02 13:34:29 +00:00
### Attributes
2021-09-01 22:22:48 +00:00
- **type:** (required) This is the service slug of the cryptocurrency or protocol layer.
- **method:** (required) This is the transport mechanism that will be used.
- **suggested:** (optional) This is an optional suggestion on how much cryptocurrency to send with each payment.
2021-09-02 13:34:29 +00:00
### Examples
2021-09-01 22:22:48 +00:00
```xml
<podcast:value
type="lightning"
method="keysend"
suggested="0.00000005000"
></podcast:value>
```
2021-09-01 22:25:48 +00:00
2021-09-01 22:22:48 +00:00
2021-09-02 15:51:28 +00:00
<br><br><br><br><!-- Tag block -->
2021-09-01 22:22:48 +00:00
## Value Recipient
2021-09-02 15:45:12 +00:00
`<podcast:valueRecipient>`<br><br>
2021-09-01 22:22:48 +00:00
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 `<podcast:value>` element.
There is no limit on how many `valueRecipient` elements can be present in a given `<podcast:value>` 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.
2021-09-02 13:34:29 +00:00
### Parent
2021-09-02 15:45:12 +00:00
&nbsp; `<podcast:value>`
2021-09-01 22:22:48 +00:00
2021-09-02 13:34:29 +00:00
### Count
2021-09-02 15:45:12 +00:00
&nbsp; Multiple
2021-09-01 22:22:48 +00:00
2021-09-02 13:34:29 +00:00
### Attributes
2021-09-01 22:22:48 +00:00
- **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`.
- **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.
- **fee** (optional) If this attribute is not specified, it is assumed to be false.
2021-09-02 13:34:29 +00:00
### Examples
2021-09-01 22:22:48 +00:00
```xml
<podcast:value type="lightning" method="keysend" suggested="0.00000015000">
<podcast:valueRecipient
name="Alice (Podcaster)"
type="node"
address="02d5c1bf8b940dc9cadca86d1b0a3c37fbe39cee4c7e839e33bef9174531d27f52"
split="40"
/>
<podcast:valueRecipient
name="Bob (Podcaster)"
type="node"
address="032f4ffbbafffbe51726ad3c164a3d0d37ec27bc67b29a159b0f49ae8ac21b8508"
split="40"
/>
<podcast:valueRecipient
name="Carol (Producer)"
type="node"
address="02dd306e68c46681aa21d88a436fb35355a8579dd30201581cefa17cb179fc4c15"
split="15"
/>
<podcast:valueRecipient
name="Hosting Provider"
type="node"
address="03ae9f91a0cb8ff43840e3c322c4c61f019d8c1c3cea15a25cfc425ac605e61a4a"
split="5"
fee="true"
/>
</podcast:value>
```
2021-12-06 20:48:43 +00:00
<br><br><br><br><!-- Tag block -->
## Medium
`<podcast:medium>`<br><br>
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 `<podcast:medium>music</podcast:medium>` 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.
### Parent
&nbsp; `<channel>`
### Count
&nbsp; Single
2021-12-06 20:59:42 +00:00
### 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.
- `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.
2021-12-06 21:24:01 +00:00
- `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.
2021-12-06 20:59:42 +00:00
- `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.
2021-12-06 20:48:43 +00:00
### Examples
Example use for a "podcast":
```xml
<podcast:medium>podcast</podcast:medium>
```
Example use for "music":
```xml
<podcast:medium>music</podcast:medium>
2021-12-10 17:06:09 +00:00
```
<br><br><br><br><!-- Tag block -->
## Images
`<podcast:images>`<br><br>
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.
### Parent
&nbsp; `<channel>` or `<item>`
### Count
&nbsp; 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.
### Examples
Example of specifying four different image sizes:
```xml
<podcast:images
srcset="https://example.com/images/ep1/pci_avatar-massive.jpg 1500w,
https://example.com/images/ep1/pci_avatar-middle.jpg 600w,
https://example.com/images/ep1/pci_avatar-small.jpg 300w,
https://example.com/images/ep1/pci_avatar-tiny.jpg 150w"
/>
2021-12-06 20:48:43 +00:00
```