├── .gitignore
├── docs
├── chatprotocols.txt
├── examples
│ ├── license
│ │ ├── licenseslugs.txt
│ │ ├── licenses.json
│ │ └── license.md
│ ├── value
│ │ ├── valueslugs.txt
│ │ └── lnaddress.md
│ ├── transcripts
│ │ ├── example.json
│ │ ├── example.vtt
│ │ └── transcripts.md
│ ├── chapters
│ │ ├── example.json
│ │ ├── exampleComplex.json
│ │ └── jsonChapters.md
│ └── publishers
│ │ └── publishers.md
├── schema
│ ├── tag-hover.png
│ ├── tag-inserted.png
│ ├── attribute-hover.png
│ ├── first-child-tag.png
│ ├── start-tag-completion.png
│ ├── podcast-wrapper.xsd
│ ├── strip-annotation.xslt
│ ├── podcast-example.xml
│ └── podcast-schema.md
├── tags
│ ├── podping.md
│ ├── funding.md
│ ├── locked.md
│ ├── season.md
│ ├── integrity.md
│ ├── source.md
│ ├── soundbite.md
│ ├── value.md
│ ├── episode.md
│ ├── chapters.md
│ ├── license.md
│ ├── images-(deprecated).md
│ ├── content-link.md
│ ├── transcript.md
│ ├── publisher.md
│ ├── block.md
│ ├── podroll.md
│ ├── txt.md
│ ├── trailer.md
│ ├── value-recipient.md
│ ├── remote-item.md
│ ├── chat.md
│ ├── social-interact.md
│ ├── location.md
│ ├── update-frequency.md
│ ├── guid.md
│ ├── alternate-enclosure.md
│ ├── person.md
│ ├── value-time-split.md
│ ├── medium.md
│ ├── live-item.md
│ └── image.md
├── 1.0.md
└── other-recommendations.md
├── .vs
├── ProjectSettings.json
├── slnx.sqlite
├── podcast-namespace
│ └── v16
│ │ └── .suo
└── VSWorkspaceState.json
├── proposal-docs
├── chat
│ ├── chatprotocols.txt
│ └── chat.md
├── hive-account-name
│ └── hive-account-name.md
├── social
│ ├── platforms.md
│ └── social.md
├── podping
│ └── podping.md
├── license
│ └── license.md
├── bonusItem
│ └── bonusItem.md
├── opensubscribe
│ └── opensubscribe.md
├── value-webmonetization
│ └── value-webmonetization.md
├── updateFrequency
│ └── updateFrequency.md
└── API
│ └── Chapters.md
├── apgtrss1.png
├── apgtrss2.png
├── socialprotocols.txt
├── contributors.txt
├── serviceslugs.txt
├── existing-namespaces.txt
├── letters
└── letter-to-apple.md
├── COPYING.txt
├── podcasting2.0.md
└── categories.json
/.gitignore:
--------------------------------------------------------------------------------
1 | /.vs/
2 | .vscode/settings.json
3 |
--------------------------------------------------------------------------------
/docs/chatprotocols.txt:
--------------------------------------------------------------------------------
1 | irc
2 | xmpp
3 | nostr
4 | matrix
--------------------------------------------------------------------------------
/.vs/ProjectSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "CurrentProjectSetting": null
3 | }
--------------------------------------------------------------------------------
/proposal-docs/chat/chatprotocols.txt:
--------------------------------------------------------------------------------
1 | irc
2 | xmpp
3 | nostr
4 | matrix
--------------------------------------------------------------------------------
/apgtrss1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/HEAD/apgtrss1.png
--------------------------------------------------------------------------------
/apgtrss2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/HEAD/apgtrss2.png
--------------------------------------------------------------------------------
/.vs/slnx.sqlite:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/HEAD/.vs/slnx.sqlite
--------------------------------------------------------------------------------
/docs/examples/license/licenseslugs.txt:
--------------------------------------------------------------------------------
1 | ARR
2 | CC-BY-4.0
3 | CC-BY-NC-4.0
4 | CC-BY-NC-ND-4.0
5 | POD-V4V-1.0
--------------------------------------------------------------------------------
/docs/examples/value/valueslugs.txt:
--------------------------------------------------------------------------------
1 | bitcoin
2 | lightning
3 | keysend
4 | lnaddress
5 | amp
6 | wallet
7 | node
--------------------------------------------------------------------------------
/socialprotocols.txt:
--------------------------------------------------------------------------------
1 | disabled
2 | activitypub
3 | twitter
4 | lightning
5 | atproto
6 | hive
7 | matrix
8 | nostr
9 |
--------------------------------------------------------------------------------
/docs/schema/tag-hover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/HEAD/docs/schema/tag-hover.png
--------------------------------------------------------------------------------
/docs/schema/tag-inserted.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/HEAD/docs/schema/tag-inserted.png
--------------------------------------------------------------------------------
/.vs/podcast-namespace/v16/.suo:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/HEAD/.vs/podcast-namespace/v16/.suo
--------------------------------------------------------------------------------
/docs/schema/attribute-hover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/HEAD/docs/schema/attribute-hover.png
--------------------------------------------------------------------------------
/docs/schema/first-child-tag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/HEAD/docs/schema/first-child-tag.png
--------------------------------------------------------------------------------
/docs/schema/start-tag-completion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Podcastindex-org/podcast-namespace/HEAD/docs/schema/start-tag-completion.png
--------------------------------------------------------------------------------
/.vs/VSWorkspaceState.json:
--------------------------------------------------------------------------------
1 | {
2 | "ExpandedNodes": [
3 | "",
4 | "\\proposal-docs"
5 | ],
6 | "SelectedNode": "\\proposal-docs\\recommendations",
7 | "PreviewInSolutionExplorer": false
8 | }
--------------------------------------------------------------------------------
/proposal-docs/hive-account-name/hive-account-name.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # WITHDRAWN - The "podcast:hiveAccount" Specification
4 |
5 | Version 1.0 by Brian of London - 2021.06.08
6 |
7 | Withdrawn - It's handled better by `customKey` and `customValue` in the [`value block`](value/value.md)
--------------------------------------------------------------------------------
/docs/schema/podcast-wrapper.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/docs/schema/strip-annotation.xslt:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/docs/tags/podping.md:
--------------------------------------------------------------------------------
1 | # Podping
2 |
3 | ``
4 |
5 | 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.
6 |
7 | ### Parent
8 |
9 | ``
10 |
11 | ### Count
12 |
13 | Single
14 |
15 | ## Examples
16 |
17 | ```xml
18 |
19 | ```
20 |
--------------------------------------------------------------------------------
/contributors.txt:
--------------------------------------------------------------------------------
1 | Tom Rossi
2 | James Cridland
3 | Guilherme Dellagustin
4 | Kevin Finn
5 | Dave Jones
6 | Daniel J. Lewis
7 | Andreas Hubel
8 | Christopher Isene
9 | Todd Cochrane
10 | Adam Curry
11 | @PhoneBoy
12 | Ben Slinger
13 | Martin Mouritzen
14 | Andy Beard
15 | Andy Valencia
16 | Matt Basta
17 | Mitch Downey
18 | @Muppet1856
19 | Douglas Kastle
20 | Andy Lehman
21 | Daniel Siebiesiuk
22 | Jon Buda
23 | Justin Jackson
24 | Tyler Lacy
25 | @brianoflondon
26 | Angelo at Blubrry
27 | Stacey Goers
28 | Stuart Moore
29 | @PofMagicfingers
30 | @Bigaston
31 | Alecks Gates
32 | Dave Keeshan
33 | Steven Bell
34 | @dergigi
35 | CTHTC
36 | @kenCode
37 | @Agorise
38 | @Dwev
39 | ... add your name as you contribute!
40 |
--------------------------------------------------------------------------------
/docs/examples/transcripts/example.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "1.0.0",
3 | "segments": [
4 | {
5 | "speaker": "Darth Vader",
6 | "startTime": 0.5,
7 | "endTime": 0.75,
8 | "body": "I"
9 | },
10 | {
11 | "speaker": "Darth Vader",
12 | "startTime": 1,
13 | "endTime": 1.25,
14 | "body": "am"
15 | },
16 | {
17 | "speaker": "Darth Vader",
18 | "startTime": 1.5,
19 | "endTime": 2.0,
20 | "body": "your"
21 | },
22 | {
23 | "speaker": "Darth Vader",
24 | "startTime": 2.25,
25 | "endTime": 2.50,
26 | "body": "father."
27 | },
28 | {
29 | "speaker": "Luke",
30 | "startTime": 2.75,
31 | "endTime": 3.0,
32 | "body": "Nooooo"
33 | }
34 | ]
35 | }
36 |
--------------------------------------------------------------------------------
/serviceslugs.txt:
--------------------------------------------------------------------------------
1 | acast
2 | amazon
3 | anchor
4 | apple
5 | audible
6 | audioboom
7 | backtracks
8 | bitcoin
9 | blubrry
10 | buzzsprout
11 | captivate
12 | castos
13 | castopod
14 | facebook
15 | fireside
16 | fyyd
17 | google
18 | gpodder
19 | hypercatcher
20 | kasts
21 | libsyn
22 | mastodon
23 | megafono
24 | megaphone
25 | omnystudio
26 | overcast
27 | paypal
28 | pinecast
29 | podbean
30 | podcastaddict
31 | podcastguru
32 | podcastindex
33 | podcasts
34 | podchaser
35 | podcloud
36 | podfriend
37 | podiant
38 | podigee
39 | podnews
40 | podomatic
41 | podserve
42 | podverse
43 | redcircle
44 | relay
45 | resonaterecordings
46 | rss
47 | shoutengine
48 | simplecast
49 | slack
50 | soundcloud
51 | spotify
52 | spreaker
53 | tiktok
54 | transistor
55 | twitter
56 | whooshkaa
57 | youtube
58 | zencast
59 |
--------------------------------------------------------------------------------
/docs/examples/transcripts/example.vtt:
--------------------------------------------------------------------------------
1 | WEBVTT
2 |
3 | 00:00:00.000 --> 00:00:02.760
4 | In today's episode, you'll learn whether or not you
5 |
6 | 00:00:02.760 --> 00:00:06.090
7 | should have a podcast trailer. And if so, what should you
8 |
9 | 00:00:06.090 --> 00:00:11.610
10 | include in one? Welcome to Podcasting Q&A, where you learn
11 |
12 | 00:00:11.610 --> 00:00:15.750
13 | the best tips and strategies to launch, grow and monetize your
14 |
15 | 00:00:15.750 --> 00:00:18.630
16 | podcast. This week's question comes from Gillian.
17 |
18 | 00:00:19.080 --> 00:00:21.450
19 | Hi Buzzsprout, Gillian here from breaking through
20 |
21 | 00:00:21.450 --> 00:00:25.350
22 | careers podcast. My question is, do we need a podcast trailer?
23 |
--------------------------------------------------------------------------------
/docs/tags/funding.md:
--------------------------------------------------------------------------------
1 | # Funding
2 |
3 | ``
4 |
5 | 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.
6 |
7 | ### Parent
8 |
9 | ``, `` or [``](live-item.md)
10 |
11 | ### Count
12 |
13 | Multiple
14 |
15 | ### Node value
16 |
17 | 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.
18 |
19 | ### Attributes
20 |
21 | - **url (required):** The URL to be followed to fund the podcast.
22 |
23 | ### Examples
24 |
25 | ```xml
26 | Support the show!
27 | ```
28 |
29 | ```xml
30 | Become a member!
31 | ```
32 |
--------------------------------------------------------------------------------
/docs/tags/locked.md:
--------------------------------------------------------------------------------
1 | # Locked
2 |
3 | ``
4 |
5 | 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.
6 |
7 | ### Parent
8 |
9 | ``
10 |
11 | ### Count
12 |
13 | Single
14 |
15 | ### Node value
16 |
17 | The node value must be "yes" or "no".
18 |
19 | ### Attributes
20 |
21 | - **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.
22 |
23 | ### Examples
24 |
25 | ```xml
26 | yes
27 | ```
28 |
29 | ```xml
30 | no
31 | ```
32 |
--------------------------------------------------------------------------------
/docs/tags/season.md:
--------------------------------------------------------------------------------
1 | # Season
2 |
3 | ``
4 |
5 | This element allows for identifying which episodes in a podcast are part of a particular "season", with an optional season name attached.
6 |
7 | ### Parent
8 |
9 | ``
10 |
11 | ### Count
12 |
13 | Single
14 |
15 | ### Node Value
16 |
17 | The node value is an integer, and represents the season "number". It is required.
18 |
19 | ### Attributes
20 |
21 | - **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.
22 |
23 | Please do not exceed `128 characters` for the name attribute.
24 |
25 | ### Examples
26 |
27 | ```xml
28 | 5
29 | ```
30 |
31 | ```xml
32 | 3
33 | ```
34 |
35 | ```xml
36 | 1
37 | ```
38 |
39 | ```xml
40 | 3
41 | ```
42 |
--------------------------------------------------------------------------------
/docs/examples/chapters/example.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "1.2.0",
3 | "chapters":
4 | [
5 | {
6 | "startTime": 0,
7 | "title": "Intro"
8 | },
9 | {
10 | "startTime": 168,
11 | "title": "Hearing Aids",
12 | "img": "https://example.com/images/hearing_aids.jpg"
13 | },
14 | {
15 | "startTime": 260,
16 | "title": "Progress Report"
17 | },
18 | {
19 | "startTime": 410,
20 | "title": "Namespace",
21 | "img": "https://example.com/images/namepsace_example.jpg",
22 | "url": "https://github.com/Podcastindex-org/podcast-namespace"
23 | },
24 | {
25 | "startTime": 3990,
26 | "title": "Just Break Up",
27 | "img": "https://example.com/images/justbreakuppod.png"
28 | },
29 | {
30 | "startTime": 4600,
31 | "title": "Donations",
32 | "url": "https://example.com/paypal_link"
33 | },
34 | {
35 | "startTime": 5510,
36 | "title": "The Big Players"
37 | },
38 | {
39 | "startTime": 5854,
40 | "title": "Spread the Word"
41 | },
42 | {
43 | "startTime": 6089,
44 | "title": "Outro"
45 | }
46 | ]
47 | }
--------------------------------------------------------------------------------
/docs/tags/integrity.md:
--------------------------------------------------------------------------------
1 | # Integrity
2 |
3 | ``
4 |
5 | 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 [``](alternate-enclosure.md) element. It allows to ensure that the file has not been tampered with.
6 |
7 | ### Parent
8 |
9 | [``](alternate-enclosure.md)
10 |
11 | ### Count
12 |
13 | Single
14 |
15 | ### Attributes
16 |
17 | - **type:** (required) Type of integrity, either "sri" or "pgp-signature".
18 | - **value:** (required) Value of the sri string or base64 encoded pgp signature.
19 |
20 | ### Examples
21 |
22 | ```xml
23 |
24 |
25 |
26 |
27 |
28 | ```
29 |
--------------------------------------------------------------------------------
/docs/tags/source.md:
--------------------------------------------------------------------------------
1 | # Source
2 |
3 | ``
4 |
5 | This element defines a uri location for a [``](alternate-enclosure.md) media file. It is meant to be used as a child of the [``](alternate-enclosure.md) element. At least one `` element must be present within every [``](alternate-enclosure.md) element.
6 |
7 | ### Parent
8 |
9 | [``](alternate-enclosure.md)
10 |
11 | ### Count
12 |
13 | Multiple
14 |
15 | ### Attributes
16 |
17 | - **uri:** (required) This is the uri where the media file resides.
18 | - **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.
19 |
20 | ### Examples
21 |
22 | ```xml
23 |
24 |
25 |
26 |
27 |
28 |
29 | ```
30 |
--------------------------------------------------------------------------------
/docs/tags/soundbite.md:
--------------------------------------------------------------------------------
1 | # Soundbite
2 |
3 | ``
4 |
5 | Points to one or more soundbites within a podcast episode. The intended use includes episodes previews, discoverability, audiogram generation, episode highlights, etc. It should be assumed that the audio/video source of the soundbite is the audio/video given in the item's [``](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) element.
6 |
7 | ### Parent
8 |
9 | ``
10 |
11 | ### Count
12 |
13 | Multiple
14 |
15 | ### Node value
16 |
17 | 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.
18 |
19 | ### Attributes
20 |
21 | - **startTime (required):** The time where the soundbite begins
22 | - **duration (required):** How long is the soundbite (recommended between 15 and 120 seconds)
23 |
24 | ### Examples
25 |
26 | ```xml
27 |
28 | ```
29 |
30 | ```xml
31 | Why the Podcast Namespace Matters
32 | ```
33 |
--------------------------------------------------------------------------------
/docs/tags/value.md:
--------------------------------------------------------------------------------
1 | # Value
2 |
3 | ``
4 |
5 | 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.
6 |
7 | This element can exist at either the `` or `` level. When it exists at the `` level, it should be treated as an "override" of whatever is defined at the `` level.
8 |
9 | This is a complex tag, so implementors are HIGHLY encouraged to read the companion [document](../examples/value/value.md) for a complete understanding of how this tag works and what it is capable of.
10 |
11 | ### Parent
12 |
13 | `` or ``
14 |
15 | ### Count
16 |
17 | Multiple
18 |
19 | ### Node Value
20 |
21 | The node value must be one or more [``](value-recipient.md) elements.
22 |
23 | ### Attributes
24 |
25 | - **type:** (required) This is the service slug of the cryptocurrency or protocol layer.
26 | - **method:** (required) This is the transport mechanism that will be used.
27 | - **suggested:** (optional) This is an optional suggestion on how much cryptocurrency to send with each payment.
28 |
29 | ### Examples
30 |
31 | ```xml
32 |
37 | ```
38 |
--------------------------------------------------------------------------------
/docs/tags/episode.md:
--------------------------------------------------------------------------------
1 | # Episode
2 |
3 | ``
4 |
5 | This element exists largely for compatibility with the [``](season.md) tag. But, it also allows for a similar idea to what "name" functions as in that element.
6 |
7 | ### Parent
8 |
9 | ``
10 |
11 | ### Count
12 |
13 | Single
14 |
15 | ### Node Value
16 |
17 | The node value is a decimal number. It is required.
18 |
19 | ### Attributes
20 |
21 | - **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.
22 |
23 | 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.
24 |
25 | Please do not exceed `32 characters` for the display attribute.
26 |
27 | ### Examples
28 |
29 | ```xml
30 | 3
31 | ```
32 |
33 | ```xml
34 | 315.5
35 | ```
36 |
37 | ```xml
38 | 204
39 | ```
40 |
41 | ```xml
42 | 9
43 | ```
44 |
--------------------------------------------------------------------------------
/docs/tags/chapters.md:
--------------------------------------------------------------------------------
1 | # Chapters
2 |
3 | ``
4 |
5 | Links to an external file (see example file) containing chapter data for the episode. See the [jsonChapters.md](../examples/chapters/jsonChapters.md) file for a description of the file syntax for chapters syntax. And, see the [example.json](../examples/chapters/example.json) example file for a real world example.
6 |
7 | 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.
8 |
9 | ### Parent
10 |
11 | ``
12 |
13 | ### Count
14 |
15 | Single
16 |
17 | ### Attributes
18 |
19 | - **url (required):** The URL where the chapters file is located.
20 | - **type (required):** Mime type of file - JSON prefered, 'application/json+chapters'.
21 |
22 | ### Examples
23 |
24 | ```xml
25 |
26 | ```
27 |
--------------------------------------------------------------------------------
/docs/tags/license.md:
--------------------------------------------------------------------------------
1 | # License
2 |
3 | ``
4 |
5 | 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](../examples/license/license.md) for a more complete picture of what this tag is intended to accomplish.
6 |
7 | ### Parent
8 |
9 | `` or ``
10 |
11 | ### Count
12 |
13 | Single
14 |
15 | ### Node Value
16 |
17 | The node value must be a lower-cased reference to a license "identifier" defined in the companion [license list](../examples/license/licenses.json) 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.
18 |
19 | ### Attributes
20 |
21 | - **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.
22 |
23 | ### Examples
24 |
25 | ```xml
26 | CC-BY-NC-ND-4.0
27 | ```
28 |
29 | ```xml
30 | my-podcast-license-v1
31 | ```
32 |
--------------------------------------------------------------------------------
/docs/tags/images-(deprecated).md:
--------------------------------------------------------------------------------
1 | # Images (Deprecated)
2 |
3 | ``
4 |
5 | *Important: This tag is now deprecated. The new [podcast:image](image.md) tag should be used instead*
6 |
7 | 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.
8 |
9 | ### Parent
10 |
11 | `` or ``
12 |
13 | ### Count
14 |
15 | Single
16 |
17 | ### Attributes
18 |
19 | - **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.
20 |
21 | ### Examples
22 |
23 | Example of specifying four different image sizes:
24 |
25 | ```xml
26 |
32 | ```
33 |
--------------------------------------------------------------------------------
/docs/tags/content-link.md:
--------------------------------------------------------------------------------
1 | # Content Link
2 |
3 | ``
4 |
5 | The `contentLink` tag is used to indicate that the content being delivered by the parent element can be found at an external location instead of, or in addition 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.
6 |
7 | For instance, perhaps a podcast feed specifies a [``](live-item.md) to deliver a live stream to apps. The feed may also give a `` pointing to YouTube and Twitch versions of the live stream as well, just in case the listener uses an app that doesn't fully support live streaming content.
8 |
9 | ### Parent
10 |
11 | `` or [``](live-item.md)
12 |
13 | ### Count
14 |
15 | Multiple
16 |
17 | ### Node Value
18 |
19 | The node value is a free-form string meant to explain to the user where this content link points and/or the nature of its purpose.
20 |
21 | ### Attributes
22 |
23 | - **href** (required) A string that is the uri pointing to content outside of the application.
24 |
25 | ### Examples
26 |
27 | (under ``)
28 |
29 | ```xml
30 | Watch this episode on YouTube!
31 | ```
32 |
33 | (under [``](live-item.md))
34 |
35 | ```xml
36 | Live on YouTube!
37 | ```
38 |
39 | ```xml
40 | Chat on Twitter!
41 | ```
42 |
--------------------------------------------------------------------------------
/docs/tags/transcript.md:
--------------------------------------------------------------------------------
1 | # Transcript
2 |
3 | ``
4 |
5 | This tag is used to link to a transcript or closed captions file. Multiple tags can be present for multiple transcript formats.
6 |
7 | Detailed file format information and example files are [here](../examples/transcripts/transcripts.md).
8 |
9 | ### Parent
10 |
11 | ``
12 |
13 | ### Count
14 |
15 | Multiple
16 |
17 | ### Attributes
18 |
19 | - **url (required):** URL of the podcast transcript.
20 | - **type (required):** Mime type of the file such as `text/plain`, `text/html`, `text/vtt`, `application/json`, `application/x-subrip`
21 | - **language (optional):** The language of the linked transcript. If there is no language attribute given, the linked file is assumed to be the same language that is specified by the RSS `` element.
22 | - **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.
23 |
24 | ### Examples
25 |
26 | ```xml
27 |
28 | ```
29 |
30 | ```xml
31 |
32 | ```
33 |
34 | ```xml
35 |
41 | ```
42 |
43 | ```xml
44 |
45 | ```
46 |
--------------------------------------------------------------------------------
/docs/tags/publisher.md:
--------------------------------------------------------------------------------
1 | # Publisher
2 |
3 | ``
4 |
5 | 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 `` element pointing to the publisher feed. For widest compatibility, it is highly recommended to use the `feedUrl` attribute of the [``](remote-item.md) element in this capacity.
6 |
7 | For complete implementation details regarding publisher feeds and how to create them, please see the full publisher feed [documentation](../examples/publishers/publishers.md) and the `publisher` medium [here](./medium.md).
8 |
9 | ### Parent
10 |
11 | ``
12 |
13 | ### Count
14 |
15 | Single
16 |
17 | ### Example:
18 |
19 | ```xml
20 |
21 |
22 | A value4value happenstance music show.
23 | https://example.org/itsamood
24 | Sovereign Feeds
25 | Mike Neumann
26 | 469b403f-db2d-574c-9db9-96dbb4f6561c
27 | podcast
28 |
29 |
30 |
31 |
32 |
33 | Wed, 03 Apr 2024 02:06:28 +0000
34 | ...
35 |
36 |
37 | ```
38 |
--------------------------------------------------------------------------------
/proposal-docs/social/platforms.md:
--------------------------------------------------------------------------------
1 | ### Social Platform / Protocol
2 |
3 | Note: Draft - trying to figure out if the platform/protocol list should be a separate file.
4 |
5 | The and elements both contain a platform and protocol element. This is a list of suitable platforms and protocols
6 |
7 | - `platform` (required): This is the platform id. It can be one of the following:
8 | - `protocol` (required): This is the protocol name. It can be one of the following:
9 |
10 | | `platform` | `protocol` |
11 | | ---------- | ------------------|
12 | | castopod | activitypub |
13 | | mastodon | activitypub |
14 | | peertube | activitypub |
15 | | | xmpp |
16 | | | irc |
17 | | matrix | matrix |
18 | | facebook | facebook |
19 | | twitter | twitter |
20 | | instagram | instagram |
21 | | slack | slack |
22 | | discord | discord |
23 | | castgarden | hive |
24 | | 3speak | hive |
25 | | peakd | hive |
26 | | fountain | lightningcomments |
27 |
28 |
29 | - `platform` (required): This is the platform id. It can be one of the following:
30 | - castopod
31 | - mastodon
32 | - peertube
33 | - facebook
34 | - twitter
35 | - instagram
36 | - slack
37 | - discord
38 | - cast.garden
39 | - 3speak
40 | - peakd.com
41 | - fountain
42 | - …
43 | - `protocol` (required): This is the protocol name. It can be one of the following:
44 | - activitypub
45 | - xmpp
46 | - irc
47 | - matrix
48 | - facebook
49 | - twitter
50 | - instagram
51 | - slack
52 | - discord
53 | - hive
54 | - lightningcomments (see #347)
55 | - …
56 |
--------------------------------------------------------------------------------
/docs/tags/block.md:
--------------------------------------------------------------------------------
1 | # Block
2 |
3 | ``
4 |
5 | This element allows a podcaster to express which platforms are allowed to publicly display this feed and its contents. In its basic form, it is a direct drop-in replacement for the `` tag, but allows for greater flexibility by the inclusion of the `id` attribute and by including multiple copies of itself in the feed.
6 |
7 | 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.
8 |
9 | In plain language, the sequence of discovery an ingesting platform should use is as follows:
10 |
11 | 1. Does `no` exist in this feed? Safe to ingest.
12 | 2. Does `yes` exist in this feed? Do not ingest.
13 | 3. Does `yes` exist in this feed? Do not ingest.
14 |
15 | ### Parent
16 |
17 | ``
18 |
19 | ### Count
20 |
21 | Multiple
22 |
23 | ### Attributes
24 |
25 | - **id** (optional) A single entry from the [service slug list](https://github.com/Podcastindex-org/podcast-namespace/blob/main/serviceslugs.txt).
26 |
27 | ### Node value
28 |
29 | The node value must be "yes" or "no".
30 |
31 | ### Examples
32 |
33 | ```xml
34 |
35 | yes
36 | ```
37 |
38 | ```xml
39 |
40 | no
41 | ```
42 |
43 | ```xml
44 |
45 | yes
46 | yes
47 | ```
48 |
49 | ```xml
50 |
51 | yes
52 | no
53 | no
54 | ```
55 |
--------------------------------------------------------------------------------
/proposal-docs/podping/podping.md:
--------------------------------------------------------------------------------
1 | # The "podcast:podping" Specification
2 |
3 | Version 1.0 by Brian of London - 2021.06.08
4 |
5 |
6 |
7 | ## Purpose
8 |
9 | The Podping notification system is rapidly developing as a new standard for signalling new episodes of podcasts to reduce constant polling. Once a new episode or entirely new podcast is sent out as a podping on the Hive blockchain, aggregators and apps can query the feed.
10 |
11 | However, as pointed out in issue https://github.com/Podcastindex-org/podcast-namespace/issues/258, there is, as yet, no way to know which feeds are using Podping.
12 |
13 | This tag proposal will allow feed owners and the hosts of multiple feeds, to signal that future updates will be sent via Podping and there is no need to speculatively poll this rss feed.
14 |
15 | An additional benefit will derive if feeds signal the name or names of the Hive accounts authorized to send Podpings. These authorized Hive accounts will be included in a `` tag
16 |
17 | ## API Requirements
18 |
19 | This tag can also contribute to a future API endpoint for the PodcastIndex which can easily return whether or not any given RSS feed is using Podping and return the Hive accounts authorized to send pings.
20 |
21 | ## Specification
22 |
23 | For the `` tag there is only one optional attribute `usesPodping` which will usually be set to `True` though could be set to `False` to specifically opt out of using Poding and indicate a feed must be polled by legacy RSS polling methods.
24 |
25 | For the optional but helpful `` tag there is one attribute, a single value with a single Hive account which is allowed to issue `podpings` for this feed.
26 |
27 | ## Example
28 |
29 | ```xml
30 |
31 |
32 |
33 |
34 |
35 | ```
36 |
37 | ## Example
38 |
39 | ```xml
40 |
41 | ```
42 |
43 | or
44 |
45 | ```xml
46 |
47 | ```
48 |
--------------------------------------------------------------------------------
/docs/examples/chapters/exampleComplex.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "1.2.0",
3 | "author": "John Doe",
4 | "title": "Episode 7 - Making Progress",
5 | "podcastName": "John's Awesome Podcast",
6 | "chapters":
7 | [
8 | {
9 | "startTime": 0,
10 | "title": "Intro"
11 | },
12 | {
13 | "startTime": 168,
14 | "title": "Hearing Aids"
15 | },
16 | {
17 | "startTime": 260,
18 | "title": "Progress Report"
19 | },
20 | {
21 | "startTime": 410,
22 | "title": "Namespace",
23 | "img": "https://example.com/images/namepsace_example.jpg",
24 | "url": "https://github.com/Podcastindex-org/podcast-namespace"
25 | },
26 | {
27 | "startTime": 3990,
28 | "title": "Just Break Up",
29 | "img": "https://example.com/images/justbreakuppod.png",
30 | "url": "https://twitter.com/justbreakuppod"
31 | },
32 | {
33 | "startTime": 4200,
34 | "title": "Played song by artist",
35 | "img": "https://i.discogs.com/R-249504-1334592212.jpeg?bucket=discogs-images&fit=contain&format=auto&height=600&quality=90&width=600&signature=wMI9I0mHkbVxkkryQrN1JkkzhwFsrereuom9Lmfa92w%3D",
36 | "url": "https://www.discogs.com/Rick-Astley-Never-Gonna-Give-You-Up/master/96559",
37 | "value": ""
38 | },
39 | {
40 | "startTime": 4600,
41 | "title": "Donations",
42 | "url": "https://example.com/paypal_link"
43 | },
44 | {
45 | "startTime": 4826,
46 | "img": "https://example.com/images/parisfrance.jpg",
47 | "toc": false,
48 | "location": {
49 | "name": "Eiffel Tower, Paris",
50 | "geo": "geo:42.3417649,-70.9661596"
51 | }
52 | },
53 | {
54 | "startTime": 5510,
55 | "title": "The Big Players"
56 | },
57 | {
58 | "startTime": 5854,
59 | "title": "Spread the Word"
60 | },
61 | {
62 | "startTime": 6089,
63 | "title": "Outro"
64 | }
65 | ]
66 | }
67 |
--------------------------------------------------------------------------------
/docs/tags/podroll.md:
--------------------------------------------------------------------------------
1 | # Podroll
2 |
3 | ``
4 |
5 | This element allows for a podcaster to include references to one or more podcasts in its `` as a way of "recommending" other podcasts to their listener. It's normally shown in user interfaces as "creator recommendations", or "shows you might like".
6 |
7 | ### Parent
8 |
9 | ``
10 |
11 | ### Count
12 |
13 | Single
14 |
15 | ### Node value
16 |
17 | The node value must be one or more [``](remote-item.md) elements.
18 |
19 | ### Examples
20 |
21 | ```xml
22 |
23 |
24 |
25 |
26 |
27 | ```
28 |
29 | Above, the simplest way to use a podroll, using the [one mandatory value for the `remoteItem`](remote-item.md).
30 |
31 | ```xml
32 |
33 |
38 |
43 |
48 |
49 | ```
50 |
51 | Above, a recommended podroll entry. It includes the `feedUrl` as well as the `feedGuid`, to help podcast apps discover shows without the GUID if they need to. It also includes a title, which is helpful for humans, and potentially for display in the app.
52 |
53 | If information differs, information discoverable from the GUID always takes precedence. RSS feeds can change; the [GUID](guid.md) does not.
54 |
55 | While the remoteItem includes an optional `itemGuid`, it is not expected that a podroll would normally link to individual episodes.
56 |
57 | (Humans: you can [put a GUID into the search box](https://podcastindex.org/search?q=917393e3-1b1e-5cef-ace4-edaa54e1f810&type=all) on the Podcast Index website).
58 |
--------------------------------------------------------------------------------
/docs/tags/txt.md:
--------------------------------------------------------------------------------
1 | # Txt
2 |
3 | ``
4 |
5 | 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.
6 |
7 | ### Parent
8 |
9 | `` or ``
10 |
11 | ### Count
12 |
13 | Multiple
14 |
15 | ### Attributes
16 |
17 | - **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`.
18 |
19 | ### Purposes
20 |
21 | 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.
22 |
23 | - `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.
24 | - `applepodcastsverify` - Same as above but [used by Apple](https://help.apple.com/itc/podcasts_connect/#/itcb54353390:~:text=podcast%3Atxt%20purpose%3D%E2%80%9C-,applepodcastsverify,-%E2%80%9D%3E).
25 |
26 | ### Node value
27 |
28 | This is a free form string. Please do not exceed `4000 characters` for the node value or it may be truncated by aggregators.
29 |
30 | ### Examples
31 |
32 | ```xml
33 | naj3eEZaWVVY9a38uhX8FekACyhtqP4JN
34 | ```
35 |
36 | ```xml
37 | S6lpp-7ZCn8-dZfGc-OoyaG
38 | ```
39 |
40 | ```xml
41 | 05124
42 | ```
43 |
44 | ```xml
45 | 2022-10-26T04:45:30.742Z
46 | ```
47 |
--------------------------------------------------------------------------------
/docs/tags/trailer.md:
--------------------------------------------------------------------------------
1 | # Trailer
2 |
3 | ``
4 |
5 | This element is used to define the location of an audio or video file to be used as a trailer for the entire podcast or a specific season. There can be more than one trailer present in the channel of the feed. This element is basically just like an [``](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) with the extra `pubdate` and `season` attributes added.
6 |
7 | 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.
8 |
9 | ### Parent
10 |
11 | ``
12 |
13 | ### Count
14 |
15 | Multiple
16 |
17 | ### Node Value
18 |
19 | 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.
20 |
21 | ### Attributes
22 |
23 | - **url:** (required) This is a url that points to the audio or video file to be played. This attribute is a string.
24 | - **pubdate:** (required) The date the trailer was published. This attribute is an RFC2822 formatted date string.
25 | - **length:** (recommended) The length of the file in bytes. This attribute is a number.
26 | - **type:** (recommended) The mime type of the file. This attribute is a string.
27 | - **season:** (optional) If this attribute is present it specifies that this trailer is for a particular season number. This attribute is a number.
28 |
29 | If the `season` attribute is present, it must be a number that matches the format of the [``](season.md) tag. So, for a podcast that has 3 published seasons, a new `` tag can be put in the channel to later be matched up with a `4` tag when it is published within a new ``.
30 |
31 | #### Examples
32 |
33 | ```xml
34 | Coming April 1st, 2021
40 | ```
41 |
42 | ```xml
43 | Season 4: Race for the Whitehouse
50 |
51 | (later matches with)
52 |
53 | 4
54 | ```
55 |
--------------------------------------------------------------------------------
/docs/tags/value-recipient.md:
--------------------------------------------------------------------------------
1 | # Value Recipient
2 |
3 | ``
4 |
5 | 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.
6 |
7 | This element may only exist within a parent [``](value.md) element.
8 |
9 | There is no limit on how many `valueRecipient` elements can be present in a given [``](value.md) element.
10 |
11 | This is a complex tag, so implementors are HIGHLY encouraged to read the companion [document](../examples/value/value.md) for a complete understanding of how this tag works and what it is capable of.
12 |
13 | ### Parent
14 |
15 | [``](value.md)
16 |
17 | ### Count
18 |
19 | Multiple
20 |
21 | ### Attributes
22 |
23 | - **name** (recommended) A free-form string that designates who or what this recipient is.
24 | - **customKey** (optional) The name of a custom record key to send along with the payment.
25 | - **customValue** (optional) A custom value to pass along with the payment. This is considered the value that belongs to the `customKey`.
26 | - **type** (required) A slug that represents the type of receiving address that will receive the payment.
27 | - **address** (required) This denotes the receiving address of the payee.
28 | - **split** (required) The number of shares of the payment this recipient will receive.
29 | - **fee** (optional) If this attribute is not specified, it is assumed to be false.
30 |
31 | ### Examples
32 |
33 | ```xml
34 |
35 |
41 |
47 |
53 |
60 |
61 | ```
62 |
--------------------------------------------------------------------------------
/docs/tags/remote-item.md:
--------------------------------------------------------------------------------
1 | # Remote Item
2 |
3 | ``
4 |
5 | This element provides a way to "point" to another feed or an `` in another feed in order to obtain some sort of data that the other feed or feed item has. This allows a podcast app to know where to go and fetch the data being requested. What data is being requested is determined by the parent item. For instance, if the parent item is a [``](podroll.md) element, then the remote feed's `` metadata is needed.
6 |
7 | 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 [``](guid.md)'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.
8 |
9 | ### Parent
10 |
11 | `` or [``](podroll.md) or [``](value-time-split.md) or [``](publisher.md)
12 |
13 | ### Count
14 |
15 | Multiple
16 |
17 | ### Attributes
18 |
19 | - **feedGuid** (required) The [``](guid.md) of the remote feed being pointed to.
20 | - **feedUrl** (optional) The url of the remote feed being pointed to.
21 | - **itemGuid** (optional) If this remote item element is intended to point to an `` in the remote feed, this attribute should contain the value of the `` of that ``.
22 | - **medium** (optional) If the feed being pointed to is not of medium type 'podcast', this attribute should contain it's [``](medium.md) type from the [list](./medium.md#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.
23 | - **title** (optional) A string that represents the title of the remote item. The purpose of this attribute is to give a hint to apps so that they can display the title without having to do a remote lookup.
24 |
25 | ### Examples
26 |
27 | ```xml
28 |
29 | ```
30 |
31 | ```xml
32 |
36 | ```
37 |
38 | ```xml
39 |
46 | ```
47 |
--------------------------------------------------------------------------------
/proposal-docs/chat/chat.md:
--------------------------------------------------------------------------------
1 | # The "podcast:chat" Specification
2 |
3 | Version 1.0 by Dave Jones - 2022.04.10
4 |
5 |
6 |
7 | ## Purpose
8 | The `` tag allows a podcaster to attach information to either the `channel` or an `item` about where the
9 | "official" chat for either the podcast or a specific episode is to be found. Just like ``
10 | functions for social media, the `chat` tag will function for ephemeral chat. There are many protocols in use across
11 | the internet for chat based communication. This tag is meant to be flexible enough to adapt to whichever protocol the
12 | podcaster wants to use.
13 |
14 | This tag can exist at the `channel` or `item` level. It's presence at a particular level governs how it should be
15 | treated. If found at the `item` level, this should be treated as the information for that specific episode,
16 | overriding what is at the `channel` level. If this tag is found at the `channel` level, it would be considered the
17 | chat for the entire podcast and is recommended to be an "always on" chat room experience.
18 |
19 | If a podcast has an "always on" style chat service it is recommended to link that at the `channel` level and do not
20 | use the `` tag at the `item` level.
21 |
22 | ## Chat Element
23 | ``
17 |
18 | ## Process
19 |
20 | The process of subscribing to a feed consists of making the purchase, storing a shared seed value and storing a shared subscriber id. The purchase
21 | can be made over standard payment processors, cryptocurrency or any other method of payment the podcast creator chooses to use.
22 |
23 |
24 |
25 | ### Initiating the purchase
26 |
27 | A members-only feed will contain a `` element that points to a website the user will use to complete the subscription signup
28 | process. That process can be any method of paying and the app would probably just open a web view to the site and let the signup process happen
29 | right in the app.
30 |
31 | ### Generating the shared values
32 |
33 | Once the signup and payment has occurred, the server that processed the signup will generate a seed value to be used in a TOTP (Time-based One Time Password)
34 | calculation. The seed value will be stored by the server in order to calculate the TOTP value in the future. It will also be handed back to the app which
35 | will store the seed in it's internal database associated with this particular RSS feed. A user identifier will also be generated by the server and handed
36 | back to the app so that an association can be kept between the TOTP seed and the user it belongs to.
37 |
38 | ### Playing the Content
39 |
40 | When the app does a GET request for an enclosure within the subscription feed, it will first calculate the current TOTP value based on it's stored copy
41 | of the seed and then attach that value to the GET request as a url parameter, like this:
42 |
43 | ```http
44 | GET https://example.com/cdn/podcast/episode23.mp3?_subscriberid=019280835669288573153765328753&_privtoken=247163
45 | ```
46 |
47 | The server validates the transmitted TOTP code by generating it server side based on the subscriber id given in the request.subscriber
48 | If the subscriber's subscription ever lapses, the server simply forgets the TOTP seed and no future requests for content will validate.
49 |
50 | ### Moving subscriptions between apps
51 |
52 | Because subscriptions are maintained by a simple TOTP random seed value, the values can be exported along with an opml file and imported into other apps.
53 |
54 |
55 |
56 | ### Subscribe Element
57 |
58 | The `` tag designates the server that will handle the subscription processing for the feed.
59 |
60 | This element must exist at the `` level.
61 |
62 | There can be only one copy of this element in a feed.
63 |
64 |
65 |
66 | #### Structure:
67 | ```xml
68 |
71 | ```
72 |
73 |
74 | #### Attributes:
75 | - `url` (required) This is the service slug of the cryptocurrency or protocol layer.
76 |
77 |
78 |
79 |
--------------------------------------------------------------------------------
/existing-namespaces.txt:
--------------------------------------------------------------------------------
1 | xmlns:a10="http://www.w3.org/2005/Atom"
2 | xmlns:acast="https://schema.acast.com/1.0/"
3 | xmlns:addthis="https://www.addthis.com/help/api-spec"
4 | xmlns:admin="http://webns.net/mvcb/"
5 | xmlns:anchor="https://anchor.fm/xmlns"
6 | xmlns:atom10="http://www.w3.org/2005/Atom"
7 | xmlns:atom="http://w3.org/2005/Atom"
8 | xmlns:atom="http://www.w3.org/2005/Atom"
9 | xmlns:b="http://www.google.com/2005/gml/b"
10 | xmlns:bitlove="http://bitlove.org"
11 | xmlns:blogChannel="http://backend.userland.com/blogChannelModule"
12 | xmlns:castbox="http://castbox.fm/dtds/podcast-1.0.dtd"
13 | xmlns:cba="https://cba.fro.at/help#feeds"
14 | xmlns:cc="http://backend.userland.com/creativeCommonsRssModule"
15 | xmlns:cc="http://creativecommons.org/ns#"
16 | xmlns:cc="http://web.resource.org/cc/"
17 | xmlns:content="http://purl.org/rss/1.0/modules/content/"
18 | xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
19 | xmlns:data="http://www.google.com/2005/gml/data"
20 | xmlns:dc="http://purl.org/dc/elements/1.1/"
21 | xmlns:dcterms="http://purl.org/dc/terms/"
22 | xmlns:expr="http://www.google.com/2005/gml/expr">
23 | xmlns:fb="http://www.facebook.com/2008/fbml"
24 | xmlns:fb="https://www.facebook.com/2008/fbml"
25 | xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"
26 | xmlns:feedpress="https://feed.press/xmlns"
27 | xmlns:fh="http://purl.org/syndication/history/1.0"
28 | xmlns:fireside="http://fireside.fm/modules/rss/fireside"
29 | xmlns:forbrowser="http://counterfolk.com/ken/extrav/audio/newitemcontent.css"
30 | xmlns:fyyd="https://fyyd.de/fyyd-ns/"
31 | xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
32 | xmlns:georss="http://www.georss.org/georss"
33 | xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"
34 | xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0/play-podcasts.xsd"
35 | xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
36 | xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
37 | xmlns:itunes="http://www.itunes.com/DTDs/Podcast-1.0.dtd"
38 | xmlns:itunes="http://www.itunes.com/dtds/Podcast-1.0.dtd"
39 | xmlns:itunes="https://www.itunes.com/dtds/podcast-1.0.dtd"
40 | xmlns:itunesu="http://www.itunesu.com/feed"
41 | xmlns:iweb="http://www.apple.com/iweb"
42 | xmlns:media="http://search.yahoo.com/mrss/"
43 | xmlns:media="http://www.rssboard.org/media-rss"
44 | xmlns:npr="https://www.npr.org/rss/"
45 | xmlns:nprml="https://api.npr.org/nprml"
46 | xmlns:og="http://opengraphprotocol.org/schema/"
47 | xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"
48 | xmlns:pinecast="https://pinecast.com/rss-dtd/1.0/"
49 | xmlns:pingback="https://podping.info/specification/1"
50 | xmlns:podaccess="https://access.acast.com/schema/1.0/"
51 | xmlns:podaccess="https://schema-access.acast.com/1.0/"
52 | xmlns:podfm="http://podfm.ru/RSS/extension"
53 | xmlns:psc="http://podlove.org/simple-chapters"
54 | xmlns:rawvoice="http://www.rawvoice.com/rawvoiceRssModule/"
55 | xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
56 | xmlns:rp="https://w3id.org/rp/v1"
57 | xmlns:s="http://purl.org/steeple"
58 | xmlns:serif="http://www.serif.com/"
59 | xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
60 | xmlns:sms="http://sms.csx.cam.ac.uk/rss"
61 | xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
62 | xmlns:soundon="http://soundon.fm/spec/podcast-1.0"
63 | xmlns:spotify="http://www.spotify.com/ns/rss"
64 | xmlns:spotify="https://www.spotify.com/ns/rss"
65 | xmlns:svg="http://www.w3.org/2000/svg"
66 | xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
67 | xmlns:thr="http://purl.org/syndication/thread/1.0"
68 | xmlns:wfw="http://wellformedweb.org/CommentAPI/"
69 | xmlns:xlink="http://www.w3.org/1999/xlink"
70 | xmlns:xlink="http://www.w3.org/1999/xlink"
71 | xmlns:xlink="https://www.w3.org/1999/xlink"
--------------------------------------------------------------------------------
/proposal-docs/value-webmonetization/value-webmonetization.md:
--------------------------------------------------------------------------------
1 | # Web Monetization using ``
2 |
3 | To enable and promote Web Monetization (WM) in podcasting, necessary information for WM could be provided for a podcast by adding a `` tag to the RSS feed.
4 | https://github.com/Podcastindex-org/podcast-namespace/blob/main/value/value.md
5 |
6 | This `value` tag would have the following values for use with Web Monetization:
7 | ```xml
8 |
12 | ```
13 |
14 | The `podcast:value.type` defines the cryptocurrency or protocol layer, which in this case is used to define Web Monetization payment information, using the value of `webmonetization`.
15 |
16 | The `method` of `ILP` specifies the use of [Interledger Protocol (ILP)](https://interledger.org/rfcs/0027-interledger-protocol-4/) which is the protocol for payment providers in WM.
17 |
18 | Within the `podcast:value` tag we also need to designate recipients. In Web Monetization, payment info is discovered using the [Simple Payment Setup Protocol](https://interledger.org/rfcs/0009-simple-payment-setup-protocol) with which the [Open Payments](https://docs.openpayments.dev/web-monetization) protocol is designed to be [backwards compatible](https://docs.openpayments.dev/web-monetization#backwards-compatibility-with-spsp).
19 |
20 | Both SPSP and Open Payments use a recipient address in the form of a [Payment Pointer](https://github.com/interledger/rfcs/blob/master/0026-payment-pointers/0026-payment-pointers.md) which will be provided in the `address` attribute, with the `type` of `paymentpointer`.
21 |
22 | ```xml
23 |
27 |
33 |
34 | ```
35 |
36 | While payments in WM are streamed to a single payment pointer at a time, the WM authors suggest splits can be implemented using [Probabilistic Revenue Sharing](https://webmonetization.org/docs/probabilistic-rev-sharing) or perhaps it should be [implemented at the payment pointer](https://github.com/Podcastindex-org/podcast-namespace/issues/132#issuecomment-780145285) rather than expecting the client to be responsible. In either case, the `podcast:value` and `podcast:valueRecipient` tags can provide sufficient information for a web player or page to setup Web Monetization for the podcast.
37 |
38 | ------
39 |
40 | ### Current
41 | https://github.com/Podcastindex-org/podcast-namespace/blob/main/value/value.md
42 | https://github.com/Podcastindex-org/podcast-namespace/blob/main/value/valueslugs.txt
43 |
44 | ### Web Monetization and Podcasting Discussion
45 | https://github.com/Podcastindex-org/podcast-namespace/issues/132
46 | https://github.com/WICG/webmonetization/issues/70
47 |
48 | ### Background WM (i.e. for podcast audio playing on a background tab)
49 | https://github.com/coilhq/web-monetization-projects/issues/387
50 | https://github.com/WICG/webmonetization/issues/17
51 |
52 | ### PRX Player Implementation (in production)
53 | Player repository: https://github.com/PRX/Play-Next.js
54 | Component to implement monetization: https://github.com/PRX/Play-Next.js/tree/main/components/Player/WebMonetized
55 | Parsing `webmonetization` from the RSS feed: https://github.com/PRX/Play-Next.js/blob/main/lib/parse/data/parseEmbedData.ts#L33-L40
56 |
57 | ### Castopod Implementation
58 | https://podlibre.social/@Castopod/105278541687633547
59 | https://blog.castopod.org/castopod-supports-web-monetization/
60 | https://github.com/ad-aures/castopod/blob/v1.0.0-beta.14/app/Helpers/rss_helper.php#L85-L95
61 |
62 | ### PodStation Planning by [Guilherme Dellagustin](https://github.com/dellagustin)
63 | https://github.com/podStation/podStation/issues/185
64 |
--------------------------------------------------------------------------------
/docs/other-recommendations.md:
--------------------------------------------------------------------------------
1 | # Other Recommendations from the Creators of the RSS Namespace Extension for Podcasting
2 |
3 | While the wholistic RSS namespace for podcasting is meant to synthesize the fragmented world of podcast namespaces, there are some existing standards and defacto-standards we want do endorse:
4 |
5 | ## Episode GUID
6 |
7 | For all new episodes, we recommended to use
8 |
9 | - either a permanent URI, e.g. `https://example.com/ep0003`
10 | - or a [Universally unique identifier (UUID)](https://en.wikipedia.org/wiki/Universally_unique_identifier) e.g. `7c029615-a810-5214-9342-eee73f58435d`
11 |
12 | The GUID of an episode should never change, even if a new version of the episode is being published, otherwise this episode will be duplicated downstream.
13 |
14 | Consumers of podcast feeds should fall back to the enclosure URL or the namespaced UUIDv5 (SHA1 Hash with ns:URL) of the enclosure URL, if the value is not set – see https://github.com/Podcastindex-org/podcast-namespace/issues/186#issuecomment-932742468 for more details.
15 |
16 | #### Examples
17 |
18 | Only one entry per `` is valid:
19 |
20 | ```xml
21 | https://example.com/ep0003
22 | 7c029615-a810-5214-9342-eee73f58435d
23 | ```
24 |
25 | (`isPermaLink` is optional, its default value is true –)
26 |
27 | ## Episode Description and Summary
28 |
29 | If you use ``, it should be an actual summary of the episode, in one or two sentences, and not a copy of the description. Be aware that Apple dropped `` from [their spec](https://help.apple.com/itc/podcasts_connect/#/itcb54353390) but many other clients still support it.
30 |
31 | The [original RSS specification](https://cyber.harvard.edu/rss/rss.html#hrelementsOfLtitemgt) defined `description` as follows:
32 |
33 | > A channel may contain any number of ``s. An item may represent a "story" -- much like a story in a newspaper or magazine; if so its description is a synopsis of the story, and the link points to the full story. An item may also be complete in itself, if so, the description contains the text (entity-encoded HTML is allowed; see examples) …
34 |
35 | There also exists `` for dedicated HTML episode notes [[rssboard.org]](https://www.rssboard.org/rss-profile#namespace-elements-content-encoded), but more and more publishers switch to only having ``.
36 |
37 | When your description contains HTML, we recommend to wrap it into ``. See https://podnews.net/article/html-episode-notes-in-podcast-rss and https://podnews.net/article/how-podcast-show-notes-display for more information about supported HTML tags in different clients. Typical are `
`, ` `, ``, `
` and `
`.
38 |
39 | ## Feed Paging and Archiving (RFC5005)
40 |
41 | To be able to put more metadata into RSS feeds, while keeping the full archive of all old episodes becomes a challange for some podcasters and podcast clients. A typical workaround in the industry is to only render the full metadata of the newest episodes, where there is already a proper solution since 2007: [RFC5005](https://tools.ietf.org/html/rfc5005)
42 |
43 | There are already a few players implementing RFC5005 for a while, but . Adoption from clients is sporadic. A new/different standard wouldn't help though because I'd say RFC5005 does all that's required. We need to be louder about the existence of the standard and ask for it's implementation from all sides.
44 |
45 | #### Examples
46 |
47 | Excerpt from https://feeds.metaebene.me/freakshow/mp3 feed page 2,
48 | parent ``:
49 |
50 | ```xml
51 |
52 |
53 |
54 |
55 | ```
56 |
57 | ## WebSub and Podping.cloud
58 |
59 | TBD
60 |
--------------------------------------------------------------------------------
/proposal-docs/updateFrequency/updateFrequency.md:
--------------------------------------------------------------------------------
1 | # The `` Specification
2 |
3 | Version 1.0 by [Nathan Gathright](https://github.com/nathangathright) - 2023.02.13
4 |
5 | > A tag to provide podcasters a way to express their intended schedule for future releases.
6 |
7 | ## Purpose
8 | In the spirit of taking platform-specific innovations and making them accessible to the open ecosystem of RSS, the intent of this proposal is to replicate the purpose of the “Update Frequency” field in Apple Podcasts Connect as well as replace the `` tag for podcasts that have no intention to release further episodes.
9 |
10 | Additionally, apps like Overcast, Pocket Casts, and Podchaser analyze the intervals between past episodes to estimate a prediction for future releases. Under certain conditions or naive algorithms, this can be inaccurate:
11 | * New podcasts that only have a trailer
12 | * Limited-run podcasts nearing the end of a season
13 | * “Daily” podcasts that only release on weekdays
14 | * Podcasts with consistent releases at irregular intervals (every Monday and Wednesday)
15 |
16 | If podcasters can unambiguously communicate their release schedule, then more apps can provide accurate information to their listeners.
17 |
18 | ## Parent
19 | ``
20 |
21 | ## Count
22 | Single
23 |
24 | ## Node value
25 |
26 | 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.
27 |
28 | ## Attributes
29 | * **complete (optional):** Boolean specifying if the podcast has no intention to release further episodes. If not set, this should be assumed to be false.
30 | * **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.
31 | * **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).
32 |
33 | ## Examples
34 |
35 | Recreating most of Apple Podcasts Connect’s “Update Frequency” values is easily achieved:
36 | ```xml
37 | Daily
38 | Weekly
39 | Biweekly
40 | Monthly
41 | Bimonthly
42 | Monthly
43 | Yearly
44 | ```
45 |
46 | However, greater precision can be easily communicated:
47 | ```xml
48 | Every weekday
49 | Every Monday and Wednesday
50 | Every friday the 13th
51 | Every year on American Thanksgiving
52 | ```
53 |
54 | Limited-run podcasts can indicate when they’ll go on hiatus by setting an UNTIL date or a COUNT:
55 | ```xml
56 | Every other Monday for 10 episodes starting on Aug 28, 2023
57 | Every Monday until Dec 31, 2023
58 | ```
59 |
60 | Podcasts currently on hiatus can indicate their intention to resume production by setting a DTSTART value in the future:
61 | ```xml
62 | Weekly, starting in 2025
63 | ```
64 |
65 | Complete podcasts with no intention to release further episodes:
66 | ```xml
67 | That’s all folks!
68 | ```
69 |
--------------------------------------------------------------------------------
/docs/tags/alternate-enclosure.md:
--------------------------------------------------------------------------------
1 | # Alternate Enclosure
2 |
3 | ``
4 |
5 | This element is meant to provide different versions of, or companion media to the main [``](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) file. This could be an audio only version of a video podcast to allow apps to switch back and forth between audio/video, lower (or higher) bitrate versions for bandwidth constrained areas, alternative codecs for different device platforms, alternate URI schemes and download types such as IPFS or WebTorrent, commentary tracks or supporting source clips, etc.
6 |
7 | 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.
8 |
9 | ### Parent
10 |
11 | ``
12 |
13 | ### Count
14 |
15 | Multiple
16 |
17 | ### Node Value
18 |
19 | The node value must be one or more [``](source.md) elements that each define a uri where the media file can be downloaded or streamed. A single, optional [``](integrity.md) element may also be included to allow for file integrity checking.
20 |
21 | ### Attributes
22 |
23 | - **type:** (required) Mime type of the media asset.
24 | - **length:** (recommended) Length of the file in bytes.
25 | - **bitrate:** (optional) Average encoding bitrate of the media asset, expressed in bits per second.
26 | - **height:** (optional) Height of the media asset for video formats.
27 | - **lang:** (optional) An [IETF language tag (BCP 47)](https://en.wikipedia.org/wiki/BCP_47) code identifying the language of this media.
28 | - **title:** (optional) A human-readable string identifying the name of the media asset. Should be limited to 32 characters for UX.
29 | - **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.
30 | - **codecs:** (optional) An [RFC 6381](https://tools.ietf.org/html/rfc6381) string specifying the codecs available in this media.
31 | - **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.
32 |
33 | ### Examples
34 |
35 | ```xml
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | ```
58 |
59 | ```xml
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 | ```
74 |
--------------------------------------------------------------------------------
/docs/tags/person.md:
--------------------------------------------------------------------------------
1 | # Person
2 |
3 | ``
4 |
5 | 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/)
6 |
7 | ### Parent
8 |
9 | `` (for a podcast) or `` (for an individual episode)
10 |
11 | It is suggested that `` is always populated, and `` is populated where needed for an individual episode. Where present, people information in `` wholly replaces all information from the ``.
12 |
13 | Publishers are expected to use the `` element in the `` parent to set the _regular_ people involved in the podcast: the detail that would be expected to be seen in an overview of the show.
14 |
15 | Publishers are expected to use the `` in the `` parent to **replace** all existing information for an individual episode.
16 |
17 | #### For example: _Terry and June_
18 |
19 | The fictional podcast _Terry and June_ is normally hosted by Terry Scott and June Whitfield. Within ``, Terry Scott and June Whitfield are listed as the hosts. A podcast directory, or podcast app, should show Terry Scott and June Whitfield as the hosts of this show.
20 |
21 | For one episode, _Terry and June_ was hosted by Reginald Marsh and June Whitfield (Terry was away). In this case, the `` for this episode should contain Reginald Marsh and June Whitfield as the hosts of this episode. A podcast app, when playing this episode, should show only Reginald Marsh and June Whitfield as the hosts of this episode. Because people information in `` replaces all existing people information in ``, Terry Scott should not be visible as a host of this episode.
22 |
23 | #### For example: _Big Daddy_
24 |
25 | The fictional podcast _Big Daddy Interviews_ is hosted by Big Daddy, a wrestler. Within ``, Big Daddy is listed as the host. A podcast directory, or podcast app, should show Big Daddy as the host of this show.
26 |
27 | For one episode, _Big Daddy Interviews_ had a guest of Sid James. In this case, the `` for this episode should contain Sid James as a guest, **and** Big Daddy as the host of this episode. Because people information in `` replaces all existing people information in ``, Big Daddy should be re-stated as the host of this episode.
28 |
29 | ### Count
30 |
31 | Multiple
32 |
33 | ### Node value
34 |
35 | 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.
36 |
37 | ### Attributes
38 |
39 | - **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.
40 | - **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.
41 | - **img:** (optional) This is the url of a picture or avatar of the person.
42 | - **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.
43 |
44 | 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".
45 |
46 | The full taxonomy list is [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/taxonomy.json) as a json file.
47 |
48 | ### Examples
49 |
50 | ```xml
51 | John Smith
55 | ```
56 |
57 | ```xml
58 | Jane Doe
63 | ```
64 |
65 | ```xml
66 | Alice Brown
71 | ```
72 |
73 | ```xml
74 | Alice Brown
80 | ```
81 |
82 | ```xml
83 | Becky Smith
88 | ```
89 |
--------------------------------------------------------------------------------
/letters/letter-to-apple.md:
--------------------------------------------------------------------------------
1 | # An Open Letter to Apple
2 |
3 | > Please leave a comment and I'll invite you and give you edit power - Brian
4 |
5 | [](https://hackmd.io/x-EFQGinSrCquuV-KYn72A)
6 |
7 |
8 | Signatories:
9 | ## Adam Curry - The Podfather
10 | ### Co-inventor of Podcasting.
11 |
12 | ## Podcasting 2.0
13 | Dave Jones
14 | Everybody else
15 | Brian of London
16 |
17 | EARLY DRAFT v1.0
18 |
19 | ## What we're asking from Apple
20 |
21 | 1. **Podcast Linking**: allow iOS and Mac users to select their own choice of 3rd party Podcast playing app for links to podcasts. We have a standardised schema and a range of apps, which have adopted it. We would love to see the Apple Podcast app also recognise this standard way of linking to episodes of podcasts.
22 | 2. **Use Podping**: We would be delighted to see Apple start using the free to use instant notification system Podping. This would dramatically reduce the number and frequency of checks on RSS feeds which Apple makes 24x7 to keep Apple's index up to date.
23 | 3. **Appoint a dedicated Podcasting 2.0 Liason**: We'd love to see Apple recognise the vibrant Podcasting 2.0 development community and **engage with us** making everything better for everyone involved in Podcasting! This largely grass roots and direct form of communication is one of the most vibrant parts of the Internet and we want to keep it growing.
24 |
25 |
26 | ## Background
27 |
28 | Adam writes: "Back in 2005 I was called to a meeting with Steve Jobs. He asked me if it would be OK to put Podcasts directly into the software for the iPod: iTunes on the Mac.
29 |
30 | This meeting followed a number of years of open source development which built the fledgling Podcasting industry. That effort had built production tools, distribution systems and podcast player software. We had our own Index which, following that meeting with Steve Jobs, I entrusted to Apple."
31 |
32 | Many years later, through which Podcasting grew into a thriving industry all of its own, Apple still holds a special place with it's Index of shows and free to use API.
33 |
34 | Today Apple maintains a large market dominance on its own iOS platform with the built in Podcasting App. But there is healthy competition from a range of apps produced by billion dollar companies right down to single person startups. All these apps compete on iOS and Google's Android and there is room for all of them.
35 |
36 | ## Podcast Linking
37 |
38 | There is an important element missing, however, especially on iOS. The ability to share a link to a Podcast or epsiode of a show and have it open in the user's preferred application.
39 |
40 | This choice is available on Google's Android system. We've recently seen search engine choice, browser choice and choice of email client added to iOS. We'd like to see Podcast App choice be added too.
41 |
42 | Podcast listening is deeply personal. Podcast listeners have strong emotional ties to the content they follow and often to the apps they use. Podcasts are also deeply affected by word of mouth sharing and link sharing needs to be easier.
43 |
44 | ### Competition
45 |
46 | All over the world, from Europe to Australia and the USA, competition authorities are looking very carefully at every aspect of big tech.
47 |
48 | The browser wars of the 90's have carried into the heavy discussions today around mobile app store policies. Something as simple as reducing barriers to user's chosing a new primary Podcast App can only be seen as a win and encouraging of competition and choice for your customers.
49 |
50 | ## Podping
51 |
52 | The diverse team of open source developers and Podcast lovers who have worked together under the Podcast Index stewardship have developed a revolutionary notification system for new podcast episode notifications.
53 |
54 | **Podping** replaces energy wasteful, repetetive polling of millions of RSS feeds with an elegent blockchain based notification system.
55 |
56 | Apple would need little more than a single Raspberry Pi, watching the stream of Podpings shared over the open source Hive blockchain. That could replace hundreds of energey burning servers Apple maintains today.
57 |
58 | This one computer would notify Apple of every new episode within seconds of it being published and only then would Apple need to fetch the updated RSS feed and index its new content.
59 |
60 | Podping is currently being used by the following podcast hosts and the *podpings* are picked up and used by PodcastIndex and a number of other apps:
61 |
62 | - Buzzsprout.com
63 | - Transistor.fm
64 | - rss.com
65 | - Captivate.fm
66 | - podserve.fm
67 | - Cast.Garden
68 | - 3speak.tv
69 | - podnews.net
70 |
71 | [You can "watch" Podping right now in the browser](https://podping.watch/), every new episode from any of these hosts will appear here and this can run in your browser, no need to check 100's of 1,000's of RSS feeds every hour!
72 |
73 | With Apple on board and using Podping to provide much faster and more energy efficient updates of podcasts to millions of iOS devices, we are sure that the rest of the Podcast hosting companies would join.
74 |
75 | ## One More Thing
76 |
77 | PodcastIndex has been working for over a year now and been at the center of developing many new initiatives around what we've called Podcasting 2.0. Those innovations we've mentioned in this letter are just the tip of an iceberg.
78 |
79 | We know Apple has been passionate about Podcasting for almost as long as we have, we would love to collaborate further and see Apple adopt some of the innovations our teams come up with! Please get in touch with Adam directly and lets work together on making Podcasting even better.
80 |
--------------------------------------------------------------------------------
/proposal-docs/API/Chapters.md:
--------------------------------------------------------------------------------
1 | # The podcast:chapters API Specification
2 |
3 | Version 1.0 by Benjamin Bellamy - 2021.03.11
4 |
5 |
6 | This version is a first draft. It will be updated. It may move somewhere else.
7 |
8 | ## Purpose
9 | The PodcastIndex namespace allows all podcast platforms (hosting, index, players…) to speak the same language and interact together.
10 | These interactions are limited to communications through the RSS feeds.
11 | This document describes a new type of interaction between actors who use a same PodcastIndex namespace tag: [Podcast:Chapters](https://github.com/Podcastindex-org/podcast-namespace/blob/main/chapters/jsonChapters.md).
12 | It was initiated by [David Norman](https://podcastindex.social/@hypercatcher) for [Hypercatcher](https://hypercatcher.com/) and [Benjamin Bellamy](https://podcastindex.social/@benjaminbellamy) for [Castopod](https://castopod.org/) so that HyperCatcher and Castopod are able to interact together and create a seamless experience for podcasters.
13 |
14 | We hope this will open a path to more collaborations between platforms which use the PodcastIndex namespace.
15 | (The podcast:transcript API is probably the next to be specified…)
16 |
17 | Note that the purpose of this specification is **not** to define “**how**” to manage the chapter service but “**who**” manages the chapter service, so that **any** podcaster is able to choose **any** provider among the ones able to provide the chapter service.
18 | Then that provider is free to use IPFS, centralised https or whatever makes sense to him — and to his users.
19 | This spec is **not** an extension of the [Podcast:Chapters](https://github.com/Podcastindex-org/podcast-namespace/blob/main/chapters/jsonChapters.md) tag, it sits next to it.
20 |
21 | ## Example
22 | To help making things clear, let's take an example:
23 | A podcaster, we'll call her Eve, is hosting a podcast on Castopod. She is using HyperCatcher to manage the chapters.
24 |
25 | ### Without the podcast:chapters API
26 | Whenever Eve wants to publish a new episode, she has to:
27 | - Go to her Castopod admin panel, save the episode, then publish it so that it is visible in the RSS feed.
28 | - Go to her HyperCatcher dashboard, click "Edit", click "Fetch Episodes" so that HyperCatcher gets this new episode.
29 | - Click on the newly fetched episode, copy the "Url for Json".
30 | - Go back to Castopod admin panel, edit the episode, paste the previously copied "Url for Json" into the appropriate field, hoping that no platform had fetched the RSS in the meantime, before the chapter Url was pasted.
31 |
32 | Later, Eve will wait for users to edit chapters, she will go back to HyperCatcher dashboard, Accept (or not) the community chapters.
33 |
34 | ### With the podcast:chapters API
35 | Whenever Eve wants to publish a new episode, she has to:
36 | - Go to her Castopod admin panel, save the episode. (Castopod will automatically call the podcast:chapters API at Hypercatcher, send the new episode and get from HyperCatcher the public "URL for Json" and insert it automatically in the RSS feed, get the private URL to the episode in the HyperCatcher dashboard and display the link on Castopod Dashboard.)
37 | - That's it.
38 |
39 | Later, Eve will wait for users to edit chapters, she will go back to HyperCatcher dashboard, Accept (or not) the community chapters.
40 | Because Castopod knows the private URL to the episode in the HyperCatcher dashboard, a link from the episode edit page in Castopod to the episode in HyperCatcher will be displayed. And we think that this is pretty cool.
41 |
42 | ## Technical Specification
43 | This API uses REST.
44 |
45 | It involves 2 parties:
46 | - a Poscast Hosting service.
47 | - a Chapters Provider service.
48 |
49 | ### Endpoints
50 | This API has only one endpoint (so far), hosted at the Chapters Provider.
51 |
52 | #### AddNewEpisode
53 | - `POST /AddNewEpisode`
54 | This adds a new Episode to the chapter provider.
55 | The endpoint URL may be defined by the chapter provider. The Podcast Hosting service must provide a way to specify this endpoint URL on its configuration panel.
56 |
57 | Parameters:
58 | - `rss`: RSS feed URL
59 | - `guid`: New Episode GUID
60 | - `enclosure_url`: New episode enclosure url
61 |
62 | Response:
63 | - `status`: true or false
64 | - `jsonUrl`: Url for Json
65 | - `episodeUrl`: Url for episode on dashboard
66 |
67 | ### Authentication
68 | Thir API will use the mechanism already used by the [PodcastIndex.org API](https://podcastindex-org.github.io/docs-api/#auth).
69 | The Chapters Provider will provide a couple `apiKey` and `apiSecret` which will be displayed on the user dashboard so that the podcaster can copy and paste them on his Podcast Hosting configuration panel.
70 | Fields:
71 | - `User-Agent`: Mandatory
72 | Please identify the system/product you are using to make this request.
73 | Example: Castopod/1.0
74 | - `X-Auth-Key`: Mandatory
75 | Your API key string
76 | Example: UXKCGDSYGUUEVQJSYDZH
77 | - `X-Auth-Date`: Mandatory
78 | The current unix epoch time as a string. 5 minute window.
79 | This value is an integer; round down if needed. The value shall not include a decimal point.
80 | Example: 1613713388
81 | - `Authorization`: Mandatory
82 | A SHA-1 hash of the X-Auth-Key, the corresponding secret and the X-Auth-Date value concatenated as a string. The resulting hash should be encoded as a hexadecimal value, two digits per byte, using lower case letters for the hex digits "a" through "f".
83 | Example: UXKCGDSYGUUEVQJSYDZH
84 | The Authorization header is computed with something like this (pseudo-code):
85 | ```
86 | authHeader = sha1(apiKey+apiSecret+unixTime)
87 | ```
88 |
89 | Discussion here:
90 | - https://github.com/Podcastindex-org/podcast-namespace/issues/209
91 | - https://podcastindex.social/web/statuses/105872943999299482
92 |
--------------------------------------------------------------------------------
/docs/examples/publishers/publishers.md:
--------------------------------------------------------------------------------
1 | # The Publisher Medium
2 |
3 | v1.0 - April 5, 2024
4 |
5 |
6 |
7 | Below, you will find implementation details about using the `publisher` value in the [``](../../tags/medium.md) tag to
8 | create "publisher feeds".
9 |
10 |
11 |
12 | ## Overview
13 |
14 | The idea of a "publisher" is that a single entity (person, organization, record label, etc) might be the responsible
15 | party which produces multiple podcast feeds. In such a case it would be useful to be able to see all of a
16 | publisher's podcasts collected in a single place. For instance, a news organization might produce 12 different
17 | podcast feeds. Or, a music artist might produce 3 albums of music using the `` tag of `music`. In
18 | those cases, having a high level feed that references these other feeds would make it easier for podcast apps to
19 | associate those feeds with a particular publishing entity.
20 |
21 | Likewise, it is helpful if the produced feeds link back to the "publisher feed" so that podcast apps can walk back
22 | up the chain from a podcast feed to it's publisher in order to find other relevant content from that publishing
23 | entity. For instance, a listener may subscribe to a music album by an artist and want to find their other
24 | albums and singles.
25 |
26 | When a publisher feed links to it's "child" feeds, and those "child" feeds link back to their "parent" publisher
27 | feeds, this provides a two-way validation that a feed is indeed a valid part of a publishing entities portfolio of
28 | content. If a feed links to a publisher feed without the publisher feed referencing it, that association should be
29 | discarded.
30 |
31 |
32 |
33 | ## Publisher Feed Requirements
34 |
35 | A publisher feed must have the following parts in it's ``:
36 |
37 | 1. A [``](../../tags/medium.md) tag with a value of `publisher`.
38 | 2. A valid [``](../../tags/guid.md).
39 | 3. One or more [``](../../tags/remote-item.md) tags that link to podcast feeds.
40 |
41 | ### Example
42 |
43 | The following example shows a publisher feed that links to all of the feeds published by the "AgileSet Media" entity.
44 | This feed also makes use of the [``](../../tags/person.md) tag to define a responsible person at the
45 | publishing entity.
46 |
47 | ```xml
48 |
49 |
50 | AgileSet Media
51 | https://agilesetmedia.com
52 | AgileSet Media is an unincorporated, unregistered, and unpapered entity of AgileSet LLC for producing and publishing stuff by Mike Neumann. It is based in Texas, USA.
53 |
54 | https://agilesetmedia.com/assets/static/AgileSet-logo-square-sm-144.png
55 | AgileSet Media
56 | https://agilesetmedia.com
57 | 144
58 | 144
59 |
60 | Mike Neumann
61 | 003af0a0-6a45-55bf-b765-68e3d349551a
62 | publisher
63 |
64 |
65 |
66 |
67 |
68 | ```
69 |
70 |
71 |
72 | ## Linking to Publisher Feeds
73 |
74 | While not strictly required, adding a reference to the publisher feed from the "child" feeds is a good idea, as it
75 | makes discovery of your other content much easier. Podcast apps can see this linkage and "walk back up the chain"
76 | to your publisher feed and then recommend your other podcast content to a listener. To do this, you will need to
77 | add a `` tag in the `` of the "child" feed that will contain a `` link to
78 | the
79 | publisher feed.
80 |
81 | ### Example
82 |
83 | The following example snippet shows a podcast feed produced by "AgileSet Media" that links to the publisher feed
84 | example above.
85 |
86 | ```xml
87 |
88 |
89 |
90 | A value4value happenstance music show.
91 | https://itsamood.org
92 | Sovereign Feeds
93 | Mike Neumann
94 | 469b403f-db2d-574c-9db9-96dbb3f6561c
95 | podcast
96 |
97 |
98 |
99 |
100 |
101 | Wed, 03 Apr 2024 02:06:28 +0000
102 | ...
103 |
104 |
105 |
106 | ```
107 |
--------------------------------------------------------------------------------
/docs/tags/value-time-split.md:
--------------------------------------------------------------------------------
1 | # Value Time Split
2 |
3 | ``
4 |
5 | This element allows different value splits for a certain period of time. It is a combination of the concept of [``](soundbite.md) and [``](remote-item.md) 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.
6 |
7 | The `` element allows time-based changes of value recipient information during playback of a feed's enclosure content.
8 |
9 | This can either contain one or more [``](value-recipient.md) tags _or_ exactly one [``](remote-item.md) tag. If a [``](remote-item.md) tag is present, the `remotePercentage` attribute can be defined to control how much the remote value block's [``](value-recipient.md) tags will receive as a whole on top of the default, non-fee [``](value-recipient.md) tags.
10 |
11 | If the remote value block contains any `` tags, they should be ignored even if the `remoteStartTime` indicates it's in a position that would invoke them. When referencing a remote value block, only the root level block splits should be used and any `` children are to be ignored.
12 |
13 | Fees from the default [``](value-recipient.md) tags should remain to be calculated before anything is taken out from ``.
14 |
15 | ### Parent
16 |
17 | ``
18 |
19 | ### Count
20 |
21 | Multiple
22 |
23 | ### Node Value
24 |
25 | A single [``](remote-item.md) element OR one or more [``](value-recipient.md) elements.
26 |
27 | ### Attributes
28 |
29 | - `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.
30 | - `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.
31 | - `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.
32 | - `remotePercentage` (optional) - The percentage of the payment the remote recipients will receive if a [``](remote-item.md) 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.
33 |
34 | ### Example (Remote Item)
35 |
36 | ```xml
37 |
38 |
39 | Metal Showcase
40 | A great playlist of my favorite metal tracks.
41 | https://example.com/rss-metal-showcase.xml
42 | en
43 | Fri, 21 Apr 2023 18:56:30 -0500
44 | music
45 |
46 | Special interview with Torcon VII
47 | ...
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | ```
64 |
65 | ### Example (Locally Specified)
66 |
67 | ```xml
68 |
69 |
70 | Cool Pod
71 | This is a cool pod
72 | https://example.com/rss-cool-pod.xml
73 | en
74 | Fri, 21 Apr 2023 18:56:30 -0500
75 | podcast
76 |
77 | Adam Hates the word "pod" (and I do, too)
78 | ...
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 | ```
97 |
--------------------------------------------------------------------------------
/docs/tags/medium.md:
--------------------------------------------------------------------------------
1 | # Medium
2 |
3 | ``
4 |
5 | The `medium` tag tells an application what the content contained within the feed IS, as opposed to what the content is ABOUT in the case of a category. This allows a podcast app to modify it's behavior or UI to give a better experience to the user for this content. For example, if a podcast has `music` an app may choose to reset playback speed to 1x and adjust it's EQ settings to be better for music vs. spoken word.
6 |
7 | 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.
8 |
9 | ### Parent
10 |
11 | ``
12 |
13 | ### Count
14 |
15 | Single
16 |
17 | ### Node Value
18 |
19 | The node value is a string denoting one of the following possible values:
20 |
21 | - `podcast` (default) - Describes a feed for a podcast show. If no `medium` tag is present in the channel, this medium is assumed.
22 | - `music` - A feed of music organized into an "album" with each item a song within the album.
23 | - `video` - Like a "podcast" but used in a more visual experience. Something akin to a dedicated video channel like would be found on YouTube.
24 | - `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.
25 | - `audiobook` - Specific types of audio with one item per feed, or where items represent chapters within the book.
26 | - `newsletter` - Describes a feed of curated written articles. Newsletter articles now sometimes have an spoken version audio enclosure attached.
27 | - `blog` - Describes a feed of informally written articles. Similar to `newsletter` but more informal as in a traditional blog platform style.
28 | - `publisher` - Describes a feed that links to other feeds a publisher owns using the [``](remote-item.md) element. To understand the structure of how "publisher" feeds work, please [see the dedicated document](../examples/publishers/publishers.md) and the [`` tag](publisher.md).
29 | - `course` - A feed of training material (audio or video courses) with each item being a session or chapter of the course or conference track.
30 |
31 | ### List Mediums
32 |
33 | 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.
34 |
35 | There is also a dedicated list medium for mixed content:
36 |
37 | - `mixed` - This list medium type describes a feed of [``](remote-item.md)'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.
38 |
39 | A "list" medium feed should not be expected to have regular ``'s,[``](live-item.md)'s, or any future similar new item type. Rather, a "List" feed is intended to exclusively contain one or more [``](remote-item.md)'s, allowing one to reference a feed by its [``](guid.md) and the guid of an item.
40 |
41 | ### Examples
42 |
43 | Example use for a standard "podcast" feed:
44 |
45 | ```xml
46 | podcast
47 | ```
48 |
49 | Example use for a "music" feed:
50 |
51 | ```xml
52 | music
53 | ```
54 |
55 | Example use for a "music" playlist feed:
56 |
57 | ```xml
58 |
59 |
60 | Picking the Hits 2.0!
61 | All the hits played on the Podcasting 2.0 show.
62 | https://podcastindex.org
63 | en-US
64 | Wed, 07 Jun 2023 04:30:38 GMT
65 |
66 | https://example.com/images/pci_avatar-massive.jpg
67 |
68 |
69 | 3f2a8e4e-263a-51aa-9d3d-0d71f82a1564
70 | musicL
71 | https://example.com/images/pci_avatar-massive.jpg
72 |
73 |
74 |
75 |
76 |
77 |
78 |
84 |
85 |
91 |
92 |
98 |
99 |
105 |
106 |
107 | ```
108 |
--------------------------------------------------------------------------------
/docs/tags/live-item.md:
--------------------------------------------------------------------------------
1 | # Live Item
2 |
3 | ``
4 |
5 | The `liveItem` tag is used for a feed to deliver a live audio or video stream to podcast apps. It takes the same format as a standard `` episode tag, and all tags that are allowed as children of a normal `` are also allowed as children of ``. Note that "allowed" is not the same as "supported". So, just like a normal ``, you cannot depend on all apps to support all tags within ``, especially when the function of the tag is not obvious. For instance, including an `` tag in a live item is probably a waste of time since apps will not know what to do with that value in the context of live media.
6 |
7 | 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.
8 |
9 | ### Parent
10 |
11 | ``
12 |
13 | ### Count
14 |
15 | Multiple
16 |
17 | ### Node Value
18 |
19 | All tags that are valid as children of a standard `` tag are also valid as children here.
20 |
21 | When specifying the audio/video source, the [``](./alternate-enclosure.md) tag is highly encouraged since it gives the broadest coverage of possible stream types and is explicit in its communication of what transport protocol and media codecs are being used. In addition to [``](./alternate-enclosure.md), a standard [``](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) should also be given as a fallback to support podcast apps that don't yet implement [``](./alternate-enclosure.md).
22 |
23 | 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.
24 |
25 | The [``](./content-link.md) tag is also required to be present, to ensure that listeners have a fallback option in case their chosen app cannot play the given content stream directly. In most instances this will just be a link to an HTML page that can play the live stream. Such a page can reside on the podcaster's own website, a page provided by their hosting company or a third party platform they have chosen to use. Podcasters who live stream to multiple platforms at once can also use the [``](./content-link.md) tag to provide links to those other platforms.
26 |
27 | A robust, well-written `` tag will include all three of: [``](./alternate-enclosure.md), [``](https://cyber.harvard.edu/rss/rss.html#ltenclosuregtSubelementOfLtitemgt) and [``](./content-link.md) to ensure the broadest interopability with podcast apps.
28 |
29 | The function of `` within a live item tag is the same as it is within a regular item. If the `` of a `` changes, it MUST be considered a new stream by podcast apps.
30 |
31 | ### Attributes
32 |
33 | - **status** (required) A string that must be one of `pending`, `live` or `ended`.
34 | - **start** (required) A string representing an ISO8601 timestamp that denotes the time when the stream is intended to start.
35 | - **end** (recommended) A string representing an ISO8601 timestamp that denotes the time when the stream is intended to end.
36 |
37 | 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.
38 |
39 | ### Examples
40 |
41 | A complete example:
42 |
43 | ```xml
44 |
45 | Podcasting 2.0 Live Show
46 | A look into the future of podcasting and how we get to Podcasting 2.0!
47 | https://example.com/podcast/live
48 | https://example.com/live
49 | John Doe (john@example.com)
50 |
55 | Adam Curry
57 | Dave Jones
59 | Becky Smith
61 |
62 |
63 |
64 |
65 | YouTube!
66 | Twitch!
67 | Listen Live!
68 |
69 | ```
70 |
71 | A bare bones example:
72 |
73 | ```xml
74 |
75 | Podcasting 2.0 Live Stream
76 | e32b4890-983b-4ce5-8b46-f2d6bc1d8819
77 |
78 | Listen Live!
79 |
80 | ```
81 |
--------------------------------------------------------------------------------
/COPYING.txt:
--------------------------------------------------------------------------------
1 | Creative Commons Legal Code
2 |
3 | CC0 1.0 Universal
4 |
5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
12 | HEREUNDER.
13 |
14 | Statement of Purpose
15 |
16 | The laws of most jurisdictions throughout the world automatically confer
17 | exclusive Copyright and Related Rights (defined below) upon the creator
18 | and subsequent owner(s) (each and all, an "owner") of an original work of
19 | authorship and/or a database (each, a "Work").
20 |
21 | Certain owners wish to permanently relinquish those rights to a Work for
22 | the purpose of contributing to a commons of creative, cultural and
23 | scientific works ("Commons") that the public can reliably and without fear
24 | of later claims of infringement build upon, modify, incorporate in other
25 | works, reuse and redistribute as freely as possible in any form whatsoever
26 | and for any purposes, including without limitation commercial purposes.
27 | These owners may contribute to the Commons to promote the ideal of a free
28 | culture and the further production of creative, cultural and scientific
29 | works, or to gain reputation or greater distribution for their Work in
30 | part through the use and efforts of others.
31 |
32 | For these and/or other purposes and motivations, and without any
33 | expectation of additional consideration or compensation, the person
34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she
35 | is an owner of Copyright and Related Rights in the Work, voluntarily
36 | elects to apply CC0 to the Work and publicly distribute the Work under its
37 | terms, with knowledge of his or her Copyright and Related Rights in the
38 | Work and the meaning and intended legal effect of CC0 on those rights.
39 |
40 | 1. Copyright and Related Rights. A Work made available under CC0 may be
41 | protected by copyright and related or neighboring rights ("Copyright and
42 | Related Rights"). Copyright and Related Rights include, but are not
43 | limited to, the following:
44 |
45 | i. the right to reproduce, adapt, distribute, perform, display,
46 | communicate, and translate a Work;
47 | ii. moral rights retained by the original author(s) and/or performer(s);
48 | iii. publicity and privacy rights pertaining to a person's image or
49 | likeness depicted in a Work;
50 | iv. rights protecting against unfair competition in regards to a Work,
51 | subject to the limitations in paragraph 4(a), below;
52 | v. rights protecting the extraction, dissemination, use and reuse of data
53 | in a Work;
54 | vi. database rights (such as those arising under Directive 96/9/EC of the
55 | European Parliament and of the Council of 11 March 1996 on the legal
56 | protection of databases, and under any national implementation
57 | thereof, including any amended or successor version of such
58 | directive); and
59 | vii. other similar, equivalent or corresponding rights throughout the
60 | world based on applicable law or treaty, and any national
61 | implementations thereof.
62 |
63 | 2. Waiver. To the greatest extent permitted by, but not in contravention
64 | of, applicable law, Affirmer hereby overtly, fully, permanently,
65 | irrevocably and unconditionally waives, abandons, and surrenders all of
66 | Affirmer's Copyright and Related Rights and associated claims and causes
67 | of action, whether now known or unknown (including existing as well as
68 | future claims and causes of action), in the Work (i) in all territories
69 | worldwide, (ii) for the maximum duration provided by applicable law or
70 | treaty (including future time extensions), (iii) in any current or future
71 | medium and for any number of copies, and (iv) for any purpose whatsoever,
72 | including without limitation commercial, advertising or promotional
73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
74 | member of the public at large and to the detriment of Affirmer's heirs and
75 | successors, fully intending that such Waiver shall not be subject to
76 | revocation, rescission, cancellation, termination, or any other legal or
77 | equitable action to disrupt the quiet enjoyment of the Work by the public
78 | as contemplated by Affirmer's express Statement of Purpose.
79 |
80 | 3. Public License Fallback. Should any part of the Waiver for any reason
81 | be judged legally invalid or ineffective under applicable law, then the
82 | Waiver shall be preserved to the maximum extent permitted taking into
83 | account Affirmer's express Statement of Purpose. In addition, to the
84 | extent the Waiver is so judged Affirmer hereby grants to each affected
85 | person a royalty-free, non transferable, non sublicensable, non exclusive,
86 | irrevocable and unconditional license to exercise Affirmer's Copyright and
87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the
88 | maximum duration provided by applicable law or treaty (including future
89 | time extensions), (iii) in any current or future medium and for any number
90 | of copies, and (iv) for any purpose whatsoever, including without
91 | limitation commercial, advertising or promotional purposes (the
92 | "License"). The License shall be deemed effective as of the date CC0 was
93 | applied by Affirmer to the Work. Should any part of the License for any
94 | reason be judged legally invalid or ineffective under applicable law, such
95 | partial invalidity or ineffectiveness shall not invalidate the remainder
96 | of the License, and in such case Affirmer hereby affirms that he or she
97 | will not (i) exercise any of his or her remaining Copyright and Related
98 | Rights in the Work or (ii) assert any associated claims and causes of
99 | action with respect to the Work, in either case contrary to Affirmer's
100 | express Statement of Purpose.
101 |
102 | 4. Limitations and Disclaimers.
103 |
104 | a. No trademark or patent rights held by Affirmer are waived, abandoned,
105 | surrendered, licensed or otherwise affected by this document.
106 | b. Affirmer offers the Work as-is and makes no representations or
107 | warranties of any kind concerning the Work, express, implied,
108 | statutory or otherwise, including without limitation warranties of
109 | title, merchantability, fitness for a particular purpose, non
110 | infringement, or the absence of latent or other defects, accuracy, or
111 | the present or absence of errors, whether or not discoverable, all to
112 | the greatest extent permissible under applicable law.
113 | c. Affirmer disclaims responsibility for clearing rights of other persons
114 | that may apply to the Work or any use thereof, including without
115 | limitation any person's Copyright and Related Rights in the Work.
116 | Further, Affirmer disclaims responsibility for obtaining any necessary
117 | consents, permissions or other rights required for any use of the
118 | Work.
119 | d. Affirmer understands and acknowledges that Creative Commons is not a
120 | party to this document and has no duty or obligation with respect to
121 | this CC0 or use of the Work.
122 |
--------------------------------------------------------------------------------
/docs/examples/transcripts/transcripts.md:
--------------------------------------------------------------------------------
1 | ## Transcript File Format Details
2 |
3 | This is the initial spec for the podcast transcript format. There are four possible formats detailed below.
4 |
5 | Some transcript implementations are done in-browser. [CORS headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)
6 | are required to make these files available from other websites. [A CORS tester is available here](https://cors-test.codehappy.dev/),
7 | to ensure that transcripts are available within browser-based players.
8 |
9 | - **Want to support only one format?** WebVTT is used by Apple Podcasts for ingest, and also natively supported by web browsers. Because the WebVTT format is the most flexible, it's an ideal choice if you can only support one format.
10 |
11 | The examples given below are just for convenience. In production you should ensure you are conforming to the actual spec for each format as defined in its own documentation.
12 |
13 | ## WebVTT
14 |
15 | The [Web Video Text Tracks Format (WebVTT)](https://www.w3.org/TR/webvtt1/) is designed for use in HTML on the web. You can use the [