diff --git a/lib/activity.php b/lib/activity.php
index bd1d5d56c0..f9192c6b80 100644
--- a/lib/activity.php
+++ b/lib/activity.php
@@ -53,6 +53,7 @@ class Activity
{
const SPEC = 'http://activitystrea.ms/spec/1.0/';
const SCHEMA = 'http://activitystrea.ms/schema/1.0/';
+ const MEDIA = 'http://purl.org/syndication/atommedia';
const VERB = 'verb';
const OBJECT = 'object';
@@ -85,7 +86,7 @@ class Activity
public $actor; // an ActivityObject
public $verb; // a string (the URL)
- public $object; // an ActivityObject
+ public $objects = array(); // an array of ActivityObjects
public $target; // an ActivityObject
public $context; // an ActivityObject
public $time; // Time of the activity
@@ -161,12 +162,15 @@ class Activity
// XXX: do other implied stuff here
}
- $objectEl = $this->_child($entry, self::OBJECT);
+ $objectEls = $entry->getElementsByTagNameNS(self::SPEC, self::OBJECT);
- if (!empty($objectEl)) {
- $this->object = new ActivityObject($objectEl);
+ if ($objectEls->length > 0) {
+ for ($i = 0; $i < $objectEls->length; $i++) {
+ $objectEl = $objectEls->item($i);
+ $this->objects[] = new ActivityObject($objectEl);
+ }
} else {
- $this->object = new ActivityObject($entry);
+ $this->objects[] = new ActivityObject($entry);
}
$actorEl = $this->_child($entry, self::ACTOR);
@@ -280,8 +284,8 @@ class Activity
}
}
- $this->object = new ActivityObject($item);
- $this->context = new ActivityContext($item);
+ $this->objects[] = new ActivityObject($item);
+ $this->context = new ActivityContext($item);
}
/**
@@ -339,8 +343,10 @@ class Activity
$xs->element('activity:verb', null, $this->verb);
- if ($this->object) {
- $xs->raw($this->object->asString());
+ if (!empty($this->objects)) {
+ foreach($this->objects as $object) {
+ $xs->raw($object->asString());
+ }
}
if ($this->target) {
diff --git a/lib/activityobject.php b/lib/activityobject.php
index 0a358ccabb..34d1b91700 100644
--- a/lib/activityobject.php
+++ b/lib/activityobject.php
@@ -100,6 +100,13 @@ class ActivityObject
public $poco;
public $displayName;
+ // @todo move this stuff to it's own PHOTO activity object
+ const MEDIA_DESCRIPTION = 'description';
+
+ public $thumbnail;
+ public $largerImage;
+ public $description;
+
/**
* Constructor
*
@@ -150,6 +157,19 @@ class ActivityObject
$this->poco = new PoCo($element);
}
+
+ if ($this->type == self::PHOTO) {
+
+ $this->thumbnail = ActivityUtils::getLink($element, 'preview');
+ $this->largerImage = ActivityUtils::getLink($element, 'enclosure');
+
+ $this->description = ActivityUtils::childContent(
+ $element,
+ ActivityObject::MEDIA_DESCRIPTION,
+ Activity::MEDIA
+ );
+
+ }
}
private function _fromAuthor($element)
diff --git a/plugins/OStatus/actions/groupsalmon.php b/plugins/OStatus/actions/groupsalmon.php
index 29377b5fa0..d60725a71b 100644
--- a/plugins/OStatus/actions/groupsalmon.php
+++ b/plugins/OStatus/actions/groupsalmon.php
@@ -60,7 +60,8 @@ class GroupsalmonAction extends SalmonAction
function handlePost()
{
- switch ($this->act->object->type) {
+ // @fixme process all objects?
+ switch ($this->act->objects[0]->type) {
case ActivityObject::ARTICLE:
case ActivityObject::BLOGENTRY:
case ActivityObject::NOTE:
diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php
index 15e8c1869d..ecdcfa1939 100644
--- a/plugins/OStatus/actions/usersalmon.php
+++ b/plugins/OStatus/actions/usersalmon.php
@@ -55,9 +55,10 @@ class UsersalmonAction extends SalmonAction
*/
function handlePost()
{
- common_log(LOG_INFO, "Received post of '{$this->act->object->id}' from '{$this->act->actor->id}'");
+ common_log(LOG_INFO, "Received post of '{$this->act->objects[0]->id}' from '{$this->act->actor->id}'");
- switch ($this->act->object->type) {
+ // @fixme: process all activity objects?
+ switch ($this->act->objects[0]->type) {
case ActivityObject::ARTICLE:
case ActivityObject::BLOGENTRY:
case ActivityObject::NOTE:
diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php
index 0eb5b8b82a..df937643bf 100644
--- a/plugins/OStatus/classes/Ostatus_profile.php
+++ b/plugins/OStatus/classes/Ostatus_profile.php
@@ -494,7 +494,7 @@ class Ostatus_profile extends Memcached_DataObject
// It's not always an ActivityObject::NOTE, but... let's just say it is.
- $note = $activity->object;
+ $note = $activity->objects[0];
// The id URI will be used as a unique identifier for for the notice,
// protecting against duplicate saves. It isn't required to be a URL;
diff --git a/scripts/importtwitteratom.php b/scripts/importtwitteratom.php
index 7316f21080..c12e3b91a8 100644
--- a/scripts/importtwitteratom.php
+++ b/scripts/importtwitteratom.php
@@ -102,7 +102,7 @@ function importActivityStream($user, $doc)
for ($i = $entries->length - 1; $i >= 0; $i--) {
$entry = $entries->item($i);
$activity = new Activity($entry, $feed);
- $object = $activity->object;
+ $object = $activity->objects[0];
if (!have_option('q', 'quiet')) {
print $activity->content . "\n";
}
diff --git a/tests/ActivityParseTests.php b/tests/ActivityParseTests.php
index 02d2ed734c..fec8829eba 100644
--- a/tests/ActivityParseTests.php
+++ b/tests/ActivityParseTests.php
@@ -25,11 +25,11 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
$this->assertEquals($act->time, 1243860840);
$this->assertEquals($act->verb, ActivityVerb::POST);
- $this->assertFalse(empty($act->object));
- $this->assertEquals($act->object->title, 'Punctuation Changeset');
- $this->assertEquals($act->object->type, 'http://versioncentral.example.org/activity/changeset');
- $this->assertEquals($act->object->summary, 'Fixing punctuation because it makes it more readable.');
- $this->assertEquals($act->object->id, 'tag:versioncentral.example.org,2009:/change/1643245');
+ $this->assertFalse(empty($act->objects[0]));
+ $this->assertEquals($act->objects[0]->title, 'Punctuation Changeset');
+ $this->assertEquals($act->objects[0]->type, 'http://versioncentral.example.org/activity/changeset');
+ $this->assertEquals($act->objects[0]->summary, 'Fixing punctuation because it makes it more readable.');
+ $this->assertEquals($act->objects[0]->id, 'tag:versioncentral.example.org,2009:/change/1643245');
}
public function testExample3()
@@ -56,12 +56,12 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
$this->assertEquals($act->actor->title, 'John Doe');
$this->assertEquals($act->actor->id, 'mailto:johndoe@example.com');
- $this->assertFalse(empty($act->object));
- $this->assertEquals($act->object->type, ActivityObject::NOTE);
- $this->assertEquals($act->object->id, 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a');
- $this->assertEquals($act->object->title, 'Atom-Powered Robots Run Amok');
- $this->assertEquals($act->object->summary, 'Some text.');
- $this->assertEquals($act->object->link, 'http://example.org/2003/12/13/atom03.html');
+ $this->assertFalse(empty($act->objects[0]));
+ $this->assertEquals($act->objects[0]->type, ActivityObject::NOTE);
+ $this->assertEquals($act->objects[0]->id, 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a');
+ $this->assertEquals($act->objects[0]->title, 'Atom-Powered Robots Run Amok');
+ $this->assertEquals($act->objects[0]->summary, 'Some text.');
+ $this->assertEquals($act->objects[0]->link, 'http://example.org/2003/12/13/atom03.html');
$this->assertFalse(empty($act->context));
@@ -90,8 +90,8 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
$this->assertEquals('http://example.net/conversation/11', $act->context->conversation);
$this->assertEquals(array('http://example.net/user/1'), $act->context->attention);
- $this->assertFalse(empty($act->object));
- $this->assertEquals($act->object->content,
+ $this->assertFalse(empty($act->objects[0]));
+ $this->assertEquals($act->objects[0]->content,
'@evan now is the time for all good men to come to the aid of their country. #thetime');
$this->assertFalse(empty($act->actor));
@@ -215,6 +215,96 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase
$this->assertNull($actor->poco->address);
$this->assertEquals(0, count($actor->poco->urls));
}
+
+ // Media test - cliqset
+ public function testExample8()
+ {
+ global $_example8;
+ $dom = DOMDocument::loadXML($_example8);
+
+ $feed = $dom->documentElement;
+
+ $entries = $feed->getElementsByTagName('entry');
+
+ $entry = $entries->item(0);
+
+ $act = new Activity($entry, $feed);
+
+ $this->assertFalse(empty($act));
+ $this->assertEquals($act->time, 1269221753);
+ $this->assertEquals($act->verb, ActivityVerb::POST);
+ $this->assertEquals($act->summary, 'zcopley posted 5 photos on Flickr');
+
+ $this->assertFalse(empty($act->objects));
+ $this->assertEquals(sizeof($act->objects), 5);
+
+ $this->assertEquals($act->objects[0]->type, ActivityObject::PHOTO);
+ $this->assertEquals($act->objects[0]->title, 'IMG_1368');
+ $this->assertNull($act->objects[0]->description);
+ $this->assertEquals(
+ $act->objects[0]->thumbnail,
+ 'http://media.cliqset.com/6f6fbee9d7dfbffc73b6ef626275eb5f_thumb.jpg'
+ );
+ $this->assertEquals(
+ $act->objects[0]->link,
+ 'http://www.flickr.com/photos/zcopley/4452933806/'
+ );
+
+ $this->assertEquals($act->objects[1]->type, ActivityObject::PHOTO);
+ $this->assertEquals($act->objects[1]->title, 'IMG_1365');
+ $this->assertNull($act->objects[1]->description);
+ $this->assertEquals(
+ $act->objects[1]->thumbnail,
+ 'http://media.cliqset.com/b8f3932cd0bba1b27f7c8b3ef986915e_thumb.jpg'
+ );
+ $this->assertEquals(
+ $act->objects[1]->link,
+ 'http://www.flickr.com/photos/zcopley/4442630390/'
+ );
+
+ $this->assertEquals($act->objects[2]->type, ActivityObject::PHOTO);
+ $this->assertEquals($act->objects[2]->title, 'Classic');
+ $this->assertEquals(
+ $act->objects[2]->description,
+ '-Powered by pikchur.com/n0u'
+ );
+ $this->assertEquals(
+ $act->objects[2]->thumbnail,
+ 'http://media.cliqset.com/fc54c15f850b7a9a8efa644087a48c91_thumb.jpg'
+ );
+ $this->assertEquals(
+ $act->objects[2]->link,
+ 'http://www.flickr.com/photos/zcopley/4430754103/'
+ );
+
+ $this->assertEquals($act->objects[3]->type, ActivityObject::PHOTO);
+ $this->assertEquals($act->objects[3]->title, 'IMG_1363');
+ $this->assertNull($act->objects[3]->description);
+
+ $this->assertEquals(
+ $act->objects[3]->thumbnail,
+ 'http://media.cliqset.com/4b1d307c9217e2114391a8b229d612cb_thumb.jpg'
+ );
+ $this->assertEquals(
+ $act->objects[3]->link,
+ 'http://www.flickr.com/photos/zcopley/4416969717/'
+ );
+
+ $this->assertEquals($act->objects[4]->type, ActivityObject::PHOTO);
+ $this->assertEquals($act->objects[4]->title, 'IMG_1361');
+ $this->assertNull($act->objects[4]->description);
+
+ $this->assertEquals(
+ $act->objects[4]->thumbnail,
+ 'http://media.cliqset.com/23d9b4b96b286e0347d36052f22f6e60_thumb.jpg'
+ );
+ $this->assertEquals(
+ $act->objects[4]->link,
+ 'http://www.flickr.com/photos/zcopley/4417734232/'
+ );
+
+ }
+
}
$_example1 = <<
EXAMPLE7;
+
+$_example8 = <<
+
+
+ Activity Stream for: zcopley
+ http://cliqset.com/feed/atom?uid=zcopley
+
+ 0
+ http://activitystrea.ms/schema/1.0/post
+ 2010-03-22T01:35:53.000Z
+
+ flickr
+ http://flickr.com
+ http://cliqset-services.s3.amazonaws.com/flickr.png
+
+
+ http://activitystrea.ms/schema/1.0/photo
+ IMG_1368
+
+
+
+
+ http://activitystrea.ms/schema/1.0/photo
+ IMG_1365
+
+
+
+
+ http://activitystrea.ms/schema/1.0/photo
+ Classic
+
+
+ -Powered by pikchur.com/n0u
+
+
+ http://activitystrea.ms/schema/1.0/photo
+ IMG_1363
+
+
+
+
+ http://activitystrea.ms/schema/1.0/photo
+ IMG_1361
+
+
+
+ zcopley posted some photos on Flickr
+ zcopley posted 5 photos on Flickr
+
+ 2010-03-22T20:46:42.778Z
+ tag:cliqset.com,2010-03-22:/user/zcopley/SVgAZubGhtAnSAee
+
+
+ zcopley
+ http://cliqset.com/user/zcopley
+
+
+ http://activitystrea.ms/schema/1.0/person
+ zcopley
+
+ Zach
+ Copley
+
+
+
+
+
+
+
+EXAMPLE8;
+
+$_example9 = <<
+
+
+
+ Google Buzz
+ 2010-03-22T01:55:53.596Z
+ tag:google.com,2009:buzz-feed/public/posted/117848251937215158042
+ Google - Google Buzz
+
+ Buzz by Zach Copley from Flickr
+ IMG_1366
+ 2010-03-18T04:29:23.000Z
+ 2010-03-18T05:14:03.325Z
+ tag:google.com,2009:buzz/z12zwdhxowq2d13q204cjr04kzu0cns5gh0
+
+
+ Zach Copley
+ http://www.google.com/profiles/zcopley
+
+ <div>IMG_1366</div>
+
+
+ IMG_1366
+
+
+
+
+ IMG_1365
+
+
+ http://activitystrea.ms/schema/1.0/post
+
+ http://activitystrea.ms/schema/1.0/photo
+ tag:google.com,2009:buzz/z12zwdhxowq2d13q204cjr04kzu0cns5gh0
+ Buzz by Zach Copley from Flickr
+ <div>IMG_1366</div>
+
+
+
+
+ 0
+
+
+EXAMPLE9;
diff --git a/tests/UserFeedParseTest.php b/tests/UserFeedParseTest.php
index b3f9a64171..208e71be69 100644
--- a/tests/UserFeedParseTest.php
+++ b/tests/UserFeedParseTest.php
@@ -66,11 +66,11 @@ class UserFeedParseTests extends PHPUnit_Framework_TestCase
// test the post
//var_export($act1);
- $this->assertEquals($act1->object->type, 'http://activitystrea.ms/schema/1.0/note');
- $this->assertEquals($act1->object->title, 'And now for something completely insane...');
+ $this->assertEquals($act1->objects[0]->type, 'http://activitystrea.ms/schema/1.0/note');
+ $this->assertEquals($act1->objects[0]->title, 'And now for something completely insane...');
- $this->assertEquals($act1->object->content, 'And now for something completely insane...');
- $this->assertEquals($act1->object->id, 'http://localhost/statusnet/notice/3');
+ $this->assertEquals($act1->objects[0]->content, 'And now for something completely insane...');
+ $this->assertEquals($act1->objects[0]->id, 'http://localhost/statusnet/notice/3');
}