formatting cleanup done

pull/541/head
daveajones 2023-06-04 09:18:02 -05:00
rodzic 05bb604306
commit 225d177a4b
1 zmienionych plików z 120 dodań i 68 usunięć

Wyświetl plik

@ -1033,9 +1033,12 @@ A complete example:
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: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>
@ -1061,12 +1064,14 @@ A bare bones example:
<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.
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.
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.
@ -1077,7 +1082,8 @@ Currently this tag is only indicated for use in the `<podcast:liveItem>` tag. I
&nbsp; Multiple
### Node Value
The node value is a free form string meant to explain to the user where this content link points and/or the nature of it's purpose.
The node value is a free form string meant to explain to the user where this content link points and/or the nature
of it's purpose.
### Attributes
- **href** (required) A string that is the uri pointing to content outside of the application.
@ -1096,17 +1102,18 @@ The node value is a free form string meant to explain to the user where this con
<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. This "root post"
is treated as the canonical location of where the comments and discussion around this episode will take place. This can be thought
of as the "official" social media comment space for this episode. If a protocol such as "activitypub" is used, or some other
protocol that allows programmatic API access, these comments can be directly pulled into the app, and replies can be posted back to
the thread from the app itself.
The `socialInteract` tag allows a podcaster to attach the url of a "root post" of a comment thread to an episode.
This "root post" is treated as the canonical location of where the comments and discussion around this episode will
take place. This can be thought of as the "official" social media comment space for this episode. If a protocol
such as "activitypub" is used, or some other protocol that allows programmatic API access, these comments can be
directly pulled into the app, and replies can be posted back to the thread from the app itself.
If multiple `socialInteract` tags are given for an `<item>`, the `priority` attribute is strongly recommended to give the app an
indication as to which comments to display first.
If multiple `socialInteract` tags are given for an `<item>`, the `priority` attribute is strongly recommended to
give the app an indication as to which comments to display first.
This tag can also be used as a signal to platforms and apps that the podcaster does not want public comments shown alongside this
episode. For this purpose a `protocol` value of "disabled" can be specified, with no other attributes or node value present.
This tag can also be used as a signal to platforms and apps that the podcaster does not want public comments shown
alongside this episode. For this purpose a `protocol` value of "disabled" can be specified, with no other
attributes or node value present.
### Parent
&nbsp; `<item>`
@ -1119,19 +1126,35 @@ episode. For this purpose a `protocol` value of "disabled" can be specified, wi
- **protocol** (required) The [protocol](/socialprotocols.txt) in use for interacting with the comment root post.
- **accountId** (recommended) The account id (on the commenting platform) of the account that created this root post.
- **accountUrl** (optional) The public url (on the commenting platform) of the account that created this root post.
- **priority** (optional) When multiple socialInteract tags are present, this integer gives order of priority. A
lower number means higher priority.
- **priority** (optional) When multiple socialInteract tags are present, this integer gives order of priority. A
lower number means higher priority.
Example (simple):
```xml
<podcast:socialInteract uri="https://podcastindex.social/web/@dave/108013847520053258" protocol="activitypub" accountId="@dave" />
<podcast:socialInteract
uri="https://podcastindex.social/web/@dave/108013847520053258"
protocol="activitypub"
accountId="@dave"
/>
```
Example (complex):
```xml
<podcast:socialInteract priority="1" uri="https://podcastindex.social/web/@dave/108013847520053258" protocol="activitypub" accountId="@dave" accountUrl="https://podcastindex.social/web/@dave" />
<podcast:socialInteract priority="2" uri="https://twitter.com/PodcastindexOrg/status/1507120226361647115" protocol="twitter" accountId="@podcastindexorg" accountUrl="https://twitter.com/PodcastindexOrg" />
<podcast:socialInteract
priority="1"
uri="https://podcastindex.social/web/@dave/108013847520053258"
protocol="activitypub"
accountId="@dave"
accountUrl="https://podcastindex.social/web/@dave"
/>
<podcast:socialInteract
priority="2"
uri="https://twitter.com/PodcastindexOrg/status/1507120226361647115"
protocol="twitter"
accountId="@podcastindexorg"
accountUrl="https://twitter.com/PodcastindexOrg"
/>
```
Example (disabled):
@ -1139,18 +1162,20 @@ Example (disabled):
<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.
* 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.
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.
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:
@ -1166,7 +1191,8 @@ In plain language, the sequence of discovery an ingesting platform should use is
&nbsp; Multiple
### Attributes
- **id** (optional) A single entry from the [service slug list](https://github.com/Podcastindex-org/podcast-namespace/blob/main/serviceslugs.txt).
- **id** (optional) A single entry from the [service slug list](https://github.
com/Podcastindex-org/podcast-namespace/blob/main/serviceslugs.txt).
### Node value
&nbsp; The node value must be "yes" or "no".
@ -1200,9 +1226,11 @@ In plain language, the sequence of discovery an ingesting platform should use is
<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.
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
&nbsp; `<channel>` or `<item>`
@ -1211,23 +1239,23 @@ like [SPF](https://en.wikipedia.org/wiki/Sender_Policy_Framework#Implementation)
&nbsp; Multiple
### Attributes
- **purpose** (optional) A service specific string that will be used to denote what purpose this tag serves. This could
be something like "example.com" if it's a third party hosting platform needing to insert this
data, or something like "verify", "release" or any other free form bit of info that is
useful to the end consumer that needs it. The free form nature of this tag requires that this
attribute is also free formed. This value should not exceed `128 characters`.
- **purpose** (optional) A service specific string that will be used to denote what purpose this tag serves. This
could be something like "example.com" if it's a third party hosting platform needing to insert this data, or
something like "verify", "release" or any other free form bit of info that is useful to the end consumer that
needs it. The free form nature of this tag requires that this attribute is also free formed. This value should not
exceed `128 characters`.
### Purposes
The following are a list of strings known to be in common use. This list is in no way exhaustive. As new purposes come into
common use, this list will be updated by the community to reflect that.
The following are a list of strings known to be in common use. This list is in no way exhaustive. As new purposes
come into common use, this list will be updated by the community to reflect that.
- `verify` - The node value is expected to contain a string that is given by a third party platform to a podcaster in
order to prove that they are the owner of the feed and are in control of it. This is meant to replace the
need for emails to exist in feeds. See example section below.
- `verify` - The node value is expected to contain a string that is given by a third party platform to a podcaster
in order to prove that they are the owner of the feed and are in control of it. This is meant to replace the need
for emails to exist in feeds. See example section below.
### Node value
&nbsp; This is a free form string. Please do not exceed `4000 characters` for the node value or it may be truncated by
aggregators.
&nbsp; 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
@ -1247,15 +1275,15 @@ common use, this list will be updated by the community to reflect that.
<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.
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.
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
&nbsp; `<channel>` or `<podcast:podroll>` or `<podcast:valueTimeSplit>`
@ -1267,11 +1295,11 @@ and used.
- **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.
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
@ -1299,7 +1327,7 @@ and used.
<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
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
@ -1332,42 +1360,66 @@ This element allows a podcaster to express their intended release schedule as st
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.
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).
* **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 Connects “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>
<podcast:updateFrequency rrule="FREQ=YEARLY;BYDAY=+4TH;BYMONTH=11">
Every year on American Thanksgiving
</podcast:updateFrequency>
```
Limited-run podcasts can indicate when theyll 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>
<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>
<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: