diff --git a/actions/api.php b/actions/api.php index 4a00b77e8d..452ed8e824 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 888aba0628..020399d9ee 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 0000000000..5c85275302 --- /dev/null +++ b/actions/twitapitags.php @@ -0,0 +1,114 @@ +. + * + * @category Twitter + * @package Laconica + * @author Craig Andrews + * @author Zach Copley + * @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 + * @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 8104d7818c..e121386370 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'));