pubcast

An experimental ActivityPub based podcasting platform.

Github星跟踪图

? 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"
  }
}

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"
  }
}

主要指标

概览
名称与所有者pubcast/pubcast
主编程语言Go
编程语言Makefile (语言数: 5)
平台
许可证Mozilla Public License 2.0
所有者活动
创建于2018-09-25 21:14:40
推送于2019-03-07 02:41:30
最后一次提交2019-03-06 18:41:08
发布数0
用户参与
星数115
关注者数12
派生数5
提交数115
已启用问题?
问题数12
打开的问题数8
拉请求数11
打开的拉请求数0
关闭的拉请求数1
项目设置
已启用Wiki?
已存档?
是复刻?
已锁定?
是镜像?
是私有?