Skip to content
An experimental ActivityPub based podcasting platform.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
activity Rename shows to orgs. Add easier testing w/ docker's postgres image. Mar 4, 2019
config New project structure Sep 29, 2018
data Grammar changes. Mar 4, 2019
handlers Grammar changes. Mar 4, 2019
scripts Rename shows to orgs. Add easier testing w/ docker's postgres image. Mar 4, 2019
.gitignore Update gitignore and makefile Oct 7, 2018
.travis.yml Update travis Sep 29, 2018
Dockerfile
LICENSE Add MPL Feb 24, 2019
Makefile Rename shows to orgs. Add easier testing w/ docker's postgres image. Mar 4, 2019
README.md Rename shows to orgs. Add easier testing w/ docker's postgres image. Mar 4, 2019
go.mod Added getting Groups Feb 23, 2019
go.sum Added getting Groups Feb 23, 2019
main.go Rename shows to orgs. Add easier testing w/ docker's postgres image. Mar 4, 2019

README.md

🎙 Pubcast

Gitter chat

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

explaination

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

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"
  }
}
You can’t perform that action at this time.