Hello there,
just wanted to mention the attachment
property in ActivityPub.
This is handled by many generic AP Servers while the description- and audio-property needs active work for other fediverse implementations to support Castopod etc.
While I did also ask myself why there is and “image” property but no “audio” or “video” in the Vocab.
So, I'd propose two changes,
- make the main type an Array to provide a native AP fallback
- use attachment
And I think it is a nice move to support VTT like caption, transcript, chapters.
We could handle them as attachment too with Mime text/vtt
and the kind, maybe conformant to WebVTT
with these kind
s
Please note also that instead of “explicit” the as:sensitive
convention / proposed extension exists which others use.
Would love to get your thoughts, in any case, it would be good if projects like Castopod use it to document it in the federation.md document - the best way would be to create a Fediverse Enhancement Proposal for Podcasts …
See also https://socialhub.activitypub.rocks/t/seeking-opinions-on-time-based-content/1566
This is just a proposal …
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://github.com/Podcastindex-org/activitypub-spec-work/blob/main/docs/1.0.md"
],
"type": ["PodcastEpisode", "Note"],
"id": "https://podcast.demo/podcasts/DemoPodcast/episodes/example-episode",
"attributedTo": "https://podcast.demo/podcasts/DemoPodcast",
"to": ["https://www.w3.org/ns/activitystreams#Public"],
"cc": ["https://podcast.demo/podcasts/DemoPodcast/followers"],
"name": "An Example PodcastEpisode Object",
"mediaType": "text/markdown",
"content": "Here is the description for the **demo episode**!",
"contentMap": {
"en": "<p>Here is the description for the <strong>demo episode</strong>!</p>",
"fr": "<p>Voici la description pour la <strong>démo de l’épisode</strong> !</p>"
},
"image": {
"type": "Image",
"mediaType": "image/jpeg",
"url": "https://podcast.demo/media/example-episode_cover.jpg"
},
"attachment": [
{
"id": "https://podcast.demo/podcasts/activitypub/episodes/example-episode.mp3",
"type": "Audio",
"name": "An Example PodcastEpisode Object",
"size": 1962804,
"bitrate": 320000,
"duration": 42,
"url": {
"href": "https://podcast.demo/media/example-episode.mp3",
"type": "Link",
"mediaType": "audio/mpeg"
},
"caption": "https://podcast.demo/media/example-episode/caption",
"transcript": "https://podcast.demo/media/example-episode/transcript",
"chapters": "https://podcast.demo/media/example-episode/chapters"
}
],
"partOfSeason": "https://podcast.demo/podcasts/DemoPodcast/seasons/1",
"episodeNumber": 1,
"explicit": false,
"location": {
"@type": "Place",
"geo": {
"@type": "GeoCoordinates",
"latitude": "48.8566969",
"longitude": "2.3514616"
},
"name": "Paris, France"
},
"discoverable": true,
"replies": "https://podcast.demo/podcasts/DemoPodcast/episodes/example-episode/replies",
"published": "2021-04-15T18:00:00Z"
}