From e4d5c47ebf60adcc08a4ca48dd6e398c3c419993 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 16 Feb 2011 16:21:46 -0800 Subject: [PATCH] Add image to JSON ActivityObject and title + links to the JSON document --- actions/apitimelinefriends.php | 2 + lib/activity.php | 2 +- lib/activityobject.php | 30 ++++++-- lib/activitystreamjsondocument.php | 108 ++++++++++++++++++++++++++++- 4 files changed, 136 insertions(+), 6 deletions(-) diff --git a/actions/apitimelinefriends.php b/actions/apitimelinefriends.php index 3833418baa..0e356bb18b 100644 --- a/actions/apitimelinefriends.php +++ b/actions/apitimelinefriends.php @@ -266,6 +266,8 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction case 'as': header('Content-Type: application/json; charset=utf-8'); $doc = new ActivityStreamJSONDocument($this->auth_user); + $doc->setTitle($title); + $doc->addLink($link,'alternate', 'text/html'); $doc->addItemsFromNotices($this->notices); $this->raw($doc->asString()); break; diff --git a/lib/activity.php b/lib/activity.php index 0046469899..e6fefca28f 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -387,7 +387,7 @@ class Activity // TODO: extensions (ActivityContext, OStatus stuff, etc.) - return $activity; + return array_filter($activity); } function asString($namespace=false, $author=true, $source=false) diff --git a/lib/activityobject.php b/lib/activityobject.php index 53ffe1a172..17753f0df4 100644 --- a/lib/activityobject.php +++ b/lib/activityobject.php @@ -652,13 +652,35 @@ class ActivityObject // TODO: downstreamDuplicates - // TODO: embedCode + // TODO: embedCode (video) // id $object['id'] = $this->id; - // TODO: image - // Need to make MediaLink serialization + if ($this->type == ActivityObject::PERSON + || $this->type == ActivityObject::GROUP) { + + // XXX: Not sure what the best avatar is to use for the + // author's "image". For now, I'm using the stream size + // one, but possibly it should be large + $avatarLink = null; + + foreach ($this->avatarLinks as $a) { + if ($a->height == AVATAR_STREAM_SIZE) { + $avatarLink = $a; + break; + } + } + + $imgLink = new ActivityStreamsMediaLink( + $avatarLink->url, + $avatarLink->width, + $avatarLink->height, + $avatarLink->type + ); + + $object['image'] = $imgLink->asArray(); + } // objectType $object['type'] = $this->type; @@ -673,6 +695,6 @@ class ActivityObject // TODO: extensions (OStatus stuff, etc.) - return $object; + return array_filter($object); } } diff --git a/lib/activitystreamjsondocument.php b/lib/activitystreamjsondocument.php index 57ece9f6bf..4fa456470e 100644 --- a/lib/activitystreamjsondocument.php +++ b/lib/activitystreamjsondocument.php @@ -43,6 +43,7 @@ if (!defined('STATUSNET')) */ class ActivityStreamJSONDocument { + /* Top level array representing the document */ protected $doc = array(); @@ -57,9 +58,28 @@ class ActivityStreamJSONDocument function __construct($cur = null) { + $this->cur = $cur; + /* Title of the JSON document */ + $this->doc['title'] = null; + + /* Array of activity items */ $this->doc['items'] = array(); + + /* Array of links associated with the document */ + $this->doc['links'] = array(); + + } + + /** + * Set the title of the document + * + * @param String $title the title + */ + function setTitle($title) + { + $this->doc['title'] = $title; } /** @@ -99,6 +119,18 @@ class ActivityStreamJSONDocument array_push($this->doc['items'], $act->asArray()); } + /** + * Add a link to the JSON document + * + * @param string $url the URL for the link + * @param string $rel the link relationship + */ + function addLink($url = null, $rel = null, $mediaType = null) + { + $link = new ActivityStreamsLink($url, $rel, $mediaType); + $this->doc['link'][] = $link->asArray(); + } + /* * Return the entire document as a big string of JSON * @@ -106,7 +138,81 @@ class ActivityStreamJSONDocument */ function asString() { - return json_encode($this->doc); + return json_encode(array_filter($this->doc)); } } + +/** + * A class for representing MediaLinks in JSON Activities + * + * @category Feed + * @package StatusNet + * @author Zach Copley + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class ActivityStreamsMediaLink extends ActivityStreamsLink +{ + private $linkDict; + + function __construct( + $url = null, + $width = null, + $height = null, + $mediaType = null, + $rel = null, + $duration = null + ) + { + parent::__construct($url, $rel, $mediaType); + $this->linkDict = array( + 'width' => $width, + 'height' => $height, + 'duration' => $duration + ); + } + + function asArray() + { + return array_merge( + parent::asArray(), + array_filter($this->linkDict) + ); + } +} + +/** + * A class for representing links in JSON Activities + * + * @category Feed + * @package StatusNet + * @author Zach Copley + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class ActivityStreamsLink +{ + private $linkDict; + + function __construct($url = null, $rel = null, $mediaType = null) + { + // links MUST have a URL + if (empty($url)) { + throw new Exception('Links must have a URL.'); + } + + $this->linkDict = array( + 'url' => $url, + 'rel' => $rel, // extension + 'media_type' => $mediaType // extension + ); + } + + function asArray() + { + return array_filter($this->linkDict); + } +}