diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 0e259d4..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,121 +0,0 @@
-Creative Commons Legal Code
-
-CC0 1.0 Universal
-
- CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
- LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
- ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
- INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
- REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
- PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
- THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
- HEREUNDER.
-
-Statement of Purpose
-
-The laws of most jurisdictions throughout the world automatically confer
-exclusive Copyright and Related Rights (defined below) upon the creator
-and subsequent owner(s) (each and all, an "owner") of an original work of
-authorship and/or a database (each, a "Work").
-
-Certain owners wish to permanently relinquish those rights to a Work for
-the purpose of contributing to a commons of creative, cultural and
-scientific works ("Commons") that the public can reliably and without fear
-of later claims of infringement build upon, modify, incorporate in other
-works, reuse and redistribute as freely as possible in any form whatsoever
-and for any purposes, including without limitation commercial purposes.
-These owners may contribute to the Commons to promote the ideal of a free
-culture and the further production of creative, cultural and scientific
-works, or to gain reputation or greater distribution for their Work in
-part through the use and efforts of others.
-
-For these and/or other purposes and motivations, and without any
-expectation of additional consideration or compensation, the person
-associating CC0 with a Work (the "Affirmer"), to the extent that he or she
-is an owner of Copyright and Related Rights in the Work, voluntarily
-elects to apply CC0 to the Work and publicly distribute the Work under its
-terms, with knowledge of his or her Copyright and Related Rights in the
-Work and the meaning and intended legal effect of CC0 on those rights.
-
-1. Copyright and Related Rights. A Work made available under CC0 may be
-protected by copyright and related or neighboring rights ("Copyright and
-Related Rights"). Copyright and Related Rights include, but are not
-limited to, the following:
-
- i. the right to reproduce, adapt, distribute, perform, display,
- communicate, and translate a Work;
- ii. moral rights retained by the original author(s) and/or performer(s);
-iii. publicity and privacy rights pertaining to a person's image or
- likeness depicted in a Work;
- iv. rights protecting against unfair competition in regards to a Work,
- subject to the limitations in paragraph 4(a), below;
- v. rights protecting the extraction, dissemination, use and reuse of data
- in a Work;
- vi. database rights (such as those arising under Directive 96/9/EC of the
- European Parliament and of the Council of 11 March 1996 on the legal
- protection of databases, and under any national implementation
- thereof, including any amended or successor version of such
- directive); and
-vii. other similar, equivalent or corresponding rights throughout the
- world based on applicable law or treaty, and any national
- implementations thereof.
-
-2. Waiver. To the greatest extent permitted by, but not in contravention
-of, applicable law, Affirmer hereby overtly, fully, permanently,
-irrevocably and unconditionally waives, abandons, and surrenders all of
-Affirmer's Copyright and Related Rights and associated claims and causes
-of action, whether now known or unknown (including existing as well as
-future claims and causes of action), in the Work (i) in all territories
-worldwide, (ii) for the maximum duration provided by applicable law or
-treaty (including future time extensions), (iii) in any current or future
-medium and for any number of copies, and (iv) for any purpose whatsoever,
-including without limitation commercial, advertising or promotional
-purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
-member of the public at large and to the detriment of Affirmer's heirs and
-successors, fully intending that such Waiver shall not be subject to
-revocation, rescission, cancellation, termination, or any other legal or
-equitable action to disrupt the quiet enjoyment of the Work by the public
-as contemplated by Affirmer's express Statement of Purpose.
-
-3. Public License Fallback. Should any part of the Waiver for any reason
-be judged legally invalid or ineffective under applicable law, then the
-Waiver shall be preserved to the maximum extent permitted taking into
-account Affirmer's express Statement of Purpose. In addition, to the
-extent the Waiver is so judged Affirmer hereby grants to each affected
-person a royalty-free, non transferable, non sublicensable, non exclusive,
-irrevocable and unconditional license to exercise Affirmer's Copyright and
-Related Rights in the Work (i) in all territories worldwide, (ii) for the
-maximum duration provided by applicable law or treaty (including future
-time extensions), (iii) in any current or future medium and for any number
-of copies, and (iv) for any purpose whatsoever, including without
-limitation commercial, advertising or promotional purposes (the
-"License"). The License shall be deemed effective as of the date CC0 was
-applied by Affirmer to the Work. Should any part of the License for any
-reason be judged legally invalid or ineffective under applicable law, such
-partial invalidity or ineffectiveness shall not invalidate the remainder
-of the License, and in such case Affirmer hereby affirms that he or she
-will not (i) exercise any of his or her remaining Copyright and Related
-Rights in the Work or (ii) assert any associated claims and causes of
-action with respect to the Work, in either case contrary to Affirmer's
-express Statement of Purpose.
-
-4. Limitations and Disclaimers.
-
- a. No trademark or patent rights held by Affirmer are waived, abandoned,
- surrendered, licensed or otherwise affected by this document.
- b. Affirmer offers the Work as-is and makes no representations or
- warranties of any kind concerning the Work, express, implied,
- statutory or otherwise, including without limitation warranties of
- title, merchantability, fitness for a particular purpose, non
- infringement, or the absence of latent or other defects, accuracy, or
- the present or absence of errors, whether or not discoverable, all to
- the greatest extent permissible under applicable law.
- c. Affirmer disclaims responsibility for clearing rights of other persons
- that may apply to the Work or any use thereof, including without
- limitation any person's Copyright and Related Rights in the Work.
- Further, Affirmer disclaims responsibility for obtaining any necessary
- consents, permissions or other rights required for any use of the
- Work.
- d. Affirmer understands and acknowledges that Creative Commons is not a
- party to this document and has no duty or obligation with respect to
- this CC0 or use of the Work.
diff --git a/README.md b/README.md
index 6e9873f..7632e79 100644
--- a/README.md
+++ b/README.md
@@ -11,11 +11,31 @@ will become the framework that the independent podcast community needs to delive
## Current Roadmap
-**Phase 1** - [Closed] Comment period closed on `11/15/20` and 5 tags were adopted.
+**Phase 1** - [Closed] Comment period closed on `11/15/20` and 5 tags were **formalized**.
-**Phase 2** - [Open] Comment period closes on `1/31/21` and tags that have good consensus will be adopted. Any tags with questions, concerns or no discernable use case will be either removed or booted to Phase 3.
+**Phase 2** - [Closed] Comment period closed on `1/31/21` and 4 tags were **formalized**.
+
+**Phase 3** - [Open] Proposals welcome. This phase will close on June 1st, 2021. At that time, any tags with full agreement will be reviewed for
+ formalization. Any tags with concerns or questions will be pushed forward to the next phase. Current tag proposals under
+ consideration are listed [here](#phase-3-open).
+
+
+
+
+## Legend
+
+**Formalized** - This tag is frozen and listed in the XMLNS document. Any future changes to it's definition must maintain backwards compatibility.
+
+**Finalized** - The tag is structurally stable and implementation testing should be considered safe. Any breaking changes will be widely communicated.
+
+**Open** - The tag/phase is open for discussion and collaboration.
+
+**Required** - This tag or attribute must be present.
+
+**Optional** - This tag or attribute may be left out.
+
+**Recommended** - This tag or attribute is technically optional, but is strongly recommended to be present for the tag to function as fully intended.
-**Phase 3** - [Open] Proposals welcome.
@@ -84,10 +104,7 @@ To see a list of platforms and apps that currently implement some or all of thes
## Example Feed
-There is an example feed [example.xml](example.xml) in this repository showing the podcastindex namespace side by side with the Apple itunes namespace. There is also
-a "sandbox" feed where we experiment with tags while they are being hashed out.
-
-The url for that feed is: [https://noagendaassets.com/enc/pc20sandbox.xml](https://noagendaassets.com/enc/pc20sandbox.xml).
+There is an example feed [example.xml](example.xml) in this repository showing the podcastindex namespace side by side with the Apple itunes namespace.
+
-
-### Phase 2 (Open)
-
-- **\**
-
- Channel or Item (optional | multiple)
-
- 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.
-
- - `name` (required) This is the full name or alias of the person.
- - `role` (optional) Used to identify what role the person serves on the show or episode. This should be a reference to an official role within the Podcast Taxonomy Project list (see below). If `role` is missing then "host" is assumed.
- - `group` (optional) This should be a camel-cased, alphanumeric reference to an official group within the Podcast Taxonomy Project list. If `group` is not present, then "cast" is assumed.
- - `img` (optional) This is the url of a picture or avatar of the person.
- - `href` (optional) Link to a relevant resource of information about the person. (eg. Podchaser profile, website, blog or wiki entry). Linking to the Podchaser profile url is highly encouraged as the standard for this url. In a case
- where there is no Podchaser profile, then a link to the person's website, blog, wiki entry, etc. can be used.
-
- The maximum recommended string length of the node value is 128 characters.
-
- The `role` and `group` tags are case-insensitive. So, "Host" is the same as "host".
-
- The full taxonomy list is [here](taxonomy.json) as a json file.
+### Phase 2 (Closed on 1/31/21)
-- **\country="[Country Code]" (locality="[Locality]") (latlon="[latitude,longitude]") (osmid="[OSM type][OSM id]") />**
+The following tags have been formally adopted into the namespace. They are fully documented in the XMLNS document located [here](docs/1.0.md). Please see that file for
+full implementation details.
-_Because of its complexity, the location tag is [currently being discussed over here](https://github.com/Podcastindex-org/podcast-namespace/issues/138). The top message contains the current proposal._
-
-
-
-- **\**[(int)]**\**
-
- Item
-
- (optional | single)
-
- This element allows for identifying which episodes in a podcast are part of a "season", and allowing that season to have a title associate with it. The element's value is an integer identifying the season number.
-
- All attributes are optional.
-
-
-
-- **\**
-
- Channel
-
- (optional | multiple)
-
- See "[IDs](#user-content-ids)" in this document for an explanation.
-
- - `platform` (required) This is the service slug of the platform.
- - `id` (required) This is the unique identifier for this podcast on the respective platform.
- - `url` (optional) A url to the page for this podcast on the respective platform.
-
-
-
-- **\**[social media handle]**\**
-
- Channel or Item
-
- (optional | multiple)
-
- This element lists social media accounts for this podcast. The service slugs should be community written into the accompanying serviceslugs.txt file.
-
- The maximum recommended string length of the node value is 128 characters.
+- **\**
+- **\**
+- **\**
+- **\**
-### Phase 3 (Open)
+### Phase 3 (Open - Closes 6/1/21)
-- **\**[category Name]**\**
-
- Channel
-
- (optional | multiple)
-
- See "Categories" in this document for an explanation. There can be up to a total of 9 categories defined.
-
- There can be a maximum of 9 category elements defined in a feed. Any number greater than that should be discarded.
-
- Category names are defined in the accompanying "categories.json" file in this repository. They should be referenced in the element by their textual name.
- The characters can be in any case. This list of categories aims to replicate the current standard but also eliminate as much as possible compound, heirarchical
- naming and the use of ampersands. Thus, "Health & Fitness" becomes "Health" and "Fitness" as two distinct categories. And, "Religion & Spirituality" becomes
- two separate categories. Again, they are different things that don't always go together. Splitting them allows for more flexible combinations. And, avoiding
- ampersands makes xml encoding errors less likely.
+The following tags should be considered purely as work in progress proposals. They should not be relied upon or implemented except for testing purposes and experimentation.
-- **\**[rating letter]**\**
-
- Channel or Item
-
- (optional | single)
-
- Specifies the generally accepted rating letter of G, PG, PG-13, R or X. Or, perhaps an age rating system like all, 14, 19, adult. Needs discussion.
+### **\** - [Finalized](https://github.com/Podcastindex-org/podcast-namespace/issues/84)
-- **\**[url this feed was imported from]**\**
+
- Channel
+```xml
+
+[Title of Trailer(string)]
+
+```
- (optional | multiple)
+
- Lists the previous url of this feed before it was imported. Any time a feed is moved, an additional **\** element
- should be added to the channel, to create a paper trail of all the previous urls this feed has lived at. This way, aggregators can easily deduplicate their feed lists.
+Channel
+
+(optional | multiple)
+
+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. If there is more than one present, the most recent one (according to it's `pubdate`) should be chosen as the preview by default within podcast apps. If the `season` attribute is present, it must be a number that matches
+the format of the `` tag. So, for a podcast that has 3 published seasons, a new `` tag can be put in the channel to later be matched up with a `4`
+tag when it's published within a new ``.
+
+This element is basically just like an `` with the extra `pubdate` and `season` attributes added.
+
+- `url` (required) This is a url that points to the audio or video file to be played.
+- `pubdate` (required) The date the trailer was published.
+- `length` (recommended) The length of the file in bytes.
+- `type` (recommended) The mime type of the file.
+- `season` (optional) If this attribute is present it specifies that this trailer is for a particular season number.
+
+Example:
+```xml
+Coming April 1st, 2021
+```
+
+Example with Season Linkage:
+```xml
+Season 4: Race for the Whitehouse
+
+(later matches with)
+
+4
+```
-- **\**
-
- Channel (optional | single)
-
- Item (optional | multiple)
-
- This element is meant to provide alternate versions of an enclosure, such as low or high bitrate, or alternate formats or alternate uri schemes, like IPFS or live streaming.
- There may be multiple alternateEnclosure elements in an item, but there must be no more than one in a channel. The presence of this element at the channel level would be
- useful for adding a video/audio trailer or intro media that introduces the listener to the podcast. For instance, in a podcast of an audiobook, this could be the book's
- introduction or preface. The alternateEnclosure element always refers to an "alternate" media version. The standard RSS enclosure element is always the default media to be played.
-
- An `` tag must be present along with this tag within the item.
-
- - `url` (required) This is the url to the media asset.
- - `type` (required) Mime type of the media asset.
- - `length` (required) Length of the file in bytes.
- - `bitrate` (optional) Encoding bitrate of media asset.
- - `title` (required) Alternate assets need a title since main title will apply to primary asset.
- - `rel` (optional) Indicates what the purpose of this enclosure is. Like "lowbitrate" for a small file to use over cellular.
+### **\** - [Discuss](https://github.com/Podcastindex-org/podcast-namespace/issues/177)
-- **\** + **\[domain, bot or service slug]\**
+
- Channel (optional | single)
+```xml
+
+[license slug(string)]
+
+```
- The "indexers" element is meant as a container for one or more `` elements which send a signal to podcast aggregators whether they are allowed to pull and parse
- this feed. If the aggregator is listed as blocked, it should take that as a signal by the feed owner to not index/aggregate this feed.
+
- *Note: this element needs a lot more discussion and work. This is just a placeholder for discussion.*
+Channel or Item
+
+(optional | single)
+
+This element defines the license that is applied to the audio/video content of the episode or the audio/video of the podcast as a whole. The node value
+should be a lower-cased reference to a license "identifier" defined in the [SPDX License List](https://spdx.org/licenses/) file.
+
+- `url` (optional) This is a url that points to the full license details for this license.
+
+Example:
+```xml
+cc-by-4.0
+```
-- **\**
-
- Channel or Item
-
- (optional | single)
-
- This points to a group of images, separated by commas - each with a pixel width declared after them. It is highly recommended that the images referenced
- be square (1:1 ratio), as this is the industry standard for podcast album art, and what podcast apps expect to work with. The srcset attribute is designed
- to work like the ```srcset``` attribute in the HTML5 specification. Suggested widths are 1500px, 600px, 300px and 150px. See the example feed in this
- repo for an example of how this looks in practice.
-
- All attributes are required.
+### **\** - [Discuss](https://github.com/Podcastindex-org/podcast-namespace/issues/205)
-- **\**[email address or url]**\**
+
- Channel
+```xml
+
+[optional comments(string)]
+
+```
- (optional | multiple)
+
- This element allows for listing different contact methods for the podcast owner. This could be for general feedback, advertising inquiries, abuse reports, etc. Only one element of each "type"
- is allowed.
+Channel or Item
- All attributes are required.
+(optional | multiple)
+
+This element allows a podcaster (or third party, with podcater permission) to specify a list of recommended content for a podcast or an episode. The recommended content can be a
+web page, a podcast, a podcast episode or a soundbite, so that listeners can eventually subscribe to a podcast, add an episode to playlist, add a soundbite to playlist, etc.
+
+This is a complex tag. The full documentation is [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/proposal-docs/recommendations/recommendations.md). Please
+read that document to understand and comment on this proposal.
+
+Example:
+```xml
+
+```
+
+Example:
+```xml
+Some other cool podcasts
+```
-- **\**[one or more "valueRecipient" elements]**\**
+### **\** - [Discuss](https://github.com/Podcastindex-org/podcast-namespace/issues/174#issue-798007719)
+
- Channel
-
- (optional | single)
+
- This element defines the payment "model". One or more `` tags must be contained within this element to instruct where to send the payments
- within this defined model.
+```xml
+
+[one or more elements]
+
+```
- - `type` (required) What type of system will be receiving the payments. Currently only "lightning" is supported.
- - `method` (required) The protocol to use to send the payments. Currently only "keysend" is supported.
- - `suggested` (required) The amount to send per minute of episode play time, defined in bitcoin (float, 0.00000005000 is 5sat/min).
+
-- **\**
+Item
- Channel
+(optional | multiple)
- (required | multiple)
+This element defines a media file. One or more tags must be contained within this element to list available methods to obtain the file. This is meant to provide different
+versions of a media file -- such as low or high bitrate, alternate formats (different codecs or video), alternate URI schemes (IPFS or live streaming), or alternate download types not
+indicated by the URI and type (like torrents).
- - `name` (optional) A friendly name to identify the receipient.
- - `type` (required) The type of destination this is. Currently, only "node" is supported.
- - `address` (required) The address of the digital wallet or node that will receive payments.
- - `split` (required) Defines a percentage that this payment destination represents. Payments will be sent to each destination in the "value" block, dividing up by this percentage.
+This is a complex tag. The full documentation is [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/proposal-docs/alternateEnclosure/alternateEnclosure.md). Please
+read that document to understand and comment on this proposal.
+
+Example:
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+Example:
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+## Other Proposals
+
+A list of the current proposed tags can be found in the issues section [here](https://github.com/Podcastindex-org/podcast-namespace/labels/proposal).
+
+
+
## Verification for Importing and Transferring
@@ -323,7 +376,7 @@ contacted and subsequently changes the value of the element to "no".
## IDs
-Their can be multiple **\** elements to indicate a listing on multiple platforms, directories, hosts, apps and services. The "platform" attribute shall be a slug
+There can be multiple **\** elements to indicate a listing on multiple platforms, directories, hosts, apps and services. The "platform" attribute shall be a slug
representing the platform, directory, host, app or service. The slugs will look like this:
- blubrry
@@ -340,3 +393,8 @@ representing the platform, directory, host, app or service. The slugs will look
- overcast
More should be added by the community as needed. This is just a starter list. The full list is [here](serviceslugs.txt).
+
+
+## Badges and Media
+
+
diff --git a/categories.json b/categories.json
index 7f2db62..168b3fa 100644
--- a/categories.json
+++ b/categories.json
@@ -427,6 +427,26 @@
{
"id": 107,
"name": "Reviews"
+ },
+ {
+ "id": 108,
+ "name": "Climate"
+ },
+ {
+ "id": 109,
+ "name": "Weather"
+ },
+ {
+ "id": 110,
+ "name": "Tabletop"
+ },
+ {
+ "id": 111,
+ "name": "Role-Playing"
+ },
+ {
+ "id": 112,
+ "name": "Cryptocurrency"
}
]
}
\ No newline at end of file
diff --git a/chapters/example.json b/chapters/example.json
index 50e6c26..75ae6fa 100644
--- a/chapters/example.json
+++ b/chapters/example.json
@@ -1,5 +1,5 @@
{
- "version": "1.0.0",
+ "version": "1.2.0",
"chapters":
[
{
diff --git a/chapters/exampleComplex.json b/chapters/exampleComplex.json
index 45e75cb..2efd094 100644
--- a/chapters/exampleComplex.json
+++ b/chapters/exampleComplex.json
@@ -1,5 +1,5 @@
{
- "version": "1.0.0",
+ "version": "1.2.0",
"author": "John Doe",
"title": "Episode 7 - Making Progress",
"podcastName": "John's Awesome Podcast",
@@ -37,8 +37,12 @@
},
{
"startTime": 4826,
- "img": "https://example.com/images/bostonharbor.jpg",
- "toc": false
+ "img": "https://example.com/images/parisfrance.jpg",
+ "toc": false,
+ "location": {
+ "name": "Eiffel Tower, Paris",
+ "geo": "geo:42.3417649,-70.9661596"
+ }
},
{
"startTime": 5510,
diff --git a/chapters/jsonChapters.md b/chapters/jsonChapters.md
index 4711191..1b6e716 100644
--- a/chapters/jsonChapters.md
+++ b/chapters/jsonChapters.md
@@ -1,10 +1,13 @@
-## JSON Chapters Format (v1.1.0)
+## JSON Chapters Format
+Version 1.2 - Updated on 2021.04.15
+
+
This is the initial spec for a json chapters format that can be referenced in an RSS feed using the `` tag of
the "podcast" namespace. This file can reside on any publicly accessible url. See the podcast namespace documentation for
details on the format of the tag.
-This type of file should be served with a Content-type of 'application/audio-chapters+json'. Chapter order is assumed to be
+This type of file should be served with a Content-type of 'application/json+chapters'. Chapter order is assumed to be
in ascending order based on the `startTime`.
@@ -23,14 +26,15 @@ The chapters object is a simple JSON object with only 2 required properties:
- `podcastName` (optional - string) The name of the podcast this episode belongs to.
- `description` (optional - string) A description of this episode.
- `fileName` (optional - string) The name of the audio file these chapters apply to.
+ - `waypoints` (optional - boolean) If this property is present, the locations in a chapter object should be displayed with a route between locations.
-## "Chapter" Objects
+## The "Chapter" Object
The "chapter" object takes this basic form:
-```
+```json
{
"startTime": 94,
"title": "Donation Segment"
@@ -41,6 +45,8 @@ There is only one required attribute:
- `startTime` (required - float) The starting time of the chapter, expressed in seconds with float precision for fractions of a second.
+
+
#### Optional Attributes:
- `title` (optional - string) The title of this chapter.
@@ -48,6 +54,32 @@ There is only one required attribute:
- `url` (optional - string) The url of a web page or supporting document that's related to the topic of this chapter.
- `toc` (optional - boolean) If this property is present and set to false, this chapter should not display visibly to the user in either the table of contents or as a jump-to point in the user interface. It should be considered a "silent" chapter marker for the purpose of meta-data only. If this property is set to `true` or not present at all, this should be considered a normal chapter for display to the user. The name "toc" is short for "table of contents".
- `endTime` (optional - float) The end time of the chapter, expressed in seconds with float precision for fractions of a second.
+ - `location` (optional - object) This object defines an optional location that is tied to this chapter. It follows the structure of the [location](https://github.com/Podcastindex-org/podcast-namespace/blob/main/location/location.md) tag in the XML namespace.
+
+
+
+## The Location Object:
+
+The "location" object takes this basic form:
+
+```json
+{
+ "name": "Eiffel Tower, Paris",
+ "geo": "geo:48.858093,2.294694"
+}
+```
+
+It is intended to provide for rich location-based experiences tied to a point of time within a podcast episode, or other feed based media. For example, a "walking tour" may include latitude and longitude waypoints along side the image within chapters markers as someone listens to the tour podcast. This
+would allow apps to show a map with markers within the UI as the tour progresses. Or, perhaps a "History of the Middle East" podcast might expose a map to highlight where certain landmarks are when being discussed.
+
+There are two required attributes:
+
+ - `name` (required - string) A human readable place name.
+ - `geo` (required - string) A simple latitude,longitude given in geoURI format, conformant to [RFC 5870](https://tools.ietf.org/html/rfc5870).
+
+#### Optional Attributes:
+
+ - `osm` (optional - string) An OpenStreetMaps query string. Please see the [location](https://github.com/Podcastindex-org/podcast-namespace/blob/main/location/location.md) XML tag specification for full details.
@@ -55,9 +87,9 @@ There is only one required attribute:
Here is what a very basic chapters file may look like:
-```
+```json
{
- "version": "1.1.0",
+ "version": "1.2.0",
"chapters":
[
{
@@ -112,9 +144,9 @@ In this more robust example, we can bring in more meta-data about the podcast ep
context for something like an embedded HTML5 player on a website. Also there is an example of a "silent" chapter that has no presence in the visible
chapter list, but allows for different artwork to be shown:
-```
+```json
{
- "version": "1.1.0",
+ "version": "1.2.0",
"author": "John Doe",
"title": "Episode 7 - Making Progress",
"podcastName": "John's Awesome Podcast",
@@ -147,8 +179,12 @@ chapter list, but allows for different artwork to be shown:
},
{
"startTime": 4826,
- "img": "https://example.com/images/bostonharbor.jpg",
- "toc": false
+ "img": "https://example.com/images/parisfrance.jpg",
+ "toc": false,
+ "location": {
+ "name": "Eiffel Tower, Paris",
+ "geo": "geo:42.3417649,-70.9661596"
+ }
},
{
"startTime": 5510,
diff --git a/contributors.txt b/contributors.txt
index 62184ce..64d0bce 100644
--- a/contributors.txt
+++ b/contributors.txt
@@ -24,4 +24,10 @@ Justin Jackson
Tyler Lacy
@brianoflondon
Angelo at Blubrry
+Stacey Goers
+Stuart Moore
+@PofMagicfingers
+@Bigaston
+Alecks Gates
+Dave Keeshan
... add your name as you contribute!
diff --git a/docs/1.0.md b/docs/1.0.md
index 5acad13..656d7b4 100644
--- a/docs/1.0.md
+++ b/docs/1.0.md
@@ -2,8 +2,12 @@
A wholistic RSS namespace for podcasting that is meant to synthesize the fragmented world of podcast namespaces. As elements are canonized, they will be added to this document so developers can begin implementation. The specifications below are considered locked and the team will prioritize backward compatibility. We are operating under the [Rules for Standards-Makers](http://scripting.com/2017/05/09/rulesForStandardsmakers.html).
-If your application generates RSS feeds and you implement one or more elements below, you will need to link this DTD in your XML.
-``
+The namespace for this extension is `https://podcastindex.org/namespace/1.0`. Clients which recognize this namespace must also recognize `https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md` as identical. The suggested tag prefix for use in XML is `podcast`, but clients should support alternate prefixes for this namespace. If your application generates RSS feeds and you implement one or more elements below, you will need to link this DTD in your XML:
+
+```xml
+
+```
+
# Podcast Tags
Each tag below exists in the podcast namespace within the specified parent. All attributes are required unless explicitly specified as optional.
@@ -11,6 +15,7 @@ Anywhere the url of a hyper-text based resource is specified, it must be given a
+
## Transcript
``
This tag is used to link to a transcript or closed captions file. Multiple tags can be present for multiple transcript formats.
@@ -18,10 +23,13 @@ This tag is used to link to a transcript or closed captions file. Multiple tags
#### Parent
``
+#### Count
+Multiple
+
#### Attributes
- **url:** URL of the podcast transcript.
- - **type:** Mime type of the file such as `text/plain`, `text/html`, `application/srt`, `application/json`
+ - **type:** Mime type of the file such as `text/plain`, `text/html`, `application/srt`, `text/vtt`, `application/json`
- **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.
@@ -34,19 +42,23 @@ This tag is used to link to a transcript or closed captions file. Multiple tags
``
+``
+
Detailed file format information and example files are [here](../transcripts/transcripts.md).
+
## Locked
``
-This tag may be set to `yes` or `no`. The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of `yes` means that any attempt to import this feed into a new platform should be rejected. It is expected
-that podcast hosting providers will enable a toggle in their GUI to allow their users to turn feed transfer lock on or off. When importing a feed, if the hosting provider has already verified the owner="" email address on their own system, and the
-email matches what is listed in this tag, it is safe to import the feed.
+This tag may be set to `yes` or `no`. The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of `yes` means that any attempt to import this feed into a new platform should be rejected.
#### Parent
``
+#### Count
+Single
+
#### Attributes
- **owner:** The owner attribute is an email address that can be used to verify ownership of this feed during move and import operations. This could be a public email or a virtual email address at the hosting provider that redirects to the owner's true email address. This is a critical element, and it's expected that podcast hosting providers (if not providing virtual addresses) will allow setting this element's value in their GUI with an emphasis to their users of how important it is to have this be a valid, working email address.
@@ -57,6 +69,7 @@ email matches what is listed in this tag, it is safe to import the feed.
+
## Funding
``
This tag lists possible donation/funding links for the podcast. The content of the tag is the recommended string to be used with the link.
@@ -64,6 +77,9 @@ This tag lists possible donation/funding links for the podcast. The content of t
#### Parent
``
+#### Count
+Multiple
+
#### Attributes
- **url:** The URL to be followed to fund the podcast.
@@ -76,6 +92,7 @@ Please do not exceed `128 characters` for the node value or it may be truncated
+
## Chapters
``
Links to an external file (see example file) containing chapter data for the episode. See the [jsonChapters.md](https://github.com/Podcastindex-org/podcast-namespace/blob/main/chapters/jsonChapters.md) file for a description of the chapter file syntax. And, see the [example.json](https://github.com/Podcastindex-org/podcast-namespace/blob/main/chapters/example.json) example file for a real world example.
@@ -83,6 +100,9 @@ Links to an external file (see example file) containing chapter data for the epi
#### Parent
``
+#### Count
+Single
+
#### Attributes
- **url:** The URL where the chapters file is located.
- **type:** Mime type of file - JSON prefered, 'application/json+chapters'.
@@ -92,6 +112,7 @@ Links to an external file (see example file) containing chapter data for the epi
+
## Soundbite
``
Points to one or more soundbites within a podcast episode. The intended use includes episodes previews, discoverability, audiogram generation, episode highlights, etc. It should be assumed that the audio/video source of the soundbite is the audio/video given in the item's `` element.
@@ -99,6 +120,9 @@ Points to one or more soundbites within a podcast episode. The intended use incl
#### Parent
``
+#### Count
+Multiple
+
#### Attributes
- **startTime:** The time where the soundbite begins
- **duration:** How long is the soundbite (recommended between 15 and 120 seconds)
@@ -112,3 +136,133 @@ Points to one or more soundbites within a podcast episode. The intended use incl
Please do not exceed `128 characters` for the node value or it may be truncated by aggregators.
+
+
+## Person
+``
+This element specifies a person of interest to the podcast. It is primarily intended to identify people like hosts, co-hosts and guests. Although, it is flexible enough to allow fuller credits to be given using the roles and groups that are listed in the [Podcast Taxonomy Project](https://podcasttaxonomy.com/)
+
+#### Parent
+`` or ``
+
+#### Count
+Multiple
+
+#### Node value
+This is the full name or alias of the person. This value cannot be blank.
+
+#### Attributes
+ - **role:** (optional) Used to identify what role the person serves on the show or episode. This should be a reference to an official role within the Podcast Taxonomy Project list (see below). If `role` is missing then "host" is assumed.
+ - **group:** (optional) This should be a reference to an official group within the Podcast Taxonomy Project list. If `group` is not present, then "cast" is assumed.
+ - **img:** (optional) This is the url of a picture or avatar of the person.
+ - **href:** (optional) The url to a relevant resource of information about the person, such as a homepage or third-party profile platform. Please see the [example feed](https://github.com/Podcastindex-org/podcast-namespace/blob/main/example.xml) for possible choices of what to use here.
+
+The `role` and `group` attributes are case-insensitive. So, "Host" is the same as "host", and "Cover Art Designer" is the same as "cover art designer".
+
+The full taxonomy list is [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/taxonomy.json) as a json file.
+
+Please do not exceed `128 characters` for the node value or they may be truncated by aggregators.
+
+#### Examples
+`John Smith`
+
+`Jane Doe`
+
+`Alice Brown`
+
+`Alice Brown`
+
+`Becky Smith`
+
+
+
+
+## Location
+``
+This tag is intended to describe the location of editorial focus for a podcast's content (i.e. "what place is this podcast about?"). The tag has many use cases and is one of the more complex ones. You are **highly encouraged** to read the full [implementation document](https://github.com/Podcastindex-org/podcast-namespace/blob/main/location/location.md) before starting to code for it.
+
+#### Parent
+`` or ``
+
+#### Count
+Single
+
+#### Node Value
+This is a free-form string meant to be a human readable location. It may conform to conventional location verbiage (i.e. "Austin, TX"), but it shouldn't be depended on to be parseable in any specific way. This value cannot be blank.
+
+#### Attributes
+ - **geo:** (recommended) This is a latitude and longitude given in "geo" notation (i.e. "geo:30.2672,97.7431").
+ - **osm:** (recommended) The Open Street Map identifier of this place, given using the OSM notation (i.e. "R113314")
+
+Please do not exceed `128 characters` for the node value or it may be truncated by aggregators.
+
+#### Examples
+`Austin, TX`
+
+`Birmingham Civil Rights Museum`
+
+`Dreamworld (Queensland)`
+
+Please see the [implementation document](https://github.com/Podcastindex-org/podcast-namespace/blob/main/location/location.md) and the [example feed](https://github.com/Podcastindex-org/podcast-namespace/blob/main/example.xml) for more examples.
+
+
+
+
+## Season
+``
+This element allows for identifying which episodes in a podcast are part of a particular "season", with an optional season name attached.
+
+#### Parent
+``
+
+#### Count
+Single
+
+#### Node Value
+The node value is an integer, and represents the season "number". It is required.
+
+#### Attributes
+ - **name:** (optional) - This is the "name" of the season. If this attribute is present, applications are free to **not** show the season number to the end user, and may use it simply for chronological sorting and grouping purposes.
+
+Please do not exceed `128 characters` for the name attribute.
+
+#### Examples
+`5`
+
+`3`
+
+`1`
+
+`3`
+
+
+
+
+## Episode
+``
+This element exists largely for compatibility with the `season` tag. But, it also allows for a similar idea to what "name" functions as in that element.
+
+#### Parent
+``
+
+#### Count
+Single
+
+#### Node Value
+The node value is a decimal number. It is required.
+
+#### Attributes
+ - **display:** (optional) - If this attribute is present, podcast apps and aggregators are encouraged to show it's value instead of the purely numerical node value. This attribute is a string.
+
+The episode numbers are decimal, so numbering such as `100.5` is acceptable if there was a special mini-episode published between two other episodes. In that scenario, the number would help with proper chronological sorting, while the `display` attribute could specify an alternate special "number" (a moniker) to display for the episode in a podcast player app UI.
+
+Please do not exceed `32 characters` for the display attribute.
+
+#### Examples
+`3`
+
+`315.5`
+
+`204`
+
+`9`
diff --git a/docs/element-support.md b/docs/element-support.md
index e80f846..6b67a8d 100644
--- a/docs/element-support.md
+++ b/docs/element-support.md
@@ -12,6 +12,9 @@ For elements that are included in the official [DTD](https://github.com/Podcasti
5. [Podcastindex](https://podcastindex.org)
6. [Castopod](https://podlibre.org/castopod-supports-chapters-and-transcript-tags/)
7. [LehmanCreations Podcast Namespace Wordpress Plugin](https://github.com/Lehmancreations/Podcast-Namespace-Wordpress-Plugin)
+8. [PodcastGuru](https://twitter.com/podcastguru_app/status/1362902472793223169)
+9. [Podlove Podcast Publisher](https://github.com/podlove/podlove-publisher/commit/d3ce9d117c57a4c864d982fb5451c3fb6d20bd91)
+
## Locked ``
1. [Buzzsprout](https://www.buzzsprout.com/blog/podcast-locking)
@@ -33,6 +36,10 @@ For elements that are included in the official [DTD](https://github.com/Podcasti
7. [PodServe.fm](https://www.podserve.fm)
8. [Castopod](https://podlibre.org/publish-your-podcast-on-all-platforms/#podcastindex)
9. [LehmanCreations Podcast Namespace Wordpress Plugin](https://github.com/Lehmancreations/Podcast-Namespace-Wordpress-Plugin)
+10. [PodcastGuru](https://twitter.com/podcastguru_app/status/1351911108886589448)
+11. [Hypercatcher](https://hypercatcher.com)
+12. [Podlove Podcast Publisher](https://github.com/podlove/podlove-publisher/releases/tag/3.3.1)
+13. [Podcat](https://twitter.com/podlove_org/status/1363586304643133442)
## Chapters ``
1. [Podcast Chapters](https://chaptersapp.com/faq/jsonExport.html)
@@ -50,3 +57,13 @@ For elements that are included in the official [DTD](https://github.com/Podcasti
2. [Podverse](https://twitter.com/Podverse/status/1326072379597053953?s=20)
3. [LehmanCreations Podcast Namespace Wordpress Plugin](https://github.com/Lehmancreations/Podcast-Namespace-Wordpress-Plugin)
4. [Castopod](https://podlibre.org/castopod-supports-soundbite-tag/)
+
+## Location ``
+1. [Buzzsprout](https://twitter.com/buzzsprout/status/1357020753745633282)
+2. [Castopod](https://podlibre.org/castopod-supports-the-location-tag/)
+3. [Podfriend](https://twitter.com/adamcurry/status/1357003546709938181)
+
+## Person ``
+1. [Castopod](https://podlibre.org/castopod-supports-the-person-tag/)
+2. [Podfriend](https://podcastindex.social/@martin/105466202975036473)
+3. [Podlove Podcast Publisher](https://github.com/podlove/podlove-publisher/commit/08d52424b359569d795d318163b0c697ef623199)
diff --git a/example.xml b/example.xml
index 4f61460..59ca8a7 100644
--- a/example.xml
+++ b/example.xml
@@ -1,53 +1,34 @@
- Podcast Feed Template
- This is a fake show that exists only as an example of the "podcast" namespace.
- http://podcastindex.org
+ Podcasting 2.0 Namespace Example
+ This is a fake show that exists only as an example of the "podcast" namespace tag usage.
+ http://example.com/podcast
http://blogs.law.harvard.edu/tech/rssen-USFreedom Controller
- Thu, 08 Oct 2020 18:51:15 +0000
- Thu, 08 Oct 2020 18:51:15 +0000
- dave@podcastindex.org (Dave Jones)
- support@podcastindex.org (Tech Support)
+ Fri, 09 Oct 2020 04:30:38 GMT
+ Fri, 09 Oct 2020 04:30:38 GMT
+ john@example.com (John Doe)
+ support@example.com (Tech Support)https://example.com/images/pci_avatar-massive.jpgPodcast Feed Template
- https://podcastindex.org
+ https://example.com/show
- yes
- Support the show!
+ yes
+ Support the show!
- Dave Jones
+ Austin, TX
+
+ John Doenoepisodichttps://example.com/images/pci_avatar-massive.jpg
-
-
- News
- Commentary
- Technology
-
- https://podcastindex.social
- adbuy@podcastindex.org
- abuse@podcastindex.org
-
- US|Columbus, OH
-
- https://yeoldhostingprovider.com/podcast479923
- https://myveryfirstpodcasthost.com/show251.xml
-
-
-
- https://example.com/pc20trailer.mp4
@@ -56,70 +37,74 @@
Episode 3 - The Future
- <p>Everything at this level will become the rss description text for this item.</p>
- https://podcastindex.org/ep0003
- http://podcastindex.org/ep0003
+ <p>A look into the future of podcasting and how we get to Podcasting 2.0!</p>
+ https://example.com/podcast/ep0003
+ https://example.com/ep0003Fri, 09 Oct 2020 04:30:38 GMT
- adam@podcastindex.org (Adam Curry)
- https://podcastindex.org/ep0003/artMd.jpg
+ John Doe (john@example.com)
+ https://example.com/ep0003/artMd.jpgno
-
- Adam Curry
- Dave Jones
-
- https://podcastindex.org/ep0003/audio/podnews201009.m4a
- https://podcastindex.org/ep0003/audio/podnews201009.mp3
+ 1
+ 3
+
+
+ Adam Curry
+ Dave Jones
+ Becky Smith
+
- Episode 2 - The Return
- <p>Everything at this level will become the rss description text for this item.</p>
- https://podcastindex.org/ep0002
- http://podcastindex.org/ep0002
+ Episode 2 - The Present
+ <p>Where are we at now in the podcasting era. What are the current challenges?</p>
+ https://example.com/podcast/ep0002
+ https://example.com/ep0002Thu, 08 Oct 2020 04:30:38 GMT
- adam@podcastindex.org (Adam Curry)
- https://podcastindex.org/ep0002/artMd.jpg
+ John Doe (john@example.com)
+ https://example.com/ep0002/artMd.jpgno
- https://podcastindex.org/ep0002/transcript_es.json
- https://podcastindex.org/ep0002/transcript.srt
- Adam Curry
- Dave Jones
-
- https://podcastindex.org/ep0002/audio/podnews201009.m4a
- https://podcastindex.org/ep0002/audio/podnews201009.mp3
+ 1
+ 2
+
+
+ Adam Curry
+ Dave Jones
+ Marcus Brown
+
- Episode 1 - The Beginning
- <p>Everything at this level will become the rss description text for this item.</p>
- http://podcastindex.org/ep0001
- http://podcastindex.org/ep0001
- Wed, 07 Nov 2020 04:29:49 GMT
- adam@podcastindex.org (Adam Curry)
- https://podcastindex.org/ep0001/artMd.jpg
-
+ Episode 1 - The Past
+ <p>How did podcasting get started? What was it like in the beginning?</p>
+ https://example.com/podcast/ep0001
+ https://example.com/ep0001
+ Wed, 07 Oct 2020 04:30:38 GMT
+ John Doe (john@example.com)
+ https://example.com/ep0001/artMd.jpg
+ no
-
-
- Adam Curry
- Dave Jones
-
- https://podcastindex.org/ep0001/audio/podnews201009.m4a
- https://podcastindex.org/ep0001/audio/podnews201009.mp3
+ 1
+ 1
+
+
+ Adam Curry
+ Dave Jones
+ Jebick Morton
+
diff --git a/images/podcastindex-namespace-final.svg b/images/podcastindex-namespace-final.svg
new file mode 100644
index 0000000..893b5ce
--- /dev/null
+++ b/images/podcastindex-namespace-final.svg
@@ -0,0 +1,30 @@
+
diff --git a/licenseslugs.txt b/licenseslugs.txt
new file mode 100644
index 0000000..f89164b
--- /dev/null
+++ b/licenseslugs.txt
@@ -0,0 +1,23 @@
+afl-3.0 - Academic Free License v3.0
+apache-2.0 - Apache license 2.0
+artistic-2.0 - Artistic license 2.0
+bsl-1.0 - Boost Software License 1.0
+bsd-2-clause - BSD 2-clause "Simplified" license
+bsd-3-clause - BSD 3-clause "New" or "Revised" license
+bsd-3-clause-clear - BSD 3-clause Clear license
+cc - Creative Commons license family cc
+cc0-1.0 - Creative Commons Zero v1.0 Universal
+cc-by-4.0 - Creative Commons Attribution 4.0
+cc-by-sa-4.0 - Creative Commons Attribution Share Alike 4.0
+wtfpl - Do What The F*ck You Want To Public License
+ecl-2.0 - Educational Community License v2.0
+epl-1.0 - Eclipse Public License 1.0
+eupl-1.1 - European Union Public License 1.1
+agpl-3.0 - GNU Affero General Public License v3.0
+gpl - GNU General Public License family
+gpl-2.0 - GNU General Public License v2.0
+gpl-3.0 - GNU General Public License v3.0
+lgpl - GNU Lesser General Public License family
+lgpl-2.1 - GNU Lesser General Public License v2.1
+lgpl-3.0 - GNU Lesser General Public License v3.0
+unlicense - The Unlicense
\ No newline at end of file
diff --git a/location/location.md b/location/location.md
new file mode 100644
index 0000000..d44ae5e
--- /dev/null
+++ b/location/location.md
@@ -0,0 +1,150 @@
+## Location tag format details
+
+Below, you will find implementation details and UX recommendations for the `` tag.
+
+
+
+### Overview
+
+This tag is intended to describe the location of editorial focus for a podcast's content - i.e. "what place is this podcast about?" It can exist at either the channel level or the item level, or both.
+
+The use-cases for this tag are multiple, in order of complexity:
+
+1. To allow a free-text "location" field to be visible in a podcast app, perhaps during playback.
+2. To allow a simple point on a map to be visible in a podcast app.
+3. To allow a search for "podcasts/episodes about places near me" - or, for example, a travel or news podcast.
+4. To describe a specific place in a programmatic fashion to allow complex geo-aware searches.
+
+
+It may allow complex searches such as:
+
+- Show me podcasts or episodes about places near me.
+- Show me podcasts about train stations in Germany.
+- Show me podcasts about mines in West Australia.
+- Visa mig podcaster om platser i Kalifornien på svenska - "Show me podcasts about places in California, returning Swedish-language podcasts only" (using the `` tag).
+
+
+Unlike other elements in the `podcast` namespace, a "place" is not permanent. Places are built, and abandoned, all the time. Buildings are demolished, businesses close.
+
+On the other hand, a point on the earth is permanent, but does not describe anything other than a point. This is not always great when wanting to describe a city, rather than an area within a city,
+or a restaurant within a city. "Locations" are also, not always real places, especially in fiction podcasts.
+
+This, therefore, means that the `` tag is complex and has a number of attributes.
+
+
+
+### Structure
+
+```xml
+[human-readable place name]
+```
+
+This tag can exist at either the `` level, or the `` level, or both. The maximum recommended string length of all attribute values is 128 characters.
+
+
+
+#### Tag Node Value **required**
+
+This is meant for podcast apps to display the name of the location that the podcast is about. Examples might be "Houses of Parliament", "Gitmo Nation" or "Ernest Murrow Theater, Chicago". This is not intended to be programmatically parsed and is for display only. For a programmatic designation of the location, use the geo URI or OSM IDs, below.
+
+This value is a maximum of 128 characters. It may describe a real or fictional place. It should be in the same language as the podcast, as indicated in the RSS tag: so a podcast in `en` should read "Eiffel Tower, Paris" and not "La Tour d'Eiffel".
+
+#### `geo` **recommended**
+
+ A geo URI, conformant to [RFC 5870](https://tools.ietf.org/html/rfc5870).
+
+ Examples:
+
+ - `geo:37.786971,-122.399677`, a simple latlon description.
+ - `geo:37.786971,-122.399677,250`, a latlon including a height of 250 meters above ground level.
+ - `geo:37.786971,-122.399677;u=350`, a latlon with an accuracy ('uncertainty') of 350 meters.
+
+For information that may interest space travelers: the RFC does include an optional coordinate reference system for other planets, though these are not recommended to be used yet by the RFC.
+
+The `geo` attribute is recommended to be used alongside an `osm` attribute. Since OSM IDs are not guaranteed to be permanent (perhaps it's the ID of a building which is later demolished), the geo URI serves as a permanent point.
+
+Data within these attributes must relate to a real place. This tag must not be used for podcasts from or about fictional places.
+
+
+
+#### `osm` **recommended**
+
+From an [OpenStreetMap](https://en.wikipedia.org/wiki/OpenStreetMap) query. If a value is given for `osm` it must contain both 'type' and 'id'.
+
+ - osm type: A one-character description of the type of OSM point. Valid is "N" (node); "W" (way); "R" (relation).
+ - osm id: The ID of the OpenStreetMap feature that is described.
+ - osm revision: an _optional_ revision ID for an OSM object, preceded by a hash.
+
+This may describe part of a building, a building or business, a suburb, city, state, or country - anything within the OSM database, using the OpenStreetMap API or a local copy of the data. This is the field that is the best programmatic representation of the place being described. The data within OpenStreetMap is rich and can be used for detailed searches.
+
+Examples:
+
+ - The United States of America: [R148838](https://nominatim.openstreetmap.org/ui/details.html?osmtype=R&osmid=148838)
+ - The Eiffel Tower in Paris: [W5013364](https://nominatim.openstreetmap.org/ui/details.html?osmtype=W&osmid=5013364)
+ - Paris, but - optionally - the revision made on 8 Jan 2021: [R7444#188](https://www.openstreetmap.org/relation/7444/history)
+
+The `osm` is recommended to be used with a `geo` attribute. Since OSM IDs are not guaranteed to be permanent (perhaps it's the ID of a building which is later demolished), the geo URI serves as a permanent point. Data within these tags must relate to a real place.
+
+If a developer uses the `osm` tag, the canonical latlon is the one returned by OSM. It is intended that the `geo` attribute is used for simple display within a podcast app without any API usage: but for more advanced uses, like a geographic search, developers will ingest the full details from OpenStreetMap. The geo URI also offers a useful fallback should the `osmid` be removed.
+
+The revision number for the edit is a special case that allows for more permanent links, with the drawback that these are not fully supported by Nominatim and require a full OSM database complete with changesets. It is recommended to simply link to the object in OSM normally, without a revision number, and some data consumers may not support the revision number.
+
+ _Caution: Do not use place_id, which is visible in API calls - these are unique to each mirror of the OSM data. You'll be wanting osm_id instead._
+
+### UX Suggestion for Podcast Hosting Platforms
+
+The quality of this data is important to ensure a good listener experience. A podcast publisher should be in no doubt what data is being asked for here, to clarify that this is about a location that is mentioned
+in the podcast. The wording of this feature is important to ensure the correct data is available.
+
+
+
+
+Podcast hosts may also wish to remind podcast publishers to always be cautious about posting public location information. It's possible to check the OSM type to see if it relates to a residential address.
+
+
+
+### Examples
+
+For a podcast that is talking about the Eiffel Tower, but actually made in Birmingham, Alabama, this is what the specification would suggest:
+
+```xml
+Eiffel Tower, Paris
+```
+
+For a podcast that is set in Gitmo Nation, a nickname used by the show for the United States of America:
+
+```xml
+Gitmo Nation
+```
+
+The `geo` point uses an optional 'uncertainty' value here of 3,900 km, indicating that the "location" described here is up to 3,900km away from the point given (which is the rough width of the USA). The OSMID
+includes a more accurate bounding box and geoJSON.
+
+For a podcast that is about Hogwarts (a fictional location), the `geo` and `osm` must not be entered:
+
+```xml
+Hogwarts
+```
+
+For a podcast from Tesla upon landing on Mars:
+
+```xml
+Tesla Base 3
+```
+
+(The coordinate reference system for Mars doesn't yet exist, but this shows the extensibility of this tag.)
+
+
+
+### What This Tag Isn't Built For
+
+For privacy and user experience, this tag is not meant as a description of the physical location of podcast hosts and guests ("I'm doing this podcast in Denver, Colorado!"). The physical location of people are available via the [podcast:person](https://github.com/Podcastindex-org/podcast-namespace#phase-2-open) tag's links to places like Twitter, Facebook, Wikipedia and Podchaser.
diff --git a/podcasting2.0.md b/podcasting2.0.md
new file mode 100644
index 0000000..5426ea0
--- /dev/null
+++ b/podcasting2.0.md
@@ -0,0 +1,85 @@
+# Podcasting 2.0
+
+
+Podcasting 2.0 is a set of forward looking ideas combined with the technology to realize them. It's a vision for what the podcast listener experience can and should
+be. That experience has stagnated for over a decade, with almost all of the improvements coming in isolated sections of the ecosystem. There hasn't been a single,
+unified vision from the podcasting community acting together with one voice. So, we've ended up with fragments of innovation across the podcasting landscape with no
+central driving goal in mind. Podcasting 2.0 is the expression of what that goal could be.
+
+Stated eloquently, the aim of Podcasting 2.0 is this:
+
+ > "I think our focus should be 100% on improving the podcasting experience in an open-standard way that allows every player to innovate faster
+ > and better than any one company could do on their own. This is our best bet at avoiding one company emerging as the monopoly of podcasting."
+ >
+ > --Tom Rossi [Tom Rossi](https://podcastindex.social/@tomrossi7/105839063781381384)
+
+
+Closed ecosystems can not innovate any better or faster than open systems. We should know this by now. The open world of RSS based podcasting can not only
+keep pace with closed systems, it can exceed them easily. Podcasting 2.0 is simply the technological expression of this idea. We can make a better podcasting
+experience for listeners than they can get behind any walled garden - no matter how high or expensive those walls are.
+
+There are three parts to Podcasting 2.0:
+
+1. The "podcast" namespace
+2. Web app friendliness
+3. Value for Value
+
+
+
+## Step 1. Adopt the "podcast" Namespace
+
+To be a Podcasting 2.0 compliant podcast you need to first declare the "podcast"
+[namespace](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md) in your feed if you self-host your podcast. If you
+use a hosting company for your podcast, check [here](https://podcastindex.org/apps) for a list of hosts that now support the new namespace.
+
+The namespace gives you (and your listeners) access to many new features:
+
+ - Transcripts: You can deliver a text transcript along with your episode to make your content more accessible to those with hearing challenges, or for those
+ learning your language.
+ - Funding: This points listeners back to a donation or membership page that they can click on to join or donate money to your show.
+ - Chapters: MP3 files have had the ability to embed chapters for many years. But, now you can create a "chapters file" that gets delivered along with your
+ episode to allow rich content like images, embedded web pages, titles and silent markers. This chapters file lives on the web, so it can be
+ changed later after publishing without uploading a new audio file or changing your episode.
+ - Soundbites: Specify short bits of your episode to serve as an intro or a teaser for your show.
+ - Persons: You can give multiple bio's in each episode that have short "about" descriptions of the people on that episode (like hosts, guests, etc.). Did you
+ interview someone cool? Point to their head shot image and link to their Wikipedia page or their blog. It makes searching for people within podcasts
+ easy and enjoyable.
+ - Location: Is your podcast about a specific place? Tag it's location right in the episode or podcast feed to let people know. It makes your show more
+ discoverable on the web.
+ - Named Seasons: Seasons have been around for a while, but now you can name them. This way you can avoid the hassle of trying to cram everything in your show title.
+
+
+
+## Step 2. Be Web App Friendly
+
+Next, you need to confirm that your feed does not have "mixed content", and that it supports CORS where necessary. Again, if you use a hosting company for your podcast
+just [make sure](https://podcastindex.org/apps) they are supporting Podcasting 2.0 features. If your host isn't on that list, send them a message and let them know you
+want these new features.
+
+If you self-host your podcast, take note of these two things...
+
+#### Mixed Content
+
+"Mixed content" is what happens when part of your podcast (like your feed) is served securely and other parts of it (like the images or the audio) are not. When this
+happens, web-based podcast players cannot play your content or see your images. Modern web browsers are very strict about security and "mixed content" is blocked by
+most of them. Make sure your entire podcast is served over HTTPS with a valid certificate.
+
+#### CORS
+
+Another problem that can hamper your content under certain circumstances (like embedded pages in chapters) is CORS. If you serve content along with your podcast that
+requires cross-origin access, please be sure to enable the correct CORS policies on the domain the content is served from. You can find details
+[here](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS).
+
+Web-based podcast apps, PWA's (Progressive Web Apps) and Browser Extension based apps are critical to Podcasting 2.0, so the above changes are very important.
+
+
`: Content of monologue
#### Snippet:
-```
+```html
Kevin:
We have an update planned where we would like to give the ability to upload an artwork file for these videos
@@ -44,7 +44,7 @@ The JSON representation is a flexible format that accomodates various degrees of
- ``: Dialogue content
#### Snippet:
-```
+```json
{
"version": "1.0.0",
"segments": [
@@ -136,3 +136,61 @@ do we need a podcast trailer?
```
Example file: [example.srt](example.srt)
+
+
+## WebVTT
+
+Web Video Text Tracks Format (WebVTT) are an alternative to SRT primarily designed for the use in HTML on the web. It is supported in all major web browsers and is similar enough to SRT to be converted.
+
+### Differences from SRT taken from [Wikipedia](https://en.wikipedia.org/wiki/WebVTT):
+- WebVTT's first line starts with WEBVTT after the optional UTF-8 byte order mark
+- There is space for optional header data between the first line and the first cue
+- Timecode fractional values are separated by a full stop instead of a comma
+- Timecode hours are optional
+- The frame numbering/identification preceding the timecode is optional
+- Comments identified by the word NOTE can be added
+- Metadata information can be added in a JSON-style format
+- Chapter information can be optionally specified
+- Only supports extended characters as UTF-8
+- CSS in a separate file defined in the companion HTML document for C tags is used instead of the FONT tag
+- Cue settings allow the customization of cue positioning on the video
+
+#### Properties:
+- Max number of lines: 2
+- Max characters per line: 32
+- Speaker names (optional): Start a new card when the speaker changes. Include the speaker's name, followed by a colon.
+
+#### Snippet:
+```
+WEBVTT
+
+00:00:00.000 --> 00:00:02.760
+Sarah: In today's episode,
+you'll learn whether or not you
+
+00:00:02.760 --> 00:00:06.090
+should have a podcast trailer.
+And if so, what should you
+
+00:00:06.090 --> 00:00:11.610
+include in one? Welcome to
+Podcasting Q&A, where you learn
+
+00:00:11.610 --> 00:00:15.750
+the best tips and strategies to
+launch, grow and monetize your
+
+00:00:15.750 --> 00:00:18.630
+podcast. This week's question
+comes from Gillian.
+
+00:00:19.080 --> 00:00:21.450
+Gillian: Hi Buzzsprout, Gillian
+here from breaking through
+
+00:00:21.450 --> 00:00:25.350
+careers podcast. My question is,
+do we need a podcast trailer?
+```
+
+Example file: [example.vtt](example.vtt)
diff --git a/value/value.md b/value/value.md
new file mode 100644
index 0000000..ac0229e
--- /dev/null
+++ b/value/value.md
@@ -0,0 +1,325 @@
+# The "podcast:value" Specification
+
+Version 1.3 by Dave Jones - 2021.02.25
+
+
+
+## Purpose
+
+Here we describe an additional "block" of XML that gives podcasters (and other media creators) a way to receive direct
+payments from their audience in response to the action of viewing or listening to a created work. Utilizing so called "Layer 2"
+crypto-currency networks like Lightning, and possibly other digital currency mechanisms, near real-time micropayments can
+be directly sent from listener or viewer to the creator without the need for a payment processor or other "middle men".
+
+The value block designates single or multiple destinations for these micro-payments. The idea is that the creator of the media
+describes (within the feed) where and how they would like payments to be sent back to them during consumption
+of that media. The format is designed to be flexible enough to handle many scenarios of direct payment streaming. Even
+the use of fiat currency, if there is an API that is capable of interfacing as a receiver within this format.
+
+
+
+## Play to Pay
+
+This system can be thought of as Play-to-pay, rather than the traditional Pay-to-play paywall approach. When a
+media listener (such as within a podcast app) presses the play button on an episode who's feed contains a value
+block, a compatible app will be expected to begin streaming micro-payments to the designated recipients on a time
+interval that makes sense for the app. The amount of each payment can be any amount the listener chooses, including
+zero. If the listener chooses not to pay to listen to this media, then the app can ignore the value block of that feed.
+
+
+
+## Payment Intervals
+
+The "time interval" for calculating payments is **always 1 minute**. However, the actual interval between when payments
+are sent can be longer. The interval should be chosen with a few factors in mind such as connectivity (is the app
+currently on-line?), transaction fees (batch payments together to reduce fee percentage), cryptocurrency network load
+(can the given crypto network or API support this payment rate?).
+
+No matter what the chosen time interval for the actual transaction, the calculation should be done on a once-per-minute
+basis. So, if the micro-payment is sent every 15 minutes, it should be calculated as 15 payments batched together
+in a single transaction. Likewise, some apps with limited connectivity may need to only send payments once per
+hour. In that scenario, there would be 60 payments added up into a single, larger payment. Batching transactions
+like this also helps to minimize the impact of transaction fees on the underlying cryptocurrency network.
+
+
+
+
+
+## Elements
+
+There are two elements that make up what we refer to as the "value block". They are a parent element that specifies the
+currency to use, and one or more child elements that specify who to pay using the currency and protocol described by the
+parent.
+
+
+
+### Value Element
+
+The `` tag designates the cryptocurrency or payment layer that will be used, the transport method for transacting
+the payments, and a suggested amount denominated in the given cryptocurrency.
+
+This element can exist at either the `` or `` level.
+
+Currently, there can be only a single copy of this element at each level.
+
+
+
+#### Structure:
+```xml
+
+[one or more "podcast:valueRecipient" elements]
+
+```
+
+
+#### Attributes:
+ - `type` (required) This is the service slug of the cryptocurrency or protocol layer.
+ - `method` (required) This is the transport mechanism that will be used.
+ - `suggested` (optional) This is an optional suggestion on how much cryptocurrency to send with each payment.
+
+
+
+#### Explanation:
+
+Using Lightning as an example, the `type` would be "lightning". Various possible `type` values will be kept
+in a slug list [here](valueslugs.txt). This is the only type currently in active use. Others are under development
+and will be added to the list as they see some measure of adoption, or at least a working example to prove viability.
+
+The `method` attribute is used to indicate a sub-protocol to use within the given `type`. Again, returning to
+Lightning as an example, the `method` would be "keysend". Normally, a Lightning payment requires an invoice
+to be generated by the payee in order to fulfill a transaction. The "keysend" protocol of Lightning allows payments
+to be streamed to what is, essentially, an open invoice. Other cryptocurrencies may have a similar protocol that
+would be used here. If not, a value of "default" should be given.
+
+The "suggested" amount is just that. It's a suggestion, and must be changeable by the user to another value, or
+to zero. The suggested amount should always be given in the smallest denomination available within the payment
+protocol being used. For instance, with Lightning it is given in millisatoshis.
+
+A single value tag can contain many `` tags as children. All of these given recipients are
+sent individual payments when the payment interval triggers.
+
+The value tag, when it exists at the `` level, designates the payment scheme for the entire podcast. When it
+exists at the `` level, it is intended to override the channel level tag for that episode only.
+
+#### Example:
+
+```xml
+
+```
+
+
+
+
+
+### Value Recipient Element
+
+The `valueRecipient` tag designates various destinations for payments to be sent to during consumption of the enclosed
+media. Each recipient is considered to receive a "split" of the total payment according to the number of shares given
+in the `split` attribute.
+
+This element may only exist within a parent `` element.
+
+There is no limit on how many `valueRecipient` elements can be present in a given `` element.
+
+
+
+#### Structure:
+
+```xml
+
+```
+
+
+
+#### Attributes:
+
+ - `name` (recommended) A free-form string that designates who or what this recipient is.
+ - `customKey` (optional) The name of a custom record key to send along with the payment.
+ - `customValue` (optional) A custom value to pass along with the payment. This is considered the value that belongs to the `customKey`.
+ - `type` (required) A slug that represents the type of receiving address that will receive the payment.
+ - `address` (required) This denotes the receiving address of the payee.
+ - `split` (required) The number of shares of the payment this recipient will receive.
+ - `fee` (optional) If this attribute is not specified, it is assumed to be false.
+
+
+
+#### Explanation:
+
+The `name` is just a human readable description of who or what this payment destination is. This could be something simple like
+"Podcaster", "Co-host" or "Producer". It could also be more descriptive like "Ronald McDonald House Charity", if a podcaster
+chooses to donate a percentage of their incoming funds to a charity.
+
+The `type` denotes what type of receiving entity this is. For instance, with lightning this would typically be "node". This would
+indicate that the `address` attribute for this recipient is a Lightning node that is capable of directly receiving incoming keysend payments. Valid values for
+the `type` attribute are kept in the accompanying file [here](valueslugs.txt). Another option is given in examples below.
+
+Payments must be sent to a valid destination which is given in the `address` attribute. This address format will vary depending on
+the underlying currency being used.
+
+The `split` attribute denotes an amount of "shares" of the total payment that the recipient will receive when each timed payment is made.
+When a single `` is present, it should be assumed that the `split` for that recipient is 100%, and the "split" should
+be ignored. When multiple recipients are present, a share calculation (see below) should be made to determine how much to send to each recipient's address.
+
+The `fee` attribute tells apps whether this split should be treated as a "fee", or a normal split. If this attribute is true, then this split should be calculated
+as a fee, meaning it's percentage (as calculated from the shares) should be taken off the top of the entire transaction amount. This is the preferred way for service
+providers such as apps, hosting companies, API's and third-party value add providers to add their fee to a value block.
+
+
+
+
+
+### Payment calculation
+
+The interval payment calculation is:
+
+ (Number of shares / Share total) * Interval payout * Interval count
+
+To calculate payouts, let's take the following value block as an example:
+
+```xml
+
+
+
+
+
+```
+
+This block designates three payment recipients. On each timed payment interval, the total payment will be split into 3 smaller
+payments according to the shares listed in the split for each recipient. So, in this case, if the listener decided to pay 100 satoshis per minute for listening
+to this podcast, then once per minute the "Host" would be sent 50 satoshis, the "Co-Host" would be sent 40 satoshis and the
+"Producer" would be sent 10 satoshis - all to their respective lightning node addresses using the "keysend" protocol.
+
+If, instead of a 50/40/10 (total of 100) split, the splits were given as 190/152/38 (total of 380), the respective payment amounts each minute would still
+be 50 satoshis, 40 satoshis and 10 satoshis because the listener chose to pay 100 satoshis per minute, and the respective shares (as a percentage of the total) would remain the same.
+
+On a 190/152/38 split, each minute the payment calculation would be:
+
+ - Interval payout: 100 satoshis
+
+ - Share total: 380
+
+ - Recipient #1 gets a payment of: 50 sats (190 / 380 * 100)
+ - Recipient #2 gets a payment of: 40 sats (152 / 380 * 100)
+ - Recipient #3 gets a payment of: 10 sats (38 / 380 * 100)
+
+If an app chooses to only make a payout once every 30 minutes of listening/watching, the calculation would be the same after multiplying
+the per-minute payment by 30:
+
+ - Interval payout: 3000 satoshis (100 * 30)
+
+ - Shares total: 380
+
+ - Recipient #1 gets a payment of: 1500 sats (190 / 380 * 3000)
+ - Recipient #2 gets a payment of: 1200 sats (152 / 380 * 3000)
+ - Recipient #3 gets a payment of: 300 sats (38 / 380 * 3000)
+
+As shown above, the once per minute calculation does not have to actually be sent every minute. A longer payout period can be chosen. But,
+the once-per-minute nature of the payout still remains in order for listeners and creators to have an easy way to measure and calculate how much
+they will spend and charge.
+
+
+
+
+
+### Supported Currencies and Protocols
+
+The value block is designed to be flexible enough to handle most any cryptocurrency, and even fiat currencies with a given
+API that exposes a compatible process.
+
+Currently, development is centered fully on [Lightning](https://github.com/lightningnetwork) using the "keysend" protocol. Keysend allows for push
+based payments without the recipient needing to generate an invoice to receive them.
+
+
+
+#### Lightning
+
+For the `` tag, the following attributes MUST be used:
+
+ - `type` (required): "lightning"
+ - `method` (required): "keysend"
+ - `suggested` (optional): An integer representing millisatoshis.
+
+For the `` tag, the following attributes MUST be used:
+
+ - `type`: "node"
+ - `address`: \
+ - `split`: \
+
+If the receiving Lightning node, or service, requires a custom record or meta-data of some sort to be passed along with the payment
+the `customKey` and `customValue` can be utilized as follows:
+
+ - `type`: "node"
+ - `method`: "keysend"
+ - `customKey`: \
+ - `customValue`: \
+ - `address`: \
+ - `split`: \
+
+
+
+##### Example
+
+This is a live, working example of a Lightning keysend value block in production. It designates four recipients for payment - two
+podcast hosts at 49 and 46 shares respectively, a producer working on per episode chapter creation who gets a 5 share, and
+a single share (effectively 1%) fee to the Podcastindex.org API.
+
+```xml
+
+
+
+
+
+
+```
diff --git a/value/valueslugs.txt b/value/valueslugs.txt
new file mode 100644
index 0000000..d8c11da
--- /dev/null
+++ b/value/valueslugs.txt
@@ -0,0 +1,5 @@
+bitcoin
+lightning
+keysend
+wallet
+node
\ No newline at end of file