kopia lustrzana https://github.com/Podcastindex-org/podcast-namespace
1729 wiersze
72 KiB
Markdown
1729 wiersze
72 KiB
Markdown
# 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).
|
||
|
||
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
|
||
<rss version="2.0" xmlns:podcast="https://podcastindex.org/namespace/1.0">
|
||
```
|
||
|
||
<br><br>
|
||
|
||
# Table of Contents
|
||
- [Transcript](#transcript)
|
||
- [Locked](#locked)
|
||
- [Funding](#funding)
|
||
- [Chapters](#chapters)
|
||
- [Soundbite](#soundbite)
|
||
- [Person](#person)
|
||
- [Location](#location)
|
||
- [Season](#season)
|
||
- [Episode](#episode)
|
||
- [Trailer](#trailer)
|
||
- [License](#license)
|
||
- [Alternate Enclosure](#alternate-enclosure)
|
||
- [Source](#source)
|
||
- [Integrity](#integrity)
|
||
- [Guid](#guid)
|
||
- [Value](#value)
|
||
- [Value Recipient](#value-recipient)
|
||
- [Medium](#medium)
|
||
- [Images](#images)
|
||
- [Live Item](#live-item)
|
||
- [Content Link](#content-link)
|
||
- [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)
|
||
- [Chat](#chat)
|
||
- [Publisher](#publisher)
|
||
|
||
<br><br>
|
||
|
||
# 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:`.
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Transcript
|
||
`<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.
|
||
|
||
Detailed file format information and example files are [here](../transcripts/transcripts.md).
|
||
|
||
### Parent
|
||
`<item>`
|
||
|
||
### Count
|
||
Multiple
|
||
|
||
### 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`
|
||
|
||
- **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.
|
||
|
||
- **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
|
||
```xml
|
||
<podcast:transcript url="https://example.com/episode1/transcript.html" type="text/html" />
|
||
```
|
||
|
||
```xml
|
||
<podcast:transcript url="https://example.com/episode1/transcript.vtt" type="text/vtt" />
|
||
```
|
||
|
||
```xml
|
||
<podcast:transcript
|
||
url="https://example.com/episode1/transcript.json"
|
||
type="application/json"
|
||
language="es"
|
||
rel="captions"
|
||
/>
|
||
```
|
||
|
||
```xml
|
||
<podcast:transcript url="https://example.com/episode1/transcript.srt" type="application/x-subrip" rel="captions" />
|
||
```
|
||
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Locked
|
||
`<podcast:locked>`<br><br>
|
||
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
|
||
`<channel>`
|
||
|
||
### Count
|
||
Single
|
||
|
||
### Node value
|
||
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.
|
||
|
||
### Examples
|
||
```xml
|
||
<podcast:locked>yes</podcast:locked>
|
||
```
|
||
|
||
```xml
|
||
<podcast:locked owner="email@example.com">no</podcast:locked>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Funding
|
||
`<podcast:funding>`<br><br>
|
||
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
|
||
`<channel>`
|
||
|
||
### Count
|
||
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.
|
||
|
||
### Attributes
|
||
- **url (required):** The URL to be followed to fund the podcast.
|
||
|
||
### Examples
|
||
```xml
|
||
<podcast:funding url="https://www.example.com/donations">Support the show!</podcast:funding>
|
||
```
|
||
|
||
```xml
|
||
<podcast:funding url="https://www.example.com/members">Become a member!</podcast:funding>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Chapters
|
||
`<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.
|
||
|
||
### Parent
|
||
`<item>`
|
||
|
||
### Count
|
||
Single
|
||
|
||
### Attributes
|
||
- **url (required):** The URL where the chapters file is located.
|
||
- **type (required):** Mime type of file - JSON prefered, 'application/json+chapters'.
|
||
|
||
### Examples
|
||
```xml
|
||
<podcast:chapters url="https://example.com/episode1/chapters.json" type="application/json+chapters" />
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Soundbite
|
||
`<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>`](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) element.
|
||
|
||
### Parent
|
||
`<item>`
|
||
|
||
### Count
|
||
Multiple
|
||
|
||
### Node value
|
||
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` for the node
|
||
value or it may be truncated by aggregators.
|
||
|
||
### Attributes
|
||
- **startTime (required):** The time where the soundbite begins
|
||
- **duration (required):** How long is the soundbite (recommended between 15 and 120 seconds)
|
||
|
||
### Examples
|
||
```xml
|
||
<podcast:soundbite startTime="73.0" duration="60.0" />
|
||
```
|
||
|
||
```xml
|
||
<podcast:soundbite startTime="1234.5" duration="42.25">Why the Podcast Namespace Matters</podcast:soundbite>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Person
|
||
`<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/)
|
||
|
||
### Parent
|
||
`<channel>` (for a podcast) or `<item>` (for an individual episode)
|
||
|
||
It is suggested that `<channel>` is always populated, and `<item>` is populated where needed for an individual
|
||
episode. Where present, people information in `<item>` wholly replaces all information from the `<channel>`.
|
||
|
||
Publishers are expected to use the `podcast:person` element in the `<channel>` 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 `<item>` 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 `<channel>`,
|
||
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 `<item>` 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 `<item>` replaces all existing people information in `<channel>`, 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 `<channel>`, 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 `<item>` for this episode should
|
||
contain Sid James as a guest, **and** Big Daddy as the host of this episode. Because people information in `<item>`
|
||
replaces all existing people information in `<channel>`, 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.
|
||
|
||
### 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.
|
||
- **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.
|
||
|
||
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.
|
||
|
||
### Examples
|
||
```xml
|
||
<podcast:person
|
||
href="https://example.com/johnsmith/blog"
|
||
img="http://example.com/images/johnsmith.jpg"
|
||
>John Smith</podcast:person>
|
||
```
|
||
|
||
```xml
|
||
<podcast:person
|
||
role="guest"
|
||
href="https://www.imdb.com/name/nm0427852888/"
|
||
img="http://example.com/images/janedoe.jpg"
|
||
>Jane Doe</podcast:person>
|
||
```
|
||
|
||
```xml
|
||
<podcast:person
|
||
role="guest"
|
||
href="https://www.wikipedia/alicebrown"
|
||
img="http://example.com/images/alicebrown.jpg"
|
||
>Alice Brown</podcast:person>
|
||
```
|
||
|
||
```xml
|
||
<podcast:person
|
||
group="writing"
|
||
role="guest"
|
||
href="https://www.wikipedia/alicebrown"
|
||
img="http://example.com/images/alicebrown.jpg"
|
||
>Alice Brown</podcast:person>
|
||
```
|
||
|
||
```xml
|
||
<podcast:person
|
||
group="visuals"
|
||
role="Cover Art Designer"
|
||
href="https://example.com/artist/beckysmith"
|
||
>Becky Smith</podcast:person>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Location
|
||
`<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.
|
||
|
||
### Parent
|
||
`<item>` or `<channel>`
|
||
|
||
### Count
|
||
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.
|
||
|
||
### Attributes
|
||
- **geo:** (recommended) This is a latitude and longitude given in ["geo" notation](https://github.com/Podcastindex-org/podcast-namespace/blob/main/location/location.md#geo-recommended) (i.e. "geo:30.2672,97.7431").
|
||
- **osm:** (recommended) The Open Street Map identifier of this place, given using the OSM notation (i.e. "R113314")
|
||
|
||
### Examples
|
||
```xml
|
||
<podcast:location geo="geo:30.2672,97.7431" osm="R113314">Austin, TX</podcast:location>
|
||
```
|
||
|
||
```xml
|
||
<podcast:location geo="geo:33.51601,-86.81455" osm="R6930627">Birmingham Civil Rights Museum</podcast:location>
|
||
```
|
||
|
||
```xml
|
||
<podcast:location geo="geo:-27.86159,153.3169" osm="W43678282">Dreamworld (Queensland)</podcast:location>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Season
|
||
`<podcast:season>`<br><br>
|
||
This element allows for identifying which episodes in a podcast are part of a particular "season", with an optional
|
||
season name attached.
|
||
|
||
### Parent
|
||
`<item>`
|
||
|
||
### Count
|
||
Single
|
||
|
||
### Node Value
|
||
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.
|
||
|
||
Please do not exceed `128 characters` for the name attribute.
|
||
|
||
### Examples
|
||
```xml
|
||
<podcast:season>5</podcast:season>
|
||
```
|
||
|
||
```xml
|
||
<podcast:season name="Race for the Whitehouse 2020">3</podcast:season>
|
||
```
|
||
|
||
```xml
|
||
<podcast:season name="Egyptology: The 19th Century">1</podcast:season>
|
||
```
|
||
|
||
```xml
|
||
<podcast:season name="The Yearling - Chapter 3">3</podcast:season>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Episode
|
||
`<podcast:episode>`<br><br>
|
||
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
|
||
`<item>`
|
||
|
||
### Count
|
||
Single
|
||
|
||
### Node Value
|
||
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.
|
||
|
||
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.
|
||
|
||
### Examples
|
||
```xml
|
||
<podcast:episode>3</podcast:episode>
|
||
```
|
||
|
||
```xml
|
||
<podcast:episode>315.5</podcast:episode>
|
||
```
|
||
|
||
```xml
|
||
<podcast:episode display="Ch.3">204</podcast:episode>
|
||
```
|
||
|
||
```xml
|
||
<podcast:episode display="Day 5">9</podcast:episode>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Trailer
|
||
`<podcast:trailer>`<br><br>
|
||
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>`](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.
|
||
|
||
### Parent
|
||
`<channel>`
|
||
|
||
### Count
|
||
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.
|
||
|
||
### 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.
|
||
|
||
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>`.
|
||
|
||
#### 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>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## License
|
||
`<podcast:license>`<br><br>
|
||
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
|
||
`<channel>` or `<item>`
|
||
|
||
### Count
|
||
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.
|
||
|
||
### 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.
|
||
|
||
### Examples
|
||
```xml
|
||
<podcast:license>cc-by-4.0</podcast:license>
|
||
```
|
||
|
||
```xml
|
||
<podcast:license url="https://example.org/mypodcastlicense/full.pdf">my-podcast-license-v1</podcast:license>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Alternate Enclosure
|
||
`<podcast:alternateEnclosure>`<br><br>
|
||
This element is meant to provide different versions of, or companion media to the main [`<enclosure>`](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
|
||
`<item>`
|
||
|
||
### Count
|
||
Multiple
|
||
|
||
### Node Value
|
||
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 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.
|
||
|
||
### Examples
|
||
```xml
|
||
<enclosure url="https://example.com/file-0.mp3" length="43200000" type="audio/mpeg" />
|
||
|
||
<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>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Source
|
||
`<podcast:source>`<br><br>
|
||
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 present within
|
||
every `<podcast:alternateEnclosure>` element.
|
||
|
||
### Parent
|
||
`<podcast:alternateEnclosure>`
|
||
|
||
### Count
|
||
Multiple
|
||
|
||
### 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.
|
||
|
||
### Examples
|
||
```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>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Integrity
|
||
`<podcast:integrity>`<br><br>
|
||
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.
|
||
|
||
### Parent
|
||
`<podcast:alternateEnclosure>`
|
||
|
||
### Count
|
||
Single
|
||
|
||
### Attributes
|
||
- **type:** (required) Type of integrity, either "sri" or "pgp-signature".
|
||
- **value:** (required) Value of the sri string or base64 encoded pgp signature.
|
||
|
||
### Examples
|
||
```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>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Guid
|
||
`<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. 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.
|
||
|
||
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.
|
||
* 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}`
|
||
```
|
||
|
||
### Parent
|
||
`<channel>`
|
||
|
||
### Count
|
||
Single
|
||
|
||
### Node Value
|
||
The node value is a UUIDv5 string.
|
||
|
||
### Examples
|
||
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>
|
||
```
|
||
|
||
### 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 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.
|
||
|
||
![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 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.
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Value
|
||
`<podcast:value>`<br><br>
|
||
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.
|
||
|
||
### Parent
|
||
`<channel>` or `<item>`
|
||
|
||
### Count
|
||
Multiple
|
||
|
||
### Node Value
|
||
The node value must be one or more `<podcast:valueRecipient>` elements.
|
||
|
||
### Attributes
|
||
- **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.
|
||
|
||
### Examples
|
||
```xml
|
||
<podcast:value
|
||
type="lightning"
|
||
method="keysend"
|
||
suggested="0.00000005000"
|
||
></podcast:value>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Value Recipient
|
||
`<podcast:valueRecipient>`<br><br>
|
||
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.
|
||
|
||
### Parent
|
||
`<podcast:value>`
|
||
|
||
### Count
|
||
Multiple
|
||
|
||
### 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`.
|
||
- **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.
|
||
|
||
### Examples
|
||
```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>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Medium
|
||
`<podcast:medium>`<br><br>
|
||
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
|
||
`<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
|
||
`<channel>`
|
||
|
||
### Count
|
||
Single
|
||
|
||
### 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.
|
||
- `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.
|
||
- `publisher` - Describes a feed that links to other feeds a publisher owns using the `<podcast:remoteItem>` element.
|
||
To understand the structure of how "publisher" feeds work, please see the dedicated document
|
||
[here](/publishers/publishers.md) and the `<podcast:publisher>` tag [here](#publisher).
|
||
|
||
### 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 `<podcast:remoteItem>`'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 `<item>`'s,`<podcast:liveItem>`'s, or any future
|
||
similar new item type. Rather, a "List" feed is intended to exclusively contain one or more `<podcast:remoteItem>`'s,
|
||
allowing one to reference a feed by its `<podcast:guid>` and the guid of an item.
|
||
|
||
### Examples
|
||
Example use for a standard "podcast" feed:
|
||
```xml
|
||
<podcast:medium>podcast</podcast:medium>
|
||
```
|
||
|
||
Example use for a "music" feed:
|
||
```xml
|
||
<podcast:medium>music</podcast:medium>
|
||
```
|
||
|
||
Example use for a "music" playlist feed:
|
||
```xml
|
||
<rss xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
|
||
<channel>
|
||
<title>Picking the Hits 2.0!</title>
|
||
<description>All the hits played on the Podcasting 2.0 show.</description>
|
||
<link>https://podcastindex.org</link>
|
||
<language>en-US</language>
|
||
<pubDate>Wed, 07 Jun 2023 04:30:38 GMT</pubDate>
|
||
<image>
|
||
<url>https://example.com/images/pci_avatar-massive.jpg</url>
|
||
</image>
|
||
|
||
<podcast:guid>3f2a8e4e-263a-51aa-9d3d-0d71f82a1564</podcast:guid>
|
||
<podcast:medium>musicL</podcast:medium>
|
||
<itunes:image>https://example.com/images/pci_avatar-massive.jpg</itunes:image>
|
||
|
||
<podcast:value type="lightning" method="keysend" suggested="0.00000005000">
|
||
<podcast:valueRecipient name="podcaster" type="node" address="036557ea56b3b86f08be31bcd2557cae8021b0e3a9413f0c0e52625c6696972e57" split="99" />
|
||
<podcast:valueRecipient name="hosting company" type="node" address="036557ea56b3b86f08be31bcd2557cae8021b0e3a9413f0c0e52625c6696972e57" split="1" />
|
||
</podcast:value>
|
||
|
||
<podcast:remoteItem
|
||
feedGuid="ff519475-6e90-5231-91a0-37d092088d88"
|
||
feedUrl="https://media.rss.com/joemartinmusic/feed.xml"
|
||
itemGuid="e75771b1-e8d4-4133-9392-c579822247d9"
|
||
medium="music"
|
||
/>
|
||
|
||
<podcast:remoteItem
|
||
feedGuid="47081700-bd65-511f-b535-f545f3cd660c"
|
||
feedUrl="https://player.wavlake.com/feed/d1ed0ec9-21a8-4eda-b2c9-b17c8019a7e8"
|
||
itemGuid="7b03666e-b323-499d-93a7-ca51ce627ffd"
|
||
medium="music"
|
||
/>
|
||
|
||
<podcast:remoteItem
|
||
feedGuid="483dde8e-7e94-59a7-8eb0-2b0dc64a87bd"
|
||
feedUrl="https://player.wavlake.com/feed/1dd1bbd8-1084-4fdc-9788-dddaa62fbc6a"
|
||
itemGuid="8501fb64-a6a3-475a-8b10-9c746f0fe579"
|
||
medium="music"
|
||
/>
|
||
|
||
<podcast:remoteItem
|
||
feedGuid="b40ffcf7-2c48-5cfe-8daa-b65d766b2c25"
|
||
feedUrl="https://www.wavlake.com/feed/92b04241-97f5-4ff7-be11-cf45f70812e7"
|
||
itemGuid="9a48aab8-6da6-4cc1-9951-5b049c333580"
|
||
medium="music"
|
||
/>
|
||
</channel>
|
||
</rss>
|
||
```
|
||
|
||
|
||
|
||
<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. 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
|
||
`<channel>` or `<item>`
|
||
|
||
### Count
|
||
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"
|
||
/>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Live Item
|
||
`<podcast:liveItem>`<br><br>
|
||
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 `<item>` episode tag, and all tags that are allowed as children of a normal `<item>` are also
|
||
allowed as children of `<podcast:liveItem>`. Note that "allowed" is not the same as "supported". So, just like a
|
||
normal `<item>`, you cannot depend on all apps to support all tags within `<podcast:liveItem>`, especially when the
|
||
function of the tag is not obvious. For instance, including an `<itunes:duration>` 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.
|
||
|
||
### Parent
|
||
`<channel>`
|
||
|
||
### Count
|
||
Multiple
|
||
|
||
### Node Value
|
||
All tags that are valid as children of a standard `<item>` tag are also valid as children here.
|
||
|
||
When specifying the audio/video source, the [`<podcast:alternateEnclosure>`](#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 [`<podcast:alternateEnclosure>`](#alternate-enclosure), a standard [`<enclosure>`](https://cyber.harvard.edu/rss/rss.
|
||
html#ltenclosuregtSubelementOfLtitemgt) should also be given as a fallback to support podcast apps that don't yet
|
||
implement [`<podcast:alternateEnclosure>`](#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.
|
||
|
||
The [`<podcast:contentLink>`](#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 [`<podcast:contentLink>`](#content-link) tag to provide links
|
||
to those other platforms.
|
||
|
||
A robust, well-written `<podcast:liveItem>` tag will include all three of: [`<podcast:alternateEnclosure>`](#alternate-enclosure), [`<enclosure>`](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt)
|
||
and [`<podcast:contentLink>`](#content-link) to ensure the broadest interopability with podcast apps.
|
||
|
||
The function of `<guid>` within a live item tag is the same as it is within a regular item. If the `<guid>` of a
|
||
`<podcast:liveItem>` 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** (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.
|
||
|
||
### Examples
|
||
A complete example:
|
||
```xml
|
||
<podcast:liveItem status="live" start="2021-09-26T07:30:00.000-0600" end="2021-09-26T09:30:00.000-0600">
|
||
<title>Podcasting 2.0 Live Show</title>
|
||
<description>A look into the future of podcasting and how we get to Podcasting 2.0!</description>
|
||
<link>https://example.com/podcast/live</link>
|
||
<guid isPermaLink="true">https://example.com/live</guid>
|
||
<author>John Doe (john@example.com)</author>
|
||
<podcast:images srcset="https://example.com/images/live/pci_avatar-massive.jpg 1500w,
|
||
https://example.com/images/live/pci_avatar-middle.jpg 600w,
|
||
https://example.com/images/live/pci_avatar-small.jpg 300w,
|
||
https://example.com/images/live/pci_avatar-tiny.jpg 150w"
|
||
/>
|
||
<podcast:person href="https://www.podchaser.com/creators/adam-curry-107ZzmWE5f"
|
||
img="https://example.com/images/adamcurry.jpg">Adam Curry</podcast:person>
|
||
<podcast:person role="guest" href="https://github.com/daveajones/"
|
||
img="https://example.com/images/davejones.jpg">Dave Jones</podcast:person>
|
||
<podcast:person group="visuals" role="cover art designer"
|
||
href="https://example.com/artist/beckysmith">Becky Smith</podcast:person>
|
||
<podcast:alternateEnclosure type="audio/mpeg" length="312" default="true">
|
||
<podcast:source uri="https://example.com/pc20/livestream" />
|
||
</podcast:alternateEnclosure>
|
||
<enclosure url="https://example.com/pc20/livestream?format=.mp3" type="audio/mpeg" length="312" />
|
||
<podcast:contentLink href="https://youtube.com/pc20/livestream">YouTube!</podcast:contentLink>
|
||
<podcast:contentLink href="https://twitch.com/pc20/livestream">Twitch!</podcast:contentLink>
|
||
<podcast:contentLink href="https://example.com/html/livestream">Listen Live!</podcast:contentLink>
|
||
</podcast:liveItem>
|
||
```
|
||
|
||
A bare bones example:
|
||
```xml
|
||
<podcast:liveItem status="live" start="2021-09-26T07:30:00.000-0600" end="2021-09-26T09:30:00.000-0600">
|
||
<title>Podcasting 2.0 Live Stream</title>
|
||
<guid>e32b4890-983b-4ce5-8b46-f2d6bc1d8819</guid>
|
||
<enclosure url="https://example.com/pc20/livestream?format=.mp3" type="audio/mpeg" length="312" />
|
||
<podcast:contentLink href="https://example.com/html/livestream">Listen Live!</podcast:contentLink>
|
||
</podcast:liveItem>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Content Link
|
||
`<podcast:contentLink>`<br><br>
|
||
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 `<podcast:liveItem>` to deliver a live stream to apps. The feed
|
||
may also give a `<podcast:contentLink>` 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 `<podcast:liveItem>` tag. In the future, its use will be expanded.
|
||
|
||
### Parent
|
||
`<podcast:liveItem>`
|
||
|
||
### Count
|
||
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.
|
||
|
||
### Attributes
|
||
- **href** (required) A string that is the uri pointing to content outside of the application.
|
||
|
||
### Examples
|
||
```xml
|
||
<podcast:contentLink href="https://youtube.com/blahblah/livestream">Live on YouTube!</podcast:contentLink>
|
||
```
|
||
|
||
```xml
|
||
<podcast:contentLink href="https://twitter.com/statuses/somepost">Chat on Twitter!</podcast:contentLink>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Social Interact
|
||
`<podcast:socialInteract>`<br><br>
|
||
The `socialInteract` tag allows a podcaster to attach the url of a "root post" of a comment thread to an episode, or
|
||
to the podcast as a whole. This "root post" is treated as the canonical location of where the comments and
|
||
discussion around the episode or podcast will take place. This can be thought of as the "official" social media
|
||
comment space for the episode or podcast. 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 `<item>` or the `<channel>`, 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 the episode or podcast. For this purpose a `protocol` value of "disabled" can be specified, with no other
|
||
attributes or node value present.
|
||
|
||
### Parent
|
||
`<item>` or `<channel>`
|
||
|
||
### Count
|
||
Multiple
|
||
|
||
### Attributes
|
||
- **protocol** (required) The [protocol](/socialprotocols.txt) in use for interacting with the comment root post.
|
||
- **uri** (required) The uri/url of root post comment.
|
||
- **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.
|
||
|
||
|
||
Example (simple):
|
||
```xml
|
||
<podcast:socialInteract
|
||
protocol="activitypub"
|
||
uri="https://podcastindex.social/web/@dave/108013847520053258"
|
||
accountId="@dave"
|
||
/>
|
||
```
|
||
|
||
Example (complex):
|
||
```xml
|
||
<podcast:socialInteract
|
||
priority="1"
|
||
protocol="activitypub"
|
||
uri="https://podcastindex.social/web/@dave/108013847520053258"
|
||
accountId="@dave"
|
||
accountUrl="https://podcastindex.social/web/@dave"
|
||
/>
|
||
<podcast:socialInteract
|
||
priority="2"
|
||
protocol="twitter"
|
||
uri="https://twitter.com/PodcastindexOrg/status/1507120226361647115"
|
||
accountId="@podcastindexorg"
|
||
accountUrl="https://twitter.com/PodcastindexOrg"
|
||
/>
|
||
```
|
||
|
||
Example (disabled):
|
||
```xml
|
||
<podcast:socialInteract protocol="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.
|
||
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Block
|
||
`<podcast:block>`<br><br>
|
||
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 `<itunes:block>` 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.
|
||
|
||
In plain language, the sequence of discovery an ingesting platform should use is as follows:
|
||
|
||
1. Does `<podcast:block id="[myslug]">no</podcast:block>` exist in this feed? Safe to ingest.
|
||
2. Does `<podcast:block id="[myslug]">yes</podcast:block>` exist in this feed? Do not ingest.
|
||
3. Does `<podcast:block>yes</podcast:block>` exist in this feed? Do not ingest.
|
||
|
||
|
||
### Parent
|
||
`<channel>`
|
||
|
||
### Count
|
||
Multiple
|
||
|
||
### Attributes
|
||
- **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".
|
||
|
||
### Examples
|
||
```xml
|
||
<!-- This means "block everything" -->
|
||
<podcast:block>yes</podcast:block>
|
||
```
|
||
|
||
```xml
|
||
<!-- This means "block nothing" (same as not present) -->
|
||
<podcast:block>no</podcast:block>
|
||
```
|
||
|
||
```xml
|
||
<!-- This means "block only google and amazon" -->
|
||
<podcast:block id="google">yes</podcast:block>
|
||
<podcast:block id="amazon">yes</podcast:block>
|
||
```
|
||
|
||
```xml
|
||
<!-- This means "block every platform _except_ google and amazon" -->
|
||
<podcast:block>yes</podcast:block>
|
||
<podcast:block id="google">no</podcast:block>
|
||
<podcast:block id="amazon">no</podcast:block>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Txt
|
||
`<podcast:txt>`<br><br>
|
||
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
|
||
`<channel>` or `<item>`
|
||
|
||
### Count
|
||
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`.
|
||
|
||
### 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.
|
||
|
||
- `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.
|
||
|
||
### Examples
|
||
```xml
|
||
<podcast:txt>naj3eEZaWVVY9a38uhX8FekACyhtqP4JN</podcast:txt>
|
||
```
|
||
|
||
```xml
|
||
<podcast:txt purpose="verify">S6lpp-7ZCn8-dZfGc-OoyaG</podcast:txt>
|
||
```
|
||
|
||
```xml
|
||
<podcast:txt purpose="release">2022-10-26T04:45:30.742Z</podcast:txt>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Remote Item
|
||
`<podcast:remoteItem>`<br><br>
|
||
This element provides a way to "point" to another feed or an `<item>` 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 `<podcast:podroll>` element, then the remote feed's `<channel>` 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 `<podcast:guid>`'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
|
||
`<channel>` or `<podcast:podroll>` or `<podcast:valueTimeSplit>` or `<podcast:publisher>`
|
||
|
||
### Count
|
||
Multiple
|
||
|
||
### Attributes
|
||
- **feedGuid** (required) The `<podcast:guid>` 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 `<item>` in the remote feed, this
|
||
attribute should contain the value of the `<guid>` of that `<item>`.
|
||
- **medium** (optional) If the feed being pointed to is not of medium type 'podcast', this attribute should contain
|
||
it's `<podcast:medium>` 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
|
||
<podcast:remoteItem feedGuid="917393e3-1b1e-5cef-ace4-edaa54e1f810" />
|
||
```
|
||
|
||
```xml
|
||
<podcast:remoteItem
|
||
feedGuid="917393e3-1b1e-5cef-ace4-edaa54e1f810"
|
||
itemGuid="asdf089j0-ep240-20230510"
|
||
/>
|
||
```
|
||
|
||
```xml
|
||
<podcast:remoteItem
|
||
feedGuid="917393e3-1b1e-5cef-ace4-edaa54e1f810"
|
||
feedUrl="https://feeds.example.org/917393e3-1b1e-5cef-ace4-edaa54e1f810/rss.xml"
|
||
itemGuid="asdf089j0-ep240-20230510"
|
||
medium="music"
|
||
/>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Podroll
|
||
`<podcast:podroll>`<br><br>
|
||
This element allows for a podcaster to include references to one or more podcasts in it's `<channel>` as a way of
|
||
"recommending" other podcasts to their listener.
|
||
|
||
### Parent
|
||
`<channel>`
|
||
|
||
### Count
|
||
Single
|
||
|
||
### Node value
|
||
The node value must be one or more `<podcast:remoteItem>` elements.
|
||
|
||
### Example
|
||
```xml
|
||
<podcast:podroll>
|
||
<podcast:remoteItem feedGuid="29cdca4a-32d8-56ba-b48b-09a011c5daa9" />
|
||
<podcast:remoteItem feedGuid="396d9ae0-da7e-5557-b894-b606231fa3ea" />
|
||
<podcast:remoteItem feedGuid="917393e3-1b1e-5cef-ace4-edaa54e1f810" />
|
||
</podcast:podroll>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Update Frequency
|
||
`<podcast:updateFrequency>`<br><br>
|
||
This element allows a podcaster to express their intended release schedule as structured data and text.
|
||
|
||
### Parent
|
||
`<channel>`
|
||
|
||
### 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
|
||
<podcast:updateFrequency rrule="FREQ=DAILY">Daily</podcast:updateFrequency>
|
||
|
||
<podcast:updateFrequency rrule="FREQ=WEEKLY">Weekly</podcast:updateFrequency>
|
||
|
||
<podcast:updateFrequency rrule="FREQ=WEEKLY;INTERVAL=2">Biweekly</podcast:updateFrequency>
|
||
|
||
<podcast:updateFrequency rrule="FREQ=MONTHLY">Monthly</podcast:updateFrequency>
|
||
|
||
<podcast:updateFrequency rrule="FREQ=MONTHLY;INTERVAL=2">Bimonthly</podcast:updateFrequency>
|
||
|
||
<podcast:updateFrequency rrule="FREQ=MONTHLY">Monthly</podcast:updateFrequency>
|
||
|
||
<podcast:updateFrequency rrule="FREQ=YEARLY">Yearly</podcast:updateFrequency>
|
||
```
|
||
|
||
However, greater precision can be easily communicated:
|
||
```xml
|
||
<podcast:updateFrequency rrule="FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR">Every weekday</podcast:updateFrequency>
|
||
|
||
<podcast:updateFrequency rrule="FREQ=WEEKLY;BYDAY=MO,WE">Every Monday and Wednesday</podcast:updateFrequency>
|
||
|
||
<podcast:updateFrequency rrule="FREQ=WEEKLY;BYDAY=FR;BYMONTHDAY=13">Every friday the 13th</podcast:updateFrequency>
|
||
|
||
<podcast:updateFrequency rrule="FREQ=YEARLY;BYDAY=+4TH;BYMONTH=11">
|
||
Every year on American Thanksgiving
|
||
</podcast:updateFrequency>
|
||
```
|
||
|
||
Limited-run podcasts can indicate when they’ll go on hiatus by setting an UNTIL date or a COUNT:
|
||
```xml
|
||
<podcast:updateFrequency rrule="FREQ=WEEKLY;INTERVAL=2;BYDAY=MO;COUNT=10" dtstart="2023-08-28T00:00:00.000Z">
|
||
Every other Monday for 10 episodes starting on Aug 28, 2023
|
||
</podcast:updateFrequency>
|
||
|
||
<podcast:updateFrequency rrule="FREQ=WEEKLY;UNTIL=2023-12-31T00:00:00.000Z;BYDAY=MO">
|
||
Every Monday until Dec 31, 2023
|
||
</podcast:updateFrequency>
|
||
```
|
||
|
||
Podcasts currently on hiatus can indicate their intention to resume production by setting a DTSTART value in the future:
|
||
```xml
|
||
<podcast:updateFrequency dtstart="2025-01-01T00:00:00.000Z" rrule="FREQ=WEEKLY">
|
||
Weekly, starting in 2025
|
||
</podcast:updateFrequency>
|
||
```
|
||
|
||
Complete podcasts with no intention to release further episodes:
|
||
```xml
|
||
<podcast:updateFrequency complete="true">That’s all folks!</podcast:updateFrequency>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Podping
|
||
`<podcast:podping>`<br><br>
|
||
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
|
||
`<channel>`
|
||
|
||
### Count
|
||
Single
|
||
|
||
## Examples
|
||
```xml
|
||
<podcast:podping usesPodping="true"/>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Value Time Split
|
||
`<podcast:valueTimeSplit>`<br><br>
|
||
This element allows different value splits for a certain period of time. It is a combination of the concept of
|
||
<podcast:soundbite> and <podcast:remoteItem> 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 `<podcast:valueTimeSplit>` element allows time-based changes of value recipient information during playback of a
|
||
feed's enclosure content.
|
||
|
||
This can either contain one or more `<podcast:valueRecipient>` tags *or* exactly one `<podcast:remoteItem>` tag. If
|
||
a `<podcast:remoteItem>` tag is present, the `remotePercentage` attribute can be defined to control how much the
|
||
remote value block's `<podcast:valueRecipient>` tags will receive as a whole on top of the default, non-fee
|
||
`<podcast:valueRecipient>` tags.
|
||
|
||
If the remote value block contains any `<podcast:valueTimeSplit>` 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 `<podcast:valueTimeSplit>` children are to be ignored.
|
||
|
||
Fees from the default `<podcast:valueRecipient>` tags should remain to be calculated before anything is taken out
|
||
from `<podcast:valueTimeSplit>`.
|
||
|
||
### Parent
|
||
`<podcast:value>`
|
||
|
||
### Count
|
||
Multiple
|
||
|
||
### Node Value
|
||
A single `<podcast:remoteItem>` element OR one or more `<podcast:valueRecipient>` 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
|
||
`<podcast:remoteItem>` 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
|
||
<rss xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" version="2.0">
|
||
<channel>
|
||
<title>Metal Showcase</title>
|
||
<description>A great playlist of my favorite metal tracks.</description>
|
||
<link>https://example.com/rss-metal-showcase.xml</link>
|
||
<language>en</language>
|
||
<pubDate>Fri, 21 Apr 2023 18:56:30 -0500</pubDate>
|
||
<podcast:medium>music</podcast:medium>
|
||
<item>
|
||
<title>Special interview with Torcon VII</title>
|
||
<otherTagsHere>...</otherTagsHere>
|
||
<podcast:value type="lightning" method="keysend">
|
||
<podcast:valueRecipient name="Alice (Podcaster)" type="node" address="02d5c1bf8b940dc9cadca86d1b0a3c37fbe39cee4c7e839e33bef9174531d27f52" split="95" />
|
||
<podcast:valueRecipient name="Hosting Provider" type="node" address="03ae9f91a0cb8ff43840e3c322c4c61f019d8c1c3cea15a25cfc425ac605e61a4a" split="5" fee="true" />
|
||
|
||
<podcast:valueTimeSplit startTime="60" duration="237" remotePercentage="95">
|
||
<podcast:remoteItem itemGuid="https://podcastindex.org/podcast/4148683#1" feedGuid="a94f5cc9-8c58-55fc-91fe-a324087a655b" medium="music" />
|
||
</podcast:valueTimeSplit>
|
||
|
||
<podcast:valueTimeSplit startTime="330" duration="53" remoteStartTime="174" remotePercentage="95">
|
||
<podcast:remoteItem itemGuid="https://podcastindex.org/podcast/4148683#3" feedGuid="a94f5cc9-8c58-55fc-91fe-a324087a655b" medium="music" />
|
||
</podcast:valueTimeSplit>
|
||
</podcast:value>
|
||
</item>
|
||
</channel>
|
||
</rss>
|
||
```
|
||
|
||
### Example (Locally Specified)
|
||
```xml
|
||
<rss xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" version="2.0">
|
||
<channel>
|
||
<title>Cool Pod</title>
|
||
<description>This is a cool pod</description>
|
||
<link>https://example.com/rss-cool-pod.xml</link>
|
||
<language>en</language>
|
||
<pubDate>Fri, 21 Apr 2023 18:56:30 -0500</pubDate>
|
||
<podcast:medium>podcast</podcast:medium>
|
||
<item>
|
||
<title>Adam Hates the word "pod" (and I do, too)</title>
|
||
<otherTagsHere>...</otherTagsHere>
|
||
<podcast:value type="lightning" method="keysend">
|
||
<podcast:valueRecipient name="Alice (Podcaster)" type="node" address="02d5c1bf8b940dc9cadca86d1b0a3c37fbe39cee4c7e839e33bef9174531d27f52" split="95" />
|
||
<podcast:valueRecipient name="Hosting Provider" type="node" address="03ae9f91a0cb8ff43840e3c322c4c61f019d8c1c3cea15a25cfc425ac605e61a4a" split="5" fee="true" />
|
||
|
||
<podcast:valueTimeSplit startTime="63" duration="388">
|
||
<podcast:valueRecipient name="Alice (Podcaster)" type="node" address="02d5c1bf8b940dc9cadca86d1b0a3c37fbe39cee4c7e839e33bef9174531d27f52" split="85" />
|
||
<podcast:valueRecipient name="Jimbob (Guest)" type="node" address="02dd306e68c46681aa21d88a436fb35355a8579dd30201581cefa17cb179fc4c15" split="10" />
|
||
</podcast:valueTimeSplit>
|
||
|
||
<podcast:valueTimeSplit startTime="367" duration="246">
|
||
<podcast:valueRecipient name="Alice (Podcaster)" type="node" address="02d5c1bf8b940dc9cadca86d1b0a3c37fbe39cee4c7e839e33bef9174531d27f52" split="85" />
|
||
<podcast:valueRecipient name="Bobjim (Guest)" type="node" address="032f4ffbbafffbe51726ad3c164a3d0d37ec27bc67b29a159b0f49ae8ac21b8508" split="10" />
|
||
</podcast:valueTimeSplit>
|
||
</podcast:value>
|
||
</item>
|
||
</channel>
|
||
</rss>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Chat
|
||
`<podcast:chat>`<br><br>
|
||
This element allows a podcaster to attach information to either the `<channel>`, `<item>` or `<podcast:liveItem>` about
|
||
where the "official" chat for either the podcast or a specific episode or live event is to be found. Just like
|
||
`<podcast:socialInteract>` functions for social media, the `<podcast:chat>` tag will function for ephemeral chat.
|
||
There are many protocols in use across the internet for chat based communication. This tag is meant to be flexible
|
||
enough to adapt to whichever protocol the podcaster wants to use.
|
||
|
||
This element's presence at a particular level governs how it should be treated. If found at the `<item>` or
|
||
`<podcast:liveItem>` level, this should be treated as the information for that specific episode, overriding what is
|
||
at the `<channel>` level. If this tag is found at the `<channel>` level, it would be considered the chat for the entire
|
||
podcast and is recommended to be an "always on" chat room experience.
|
||
|
||
If a podcast has an "always on" style chat service it is recommended to link that at the `<channel>` level and do not
|
||
use the `<podcast:chat>` tag at the `<item>` or `<podcast:liveItem>` level.
|
||
|
||
### Parent
|
||
`<channel>` or `<item>` or `<podcast:liveItem>`
|
||
|
||
### Count
|
||
Single
|
||
|
||
### Attributes
|
||
- `server` (required) The fqdn of a chat server that serves as the "bootstrap" server to connect to.
|
||
- `protocol` (required) The [protocol](chatprotocols.txt) in use on the server.
|
||
- `accountId` (recommended) The account id of the podcaster on the server or platform being connected to.
|
||
- `space` (optional) Some chat systems have a notion of a chat "space" or "room" or "topic". This attribute will serve
|
||
that purpose.
|
||
|
||
### Example (IRC):
|
||
```xml
|
||
<podcast:chat
|
||
server="irc.zeronode.net"
|
||
protocol="irc"
|
||
accountId="@jsmith"
|
||
space="#myawesomepodcast"
|
||
/>
|
||
```
|
||
|
||
### Example (XMPP):
|
||
```xml
|
||
<podcast:chat
|
||
server="jabber.example.com"
|
||
protocol="xmpp"
|
||
accountId="jsmith@jabber.example.org"
|
||
space="myawesomepodcast@jabber.example.org"
|
||
/>
|
||
```
|
||
|
||
### Example (Nostr):
|
||
```xml
|
||
<podcast:chat
|
||
server="relay.example.com"
|
||
protocol="nostr"
|
||
accountId="npub1pvdw7mm7k20t9dn9gful8n5xua5yv8rmgd9wul88qq5dxj80lpxqd39r3u"
|
||
space="#myawesomepodcast_episode129"
|
||
/>
|
||
```
|
||
|
||
### Example (Matrix):
|
||
```xml
|
||
<podcast:chat
|
||
server="example.com"
|
||
protocol="matrix"
|
||
accountId="@bob:example.com"
|
||
space="#general:example.com"
|
||
/>
|
||
```
|
||
|
||
|
||
|
||
<br><br><br><br><!-- Tag block -->
|
||
## Publisher
|
||
`<podcast:publisher>`<br><br>
|
||
This element allows a podcast feed to link to it's "publisher feed" parent. This is useful when a parent publishing
|
||
entity wants to attest ownership over all of the podcast feeds it owns/publishes. This element must contain exactly
|
||
one `<podcast:remoteItem medium="publisher">` element pointing to the publisher feed. For widest compatibility, it is
|
||
highly recommended to use the `feedUrl` attribute of the `<podcast:remoteItem>` element in this capacity.
|
||
|
||
For complete implementation details regarding publisher feeds and how to create them, please see the full publisher
|
||
feed [documentation](/publishers/publishers.md) and the `publisher` medium [here](#medium).
|
||
|
||
### Parent
|
||
`<channel>`
|
||
|
||
### Count
|
||
Single
|
||
|
||
### Example:
|
||
```xml
|
||
<channel>
|
||
<title><![CDATA[It's A Mood]]></title>
|
||
<description>A value4value happenstance music show.</description>
|
||
<link>https://example.org/itsamood</link>
|
||
<generator>Sovereign Feeds</generator>
|
||
<podcast:person href="https://example.org/mikeneumann" group="cast" role="host" img="https://example.org/mikeneumann/image.jpg">Mike Neumann</podcast:person>
|
||
<podcast:guid>469b403f-db2d-574c-9db9-96dbb4f6561c</podcast:guid>
|
||
<podcast:medium>podcast</podcast:medium>
|
||
<podcast:publisher>
|
||
<podcast:remoteItem medium="publisher" feedGuid="003af0a0-6a45-55cf-b765-68e3d349551a" feedUrl="https://agilesetmedia.com/assets/static/feeds/publisher.xml"/>
|
||
</podcast:publisher>
|
||
<item>
|
||
<title><![CDATA[Runnin']]></title>
|
||
<pubDate>Wed, 03 Apr 2024 02:06:28 +0000</pubDate>
|
||
...
|
||
</item>
|
||
</channel>
|
||
``` |