load->library('rssparser'); $this->rssparser->set_feed_url('http://example.com/feed'); $this->rssparser->set_cache_life(30); $rss = $this->rssparser->getFeed(6); // Get six items from the feed // Using a callback function to parse addictional XML fields $this->load->library('rssparser', array($this, 'parseFile')); // parseFile method of current class function parseFile($data, $item) { $data['summary'] = (string)$item->summary; return $data; } */ class RSSParser { public $feed_uri = NULL; // Feed URI public $data = FALSE; // Associative array containing all the feed items public $channel_data = array(); // Store RSS Channel Data in an array public $feed_unavailable = NULL; // Boolean variable which indicates whether an RSS feed was unavailable public $cache_life = 0; // Cache lifetime public $cache_dir = './hoosk/hoosk0/cache/'; // Cache directory public $write_cache_flag = FALSE; // Flag to write to cache public $callback = FALSE; // Callback to read custom data function __construct($callback = FALSE) { if ($callback) { $this->callback = $callback; } } // -------------------------------------------------------------------- function get_http_response_code($url) { $headers = get_headers($url); return substr($headers[0], 9, 3); } function parse() { // Are we caching? if ($this->cache_life != 0) { $filename = $this->cache_dir.'rss_Parse_'.md5($this->feed_uri); // Is there a cache file ? if (file_exists($filename)) { // Has it expired? $timedif = (time() - filemtime($filename)); if ($timedif < ( $this->cache_life * 60)) { $rawFeed = file_get_contents($filename); } else { // So raise the falg $this->write_cache_flag = true; } } else { // Raise the flag to write the cache $this->write_cache_flag = true; } } // Reset $this->data = array(); $this->channel_data = array(); // Parse the document if (!isset($rawFeed)) { if($this->get_http_response_code($this->feed_uri) != "200"){ return false; }else{ $rawFeed = file_get_contents($this->feed_uri); } } $xml = new SimpleXmlElement($rawFeed, 0, false); if ($xml->channel) { // Assign the channel data $this->channel_data['title'] = $xml->channel->title; $this->channel_data['description'] = $xml->channel->description; // Build the item array foreach ($xml->channel->item as $item) { $data = array(); $data['title'] = (string)$item->title; $data['description'] = (string)$item->description; $data['pubDate'] = (string)$item->pubDate; $data['link'] = (string)$item->link; $dc = $item->children('http://purl.org/dc/elements/1.1/'); $data['author'] = (string)$dc->creator; if ($this->callback) { $data = call_user_func($this->callback, $data, $item); } $this->data[] = $data; } } else { // Assign the channel data $this->channel_data['title'] = $xml->title; $this->channel_data['description'] = $xml->subtitle; // Build the item array foreach ($xml->entry as $item) { $data = array(); $data['id'] = (string)$item->id; $data['title'] = (string)$item->title; $data['description'] = (string)$item->content; $data['pubDate'] = (string)$item->published; $data['link'] = (string)$item->link['href']; $dc = $item->children('http://purl.org/dc/elements/1.1/'); $data['author'] = (string)$dc->creator; if ($this->callback) { $data = call_user_func($this->callback, $data, $item); } $this->data[] = $data; } } // Do we need to write the cache file? if ($this->write_cache_flag) { if (!$fp = @fopen($filename, 'wb')) { echo "RSSParser error"; log_message('error', "Unable to write cache file: ".$filename); return; } flock($fp, LOCK_EX); fwrite($fp, $rawFeed); flock($fp, LOCK_UN); fclose($fp); } return TRUE; } // -------------------------------------------------------------------- function set_cache_life($period = NULL) { $this->cache_life = $period; return $this; } // -------------------------------------------------------------------- function set_feed_url($url = NULL) { $this->feed_uri = $url; return $this; } // -------------------------------------------------------------------- /* Return the feeds one at a time: when there are no more feeds return false * @param No of items to return from the feed * @return Associative array of items */ function getFeed($num) { $this->parse(); $c = 0; $return = array(); foreach ($this->data AS $item) { $return[] = $item; $c++; if ($c == $num) { break; } } return $return; } // -------------------------------------------------------------------- /* Return channel data for the feed */ function & getChannelData() { $flag = false; if (!empty($this->channel_data)) { return $this->channel_data; } else { return $flag; } } // -------------------------------------------------------------------- /* Were we unable to retreive the feeds ? */ function errorInResponse() { return $this->feed_unavailable; } // -------------------------------------------------------------------- /* Initialize the feed data */ function clear() { $this->feed_uri = NULL; $this->data = FALSE; $this->channel_data = array(); $this->cache_life = 0; $this->callback = FALSE; return $this; } } /* End of file RSSParser.php */ /* Location: ./application/libraries/RSSParser.php */