formalize alternateEnclosure tag

pull/260/head
Dave Jones 2021-06-08 11:25:15 -05:00
rodzic 9cca621413
commit 0bc285ce0c
2 zmienionych plików z 138 dodań i 87 usunięć

Wyświetl plik

@ -131,97 +131,19 @@ full implementation details.
### <u>Phase 3 (Closed on 6/1/21)</u>
The following tags have been finalized ahead of formal consideration and review after June 1st, 2021.
<br>
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.
- **\<podcast:trailer>** <br>
- **\<podcast:license>** <br>
- **\<podcast:alternateEnclosure>** <br>
- **\<podcast:source>** <br>
- **\<podcast:integrity>** <br>
### **\<podcast:alternateEnclosure>** - <small>[Discussion](https://github.com/Podcastindex-org/podcast-namespace/issues/174#issue-798007719)</small>
<br>
<b>
```xml
<podcast:alternateEnclosure
type="[mime type]"
length="[(int)]"
bitrate="[(float)]"
height="[(int)]"
lang="[(string)]"
title="[(string)]"
rel="[(string)]"
codecs="[(string)]"
default="[(boolean)]"
>
[one or more <podcast:source> elements]
</podcast:alternateEnclosure>
```
</b>
Item
(optional | multiple)
This element defines a media file. One or more <podcast:source> 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).
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
<enclosure url="https://best-podcast.com/file-0.mp3" length="43200000" type="audio/mpeg" />
<podcast:alternateEnclosure type="audio/mpeg" length="43200000" bitrate="128000" default="true" title="Standard">
<podcast:source uri="https://best-podcast.com/file-0.mp3" />
<podcast:source uri="ipfs://someRandomMpegFile" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="audio/opus" length="32400000" bitrate="96000" title="High quality">
<podcast:source uri="https://best-podcast.com/file-high.opus" />
<podcast:source uri="ipfs://someRandomHighBitrateOpusFile" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="audio/aac" length="54000000" bitrate="160000" title="High quality AAC">
<podcast:source uri="https://best-podcast.com/file-proprietary.aac" />
<podcast:source uri="ipfs://someRandomProprietaryAACFile" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="audio/opus" length="5400000" bitrate="16000" title="Low bandwidth">
<podcast:source uri="https://best-podcast.com/file-low.opus" />
<podcast:source uri="ipfs://someRandomLowBitrateOpusFile" />
</podcast:alternateEnclosure>
```
Example:
```xml
<podcast:alternateEnclosure type="audio/mpeg" length="2490970" bitrate="160707.74">
<podcast:source uri="https://best-podcast.com/file-0.mp3" />
<podcast:source uri="ipfs://QmdwGqd3d2gFPGeJNLLCshdiPert45fMu84552Y4XHTy4y" />
<podcast:source uri="https://best-podcast.com/file-0.torrent" contentType="application/x-bittorrent" />
<podcast:source uri="http://somerandom.onion/file-0.mp3" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="video/mp4" length="10562995" bitrate="681483.55" height="1080">
<podcast:source uri="https://best-podcast.com/file-1080.mp4" />
<podcast:source uri="ipfs://QmfQKJcp2xdByEt8mzWr1AJUhwvb9rdWPoacvdq2roDhgh" />
<podcast:source uri="https://best-podcast.com/file-1080.torrent" contentType="application/x-bittorrent" />
<podcast:source uri="http://somrandom.onion/file-1080.mp4" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="video/mp4" length="7924786" bitrate="511276.52" height="720">
<podcast:source uri="https://best-podcast.com/file-720.mp4" />
<podcast:source uri="ipfs://QmX33FYehk6ckGQ6g1D9D3FqZPix5JpKstKQKbaS8quUFb" />
<podcast:source uri="https://best-podcast.com/file-720.torrent" contentType="application/x-bittorrent" />
<podcast:source uri="http://somrandom.onion/file-720.mp4" />
</podcast:alternateEnclosure>
```
<br><br>
### <u>Phase 4 (Open for Proposals)</u>

Wyświetl plik

@ -332,4 +332,133 @@ must be a free form abbreviation of the name of the license as you reference it
#### Examples
`<podcast:license>cc-by-4.0</podcast:license>`
`<podcast:license url="https://example.org/mypodcastlicense/full.pdf">my-podcast-license-v1</podcast:license>`
`<podcast:license url="https://example.org/mypodcastlicense/full.pdf">my-podcast-license-v1</podcast:license>`
<br><br>
## Alternate Enclosure
`<podcast:alternateEnclosure>`
This element is meant to provide different versions of, or companion media to the main `<enclosure>` file. This could be an audio only version of a video podcast to allow apps to switch back and forth between audio/video,
lower (or higher) bitrate versions for bandwidth constrained areas, alternative codecs for different device platforms, alternate URI schemes and download types such as IPFS or WebTorrent, commentary tracks or supporting source clips, etc.
This is a complex tag, so implementors are highley 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's capable of.
#### Parent
`<item>`
#### Count
Multiple
#### Node Value
The node value must be one or more `<podcast:source>` elements that each define a uri where the parent `<podcast:alternateEnclosure>` can be downloaded or streamed.
#### Attributes
- **type:** (required) Mime type of the media asset.
- **length:** (required) Length of the file in bytes.
- **bitrate:** (optional) Encoding bitrate of media asset.
- **height:** (optional) Height of the media asset for video formats.
- **lang:** (optional) An [IETF language tag (BCP 47)](https://en.wikipedia.org/wiki/BCP_47) code identifying the language of this media.
- **title:** (optional) A human-readable string identifying the name of the media asset. Should be limited to 32 characters for UX.
- **rel:** (optional) Provides a method of offering and/or grouping together different media elements. If not set, or set to "default", the media will be grouped with the enclosure and assumed to be an alternative to the enclosure's encoding/transport. This attribute can and should be the same for items with the same content encoded by different means. Should be limited to 32 characters for UX.
- **codecs:** (optional) An [RFC 6381](https://tools.ietf.org/html/rfc6381) string specifying the codecs available in this media.
- **default:** (optional) Boolean specifying whether or not the given media is the same as the file from the enclosure element and should be the preferred media element. The primary reason to set this is to offer alternative transports for the enclosure. If not set, this should be assumed to be false.
#### Examples
```xml
<enclosure url="https://best-podcast.com/file-0.mp3" length="43200000" type="audio/mpeg" />
<podcast:alternateEnclosure type="audio/mpeg" length="43200000" bitrate="128000" default="true" title="Standard">
<podcast:source uri="https://example.com/file-0.mp3" />
<podcast:source uri="ipfs://someRandomMpegFile" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="audio/opus" length="32400000" bitrate="96000" title="High quality">
<podcast:source uri="https://example.com/file-high.opus" />
<podcast:source uri="ipfs://someRandomHighBitrateOpusFile" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="audio/aac" length="54000000" bitrate="160000" title="High quality AAC">
<podcast:source uri="https://example.com/file-proprietary.aac" />
<podcast:source uri="ipfs://someRandomProprietaryAACFile" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="audio/opus" length="5400000" bitrate="16000" title="Low bandwidth">
<podcast:source uri="https://example.com/file-low.opus" />
<podcast:source uri="ipfs://someRandomLowBitrateOpusFile" />
</podcast:alternateEnclosure>
```
```xml
<podcast:alternateEnclosure type="audio/mpeg" length="2490970" bitrate="160707.74">
<podcast:source uri="https://example.com/file-0.mp3" />
<podcast:source uri="ipfs://QmdwGqd3d2gFPGeJNLLCshdiPert45fMu84552Y4XHTy4y" />
<podcast:source uri="https://example.com/file-0.torrent" contentType="application/x-bittorrent" />
<podcast:source uri="http://example.onion/file-0.mp3" />
</podcast:alternateEnclosure>
<podcast:alternateEnclosure type="video/mp4" length="10562995" bitrate="681483.55" height="1080">
<podcast:source uri="https://example.com/file-1080.mp4" />
<podcast:source uri="ipfs://QmfQKJcp2xdByEt8mzWr1AJUhwvb9rdWPoacvdq2roDhgh" />
<podcast:source uri="https://example.com/file-1080.torrent" contentType="application/x-bittorrent" />
<podcast:source uri="http://example.onion/file-1080.mp4" />
</podcast:alternateEnclosure>
```
<br><br>
## Source
`<podcast:source>`
This element defines a uri location for a `<podcast:alternateEnclosure>` media file. It is meant to be used as a child of the `<podcast:alternateEnclosure>` element.
#### Parent
`<podcast:alternateEnclosure>`
#### Count
Multiple
#### Node Value
None
#### Attributes
- **uri:** (required) This is the uri where a media file resides.
#### Examples
```xml
<podcast:alternateEnclosure type="video/mp4" length="7924786" bitrate="511276.52" height="720">
<podcast:source uri="https://example.com/file-720.mp4" />
<podcast:source uri="ipfs://QmX33FYehk6ckGQ6g1D9D3FqZPix5JpKstKQKbaS8quUFb" />
<podcast:source uri="https://example.com/file-720.torrent" contentType="application/x-bittorrent" />
<podcast:source uri="http://example.onion/file-720.mp4" />
</podcast:alternateEnclosure>
```
<br><br>
## Integrity
`<podcast:integrity>`
This element defines a method of verifying integrity of the media given either an [SRI-compliant integrity string](https://www.w3.org/TR/SRI/) or a base64 encoded PGP signature.
#### Parent
`<podcast:alternateEnclosure>`
#### Count
Multiple
#### Node Value
None
#### Attributes
- **type:** (required) Type of integrity, either "sri" or "pgp-signature".
- **value:** (required) Value of the sri string or base64 encoded pgp signature.
#### Examples
```xml
<podcast:alternateEnclosure type="video/mp4" length="7924786" bitrate="511276.52" height="720">
<podcast:source uri="https://example.com/file-720.mp4" />
<podcast:source uri="ipfs://QmX33FYehk6ckGQ6g1D9D3FqZPix5JpKstKQKbaS8quUFb" />
<podcast:integrity type="sri" value="sha384-ExVqijgYHm15PqQqdXfW95x+Rs6C+d6E/ICxyQOeFevnxNLR/wtJNrNYTjIysUBo" />
</podcast:alternateEnclosure>
```