* renamed FeedSub plugin to OStatus * now setting avatar on subscriptions * general fixes for subscription * integrated PuSH hub to handle only user timelines on canonical ID url; sends updates directly * set $config['feedsub']['nohub'] = true to test w/ foreign feeds that don't have hubs (won't actually receive updates though) * a few bits of code documentation * HMAC support for verified distributions (safest if sub setup is on HTTPS) And a couple core changes: * minimizing HTML output for exceptions in API requests to aid in debugging * fix for rel=self link in apitimelineuser when id given This does not not yet include any of the individual subscription management (Salmon notifications for sub/unsub, etc) nor a nice UI for user subscriptions. Needs some further cleanup to treat posts as status updates instead of link references.
		
			
				
	
	
		
			171 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?php
 | |
| /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 | |
| 
 | |
| /**
 | |
|  * Class representing entries in an RSS2 feed.
 | |
|  *
 | |
|  * PHP versions 5
 | |
|  *
 | |
|  * LICENSE: This source file is subject to version 3.0 of the PHP license
 | |
|  * that is available through the world-wide-web at the following URI:
 | |
|  * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
 | |
|  * the PHP License and are unable to obtain it through the web, please
 | |
|  * send a note to license@php.net so we can mail you a copy immediately.
 | |
|  *
 | |
|  * @category   XML
 | |
|  * @package    XML_Feed_Parser
 | |
|  * @author     James Stewart <james@jystewart.net>
 | |
|  * @copyright  2005 James Stewart <james@jystewart.net>
 | |
|  * @license    http://www.gnu.org/copyleft/lesser.html  GNU LGPL 2.1
 | |
|  * @version    CVS: $Id: RSS2Element.php,v 1.11 2006/07/26 21:18:47 jystewart Exp $
 | |
|  * @link       http://pear.php.net/package/XML_Feed_Parser/
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * This class provides support for RSS 2.0 entries. It will usually be 
 | |
|  * called by XML_Feed_Parser_RSS2 with which it shares many methods.
 | |
|  *
 | |
|  * @author    James Stewart <james@jystewart.net>
 | |
|  * @version    Release: 1.0.3
 | |
|  * @package XML_Feed_Parser
 | |
|  */
 | |
| class XML_Feed_Parser_RSS2Element extends XML_Feed_Parser_RSS2
 | |
| {
 | |
|     /**
 | |
|      * This will be a reference to the parent object for when we want
 | |
|      * to use a 'fallback' rule
 | |
|      * @var XML_Feed_Parser_RSS2
 | |
|      */
 | |
|     protected $parent;
 | |
| 
 | |
|     /**
 | |
|      * Our specific element map 
 | |
|      * @var array
 | |
|      */
 | |
|     protected $map = array(
 | |
|         'title' => array('Text'),
 | |
|         'guid' => array('Guid'),
 | |
|         'description' => array('Text'),
 | |
|         'author' => array('Text'),
 | |
|         'comments' => array('Text'),
 | |
|         'enclosure' => array('Enclosure'),
 | |
|         'pubDate' => array('Date'),
 | |
|         'source' => array('Source'),
 | |
|         'link' => array('Text'),
 | |
|         'content' => array('Content'));
 | |
| 
 | |
|     /**
 | |
|      * Here we map some elements to their atom equivalents. This is going to be
 | |
|      * quite tricky to pull off effectively (and some users' methods may vary)
 | |
|      * but is worth trying. The key is the atom version, the value is RSS2.
 | |
|      * @var array
 | |
|      */
 | |
|     protected $compatMap = array(
 | |
|         'id' => array('guid'),
 | |
|         'updated' => array('lastBuildDate'),
 | |
|         'published' => array('pubdate'),
 | |
|         'guidislink' => array('guid', 'ispermalink'),
 | |
|         'summary' => array('description'));
 | |
| 
 | |
|     /**
 | |
|      * Store useful information for later.
 | |
|      *
 | |
|      * @param   DOMElement  $element - this item as a DOM element
 | |
|      * @param   XML_Feed_Parser_RSS2    $parent - the feed of which this is a member
 | |
|      */
 | |
|     function __construct(DOMElement $element, $parent, $xmlBase = '')
 | |
|     {
 | |
|         $this->model = $element;
 | |
|         $this->parent = $parent;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the value of the guid element, if specified
 | |
|      *
 | |
|      * guid is the closest RSS2 has to atom's ID. It is usually but not always a
 | |
|      * URI. The one attribute that RSS2 can posess is 'ispermalink' which specifies
 | |
|      * whether the guid is itself dereferencable. Use of guid is not obligatory,
 | |
|      * but is advisable. To get the guid you would call $item->id() (for atom
 | |
|      * compatibility) or $item->guid(). To check if this guid is a permalink call
 | |
|      * $item->guid("ispermalink").
 | |
|      *
 | |
|      * @param   string  $method - the method name being called
 | |
|      * @param   array   $params - parameters required
 | |
|      * @return  string  the guid or value of ispermalink
 | |
|      */
 | |
|     protected function getGuid($method, $params)
 | |
|     {
 | |
|         $attribute = (isset($params[0]) and $params[0] == 'ispermalink') ? 
 | |
|             true : false;
 | |
|         $tag = $this->model->getElementsByTagName('guid');
 | |
|         if ($tag->length > 0) {
 | |
|             if ($attribute) {
 | |
|                 if ($tag->hasAttribute("ispermalink")) {
 | |
|                     return $tag->getAttribute("ispermalink");
 | |
|                 }
 | |
|             }
 | |
|             return $tag->item(0)->nodeValue;
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Access details of file enclosures
 | |
|      *
 | |
|      * The RSS2 spec is ambiguous as to whether an enclosure element must be
 | |
|      * unique in a given entry. For now we will assume it needn't, and allow
 | |
|      * for an offset.
 | |
|      *
 | |
|      * @param   string $method - the method being called
 | |
|      * @param   array   $parameters - we expect the first of these to be our offset
 | |
|      * @return  array|false
 | |
|      */
 | |
|     protected function getEnclosure($method, $parameters)
 | |
|     {
 | |
|         $encs = $this->model->getElementsByTagName('enclosure');
 | |
|         $offset = isset($parameters[0]) ? $parameters[0] : 0;
 | |
|         if ($encs->length > $offset) {
 | |
|             try {
 | |
|                 if (! $encs->item($offset)->hasAttribute('url')) {
 | |
|                     return false;
 | |
|                 }
 | |
|                 $attrs = $encs->item($offset)->attributes;
 | |
|                 return array(
 | |
|                     'url' => $attrs->getNamedItem('url')->value,
 | |
|                     'length' => $attrs->getNamedItem('length')->value,
 | |
|                     'type' => $attrs->getNamedItem('type')->value);
 | |
|             } catch (Exception $e) {
 | |
|                 return false;
 | |
|             }
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the entry source if specified
 | |
|      *
 | |
|      * source is an optional sub-element of item. Like atom:source it tells
 | |
|      * us about where the entry came from (eg. if it's been copied from another
 | |
|      * feed). It is not a rich source of metadata in the same way as atom:source
 | |
|      * and while it would be good to maintain compatibility by returning an
 | |
|      * XML_Feed_Parser_RSS2 element, it makes a lot more sense to return an array.
 | |
|      *
 | |
|      * @return array|false
 | |
|      */
 | |
|     protected function getSource()
 | |
|     {
 | |
|         $get = $this->model->getElementsByTagName('source');
 | |
|         if ($get->length) {
 | |
|             $source = $get->item(0);
 | |
|             $array = array(
 | |
|                 'content' => $source->nodeValue);
 | |
|             foreach ($source->attributes as $attribute) {
 | |
|                 $array[$attribute->name] = $attribute->value;
 | |
|             }
 | |
|             return $array;
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| ?>
 |