diff options
author | Craig Andrews <candrews@integralblue.com> | 2009-07-12 15:07:54 -0400 |
---|---|---|
committer | Craig Andrews <candrews@integralblue.com> | 2009-07-12 15:07:54 -0400 |
commit | 91324890ae130a6f4280c9f6d82151793611de1f (patch) | |
tree | bc847afe0b726f32cfd32c25e864e081eb47e198 | |
parent | 7621e0e38467349a89f71e814941932fbacecfa1 (diff) |
Add timeline tags API (RSS 2.0 and Atom feeds)
-rw-r--r-- | actions/api.php | 1 | ||||
-rw-r--r-- | actions/tag.php | 20 | ||||
-rw-r--r-- | actions/twitapitags.php | 114 | ||||
-rw-r--r-- | lib/router.php | 9 |
4 files changed, 142 insertions, 2 deletions
diff --git a/actions/api.php b/actions/api.php index 4a00b77e8..452ed8e82 100644 --- a/actions/api.php +++ b/actions/api.php @@ -128,6 +128,7 @@ class ApiAction extends Action 'laconica/version', 'laconica/config', 'laconica/wadl', + 'tags/timeline', 'groups/timeline'); static $bareauth = array('statuses/user_timeline', diff --git a/actions/tag.php b/actions/tag.php index 888aba062..020399d9e 100644 --- a/actions/tag.php +++ b/actions/tag.php @@ -72,8 +72,24 @@ class TagAction extends Action function getFeeds() { return array(new Feed(Feed::RSS1, - common_local_url('tagrss', array('tag' => $this->tag)), - sprintf(_('Feed for tag %s'), $this->tag))); + common_local_url('tagrss', + array('tag' => $this->tag)), + sprintf(_('Notice feed for tag %s (RSS 1.0)'), + $this->tag)), + new Feed(Feed::RSS2, + common_local_url('api', + array('apiaction' => 'tags', + 'method' => 'timeline', + 'argument' => $this->tag.'.rss')), + sprintf(_('Notice feed for %s group (RSS 2.0)'), + $this->tag)), + new Feed(Feed::ATOM, + common_local_url('api', + array('apiaction' => 'tags', + 'method' => 'timeline', + 'argument' => $this->tag.'.atom')), + sprintf(_('Notice feed for tag %s (Atom)'), + $this->tag))); } function showContent() diff --git a/actions/twitapitags.php b/actions/twitapitags.php new file mode 100644 index 000000000..5c8527530 --- /dev/null +++ b/actions/twitapitags.php @@ -0,0 +1,114 @@ +<?php +/** + * Laconica, the distributed open-source microblogging tool + * + * Laconica extensions to the Twitter-like API for groups + * + * PHP version 5 + * + * LICENCE: This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @category Twitter + * @package Laconica + * @author Craig Andrews + * @author Zach Copley <zach@controlyourself.ca> + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/twitterapi.php'; + +/** + * Group-specific API methods + * + * This class handles Laconica group API methods. + * + * @category Twitter + * @package Laconica + * @author Craig Andrews + * @author Zach Copley <zach@controlyourself.ca> + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + + class TwitapitagsAction extends TwitterapiAction + { + + function timeline($args, $apidata) + { + parent::handle($args); + + common_debug("in tags api action"); + + $this->auth_user = $apidata['user']; + $tag = $apidata['api_arg']; + + if (empty($tag)) { + $this->clientError('Not Found', 404, $apidata['content-type']); + return; + } + + $sitename = common_config('site', 'name'); + $title = sprintf(_("Notices tagged with %s"), $tag); + $taguribase = common_config('integration', 'taguri'); + $id = "tag:$taguribase:TagTimeline:".$tag; + $link = common_local_url('tag', + array('tag' => $tag)); + $subtitle = sprintf(_('Updates tagged with %1$s on %2$s!'), + $tag, $sitename); + + $page = (int)$this->arg('page', 1); + $count = (int)$this->arg('count', 20); + $max_id = (int)$this->arg('max_id', 0); + $since_id = (int)$this->arg('since_id', 0); + $since = $this->arg('since'); + + # XXX: support max_id, since_id, and since arguments + $notice = Notice_tag::getStream($tag, ($page-1)*$count, $count + 1); + + switch($apidata['content-type']) { + case 'xml': + $this->show_xml_timeline($notice); + break; + case 'rss': + $this->show_rss_timeline($notice, $title, $link, + $subtitle, $suplink); + break; + case 'atom': + if (isset($apidata['api_arg'])) { + $selfuri = common_root_url() . + 'api/laconica/tags/timeline/' . + $apidata['api_arg'] . '.atom'; + } else { + $selfuri = common_root_url() . + 'api/laconica/tags/timeline.atom'; + } + $this->show_atom_timeline($notice, $title, $id, $link, + $subtitle, $suplink, $selfuri); + break; + case 'json': + $this->show_json_timeline($notice); + break; + default: + $this->clientError(_('API method not found!'), $code = 404); + } + } + +} diff --git a/lib/router.php b/lib/router.php index 8104d7818..e12138637 100644 --- a/lib/router.php +++ b/lib/router.php @@ -403,6 +403,15 @@ class Router array('action' => 'api', 'apiaction' => 'groups')); + // Tags + $m->connect('api/laconica/tags/:method/:argument', + array('action' => 'api', + 'apiaction' => 'tags')); + + $m->connect('api/laconica/tags/:method', + array('action' => 'api', + 'apiaction' => 'tags')); + // search $m->connect('api/search.atom', array('action' => 'twitapisearchatom')); $m->connect('api/search.json', array('action' => 'twitapisearchjson')); |