? Pubcast
An experimental (Read: not-usable or in anyway done) distributed/federated podcasting platform based on ActivityPub.
Usage
Getting started:
Ensure that you're using go11 with go-modules turned on.
export GO111MODULE=on # Put this in your .zshrc or .bash_profile or whatnot
Clone/Download the project with:
go get github.com/pubcast/pubcast
Building a binary with make (or mmake if you're fancy):
make
Building and then running that binary:
make run
Running tests:
make test
Setting up your database (this works best if you have postgres already running locally):
make database
Creating a new migration in db/migrations
:
make migration NAME=some_name_here
Learning about ActivityPub
Basic Description
ActivityPub gives every user (or actor
in it's vocab) on a server an "inbox" and an "outbox". But these are really just endpoints:
https://myactpub.site/activity/user/flaque/inbox
https://myactpub.site/activity/user/flaque/outbox
ActivityPub asks that you accept GET
and POST
requests to these endpoints where a POST
tells a the server to put that in a user's queue or feed and GET
lets the user retrieve info from the feed.
You send messages called ActivityStreams
that are really just a special spec of JSON:
{"@context": "https://www.w3.org/ns/activitystreams",
"type": "Create",
"id": "https://social.example/alyssa/posts/a29a6843-9feb-4c74-a7f7-081b9c9201d3",
"to": ["https://chatty.example/ben/"],
"author": "https://social.example/alyssa/",
"object": {"type": "Note",
"id": "https://social.example/alyssa/posts/49e2d03d-b53a-4c4c-a95c-94a6abf45a19",
"attributedTo": "https://social.example/alyssa/",
"to": ["https://chatty.example/ben/"],
"content": "Say, did you finish reading that book I lent you?"}
Objects, Actors, and Activities
(Note: Pubcast uses a slightly different internal naming than ActivityPub. To have more understandable code in the context of podcasts, ActivityPub's Organization
actor type is a Show
inside Pubcast. Additionally, the Object
type is a Pubcast Episode
.)
ActivityPub is based on a formalized vocabulary of data types, actions and folks doing the actions.
An Object
is a generic data type written in JSON:
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Object",
"id": "http://www.test.example/object/1",
"name": "A Simple, non-specific object"
}
Objects have a set collection of formalized properties such as id
, name
, url
, etc but you technically can create your own. Objects serve as a base type for other Activity Steam's core set of types.
For example, there are a set of actor types that themselves are Objects
.
/* A "Person" actor type */
{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Person",
"name": "Sally Smith"
}
Activities are also subtypes of Object
, and are used to describe relationships between objects. Some examples of activities include:
- Accept
- Create
- Move
- Question
- Undo
- Follow
- View
An Activity
json might look something like this:
{
"@context": "https://www.w3.org/ns/activitystreams",
"summary": "Sally created a note",
"type": "Create",
"actor": {
"type": "Person",
"name": "Sally"
},
"object": {
"type": "Note",
"name": "A Simple Note",
"content": "This is a simple note"
}
}
Links
- ActivityPub tutorial
- ActivityPub.rocks explaination
- W3 ActivityPub Spec
- W3 ActivityPub Vocabulary Spec
- Other Golang implementations of this spec
Design
Podcast Object
Podcasts include four main pieces of information: the header
info, the shownotes
, the preview
, and the audio
. A Header includes the title and date of the show. Shownotes are a collection of info about the show; they're basically an HTML supported description. A preview is an image thumbnail for the show. Audio is the actual stuff you're listening to.
A Podcast ActivityStream Object can therefore look something like this:
"object" : {
"id": "https://example.org/activity/organization/npr/planet-money",
"type": "Podcast",
"name": "This American Life",
"date": "2008-09-15T15:53:00",
"shownotes": "Check out our <a href='foo.com'>website!</a>",
"preview": {
"type": "Image",
"href": "http://example.org/album/máiréad.jpg",
"mediaType": "image/jpeg"
},
"audio": {
"type": "Audio",
"href": "https://example.org/activity/organization/npr/planet-money/episodes/1.mp4",
"mediaType": "audio/mp4"
}
}