/ Published in: PHP
Simplepie per default uses relative paths to generate the cache filename. Whenever I use Simplepie I run into the same problem, that the cache directory can't be located. This is why I modify the file everytime. Here's my version (with a hardcoded path which you'll want to replace with your desired location).
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
<?php /** * SimplePie * * A PHP-Based RSS and Atom Feed Framework. * Takes the hard work out of managing a complete RSS/Atom solution. * * Copyright (c) 2004-2010, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * * Neither the name of the SimplePie Team nor the names of its contributors may be used * to endorse or promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package SimplePie * @version 1.3-dev * @copyright 2004-2010 Ryan Parman, Geoffrey Sneddon, Ryan McCue * @author Ryan Parman * @author Geoffrey Sneddon * @author Ryan McCue * @link http://simplepie.org/ SimplePie * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @todo phpDoc comments */ class SimplePie extends SimplePie_Core { } class SimplePie_Author { var $name; var $link; var $email; public function __construct($name = null, $link = null, $email = null) { $this->name = $name; $this->email = $email; } public function __toString() { } public function get_name() { if ($this->name !== null) { return $this->name; } else { return null; } } public function get_link() { { } else { return null; } } public function get_email() { if ($this->email !== null) { return $this->email; } else { return null; } } } class SimplePie_Cache_DB { public function prepare_simplepie_object_for_cache($data) { $items = $data->get_items(); { foreach ($items as $item) { $items_by_id[$item->get_id()] = $item; } { foreach ($items as $item) { $items_by_id[$item->get_id(true)] = $item; } } { $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]; } { $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]; } { $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]; } elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0])) { $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]; } else { $channel = null; } if ($channel !== null) { { } { } { } { } { } } { } { } } } } class SimplePie_Cache_File { var $location; var $filename; var $extension; var $name; public function __construct($location, $filename, $extension) { $this->location = $_SERVER["DOCUMENT_ROOT"].$location; $this->filename = $filename; $this->extension = $extension; $this->name = "$this->location/$this->filename.$this->extension"; } public function save($data) { if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location)) { { $data = $data->data; } } return false; } public function load() { { } return false; } public function mtime() { { } return false; } { { } return false; } { { } return false; } } class SimplePie_Cache_MySQL extends SimplePie_Cache_DB { var $mysql; var $options; var $id; public function __construct($mysql_location, $name, $extension) { $host = $mysql_location->get_host(); { } else { $server = $host; if ($mysql_location->get_port() !== null) { $server .= ':' . $mysql_location->get_port(); } } { } else { $username = $mysql_location->get_userinfo(); $password = null; } { $this->id = $name . $extension; { $this->options['prefix'][0] = ''; } { { $db[] = $row[0]; } { if (!mysql_query('CREATE TABLE `' . $this->options['prefix'][0] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))')) { } } { if (!mysql_query('CREATE TABLE `' . $this->options['prefix'][0] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` TEXT CHARACTER SET utf8 NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))')) { } } } else { } } } public function save($data) { { { $data = clone $data; $prepared = $this->prepare_simplepie_object_for_cache($data); if ($query = mysql_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = ' . $feed_id, $this->mysql)) { { if ($items) { $sql = 'UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `items` = ' . $items . ', `data` = \'' . mysql_real_escape_string($prepared[0]) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id; } else { $sql = 'UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `data` = \'' . mysql_real_escape_string($prepared[0]) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id; } { return false; } } elseif (!mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(' . $feed_id . ', ' . count($prepared[1]) . ', \'' . mysql_real_escape_string($prepared[0]) . '\', ' . time() . ')', $this->mysql)) { return false; } { foreach ($ids as $id) { } if ($query = mysql_unbuffered_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'items` WHERE `id` = \'' . implode('\' OR `id` = \'', $database_ids) . '\' AND `feed_id` = ' . $feed_id, $this->mysql)) { { $existing_ids[] = $row[0]; } foreach ($new_ids as $new_id) { if (!($date = $prepared[1][$new_id]->get_date('U'))) { } if (!mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(' . $feed_id . ', \'' . mysql_real_escape_string($new_id) . '\', \'' . mysql_real_escape_string(serialize($prepared[1][$new_id]->data)) . '\', ' . $date . ')', $this->mysql)) { return false; } } return true; } } else { return true; } } } elseif ($query = mysql_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = ' . $feed_id, $this->mysql)) { { if (mysql_query('UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `items` = 0, `data` = \'' . mysql_real_escape_string(serialize($data)) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id, $this->mysql)) { return true; } } elseif (mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(\'' . mysql_real_escape_string($this->id) . '\', 0, \'' . mysql_real_escape_string(serialize($data)) . '\', ' . time() . ')', $this->mysql)) { return true; } } } return false; } public function load() { if ($this->mysql && ($query = mysql_query('SELECT `items`, `data` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($row = mysql_fetch_row($query))) { { $items = (int) $this->options['items'][0]; } else { $items = (int) $row[0]; } if ($items !== 0) { { $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]; } { $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]; } { $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]; } { $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]; } else { $feed = null; } if ($feed !== null) { $sql = 'SELECT `data` FROM `' . $this->options['prefix'][0] . 'items` WHERE `feed_id` = \'' . mysql_real_escape_string($this->id) . '\' ORDER BY `posted` DESC'; if ($items > 0) { $sql .= ' LIMIT ' . $items; } { { } } else { return false; } } } return $data; } return false; } public function mtime() { if ($this->mysql && ($query = mysql_query('SELECT `mtime` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($row = mysql_fetch_row($query))) { return $row[0]; } else { return false; } } { if ($this->mysql && ($query = mysql_query('UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `mtime` = ' . time() . ' WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && mysql_affected_rows($this->mysql)) { return true; } else { return false; } } { if ($this->mysql && ($query = mysql_query('DELETE FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($query2 = mysql_query('DELETE FROM `' . $this->options['prefix'][0] . 'items` WHERE `feed_id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql))) { return true; } else { return false; } } } class SimplePie_Cache { private function __construct() { } public static function create($location, $filename, $extension) { $location_iri = new SimplePie_IRI($location); switch ($location_iri->get_scheme()) { case 'mysql': { return new SimplePie_Cache_MySQL($location_iri, $filename, $extension); } break; default: return new SimplePie_Cache_File($location, $filename, $extension); } } } class SimplePie_Caption { var $type; var $lang; var $startTime; var $endTime; var $text; public function __construct($type = null, $lang = null, $startTime = null, $endTime = null, $text = null) { $this->type = $type; $this->lang = $lang; $this->startTime = $startTime; $this->endTime = $endTime; $this->text = $text; } public function __toString() { } public function get_endtime() { if ($this->endTime !== null) { return $this->endTime; } else { return null; } } public function get_language() { if ($this->lang !== null) { return $this->lang; } else { return null; } } public function get_starttime() { if ($this->startTime !== null) { return $this->startTime; } else { return null; } } public function get_text() { if ($this->text !== null) { return $this->text; } else { return null; } } public function get_type() { if ($this->type !== null) { return $this->type; } else { return null; } } } class SimplePie_Category { var $term; var $scheme; var $label; public function __construct($term = null, $scheme = null, $label = null) { $this->term = $term; $this->scheme = $scheme; $this->label = $label; } public function __toString() { } public function get_term() { if ($this->term !== null) { return $this->term; } else { return null; } } public function get_scheme() { if ($this->scheme !== null) { return $this->scheme; } else { return null; } } public function get_label() { if ($this->label !== null) { return $this->label; } else { return $this->get_term(); } } } class SimplePie_Content_Type_Sniffer { var $file; public function __construct($file) { } public function get_type() { { && ($this->file->headers['content-type'] === 'text/plain' || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1' || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1')) { return $this->text_or_binary(); } { } else { $official = $this->file->headers['content-type']; } if ($official === 'unknown/unknown' || $official === 'application/unknown') { return $this->unknown(); } || $official === 'text/xml' || $official === 'application/xml') { return $official; } { if ($return = $this->image()) { return $return; } else { return $official; } } elseif ($official === 'text/html') { return $this->feed_or_html(); } else { return $official; } } else { return $this->unknown(); } } public function text_or_binary() { { return 'text/plain'; } { return 'application/octect-stream'; } else { return 'text/plain'; } } public function unknown() { { return 'text/html'; } { return 'application/pdf'; } { return 'application/postscript'; } { return 'image/gif'; } { return 'image/png'; } { return 'image/jpeg'; } { return 'image/bmp'; } else { return $this->text_or_binary(); } } public function image() { { return 'image/gif'; } { return 'image/png'; } { return 'image/jpeg'; } { return 'image/bmp'; } else { return false; } } public function feed_or_html() { while ($pos < $len) { switch ($this->file->body[$pos]) { case "\x09": case "\x0A": case "\x0D": case "\x20": continue 2; case '<': $pos++; break; default: return 'text/html'; } { $pos += 3; { $pos += 3; } else { return 'text/html'; } } { { $pos++; } else { return 'text/html'; } } { { $pos += 2; } else { return 'text/html'; } } { return 'application/rss+xml'; } { return 'application/atom+xml'; } else { return 'text/html'; } } return 'text/html'; } } class SimplePie_Copyright { var $url; var $label; public function __construct($url = null, $label = null) { $this->url = $url; $this->label = $label; } public function __toString() { } public function get_url() { if ($this->url !== null) { return $this->url; } else { return null; } } public function get_attribution() { if ($this->label !== null) { return $this->label; } else { return null; } } } define('SIMPLEPIE_USERAGENT', SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION . ' (Feed Parser; ' . SIMPLEPIE_URL . '; Allow like Gecko) Build/' . SIMPLEPIE_BUILD); define('SIMPLEPIE_LINKBACK', '<a href="' . SIMPLEPIE_URL . '" title="' . SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . '">' . SIMPLEPIE_NAME . '</a>'); define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*'); define('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*'); class SimplePie_Core { public $error; public $sanitize; public $useragent = SIMPLEPIE_USERAGENT; public $feed_url; public $file; public $raw_data; public $timeout = 10; public $force_fsockopen = false; public $force_feed = false; public $xml_dump = false; public $cache = true; public $cache_duration = 3600; public $autodiscovery_cache_duration = 604800; public $cache_location = '/system/cms/cache/default/simplepie'; public $cache_name_function = 'md5'; public $order_by_date = true; public $input_encoding = false; public $autodiscovery = SIMPLEPIE_LOCATOR_ALL; public $cache_class = 'SimplePie_Cache'; public $locator_class = 'SimplePie_Locator'; public $parser_class = 'SimplePie_Parser'; public $file_class = 'SimplePie_File'; public $item_class = 'SimplePie_Item'; public $author_class = 'SimplePie_Author'; public $category_class = 'SimplePie_Category'; public $enclosure_class = 'SimplePie_Enclosure'; public $caption_class = 'SimplePie_Caption'; public $copyright_class = 'SimplePie_Copyright'; public $credit_class = 'SimplePie_Credit'; public $rating_class = 'SimplePie_Rating'; public $restriction_class = 'SimplePie_Restriction'; public $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer'; public $source_class = 'SimplePie_Source'; public $javascript = 'js'; public $max_checked_feeds = 10; public $image_handler = ''; public $config_settings = null; public $item_limit = 0; public $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'); public $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'); public function __construct() { { } $this->sanitize = new SimplePie_Sanitize(); { trigger_error('Passing parameters to the constructor is no longer supported. Please use set_feed_url(), set_cache_location(), and set_cache_location() directly.'); } } public function __toString() { } public function __destruct() { if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode')) { { foreach ($this->data['items'] as $item) { $item->__destruct(); } } { foreach ($this->data['ordered_items'] as $item) { $item->__destruct(); } } } } public function force_feed($enable = false) { $this->force_feed = (bool) $enable; } public function set_feed_url($url) { { foreach ($url as $value) { $this->multifeed_url[] = SimplePie_Misc::fix_protocol($value, 1); } } else { $this->feed_url = SimplePie_Misc::fix_protocol($url, 1); } } public function set_file(&$file) { { $this->feed_url = $file->url; return true; } return false; } public function set_raw_data($data) { $this->raw_data = $data; } public function set_timeout($timeout = 10) { $this->timeout = (int) $timeout; } public function force_fsockopen($enable = false) { $this->force_fsockopen = (bool) $enable; } public function enable_cache($enable = true) { $this->cache = (bool) $enable; } public function set_cache_duration($seconds = 3600) { $this->cache_duration = (int) $seconds; } public function set_autodiscovery_cache_duration($seconds = 604800) { $this->autodiscovery_cache_duration = (int) $seconds; } public function set_cache_location($location = '/system/cms/cache/default/simplepie') { $this->cache_location = (string) $location; } public function enable_order_by_date($enable = true) { $this->order_by_date = (bool) $enable; } public function set_input_encoding($encoding = false) { if ($encoding) { $this->input_encoding = (string) $encoding; } else { $this->input_encoding = false; } } public function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL) { $this->autodiscovery = (int) $level; } public function set_cache_class($class = 'SimplePie_Cache') { { $this->cache_class = $class; return true; } return false; } public function set_locator_class($class = 'SimplePie_Locator') { { $this->locator_class = $class; return true; } return false; } public function set_parser_class($class = 'SimplePie_Parser') { { $this->parser_class = $class; return true; } return false; } public function set_file_class($class = 'SimplePie_File') { { $this->file_class = $class; return true; } return false; } public function set_sanitize_class($class = 'SimplePie_Sanitize') { { $this->sanitize = new $class(); return true; } return false; } public function set_item_class($class = 'SimplePie_Item') { { $this->item_class = $class; return true; } return false; } public function set_author_class($class = 'SimplePie_Author') { { $this->author_class = $class; return true; } return false; } public function set_category_class($class = 'SimplePie_Category') { { $this->category_class = $class; return true; } return false; } public function set_enclosure_class($class = 'SimplePie_Enclosure') { { $this->enclosure_class = $class; return true; } return false; } public function set_caption_class($class = 'SimplePie_Caption') { { $this->caption_class = $class; return true; } return false; } public function set_copyright_class($class = 'SimplePie_Copyright') { { $this->copyright_class = $class; return true; } return false; } public function set_credit_class($class = 'SimplePie_Credit') { { $this->credit_class = $class; return true; } return false; } public function set_rating_class($class = 'SimplePie_Rating') { { $this->rating_class = $class; return true; } return false; } public function set_restriction_class($class = 'SimplePie_Restriction') { { $this->restriction_class = $class; return true; } return false; } public function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer') { { $this->content_type_sniffer_class = $class; return true; } return false; } public function set_source_class($class = 'SimplePie_Source') { { $this->source_class = $class; return true; } return false; } public function set_useragent($ua = SIMPLEPIE_USERAGENT) { $this->useragent = (string) $ua; } public function set_cache_name_function($function = 'md5') { { $this->cache_name_function = $function; } } public function set_javascript($get = 'js') { if ($get) { $this->javascript = (string) $get; } else { $this->javascript = false; } } public function set_stupidly_fast($set = false) { if ($set) { $this->enable_order_by_date(false); $this->remove_div(false); $this->strip_comments(false); $this->strip_htmltags(false); $this->strip_attributes(false); $this->set_image_handler(false); } } public function set_max_checked_feeds($max = 10) { $this->max_checked_feeds = (int) $max; } public function remove_div($enable = true) { $this->sanitize->remove_div($enable); } public function strip_htmltags($tags = '', $encode = null) { if ($tags === '') { $tags = $this->strip_htmltags; } $this->sanitize->strip_htmltags($tags); if ($encode !== null) { $this->sanitize->encode_instead_of_strip($tags); } } public function encode_instead_of_strip($enable = true) { $this->sanitize->encode_instead_of_strip($enable); } public function strip_attributes($attribs = '') { if ($attribs === '') { $attribs = $this->strip_attributes; } $this->sanitize->strip_attributes($attribs); } public function set_output_encoding($encoding = 'UTF-8') { $this->sanitize->set_output_encoding($encoding); } public function strip_comments($strip = false) { $this->sanitize->strip_comments($strip); } { $this->sanitize->set_url_replacements($element_attribute); } public function set_image_handler($page = false, $qs = 'i') { if ($page !== false) { $this->sanitize->set_image_handler($page . '?' . $qs . '='); } else { $this->image_handler = ''; } } public function set_item_limit($limit = 0) { $this->item_limit = (int) $limit; } public function init() { if ((function_exists('version_compare') && version_compare(PHP_VERSION, '5.0', '<')) || !extension_loaded('xml') || !extension_loaded('pcre')) { return false; } { static $xml_is_sane = null; if ($xml_is_sane === null) { } if (!$xml_is_sane) { return false; } } { SimplePie_Misc::output_javascript(); exit; } $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->cache_class); $this->sanitize->pass_file_data($this->file_class, $this->timeout, $this->useragent, $this->force_fsockopen); if ($this->feed_url !== null || $this->raw_data !== null) { $this->error = null; $cache = false; if ($this->feed_url !== null) { if ($this->cache && $parsed_feed_url['scheme'] !== '') { $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'); } if ($cache && !$this->xml_dump) { $this->data = $cache->load(); { { } { $cache = false; } { { if ($this->data['feed_url'] === $this->data['url']) { } else { $this->set_feed_url($this->data['feed_url']); return $this->init(); } } } { { { $headers['if-modified-since'] = $this->data['headers']['last-modified']; } { $headers['if-none-match'] = '"' . $this->data['headers']['etag'] . '"'; } $file = new $this->file_class($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen); if ($file->success) { if ($file->status_code === 304) { return true; } else { $headers = $file->headers; } } else { } } } else { return true; } } else { } } { { } else { $file = new $this->file_class($this->feed_url, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen); } } if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) { $this->error = $file->error; { return true; } else { return false; } } if (!$this->force_feed) { $locate = new $this->locator_class($file, $this->timeout, $this->useragent, $this->file_class, $this->max_checked_feeds, $this->content_type_sniffer_class); if (!$locate->is_feed($file)) { if ($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds)) { if ($cache) { $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD); // die(var_dump($this)); if (!$cache->save($this)) { trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); } $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'); } $this->feed_url = $file->url; } else { $this->error = "A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or " . SIMPLEPIE_NAME . " was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed."; SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); return false; } } $locate = null; } $headers = $file->headers; $data = $file->body; $sniffer = new $this->content_type_sniffer_class($file); $sniffed = $sniffer->get_type(); } else { $data = $this->raw_data; } if ($this->input_encoding !== false) { $encodings[] = $this->input_encoding; } $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity'); { { if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) { } $encodings[] = 'UTF-8'; } { if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) { $encodings[] = $charset[1]; } $encodings[] = 'US-ASCII'; } { $encodings[] = 'US-ASCII'; } } $encodings[] = 'UTF-8'; $encodings[] = 'ISO-8859-1'; if ($this->xml_dump) { echo $data; exit; } foreach ($encodings as $encoding) { if ($utf8_data = SimplePie_Misc::change_encoding($data, $encoding, 'UTF-8')) { $parser = new $this->parser_class(); if ($parser->parse($utf8_data, 'UTF-8')) { $this->data = $parser->get_data(); if ($this->get_type() & ~SIMPLEPIE_TYPE_NONE) { { $this->data['headers'] = $headers; } $this->data['build'] = SIMPLEPIE_BUILD; if ($cache && !$cache->save($this)) { trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); } return true; } else { $this->error = "A feed could not be found at $this->feed_url. This does not appear to be a valid RSS or Atom feed."; SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); return false; } } } } { $this->error = sprintf('This XML document is invalid, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column()); } else { $this->error = 'The data could not be converted to UTF-8. You MUST have either the iconv or mbstring extension installed. Upgrading to PHP 5.x (which includes iconv) is highly recommended.'; } SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); return false; } { $i = 0; $success = 0; foreach ($this->multifeed_url as $url) { $this->multifeed_objects[$i] = clone $this; $this->multifeed_objects[$i]->set_feed_url($url); $success |= $this->multifeed_objects[$i]->init(); $i++; } return (bool) $success; } else { return false; } } public function error() { return $this->error; } public function get_encoding() { return $this->sanitize->output_encoding; } public function handle_content_type($mime = 'text/html') { { $header = "Content-type: $mime;"; if ($this->get_encoding()) { $header .= ' charset=' . $this->get_encoding(); } else { $header .= ' charset=UTF-8'; } } } public function get_type() { { $this->data['type'] = SIMPLEPIE_TYPE_ALL; { $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10; } { $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03; } { if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel']) || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image']) || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']) || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput'])) { $this->data['type'] &= SIMPLEPIE_TYPE_RSS_10; } if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel']) || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image']) || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']) || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput'])) { $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090; } } { $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL; { { case '0.91': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091; if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) { switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) { case '0': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE; break; case '24': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND; break; } } break; case '0.92': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_092; break; case '0.93': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_093; break; case '0.94': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_094; break; case '2.0': $this->data['type'] &= SIMPLEPIE_TYPE_RSS_20; break; } } } else { $this->data['type'] = SIMPLEPIE_TYPE_NONE; } } return $this->data['type']; } public function subscribe_url() { if ($this->feed_url !== null) { return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI); } else { return null; } } public function get_feed_tags($namespace, $tag) { $type = $this->get_type(); if ($type & SIMPLEPIE_TYPE_ATOM_10) { { return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]; } } if ($type & SIMPLEPIE_TYPE_ATOM_03) { { return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]; } } if ($type & SIMPLEPIE_TYPE_RSS_RDF) { { return $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]; } } if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) { { return $this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]; } } return null; } public function get_channel_tags($namespace, $tag) { $type = $this->get_type(); if ($type & SIMPLEPIE_TYPE_ATOM_ALL) { if ($return = $this->get_feed_tags($namespace, $tag)) { return $return; } } if ($type & SIMPLEPIE_TYPE_RSS_10) { if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel')) { { return $channel[0]['child'][$namespace][$tag]; } } } if ($type & SIMPLEPIE_TYPE_RSS_090) { if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel')) { { return $channel[0]['child'][$namespace][$tag]; } } } if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) { if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel')) { { return $channel[0]['child'][$namespace][$tag]; } } } return null; } public function get_image_tags($namespace, $tag) { $type = $this->get_type(); if ($type & SIMPLEPIE_TYPE_RSS_10) { if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image')) { { return $image[0]['child'][$namespace][$tag]; } } } if ($type & SIMPLEPIE_TYPE_RSS_090) { if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image')) { { return $image[0]['child'][$namespace][$tag]; } } } if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) { if ($image = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'image')) { { return $image[0]['child'][$namespace][$tag]; } } } return null; } { { return $element['xml_base']; } elseif ($this->get_link() !== null) { return $this->get_link(); } else { return $this->subscribe_url(); } } public function sanitize($data, $type, $base = '') { return $this->sanitize->sanitize($data, $type, $base); } public function get_title() { if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) { return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) { return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) { return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } else { return null; } } public function get_category($key = 0) { $categories = $this->get_categories(); { return $categories[$key]; } else { return null; } } public function get_categories() { { $term = null; $scheme = null; $label = null; { $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); } { $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); } { $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); } $categories[] = new $this->category_class($term, $scheme, $label); } { $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); { $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); } else { $scheme = null; } $categories[] = new $this->category_class($term, $scheme, null); } { $categories[] = new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); } { $categories[] = new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); } { } else { return null; } } public function get_author($key = 0) { $authors = $this->get_authors(); { return $authors[$key]; } else { return null; } } public function get_authors() { { $name = null; $uri = null; $email = null; { $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } { $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); } { $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $authors[] = new $this->author_class($name, $uri, $email); } } if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) { $name = null; $url = null; $email = null; { $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } { $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); } { $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $authors[] = new $this->author_class($name, $url, $email); } } { $authors[] = new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); } { $authors[] = new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); } { $authors[] = new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); } { } else { return null; } } public function get_contributor($key = 0) { $contributors = $this->get_contributors(); { return $contributors[$key]; } else { return null; } } public function get_contributors() { foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) { $name = null; $uri = null; $email = null; { $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } { $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); } { $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $uri !== null) { $contributors[] = new $this->author_class($name, $uri, $email); } } foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) { $name = null; $url = null; $email = null; { $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } { $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); } { $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); } if ($name !== null || $email !== null || $url !== null) { $contributors[] = new $this->author_class($name, $url, $email); } } { } else { return null; } } public function get_link($key = 0, $rel = 'alternate') { $links = $this->get_links($rel); { return $links[$key]; } else { return null; } } public function get_permalink() { return $this->get_link(0); } public function get_links($rel = 'alternate') { { if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link')) { foreach ($links as $link) { {
URL: http://simplepie.org