Example #1
0
 /**
  * Create a new cache object
  * @param string $location Location string (from SimplePie::$cache_location)
  * @param string $name     Unique ID for the cache
  * @param string $type     Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
  */
 public function __construct($location, $name, $type)
 {
     $this->options = array('host' => '127.0.0.1', 'port' => 11211, 'extras' => array('timeout' => 3600, 'prefix' => 'simplepie_'));
     $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));
     $this->name = $this->options['extras']['prefix'] . md5("{$name}:{$type}");
     $this->cache = new Memcached();
     $this->cache->addServer($this->options['host'], (int) $this->options['port']);
 }
 /**
  * @dataProvider firefoxtests
  */
 public function test_from_file($data)
 {
     $locator = new SimplePie_Locator($data, 0, null, 'MockSimplePie_File', false);
     $expected = SimplePie_Misc::get_element('link', $data->body);
     $feed = $locator->find(SIMPLEPIE_LOCATOR_ALL, $all);
     $this->assertFalse($locator->is_feed($data), 'HTML document not be a feed itself');
     $this->assertInstanceOf('MockSimplePie_File', $feed);
     $expected = array_map(array(get_class(), 'map_url_attrib'), $expected);
     $success = array_filter($expected, array(get_class(), 'filter_success'));
     $found = array_map(array(get_class(), 'map_url_file'), $all);
     $this->assertEquals($success, $found);
 }
 function find($uri = NULL)
 {
     $ret = array();
     if (!is_null($this->data($uri))) {
         if ($this->is_feed($uri)) {
             $href = array($this->uri);
         } else {
             // Assume that we have HTML or XHTML (even if we don't, who's it gonna hurt?)
             // Autodiscovery is the preferred method
             $href = $this->_link_rel_feeds();
             // ... but we'll also take the little orange buttons
             $href = array_merge($href, $this->_a_href_feeds(TRUE));
             // If all that failed, look harder
             if (count($href) == 0) {
                 $href = $this->_a_href_feeds(FALSE);
             }
             // Our search may turn up duplicate URIs. We only need to do any given URI once.
             // Props to Camilo <http://projects.radgeek.com/2008/12/14/feedwordpress-20081214/#comment-20090122160414>
             $href = array_unique($href);
         }
         /* if */
         // Try some clever URL little tricks before we go
         $href = array_merge($href, $this->_url_manipulation_feeds());
         $href = array_unique($href);
         // Verify feeds and resolve relative URIs
         foreach ($href as $u) {
             $the_uri = SimplePie_Misc::absolutize_url($u, $this->uri);
             if ($this->verify and ($u != $this->uri and $the_uri != $this->uri)) {
                 $feed = new FeedFinder($the_uri);
                 if ($feed->is_feed()) {
                     $ret[] = $the_uri;
                 }
                 unset($feed);
             } else {
                 $ret[] = $the_uri;
             }
         }
         /* foreach */
     }
     /* if */
     return array_values($ret);
 }
Example #4
0
 /**
  * Tries to get a favicon from a page
  * @param string $url the url to the page
  * @return string the full url to the page
  */
 protected function extractFromPage($url)
 {
     if (!$url) {
         return null;
     }
     $file = $this->getFile($url);
     if ($file->body !== '') {
         $document = new \DOMDocument();
         @$document->loadHTML($file->body);
         if ($document) {
             $xpath = new \DOMXpath($document);
             $elements = $xpath->query("//link[contains(@rel, 'icon')]");
             if ($elements->length > 0) {
                 $iconPath = $elements->item(0)->getAttribute('href');
                 $absPath = \SimplePie_Misc::absolutize_url($iconPath, $url);
                 return $absPath;
             }
         }
     }
 }
 public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
 {
     if (class_exists('idna_convert')) {
         $idn = new idna_convert();
         $parsed = SimplePie_Misc::parse_url($url);
         $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
     }
     $this->url = $url;
     $this->useragent = $useragent;
     if (preg_match('/^http(s)?:\\/\\//i', $url)) {
         if (!is_array($headers)) {
             $headers = array();
         }
         $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL;
         $headers2 = array();
         foreach ($headers as $key => $value) {
             $headers2[] = "{$key}: {$value}";
         }
         //TODO: allow for HTTP headers
         // curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
         $response = self::$agent->get($url);
         if ($response === false || !isset($response['status_code'])) {
             $this->error = 'failed to fetch URL';
             $this->success = false;
         } else {
             // The extra lines at the end are there to satisfy SimplePie's HTTP parser.
             // The class expects a full HTTP message, whereas we're giving it only
             // headers - the new lines indicate the start of the body.
             $parser = new SimplePie_HTTP_Parser($response['headers'] . "\r\n\r\n");
             if ($parser->parse()) {
                 $this->headers = $parser->headers;
                 //$this->body = $parser->body;
                 $this->body = $response['body'];
                 $this->status_code = $parser->status_code;
             }
         }
     } else {
         $this->error = 'invalid URL';
         $this->success = false;
     }
 }
Example #6
0
 /**
  * Create a new cache object
  *
  * @param string $location Location string (from SimplePie::$cache_location)
  * @param string $name Unique ID for the cache
  * @param string $type Either TYPE_FEED for SimplePie data, or TYPE_IMAGE for image data
  */
 public function __construct($location, $name, $type)
 {
     $this->options = array('user' => null, 'pass' => null, 'host' => '127.0.0.1', 'port' => '3306', 'path' => '', 'extras' => array('prefix' => '', 'cache_purge_time' => 2592000));
     $this->options = SimplePie_Misc::array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));
     // Path is prefixed with a "/"
     $this->options['dbname'] = substr($this->options['path'], 1);
     try {
         $this->mysql = new PDO("mysql:dbname={$this->options['dbname']};host={$this->options['host']};port={$this->options['port']}", $this->options['user'], $this->options['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
     } catch (PDOException $e) {
         $this->mysql = null;
         return;
     }
     $this->id = $name . $type;
     if (!($query = $this->mysql->query('SHOW TABLES'))) {
         $this->mysql = null;
         return;
     }
     $db = array();
     while ($row = $query->fetchColumn()) {
         $db[] = $row;
     }
     if (!in_array($this->options['extras']['prefix'] . 'cache_data', $db)) {
         $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . '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 ($query === false) {
             trigger_error("Can't create " . $this->options['extras']['prefix'] . "cache_data table, check permissions", E_USER_WARNING);
             $this->mysql = null;
             return;
         }
     }
     if (!in_array($this->options['extras']['prefix'] . 'items', $db)) {
         $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` MEDIUMBLOB NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))');
         if ($query === false) {
             trigger_error("Can't create " . $this->options['extras']['prefix'] . "items table, check permissions", E_USER_WARNING);
             $this->mysql = null;
             return;
         }
     }
 }
Example #7
0
 public function get_copyright()
 {
     if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) {
         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, 'copyright')) {
         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_20, 'copyright')) {
         return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
     } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) {
         return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
     } elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) {
         return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
     } else {
         return null;
     }
 }
Example #8
0
<?php

require_once "config.php";
require_once "lib/simplepie/simplepie.inc";
SimplePie_Misc::display_cached_file($_GET['i'], SIMPLEPIE_CACHE_DIR, 'spi');
 function find($uri = NULL, $params = array())
 {
     $params = wp_parse_args($params, array("authentication" => -1, "username" => NULL, "password" => NULL));
     // Equivalents
     if ($params['authentication'] == '-') {
         $params['authentication'] = NULL;
         $params['username'] = NULL;
         $params['password'] = NULL;
     }
     // Set/reset
     if ($params['authentication'] != -1) {
         $this->credentials = array("authentication" => $params['authentication'], "username" => $params['username'], "password" => $params['password']);
     }
     $ret = array();
     if (!is_null($this->data($uri))) {
         if ($this->is_opml($uri)) {
             $href = $this->_opml_rss_uris();
         } else {
             if ($this->is_feed($uri)) {
                 $href = array($this->uri);
             } else {
                 // Assume that we have HTML or XHTML (even if we don't, who's
                 // it gonna hurt?) Autodiscovery is the preferred method.
                 $href = $this->_link_rel_feeds();
                 // ... but we'll also take the little orange buttons
                 if ($this->fallbacks > 0) {
                     $href = array_merge($href, $this->_a_href_feeds(TRUE));
                 }
                 // If all that failed, look harder
                 if ($this->fallbacks > 1) {
                     if (count($href) == 0) {
                         $href = $this->_a_href_feeds(FALSE);
                     }
                 }
                 // Our search may turn up duplicate URIs. We only need to do
                 // any given URI once. Props to Camilo <http://projects.radgeek.com/2008/12/14/feedwordpress-20081214/#comment-20090122160414>
                 $href = array_unique($href);
             }
             // Try some clever URL little tricks before we go
             if ($this->fallbacks > 2) {
                 $href = array_merge($href, $this->_url_manipulation_feeds());
             }
         }
         $href = array_unique($href);
         // Verify feeds and resolve relative URIs
         foreach ($href as $u) {
             $the_uri = SimplePie_Misc::absolutize_url($u, $this->uri);
             if ($this->verify and ($u != $this->uri and $the_uri != $this->uri)) {
                 $feed = new FeedFinder($the_uri, $this->credentials);
                 if ($feed->is_feed()) {
                     $ret[] = $the_uri;
                 }
                 unset($feed);
             } else {
                 $ret[] = $the_uri;
             }
         }
     }
     if ($this->is_401($uri)) {
         $ret = array_merge(array(new WP_Error('http_request_failed', '401 Not authorized', array("uri" => $this->uri, "status" => 401))), $ret);
     }
     return array_values($ret);
 }
Example #10
0
 /**
  * Grabs all available enclosures (podcasts, etc.)
  *
  * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.
  *
  * At this point, we're pretty much assuming that all enclosures for an item are the same content.  Anything else is too complicated to properly support.
  *
  * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4).
  * @todo If an element exists at a level, but it's value is empty, we should fall back to the value from the parent (if it exists).
  */
 public function get_enclosures()
 {
     if (!isset($this->data['enclosures'])) {
         $this->data['enclosures'] = array();
         // Elements
         $captions_parent = null;
         $categories_parent = null;
         $copyrights_parent = null;
         $credits_parent = null;
         $description_parent = null;
         $duration_parent = null;
         $hashes_parent = null;
         $keywords_parent = null;
         $player_parent = null;
         $ratings_parent = null;
         $restrictions_parent = null;
         $thumbnails_parent = null;
         $title_parent = null;
         // Let's do the channel and item-level ones first, and just re-use them if we need to.
         $parent = $this->get_feed();
         // CAPTIONS
         if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text')) {
             foreach ($captions as $caption) {
                 $caption_type = null;
                 $caption_lang = null;
                 $caption_startTime = null;
                 $caption_endTime = null;
                 $caption_text = null;
                 if (isset($caption['attribs']['']['type'])) {
                     $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($caption['attribs']['']['lang'])) {
                     $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($caption['attribs']['']['start'])) {
                     $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($caption['attribs']['']['end'])) {
                     $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($caption['data'])) {
                     $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 $captions_parent[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
             }
         } elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text')) {
             foreach ($captions as $caption) {
                 $caption_type = null;
                 $caption_lang = null;
                 $caption_startTime = null;
                 $caption_endTime = null;
                 $caption_text = null;
                 if (isset($caption['attribs']['']['type'])) {
                     $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($caption['attribs']['']['lang'])) {
                     $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($caption['attribs']['']['start'])) {
                     $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($caption['attribs']['']['end'])) {
                     $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($caption['data'])) {
                     $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 $captions_parent[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
             }
         }
         if (is_array($captions_parent)) {
             $captions_parent = array_values(SimplePie_Misc::array_unique($captions_parent));
         }
         // CATEGORIES
         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category) {
             $term = null;
             $scheme = null;
             $label = null;
             if (isset($category['data'])) {
                 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
             if (isset($category['attribs']['']['scheme'])) {
                 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
             } else {
                 $scheme = 'http://search.yahoo.com/mrss/category_schema';
             }
             if (isset($category['attribs']['']['label'])) {
                 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
             $categories_parent[] = new $this->feed->category_class($term, $scheme, $label);
         }
         foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category) {
             $term = null;
             $scheme = null;
             $label = null;
             if (isset($category['data'])) {
                 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
             if (isset($category['attribs']['']['scheme'])) {
                 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
             } else {
                 $scheme = 'http://search.yahoo.com/mrss/category_schema';
             }
             if (isset($category['attribs']['']['label'])) {
                 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
             $categories_parent[] = new $this->feed->category_class($term, $scheme, $label);
         }
         foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category) {
             $term = null;
             $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
             $label = null;
             if (isset($category['attribs']['']['text'])) {
                 $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
             $categories_parent[] = new $this->feed->category_class($term, $scheme, $label);
             if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'])) {
                 foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory) {
                     if (isset($subcategory['attribs']['']['text'])) {
                         $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
                     }
                     $categories_parent[] = new $this->feed->category_class($term, $scheme, $label);
                 }
             }
         }
         if (is_array($categories_parent)) {
             $categories_parent = array_values(SimplePie_Misc::array_unique($categories_parent));
         }
         // COPYRIGHT
         if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright')) {
             $copyright_url = null;
             $copyright_label = null;
             if (isset($copyright[0]['attribs']['']['url'])) {
                 $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
             if (isset($copyright[0]['data'])) {
                 $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
             $copyrights_parent = new $this->feed->copyright_class($copyright_url, $copyright_label);
         } elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright')) {
             $copyright_url = null;
             $copyright_label = null;
             if (isset($copyright[0]['attribs']['']['url'])) {
                 $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
             if (isset($copyright[0]['data'])) {
                 $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
             $copyrights_parent = new $this->feed->copyright_class($copyright_url, $copyright_label);
         }
         // CREDITS
         if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit')) {
             foreach ($credits as $credit) {
                 $credit_role = null;
                 $credit_scheme = null;
                 $credit_name = null;
                 if (isset($credit['attribs']['']['role'])) {
                     $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($credit['attribs']['']['scheme'])) {
                     $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                 } else {
                     $credit_scheme = 'urn:ebu';
                 }
                 if (isset($credit['data'])) {
                     $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 $credits_parent[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
             }
         } elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit')) {
             foreach ($credits as $credit) {
                 $credit_role = null;
                 $credit_scheme = null;
                 $credit_name = null;
                 if (isset($credit['attribs']['']['role'])) {
                     $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($credit['attribs']['']['scheme'])) {
                     $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                 } else {
                     $credit_scheme = 'urn:ebu';
                 }
                 if (isset($credit['data'])) {
                     $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 $credits_parent[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
             }
         }
         if (is_array($credits_parent)) {
             $credits_parent = array_values(SimplePie_Misc::array_unique($credits_parent));
         }
         // DESCRIPTION
         if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description')) {
             if (isset($description_parent[0]['data'])) {
                 $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
         } elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description')) {
             if (isset($description_parent[0]['data'])) {
                 $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
         }
         // DURATION
         if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration')) {
             $seconds = null;
             $minutes = null;
             $hours = null;
             if (isset($duration_parent[0]['data'])) {
                 $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
                 if (sizeof($temp) > 0) {
                     $seconds = (int) array_pop($temp);
                 }
                 if (sizeof($temp) > 0) {
                     $minutes = (int) array_pop($temp);
                     $seconds += $minutes * 60;
                 }
                 if (sizeof($temp) > 0) {
                     $hours = (int) array_pop($temp);
                     $seconds += $hours * 3600;
                 }
                 unset($temp);
                 $duration_parent = $seconds;
             }
         }
         // HASHES
         if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash')) {
             foreach ($hashes_iterator as $hash) {
                 $value = null;
                 $algo = null;
                 if (isset($hash['data'])) {
                     $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($hash['attribs']['']['algo'])) {
                     $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
                 } else {
                     $algo = 'md5';
                 }
                 $hashes_parent[] = $algo . ':' . $value;
             }
         } elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash')) {
             foreach ($hashes_iterator as $hash) {
                 $value = null;
                 $algo = null;
                 if (isset($hash['data'])) {
                     $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($hash['attribs']['']['algo'])) {
                     $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
                 } else {
                     $algo = 'md5';
                 }
                 $hashes_parent[] = $algo . ':' . $value;
             }
         }
         if (is_array($hashes_parent)) {
             $hashes_parent = array_values(SimplePie_Misc::array_unique($hashes_parent));
         }
         // KEYWORDS
         if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords')) {
             if (isset($keywords[0]['data'])) {
                 $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
                 foreach ($temp as $word) {
                     $keywords_parent[] = trim($word);
                 }
             }
             unset($temp);
         } elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords')) {
             if (isset($keywords[0]['data'])) {
                 $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
                 foreach ($temp as $word) {
                     $keywords_parent[] = trim($word);
                 }
             }
             unset($temp);
         } elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords')) {
             if (isset($keywords[0]['data'])) {
                 $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
                 foreach ($temp as $word) {
                     $keywords_parent[] = trim($word);
                 }
             }
             unset($temp);
         } elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords')) {
             if (isset($keywords[0]['data'])) {
                 $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
                 foreach ($temp as $word) {
                     $keywords_parent[] = trim($word);
                 }
             }
             unset($temp);
         }
         if (is_array($keywords_parent)) {
             $keywords_parent = array_values(SimplePie_Misc::array_unique($keywords_parent));
         }
         // PLAYER
         if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player')) {
             if (isset($player_parent[0]['attribs']['']['url'])) {
                 $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
             }
         } elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player')) {
             if (isset($player_parent[0]['attribs']['']['url'])) {
                 $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
             }
         }
         // RATINGS
         if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating')) {
             foreach ($ratings as $rating) {
                 $rating_scheme = null;
                 $rating_value = null;
                 if (isset($rating['attribs']['']['scheme'])) {
                     $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                 } else {
                     $rating_scheme = 'urn:simple';
                 }
                 if (isset($rating['data'])) {
                     $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 $ratings_parent[] = new $this->feed->rating_class($rating_scheme, $rating_value);
             }
         } elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit')) {
             foreach ($ratings as $rating) {
                 $rating_scheme = 'urn:itunes';
                 $rating_value = null;
                 if (isset($rating['data'])) {
                     $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 $ratings_parent[] = new $this->feed->rating_class($rating_scheme, $rating_value);
             }
         } elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating')) {
             foreach ($ratings as $rating) {
                 $rating_scheme = null;
                 $rating_value = null;
                 if (isset($rating['attribs']['']['scheme'])) {
                     $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                 } else {
                     $rating_scheme = 'urn:simple';
                 }
                 if (isset($rating['data'])) {
                     $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 $ratings_parent[] = new $this->feed->rating_class($rating_scheme, $rating_value);
             }
         } elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit')) {
             foreach ($ratings as $rating) {
                 $rating_scheme = 'urn:itunes';
                 $rating_value = null;
                 if (isset($rating['data'])) {
                     $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 $ratings_parent[] = new $this->feed->rating_class($rating_scheme, $rating_value);
             }
         }
         if (is_array($ratings_parent)) {
             $ratings_parent = array_values(SimplePie_Misc::array_unique($ratings_parent));
         }
         // RESTRICTIONS
         if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction')) {
             foreach ($restrictions as $restriction) {
                 $restriction_relationship = null;
                 $restriction_type = null;
                 $restriction_value = null;
                 if (isset($restriction['attribs']['']['relationship'])) {
                     $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($restriction['attribs']['']['type'])) {
                     $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($restriction['data'])) {
                     $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 $restrictions_parent[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
             }
         } elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block')) {
             foreach ($restrictions as $restriction) {
                 $restriction_relationship = 'allow';
                 $restriction_type = null;
                 $restriction_value = 'itunes';
                 if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') {
                     $restriction_relationship = 'deny';
                 }
                 $restrictions_parent[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
             }
         } elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction')) {
             foreach ($restrictions as $restriction) {
                 $restriction_relationship = null;
                 $restriction_type = null;
                 $restriction_value = null;
                 if (isset($restriction['attribs']['']['relationship'])) {
                     $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($restriction['attribs']['']['type'])) {
                     $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($restriction['data'])) {
                     $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 $restrictions_parent[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
             }
         } elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block')) {
             foreach ($restrictions as $restriction) {
                 $restriction_relationship = 'allow';
                 $restriction_type = null;
                 $restriction_value = 'itunes';
                 if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') {
                     $restriction_relationship = 'deny';
                 }
                 $restrictions_parent[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
             }
         }
         if (is_array($restrictions_parent)) {
             $restrictions_parent = array_values(SimplePie_Misc::array_unique($restrictions_parent));
         }
         // THUMBNAILS
         if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) {
             foreach ($thumbnails as $thumbnail) {
                 if (isset($thumbnail['attribs']['']['url'])) {
                     $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
                 }
             }
         } elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) {
             foreach ($thumbnails as $thumbnail) {
                 if (isset($thumbnail['attribs']['']['url'])) {
                     $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
                 }
             }
         }
         // TITLES
         if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title')) {
             if (isset($title_parent[0]['data'])) {
                 $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
         } elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title')) {
             if (isset($title_parent[0]['data'])) {
                 $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
             }
         }
         // Clear the memory
         unset($parent);
         // Attributes
         $bitrate = null;
         $channels = null;
         $duration = null;
         $expression = null;
         $framerate = null;
         $height = null;
         $javascript = null;
         $lang = null;
         $length = null;
         $medium = null;
         $samplingrate = null;
         $type = null;
         $url = null;
         $width = null;
         // Elements
         $captions = null;
         $categories = null;
         $copyrights = null;
         $credits = null;
         $description = null;
         $hashes = null;
         $keywords = null;
         $player = null;
         $ratings = null;
         $restrictions = null;
         $thumbnails = null;
         $title = null;
         // If we have media:group tags, loop through them.
         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group) {
             if (isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'])) {
                 // If we have media:content tags, loop through them.
                 foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) {
                     if (isset($content['attribs']['']['url'])) {
                         // Attributes
                         $bitrate = null;
                         $channels = null;
                         $duration = null;
                         $expression = null;
                         $framerate = null;
                         $height = null;
                         $javascript = null;
                         $lang = null;
                         $length = null;
                         $medium = null;
                         $samplingrate = null;
                         $type = null;
                         $url = null;
                         $width = null;
                         // Elements
                         $captions = null;
                         $categories = null;
                         $copyrights = null;
                         $credits = null;
                         $description = null;
                         $hashes = null;
                         $keywords = null;
                         $player = null;
                         $ratings = null;
                         $restrictions = null;
                         $thumbnails = null;
                         $title = null;
                         // Start checking the attributes of media:content
                         if (isset($content['attribs']['']['bitrate'])) {
                             $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
                         }
                         if (isset($content['attribs']['']['channels'])) {
                             $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
                         }
                         if (isset($content['attribs']['']['duration'])) {
                             $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
                         } else {
                             $duration = $duration_parent;
                         }
                         if (isset($content['attribs']['']['expression'])) {
                             $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
                         }
                         if (isset($content['attribs']['']['framerate'])) {
                             $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
                         }
                         if (isset($content['attribs']['']['height'])) {
                             $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
                         }
                         if (isset($content['attribs']['']['lang'])) {
                             $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
                         }
                         if (isset($content['attribs']['']['fileSize'])) {
                             $length = ceil($content['attribs']['']['fileSize']);
                         }
                         if (isset($content['attribs']['']['medium'])) {
                             $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
                         }
                         if (isset($content['attribs']['']['samplingrate'])) {
                             $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
                         }
                         if (isset($content['attribs']['']['type'])) {
                             $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                         }
                         if (isset($content['attribs']['']['width'])) {
                             $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
                         }
                         $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
                         // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
                         // CAPTIONS
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) {
                             foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) {
                                 $caption_type = null;
                                 $caption_lang = null;
                                 $caption_startTime = null;
                                 $caption_endTime = null;
                                 $caption_text = null;
                                 if (isset($caption['attribs']['']['type'])) {
                                     $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($caption['attribs']['']['lang'])) {
                                     $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($caption['attribs']['']['start'])) {
                                     $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($caption['attribs']['']['end'])) {
                                     $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($caption['data'])) {
                                     $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
                             }
                             if (is_array($captions)) {
                                 $captions = array_values(SimplePie_Misc::array_unique($captions));
                             }
                         } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) {
                             foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) {
                                 $caption_type = null;
                                 $caption_lang = null;
                                 $caption_startTime = null;
                                 $caption_endTime = null;
                                 $caption_text = null;
                                 if (isset($caption['attribs']['']['type'])) {
                                     $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($caption['attribs']['']['lang'])) {
                                     $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($caption['attribs']['']['start'])) {
                                     $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($caption['attribs']['']['end'])) {
                                     $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($caption['data'])) {
                                     $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
                             }
                             if (is_array($captions)) {
                                 $captions = array_values(SimplePie_Misc::array_unique($captions));
                             }
                         } else {
                             $captions = $captions_parent;
                         }
                         // CATEGORIES
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) {
                             foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) {
                                 $term = null;
                                 $scheme = null;
                                 $label = null;
                                 if (isset($category['data'])) {
                                     $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($category['attribs']['']['scheme'])) {
                                     $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 } else {
                                     $scheme = 'http://search.yahoo.com/mrss/category_schema';
                                 }
                                 if (isset($category['attribs']['']['label'])) {
                                     $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 $categories[] = new $this->feed->category_class($term, $scheme, $label);
                             }
                         }
                         if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) {
                             foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) {
                                 $term = null;
                                 $scheme = null;
                                 $label = null;
                                 if (isset($category['data'])) {
                                     $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($category['attribs']['']['scheme'])) {
                                     $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 } else {
                                     $scheme = 'http://search.yahoo.com/mrss/category_schema';
                                 }
                                 if (isset($category['attribs']['']['label'])) {
                                     $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 $categories[] = new $this->feed->category_class($term, $scheme, $label);
                             }
                         }
                         if (is_array($categories) && is_array($categories_parent)) {
                             $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent)));
                         } elseif (is_array($categories)) {
                             $categories = array_values(SimplePie_Misc::array_unique($categories));
                         } elseif (is_array($categories_parent)) {
                             $categories = array_values(SimplePie_Misc::array_unique($categories_parent));
                         }
                         // COPYRIGHTS
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) {
                             $copyright_url = null;
                             $copyright_label = null;
                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) {
                                 $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) {
                                 $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label);
                         } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) {
                             $copyright_url = null;
                             $copyright_label = null;
                             if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) {
                                 $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) {
                                 $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label);
                         } else {
                             $copyrights = $copyrights_parent;
                         }
                         // CREDITS
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) {
                             foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) {
                                 $credit_role = null;
                                 $credit_scheme = null;
                                 $credit_name = null;
                                 if (isset($credit['attribs']['']['role'])) {
                                     $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($credit['attribs']['']['scheme'])) {
                                     $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 } else {
                                     $credit_scheme = 'urn:ebu';
                                 }
                                 if (isset($credit['data'])) {
                                     $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
                             }
                             if (is_array($credits)) {
                                 $credits = array_values(SimplePie_Misc::array_unique($credits));
                             }
                         } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) {
                             foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) {
                                 $credit_role = null;
                                 $credit_scheme = null;
                                 $credit_name = null;
                                 if (isset($credit['attribs']['']['role'])) {
                                     $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($credit['attribs']['']['scheme'])) {
                                     $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 } else {
                                     $credit_scheme = 'urn:ebu';
                                 }
                                 if (isset($credit['data'])) {
                                     $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
                             }
                             if (is_array($credits)) {
                                 $credits = array_values(SimplePie_Misc::array_unique($credits));
                             }
                         } else {
                             $credits = $credits_parent;
                         }
                         // DESCRIPTION
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) {
                             $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                         } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) {
                             $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                         } else {
                             $description = $description_parent;
                         }
                         // HASHES
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) {
                             foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) {
                                 $value = null;
                                 $algo = null;
                                 if (isset($hash['data'])) {
                                     $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($hash['attribs']['']['algo'])) {
                                     $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 } else {
                                     $algo = 'md5';
                                 }
                                 $hashes[] = $algo . ':' . $value;
                             }
                             if (is_array($hashes)) {
                                 $hashes = array_values(SimplePie_Misc::array_unique($hashes));
                             }
                         } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) {
                             foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) {
                                 $value = null;
                                 $algo = null;
                                 if (isset($hash['data'])) {
                                     $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($hash['attribs']['']['algo'])) {
                                     $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 } else {
                                     $algo = 'md5';
                                 }
                                 $hashes[] = $algo . ':' . $value;
                             }
                             if (is_array($hashes)) {
                                 $hashes = array_values(SimplePie_Misc::array_unique($hashes));
                             }
                         } else {
                             $hashes = $hashes_parent;
                         }
                         // KEYWORDS
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) {
                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) {
                                 $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
                                 foreach ($temp as $word) {
                                     $keywords[] = trim($word);
                                 }
                                 unset($temp);
                             }
                             if (is_array($keywords)) {
                                 $keywords = array_values(SimplePie_Misc::array_unique($keywords));
                             }
                         } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) {
                             if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) {
                                 $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
                                 foreach ($temp as $word) {
                                     $keywords[] = trim($word);
                                 }
                                 unset($temp);
                             }
                             if (is_array($keywords)) {
                                 $keywords = array_values(SimplePie_Misc::array_unique($keywords));
                             }
                         } else {
                             $keywords = $keywords_parent;
                         }
                         // PLAYER
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) {
                             $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
                         } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) {
                             $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
                         } else {
                             $player = $player_parent;
                         }
                         // RATINGS
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) {
                             foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) {
                                 $rating_scheme = null;
                                 $rating_value = null;
                                 if (isset($rating['attribs']['']['scheme'])) {
                                     $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 } else {
                                     $rating_scheme = 'urn:simple';
                                 }
                                 if (isset($rating['data'])) {
                                     $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value);
                             }
                             if (is_array($ratings)) {
                                 $ratings = array_values(SimplePie_Misc::array_unique($ratings));
                             }
                         } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) {
                             foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) {
                                 $rating_scheme = null;
                                 $rating_value = null;
                                 if (isset($rating['attribs']['']['scheme'])) {
                                     $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 } else {
                                     $rating_scheme = 'urn:simple';
                                 }
                                 if (isset($rating['data'])) {
                                     $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value);
                             }
                             if (is_array($ratings)) {
                                 $ratings = array_values(SimplePie_Misc::array_unique($ratings));
                             }
                         } else {
                             $ratings = $ratings_parent;
                         }
                         // RESTRICTIONS
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) {
                             foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) {
                                 $restriction_relationship = null;
                                 $restriction_type = null;
                                 $restriction_value = null;
                                 if (isset($restriction['attribs']['']['relationship'])) {
                                     $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($restriction['attribs']['']['type'])) {
                                     $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($restriction['data'])) {
                                     $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
                             }
                             if (is_array($restrictions)) {
                                 $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
                             }
                         } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) {
                             foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) {
                                 $restriction_relationship = null;
                                 $restriction_type = null;
                                 $restriction_value = null;
                                 if (isset($restriction['attribs']['']['relationship'])) {
                                     $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($restriction['attribs']['']['type'])) {
                                     $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 if (isset($restriction['data'])) {
                                     $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                 }
                                 $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
                             }
                             if (is_array($restrictions)) {
                                 $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
                             }
                         } else {
                             $restrictions = $restrictions_parent;
                         }
                         // THUMBNAILS
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) {
                             foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) {
                                 $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
                             }
                             if (is_array($thumbnails)) {
                                 $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
                             }
                         } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) {
                             foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) {
                                 $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
                             }
                             if (is_array($thumbnails)) {
                                 $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
                             }
                         } else {
                             $thumbnails = $thumbnails_parent;
                         }
                         // TITLES
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) {
                             $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                         } elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) {
                             $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                         } else {
                             $title = $title_parent;
                         }
                         $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width);
                     }
                 }
             }
         }
         // If we have standalone media:content tags, loop through them.
         if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'])) {
             foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) {
                 if (isset($content['attribs']['']['url']) || isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) {
                     // Attributes
                     $bitrate = null;
                     $channels = null;
                     $duration = null;
                     $expression = null;
                     $framerate = null;
                     $height = null;
                     $javascript = null;
                     $lang = null;
                     $length = null;
                     $medium = null;
                     $samplingrate = null;
                     $type = null;
                     $url = null;
                     $width = null;
                     // Elements
                     $captions = null;
                     $categories = null;
                     $copyrights = null;
                     $credits = null;
                     $description = null;
                     $hashes = null;
                     $keywords = null;
                     $player = null;
                     $ratings = null;
                     $restrictions = null;
                     $thumbnails = null;
                     $title = null;
                     // Start checking the attributes of media:content
                     if (isset($content['attribs']['']['bitrate'])) {
                         $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
                     }
                     if (isset($content['attribs']['']['channels'])) {
                         $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
                     }
                     if (isset($content['attribs']['']['duration'])) {
                         $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
                     } else {
                         $duration = $duration_parent;
                     }
                     if (isset($content['attribs']['']['expression'])) {
                         $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
                     }
                     if (isset($content['attribs']['']['framerate'])) {
                         $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
                     }
                     if (isset($content['attribs']['']['height'])) {
                         $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
                     }
                     if (isset($content['attribs']['']['lang'])) {
                         $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
                     }
                     if (isset($content['attribs']['']['fileSize'])) {
                         $length = ceil($content['attribs']['']['fileSize']);
                     }
                     if (isset($content['attribs']['']['medium'])) {
                         $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
                     }
                     if (isset($content['attribs']['']['samplingrate'])) {
                         $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
                     }
                     if (isset($content['attribs']['']['type'])) {
                         $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                     }
                     if (isset($content['attribs']['']['width'])) {
                         $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
                     }
                     if (isset($content['attribs']['']['url'])) {
                         $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
                     }
                     // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
                     // CAPTIONS
                     if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) {
                         foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) {
                             $caption_type = null;
                             $caption_lang = null;
                             $caption_startTime = null;
                             $caption_endTime = null;
                             $caption_text = null;
                             if (isset($caption['attribs']['']['type'])) {
                                 $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             if (isset($caption['attribs']['']['lang'])) {
                                 $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             if (isset($caption['attribs']['']['start'])) {
                                 $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             if (isset($caption['attribs']['']['end'])) {
                                 $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             if (isset($caption['data'])) {
                                 $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
                         }
                         if (is_array($captions)) {
                             $captions = array_values(SimplePie_Misc::array_unique($captions));
                         }
                     } else {
                         $captions = $captions_parent;
                     }
                     // CATEGORIES
                     if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) {
                         foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) {
                             $term = null;
                             $scheme = null;
                             $label = null;
                             if (isset($category['data'])) {
                                 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             if (isset($category['attribs']['']['scheme'])) {
                                 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                             } else {
                                 $scheme = 'http://search.yahoo.com/mrss/category_schema';
                             }
                             if (isset($category['attribs']['']['label'])) {
                                 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             $categories[] = new $this->feed->category_class($term, $scheme, $label);
                         }
                     }
                     if (is_array($categories) && is_array($categories_parent)) {
                         $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent)));
                     } elseif (is_array($categories)) {
                         $categories = array_values(SimplePie_Misc::array_unique($categories));
                     } elseif (is_array($categories_parent)) {
                         $categories = array_values(SimplePie_Misc::array_unique($categories_parent));
                     } else {
                         $categories = null;
                     }
                     // COPYRIGHTS
                     if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) {
                         $copyright_url = null;
                         $copyright_label = null;
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) {
                             $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
                         }
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) {
                             $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                         }
                         $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label);
                     } else {
                         $copyrights = $copyrights_parent;
                     }
                     // CREDITS
                     if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) {
                         foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) {
                             $credit_role = null;
                             $credit_scheme = null;
                             $credit_name = null;
                             if (isset($credit['attribs']['']['role'])) {
                                 $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             if (isset($credit['attribs']['']['scheme'])) {
                                 $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                             } else {
                                 $credit_scheme = 'urn:ebu';
                             }
                             if (isset($credit['data'])) {
                                 $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
                         }
                         if (is_array($credits)) {
                             $credits = array_values(SimplePie_Misc::array_unique($credits));
                         }
                     } else {
                         $credits = $credits_parent;
                     }
                     // DESCRIPTION
                     if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) {
                         $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                     } else {
                         $description = $description_parent;
                     }
                     // HASHES
                     if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) {
                         foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) {
                             $value = null;
                             $algo = null;
                             if (isset($hash['data'])) {
                                 $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             if (isset($hash['attribs']['']['algo'])) {
                                 $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
                             } else {
                                 $algo = 'md5';
                             }
                             $hashes[] = $algo . ':' . $value;
                         }
                         if (is_array($hashes)) {
                             $hashes = array_values(SimplePie_Misc::array_unique($hashes));
                         }
                     } else {
                         $hashes = $hashes_parent;
                     }
                     // KEYWORDS
                     if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) {
                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) {
                             $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
                             foreach ($temp as $word) {
                                 $keywords[] = trim($word);
                             }
                             unset($temp);
                         }
                         if (is_array($keywords)) {
                             $keywords = array_values(SimplePie_Misc::array_unique($keywords));
                         }
                     } else {
                         $keywords = $keywords_parent;
                     }
                     // PLAYER
                     if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) {
                         $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
                     } else {
                         $player = $player_parent;
                     }
                     // RATINGS
                     if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) {
                         foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) {
                             $rating_scheme = null;
                             $rating_value = null;
                             if (isset($rating['attribs']['']['scheme'])) {
                                 $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
                             } else {
                                 $rating_scheme = 'urn:simple';
                             }
                             if (isset($rating['data'])) {
                                 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value);
                         }
                         if (is_array($ratings)) {
                             $ratings = array_values(SimplePie_Misc::array_unique($ratings));
                         }
                     } else {
                         $ratings = $ratings_parent;
                     }
                     // RESTRICTIONS
                     if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) {
                         foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) {
                             $restriction_relationship = null;
                             $restriction_type = null;
                             $restriction_value = null;
                             if (isset($restriction['attribs']['']['relationship'])) {
                                 $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             if (isset($restriction['attribs']['']['type'])) {
                                 $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             if (isset($restriction['data'])) {
                                 $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                             }
                             $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
                         }
                         if (is_array($restrictions)) {
                             $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
                         }
                     } else {
                         $restrictions = $restrictions_parent;
                     }
                     // THUMBNAILS
                     if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) {
                         foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) {
                             $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
                         }
                         if (is_array($thumbnails)) {
                             $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
                         }
                     } else {
                         $thumbnails = $thumbnails_parent;
                     }
                     // TITLES
                     if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) {
                         $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                     } else {
                         $title = $title_parent;
                     }
                     $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width);
                 }
             }
         }
         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link) {
             if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') {
                 // Attributes
                 $bitrate = null;
                 $channels = null;
                 $duration = null;
                 $expression = null;
                 $framerate = null;
                 $height = null;
                 $javascript = null;
                 $lang = null;
                 $length = null;
                 $medium = null;
                 $samplingrate = null;
                 $type = null;
                 $url = null;
                 $width = null;
                 $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
                 if (isset($link['attribs']['']['type'])) {
                     $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($link['attribs']['']['length'])) {
                     $length = ceil($link['attribs']['']['length']);
                 }
                 // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
                 $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
             }
         }
         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link) {
             if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') {
                 // Attributes
                 $bitrate = null;
                 $channels = null;
                 $duration = null;
                 $expression = null;
                 $framerate = null;
                 $height = null;
                 $javascript = null;
                 $lang = null;
                 $length = null;
                 $medium = null;
                 $samplingrate = null;
                 $type = null;
                 $url = null;
                 $width = null;
                 $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
                 if (isset($link['attribs']['']['type'])) {
                     $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($link['attribs']['']['length'])) {
                     $length = ceil($link['attribs']['']['length']);
                 }
                 // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
                 $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
             }
         }
         if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure')) {
             if (isset($enclosure[0]['attribs']['']['url'])) {
                 // Attributes
                 $bitrate = null;
                 $channels = null;
                 $duration = null;
                 $expression = null;
                 $framerate = null;
                 $height = null;
                 $javascript = null;
                 $lang = null;
                 $length = null;
                 $medium = null;
                 $samplingrate = null;
                 $type = null;
                 $url = null;
                 $width = null;
                 $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));
                 if (isset($enclosure[0]['attribs']['']['type'])) {
                     $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
                 }
                 if (isset($enclosure[0]['attribs']['']['length'])) {
                     $length = ceil($enclosure[0]['attribs']['']['length']);
                 }
                 // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
                 $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
             }
         }
         if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width)) {
             // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
             $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width);
         }
         $this->data['enclosures'] = array_values(SimplePie_Misc::array_unique($this->data['enclosures']));
     }
     if (!empty($this->data['enclosures'])) {
         return $this->data['enclosures'];
     } else {
         return null;
     }
 }
Example #11
0
 public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
 {
     if (class_exists('idna_convert')) {
         $idn = new idna_convert();
         $parsed = SimplePie_Misc::parse_url($url);
         $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
     }
     $this->url = $url;
     $this->useragent = $useragent;
     if (preg_match('/^http(s)?:\\/\\//i', $url)) {
         if ($useragent === null) {
             $useragent = ini_get('user_agent');
             $this->useragent = $useragent;
         }
         if (!is_array($headers)) {
             $headers = array();
         }
         if (!$force_fsockopen && function_exists('curl_exec')) {
             $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL;
             $fp = curl_init();
             $headers2 = array();
             foreach ($headers as $key => $value) {
                 $headers2[] = "{$key}: {$value}";
             }
             if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>=')) {
                 curl_setopt($fp, CURLOPT_ENCODING, '');
             }
             curl_setopt($fp, CURLOPT_URL, $url);
             curl_setopt($fp, CURLOPT_HEADER, 1);
             curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
             curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
             curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
             curl_setopt($fp, CURLOPT_REFERER, $url);
             curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
             curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
             if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>=')) {
                 curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
                 curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);
             }
             $this->headers = curl_exec($fp);
             if (curl_errno($fp) === 23 || curl_errno($fp) === 61) {
                 curl_setopt($fp, CURLOPT_ENCODING, 'none');
                 $this->headers = curl_exec($fp);
             }
             if (curl_errno($fp)) {
                 $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);
                 $this->success = false;
             } else {
                 $info = curl_getinfo($fp);
                 curl_close($fp);
                 $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1);
                 $this->headers = array_pop($this->headers);
                 $parser = new SimplePie_HTTP_Parser($this->headers);
                 if ($parser->parse()) {
                     $this->headers = $parser->headers;
                     $this->body = $parser->body;
                     $this->status_code = $parser->status_code;
                     if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) {
                         $this->redirects++;
                         $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
                         return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
                     }
                 }
             }
         } else {
             $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
             $url_parts = parse_url($url);
             $socket_host = $url_parts['host'];
             if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') {
                 $socket_host = "ssl://{$url_parts['host']}";
                 $url_parts['port'] = 443;
             }
             if (!isset($url_parts['port'])) {
                 $url_parts['port'] = 80;
             }
             $fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout);
             if (!$fp) {
                 $this->error = 'fsockopen error: ' . $errstr;
                 $this->success = false;
             } else {
                 stream_set_timeout($fp, $timeout);
                 if (isset($url_parts['path'])) {
                     if (isset($url_parts['query'])) {
                         $get = "{$url_parts['path']}?{$url_parts['query']}";
                     } else {
                         $get = $url_parts['path'];
                     }
                 } else {
                     $get = '/';
                 }
                 $out = "GET {$get} HTTP/1.1\r\n";
                 $out .= "Host: {$url_parts['host']}\r\n";
                 $out .= "User-Agent: {$useragent}\r\n";
                 if (extension_loaded('zlib')) {
                     $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n";
                 }
                 if (isset($url_parts['user']) && isset($url_parts['pass'])) {
                     $out .= "Authorization: Basic " . base64_encode("{$url_parts['user']}:{$url_parts['pass']}") . "\r\n";
                 }
                 foreach ($headers as $key => $value) {
                     $out .= "{$key}: {$value}\r\n";
                 }
                 $out .= "Connection: Close\r\n\r\n";
                 fwrite($fp, $out);
                 $info = stream_get_meta_data($fp);
                 $this->headers = '';
                 while (!$info['eof'] && !$info['timed_out']) {
                     $this->headers .= fread($fp, 1160);
                     $info = stream_get_meta_data($fp);
                 }
                 if (!$info['timed_out']) {
                     $parser = new SimplePie_HTTP_Parser($this->headers);
                     if ($parser->parse()) {
                         $this->headers = $parser->headers;
                         $this->body = $parser->body;
                         $this->status_code = $parser->status_code;
                         if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) {
                             $this->redirects++;
                             $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
                             return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
                         }
                         if (isset($this->headers['content-encoding'])) {
                             // Hey, we act dumb elsewhere, so let's do that here too
                             switch (strtolower(trim($this->headers['content-encoding'], "\t\n\r "))) {
                                 case 'gzip':
                                 case 'x-gzip':
                                     $decoder = new SimplePie_gzdecode($this->body);
                                     if (!$decoder->parse()) {
                                         $this->error = 'Unable to decode HTTP "gzip" stream';
                                         $this->success = false;
                                     } else {
                                         $this->body = $decoder->data;
                                     }
                                     break;
                                 case 'deflate':
                                     if (($decompressed = gzinflate($this->body)) !== false) {
                                         $this->body = $decompressed;
                                     } else {
                                         if (($decompressed = gzuncompress($this->body)) !== false) {
                                             $this->body = $decompressed;
                                         } else {
                                             if (function_exists('gzdecode') && ($decompressed = gzdecode($this->body)) !== false) {
                                                 $this->body = $decompressed;
                                             } else {
                                                 $this->error = 'Unable to decode HTTP "deflate" stream';
                                                 $this->success = false;
                                             }
                                         }
                                     }
                                     break;
                                 default:
                                     $this->error = 'Unknown content coding';
                                     $this->success = false;
                             }
                         }
                     }
                 } else {
                     $this->error = 'fsocket timed out';
                     $this->success = false;
                 }
                 fclose($fp);
             }
         }
     } else {
         $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS;
         if (!($this->body = file_get_contents($url))) {
             $this->error = 'file_get_contents could not read the file';
             $this->success = false;
         }
     }
 }
Example #12
0
 function replace_urls($data, $tag, $attributes)
 {
     if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags)) {
         $elements = SimplePie_Misc::get_element($tag, $data);
         foreach ($elements as $element) {
             if (is_array($attributes)) {
                 foreach ($attributes as $attribute) {
                     if (isset($element['attribs'][$attribute]['data'])) {
                         $element['attribs'][$attribute]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attribute]['data'], $this->base);
                         $new_element = SimplePie_Misc::element_implode($element);
                         $data = str_replace($element['full'], $new_element, $data);
                         $element['full'] = $new_element;
                     }
                 }
             } elseif (isset($element['attribs'][$attributes]['data'])) {
                 $element['attribs'][$attributes]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attributes]['data'], $this->base);
                 $data = str_replace($element['full'], SimplePie_Misc::element_implode($element), $data);
             }
         }
     }
     return $data;
 }
Example #13
0
 * @package Lilina
 * @version 1.0
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 */
/** */
define('LILINA_PATH', dirname(__FILE__));
define('LILINA_INCPATH', LILINA_PATH . '/inc');
define('LILINA_PAGE', 'favicon');
// Hide errors
ini_set('display_errors', false);
require_once LILINA_INCPATH . '/contrib/simplepie.class.php';
if (!isset($_GET['i'])) {
    die;
}
require_once LILINA_INCPATH . '/core/conf.php';
require_once LILINA_INCPATH . '/core/plugin-functions.php';
function faux_hash($input)
{
    return $input;
}
if ($_GET['i'] != 'default' && file_exists(LILINA_CACHE_DIR . $_GET['i'] . '.spi')) {
    SimplePie_Misc::display_cached_file($_GET['i'], LILINA_CONTENT_DIR . '/system/cache', 'spi', 'SimplePie_Cache', 'faux_hash');
} else {
    require_once LILINA_INCPATH . '/core/class-templates.php';
    Locale::load_default_textdomain();
    header('Content-Type: image/png');
    header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT');
    // 7 days
    echo file_get_contents(Templates::get_file('feed.png'));
    die;
}
Example #14
0
 function result()
 {
     if ($this->data['file']->url != 'http://diveintomark.org/tests/client/autodiscovery/') {
         parent::result();
     }
     static $done = array();
     $links = SimplePie_Misc::get_element('link', $this->data['file']->body);
     foreach ($links as $link) {
         if (!empty($link['attribs']['href']['data']) && !empty($link['attribs']['rel']['data'])) {
             $rel = array_unique(SimplePie_Misc::space_seperated_tokens(strtolower($link['attribs']['rel']['data'])));
             $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->data['file']->url);
             if (!in_array($href, $done) && in_array('next', $rel)) {
                 $done[] = $this->data['url'] = $href;
                 break;
             }
         }
     }
     if ($this->data['url']) {
         $this->run();
     }
 }
Example #15
0
 /**
  * Decode an entity
  *
  * @access private
  */
 public function entity()
 {
     switch ($this->consume()) {
         case "\t":
         case "\n":
         case "\v":
         case "\v":
         case "\f":
         case " ":
         case "<":
         case "&":
         case false:
             break;
         case "#":
             switch ($this->consume()) {
                 case "x":
                 case "X":
                     $range = '0123456789ABCDEFabcdef';
                     $hex = true;
                     break;
                 default:
                     $range = '0123456789';
                     $hex = false;
                     $this->unconsume();
                     break;
             }
             if ($codepoint = $this->consume_range($range)) {
                 static $windows_1252_specials = array(0xd => "\n", 0x80 => "€", 0x81 => "�", 0x82 => "‚", 0x83 => "ƒ", 0x84 => "„", 0x85 => "…", 0x86 => "†", 0x87 => "‡", 0x88 => "ˆ", 0x89 => "‰", 0x8a => "Š", 0x8b => "‹", 0x8c => "Œ", 0x8d => "�", 0x8e => "Ž", 0x8f => "�", 0x90 => "�", 0x91 => "‘", 0x92 => "’", 0x93 => "“", 0x94 => "”", 0x95 => "•", 0x96 => "–", 0x97 => "—", 0x98 => "˜", 0x99 => "™", 0x9a => "š", 0x9b => "›", 0x9c => "œ", 0x9d => "�", 0x9e => "ž", 0x9f => "Ÿ");
                 if ($hex) {
                     $codepoint = hexdec($codepoint);
                 } else {
                     $codepoint = intval($codepoint);
                 }
                 if (isset($windows_1252_specials[$codepoint])) {
                     $replacement = $windows_1252_specials[$codepoint];
                 } else {
                     $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint);
                 }
                 if (!in_array($this->consume(), array(';', false), true)) {
                     $this->unconsume();
                 }
                 $consumed_length = strlen($this->consumed);
                 $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length);
                 $this->position += strlen($replacement) - $consumed_length;
             }
             break;
         default:
             static $entities = array('Aacute' => "Á", 'aacute' => "á", 'Aacute;' => "Á", 'aacute;' => "á", 'Acirc' => "Â", 'acirc' => "â", 'Acirc;' => "Â", 'acirc;' => "â", 'acute' => "´", 'acute;' => "´", 'AElig' => "Æ", 'aelig' => "æ", 'AElig;' => "Æ", 'aelig;' => "æ", 'Agrave' => "À", 'agrave' => "à", 'Agrave;' => "À", 'agrave;' => "à", 'alefsym;' => "ℵ", 'Alpha;' => "Α", 'alpha;' => "α", 'AMP' => "&", 'amp' => "&", 'AMP;' => "&", 'amp;' => "&", 'and;' => "∧", 'ang;' => "∠", 'apos;' => "'", 'Aring' => "Å", 'aring' => "å", 'Aring;' => "Å", 'aring;' => "å", 'asymp;' => "≈", 'Atilde' => "Ã", 'atilde' => "ã", 'Atilde;' => "Ã", 'atilde;' => "ã", 'Auml' => "Ä", 'auml' => "ä", 'Auml;' => "Ä", 'auml;' => "ä", 'bdquo;' => "„", 'Beta;' => "Β", 'beta;' => "β", 'brvbar' => "¦", 'brvbar;' => "¦", 'bull;' => "•", 'cap;' => "∩", 'Ccedil' => "Ç", 'ccedil' => "ç", 'Ccedil;' => "Ç", 'ccedil;' => "ç", 'cedil' => "¸", 'cedil;' => "¸", 'cent' => "¢", 'cent;' => "¢", 'Chi;' => "Χ", 'chi;' => "χ", 'circ;' => "ˆ", 'clubs;' => "♣", 'cong;' => "≅", 'COPY' => "©", 'copy' => "©", 'COPY;' => "©", 'copy;' => "©", 'crarr;' => "↵", 'cup;' => "∪", 'curren' => "¤", 'curren;' => "¤", 'Dagger;' => "‡", 'dagger;' => "†", 'dArr;' => "⇓", 'darr;' => "↓", 'deg' => "°", 'deg;' => "°", 'Delta;' => "Δ", 'delta;' => "δ", 'diams;' => "♦", 'divide' => "÷", 'divide;' => "÷", 'Eacute' => "É", 'eacute' => "é", 'Eacute;' => "É", 'eacute;' => "é", 'Ecirc' => "Ê", 'ecirc' => "ê", 'Ecirc;' => "Ê", 'ecirc;' => "ê", 'Egrave' => "È", 'egrave' => "è", 'Egrave;' => "È", 'egrave;' => "è", 'empty;' => "∅", 'emsp;' => " ", 'ensp;' => " ", 'Epsilon;' => "Ε", 'epsilon;' => "ε", 'equiv;' => "≡", 'Eta;' => "Η", 'eta;' => "η", 'ETH' => "Ð", 'eth' => "ð", 'ETH;' => "Ð", 'eth;' => "ð", 'Euml' => "Ë", 'euml' => "ë", 'Euml;' => "Ë", 'euml;' => "ë", 'euro;' => "€", 'exist;' => "∃", 'fnof;' => "ƒ", 'forall;' => "∀", 'frac12' => "½", 'frac12;' => "½", 'frac14' => "¼", 'frac14;' => "¼", 'frac34' => "¾", 'frac34;' => "¾", 'frasl;' => "⁄", 'Gamma;' => "Γ", 'gamma;' => "γ", 'ge;' => "≥", 'GT' => ">", 'gt' => ">", 'GT;' => ">", 'gt;' => ">", 'hArr;' => "⇔", 'harr;' => "↔", 'hearts;' => "♥", 'hellip;' => "…", 'Iacute' => "Í", 'iacute' => "í", 'Iacute;' => "Í", 'iacute;' => "í", 'Icirc' => "Î", 'icirc' => "î", 'Icirc;' => "Î", 'icirc;' => "î", 'iexcl' => "¡", 'iexcl;' => "¡", 'Igrave' => "Ì", 'igrave' => "ì", 'Igrave;' => "Ì", 'igrave;' => "ì", 'image;' => "ℑ", 'infin;' => "∞", 'int;' => "∫", 'Iota;' => "Ι", 'iota;' => "ι", 'iquest' => "¿", 'iquest;' => "¿", 'isin;' => "∈", 'Iuml' => "Ï", 'iuml' => "ï", 'Iuml;' => "Ï", 'iuml;' => "ï", 'Kappa;' => "Κ", 'kappa;' => "κ", 'Lambda;' => "Λ", 'lambda;' => "λ", 'lang;' => "〈", 'laquo' => "«", 'laquo;' => "«", 'lArr;' => "⇐", 'larr;' => "←", 'lceil;' => "⌈", 'ldquo;' => "“", 'le;' => "≤", 'lfloor;' => "⌊", 'lowast;' => "∗", 'loz;' => "◊", 'lrm;' => "‎", 'lsaquo;' => "‹", 'lsquo;' => "‘", 'LT' => "<", 'lt' => "<", 'LT;' => "<", 'lt;' => "<", 'macr' => "¯", 'macr;' => "¯", 'mdash;' => "—", 'micro' => "µ", 'micro;' => "µ", 'middot' => "·", 'middot;' => "·", 'minus;' => "−", 'Mu;' => "Μ", 'mu;' => "μ", 'nabla;' => "∇", 'nbsp' => " ", 'nbsp;' => " ", 'ndash;' => "–", 'ne;' => "≠", 'ni;' => "∋", 'not' => "¬", 'not;' => "¬", 'notin;' => "∉", 'nsub;' => "⊄", 'Ntilde' => "Ñ", 'ntilde' => "ñ", 'Ntilde;' => "Ñ", 'ntilde;' => "ñ", 'Nu;' => "Ν", 'nu;' => "ν", 'Oacute' => "Ó", 'oacute' => "ó", 'Oacute;' => "Ó", 'oacute;' => "ó", 'Ocirc' => "Ô", 'ocirc' => "ô", 'Ocirc;' => "Ô", 'ocirc;' => "ô", 'OElig;' => "Œ", 'oelig;' => "œ", 'Ograve' => "Ò", 'ograve' => "ò", 'Ograve;' => "Ò", 'ograve;' => "ò", 'oline;' => "‾", 'Omega;' => "Ω", 'omega;' => "ω", 'Omicron;' => "Ο", 'omicron;' => "ο", 'oplus;' => "⊕", 'or;' => "∨", 'ordf' => "ª", 'ordf;' => "ª", 'ordm' => "º", 'ordm;' => "º", 'Oslash' => "Ø", 'oslash' => "ø", 'Oslash;' => "Ø", 'oslash;' => "ø", 'Otilde' => "Õ", 'otilde' => "õ", 'Otilde;' => "Õ", 'otilde;' => "õ", 'otimes;' => "⊗", 'Ouml' => "Ö", 'ouml' => "ö", 'Ouml;' => "Ö", 'ouml;' => "ö", 'para' => "¶", 'para;' => "¶", 'part;' => "∂", 'permil;' => "‰", 'perp;' => "⊥", 'Phi;' => "Φ", 'phi;' => "φ", 'Pi;' => "Π", 'pi;' => "π", 'piv;' => "ϖ", 'plusmn' => "±", 'plusmn;' => "±", 'pound' => "£", 'pound;' => "£", 'Prime;' => "″", 'prime;' => "′", 'prod;' => "∏", 'prop;' => "∝", 'Psi;' => "Ψ", 'psi;' => "ψ", 'QUOT' => "\"", 'quot' => "\"", 'QUOT;' => "\"", 'quot;' => "\"", 'radic;' => "√", 'rang;' => "〉", 'raquo' => "»", 'raquo;' => "»", 'rArr;' => "⇒", 'rarr;' => "→", 'rceil;' => "⌉", 'rdquo;' => "”", 'real;' => "ℜ", 'REG' => "®", 'reg' => "®", 'REG;' => "®", 'reg;' => "®", 'rfloor;' => "⌋", 'Rho;' => "Ρ", 'rho;' => "ρ", 'rlm;' => "‏", 'rsaquo;' => "›", 'rsquo;' => "’", 'sbquo;' => "‚", 'Scaron;' => "Š", 'scaron;' => "š", 'sdot;' => "⋅", 'sect' => "§", 'sect;' => "§", 'shy' => "­", 'shy;' => "­", 'Sigma;' => "Σ", 'sigma;' => "σ", 'sigmaf;' => "ς", 'sim;' => "∼", 'spades;' => "♠", 'sub;' => "⊂", 'sube;' => "⊆", 'sum;' => "∑", 'sup;' => "⊃", 'sup1' => "¹", 'sup1;' => "¹", 'sup2' => "²", 'sup2;' => "²", 'sup3' => "³", 'sup3;' => "³", 'supe;' => "⊇", 'szlig' => "ß", 'szlig;' => "ß", 'Tau;' => "Τ", 'tau;' => "τ", 'there4;' => "∴", 'Theta;' => "Θ", 'theta;' => "θ", 'thetasym;' => "ϑ", 'thinsp;' => " ", 'THORN' => "Þ", 'thorn' => "þ", 'THORN;' => "Þ", 'thorn;' => "þ", 'tilde;' => "˜", 'times' => "×", 'times;' => "×", 'TRADE;' => "™", 'trade;' => "™", 'Uacute' => "Ú", 'uacute' => "ú", 'Uacute;' => "Ú", 'uacute;' => "ú", 'uArr;' => "⇑", 'uarr;' => "↑", 'Ucirc' => "Û", 'ucirc' => "û", 'Ucirc;' => "Û", 'ucirc;' => "û", 'Ugrave' => "Ù", 'ugrave' => "ù", 'Ugrave;' => "Ù", 'ugrave;' => "ù", 'uml' => "¨", 'uml;' => "¨", 'upsih;' => "ϒ", 'Upsilon;' => "Υ", 'upsilon;' => "υ", 'Uuml' => "Ü", 'uuml' => "ü", 'Uuml;' => "Ü", 'uuml;' => "ü", 'weierp;' => "℘", 'Xi;' => "Ξ", 'xi;' => "ξ", 'Yacute' => "Ý", 'yacute' => "ý", 'Yacute;' => "Ý", 'yacute;' => "ý", 'yen' => "¥", 'yen;' => "¥", 'yuml' => "ÿ", 'Yuml;' => "Ÿ", 'yuml;' => "ÿ", 'Zeta;' => "Ζ", 'zeta;' => "ζ", 'zwj;' => "‍", 'zwnj;' => "‌");
             for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++) {
                 $consumed = substr($this->consumed, 1);
                 if (isset($entities[$consumed])) {
                     $match = $consumed;
                 }
             }
             if ($match !== null) {
                 $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1);
                 $this->position += strlen($entities[$match]) - strlen($consumed) - 1;
             }
             break;
     }
 }
 /**
  * Loads images from a MediaRSS or ATOM feed
  */
 function _loadRSS($url)
 {
     require_once DOKU_INC . 'inc/FeedParser.php';
     $feed = new FeedParser();
     $feed->set_feed_url($url);
     $feed->init();
     $files = array();
     // base url to use for broken feeds with non-absolute links
     $main = parse_url($url);
     $host = $main['scheme'] . '://' . $main['host'] . ($main['port'] ? ':' . $main['port'] : '');
     $path = dirname($main['path']) . '/';
     foreach ($feed->get_items() as $item) {
         if ($enclosure = $item->get_enclosure()) {
             // skip non-image enclosures
             if ($enclosure->get_type()) {
                 if (substr($enclosure->get_type(), 0, 5) != 'image') {
                     continue;
                 }
             } else {
                 if (!preg_match('/\\.(jpe?g|png|gif)(\\?|$)/i', $enclosure->get_link())) {
                     continue;
                 }
             }
             // non absolute links
             $ilink = $enclosure->get_link();
             if (!preg_match('/^https?:\\/\\//i', $ilink)) {
                 if ($ilink[0] == '/') {
                     $ilink = $host . $ilink;
                 } else {
                     $ilink = $host . $path . $ilink;
                 }
             }
             $link = $item->link;
             if (!preg_match('/^https?:\\/\\//i', $link)) {
                 if ($link[0] == '/') {
                     $link = $host . $link;
                 } else {
                     $link = $host . $path . $link;
                 }
             }
             $files[] = array('id' => $ilink, 'isimg' => true, 'file' => basename($ilink), 'title' => SimplePie_Misc::htmlspecialchars_decode($enclosure->get_title(), ENT_COMPAT), 'desc' => strip_tags(SimplePie_Misc::htmlspecialchars_decode($enclosure->get_description(), ENT_COMPAT)), 'width' => $enclosure->get_width(), 'height' => $enclosure->get_height(), 'mtime' => $item->get_date('U'), 'ctime' => $item->get_date('U'), 'detail' => $link);
         }
     }
     return $files;
 }
Example #17
0
 public static function discoverFavicon($url)
 {
     //try webroot favicon
     $favicon = \SimplePie_Misc::absolutize_url('/favicon.ico', $url);
     if (self::checkFavicon($favicon)) {
         return $favicon;
     }
     //try to extract favicon from web page
     $absoluteUrl = \SimplePie_Misc::absolutize_url('/', $url);
     $handle = curl_init();
     curl_setopt($handle, CURLOPT_URL, $absoluteUrl);
     curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($handle, CURLOPT_FOLLOWLOCATION, TRUE);
     curl_setopt($handle, CURLOPT_MAXREDIRS, 10);
     if (FALSE !== ($page = curl_exec($handle))) {
         preg_match('/<[^>]*link[^>]*(rel=["\']icon["\']|rel=["\']shortcut icon["\']) .*href=["\']([^>]*)["\'].*>/iU', $page, $match);
         if (1 < sizeof($match)) {
             // the specified uri might be an url, an absolute or a relative path
             // we have to turn it into an url to be able to display it out of context
             $favicon = htmlspecialchars_decode($match[2]);
             // test for an url
             if (parse_url($favicon, PHP_URL_SCHEME)) {
                 if (self::checkFavicon($favicon)) {
                     return $favicon;
                 }
             }
         }
     }
     return null;
 }
 /**
  * Load Events
  *
  * Load Google Calendar events from SimplePie object
  *
  * @access	public
  * @param	SimplePie object
  * @return	void
  */
 function _load_events($feed)
 {
     foreach ($feed->get_items() as $event) {
         // grab Google-namespaced tags (<gd:when>, <gd:where>, etc.)
         $when = $event->get_item_tags('http://schemas.google.com/g/2005', 'when');
         $where = $event->get_item_tags('http://schemas.google.com/g/2005', 'where');
         $location = $where[0]['attribs']['']['valueString'];
         $startTime = $when[0]['attribs']['']['startTime'];
         $startTime = SimplePie_Misc::parse_date($startTime);
         $endTime = $when[0]['attribs']['']['endTime'];
         $endTime = SimplePie_Misc::parse_date($endTime);
         // provide event only if there's actually a title here (private events don't have titles)
         if (strlen(trim($event->get_title())) > 1) {
             $this->events[] = array('title' => $event->get_title(), 'description' => $event->get_description(), 'link' => $event->get_link(), 'start_time' => $startTime, 'end_time' => $endTime, 'location' => $location);
         }
     }
 }
Example #19
0
 /**
  * Get the file extension
  *
  * @return string|null
  */
 public function get_extension()
 {
     if ($this->link !== null) {
         $url = SimplePie_Misc::parse_url($this->link);
         if ($url['path'] !== '') {
             return pathinfo($url['path'], PATHINFO_EXTENSION);
         }
     }
     return null;
 }
Example #20
0
 /**
  * Find the feed's icon
  *
  * @param SimplePie $feed SimplePie object to retrieve logo for
  * @return string URL to feed icon
  */
 protected static function discover_favicon($feed, $id)
 {
     if ($return = $feed->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) {
         $favicon = SimplePie_Misc::absolutize_url($return[0]['data'], $feed->get_base($return[0]));
     } elseif (($url = $feed->get_link()) !== null && preg_match('/^http(s)?:\\/\\//i', $url)) {
         $filename = $id . '.ico';
         $favicon = SimplePie_Misc::absolutize_url('/favicon.ico', $url);
     } else {
         return false;
     }
     $cache = new DataHandler(get_option('cachedir'));
     $request = new HTTPRequest();
     $file = $request->get($favicon, array('X-Forwarded-For' => $_SERVER['REMOTE_ADDR']));
     if ($file->success && strlen($file->body) > 0) {
         $sniffer = new $feed->content_type_sniffer_class($file);
         if (substr($sniffer->get_type(), 0, 6) === 'image/') {
             $body = array('type' => $sniffer->get_type(), 'body' => $file->body);
             return $cache->save($filename, serialize($body));
         } else {
             return false;
         }
     }
     return false;
 }
 function resolve_single_relative_uri($refs)
 {
     $tag = FeedWordPressHTML::attributeMatch($refs);
     $url = SimplePie_Misc::absolutize_url($tag['value'], $this->_base);
     return $tag['prefix'] . $url . $tag['suffix'];
 }
Example #22
0
<?php

// This should be modifed as your own use warrants.
require_once 'simplepie.inc';
SimplePie_Misc::display_cached_file($_GET['i'], '../../phorum5/cache', 'spi');
Example #23
0
 /**
  * Change a string from one encoding to another
  *
  * @param string $data Raw data in $input encoding
  * @param string $input Encoding of $data
  * @param string $output Encoding you want
  * @return string|boolean False if we can't convert it
  */
 public static function change_encoding($data, $input, $output)
 {
     $input = SimplePie_Misc::encoding($input);
     $output = SimplePie_Misc::encoding($output);
     // We fail to fail on non US-ASCII bytes
     if ($input === 'US-ASCII') {
         static $non_ascii_octects = '';
         if (!$non_ascii_octects) {
             for ($i = 0x80; $i <= 0xff; $i++) {
                 $non_ascii_octects .= chr($i);
             }
         }
         $data = substr($data, 0, strcspn($data, $non_ascii_octects));
     }
     // This is first, as behaviour of this is completely predictable
     if ($input === 'windows-1252' && $output === 'UTF-8') {
         return SimplePie_Misc::windows_1252_to_utf8($data);
     } elseif (function_exists('mb_convert_encoding') && ($return = SimplePie_Misc::change_encoding_mbstring($data, $input, $output))) {
         return $return;
     } elseif (function_exists('iconv') && ($return = SimplePie_Misc::change_encoding_iconv($data, $input, $output))) {
         return $return;
     } else {
         return false;
     }
 }
 /**
  * Simple HTTP response parser
  *
  * @param string $headers Full response text including headers and body
  * @param string $url Original request URL
  * @param array $req_headers Original $headers array passed to {@link request()}, in case we need to follow redirects
  * @param array $req_data Original $data array passed to {@link request()}, in case we need to follow redirects
  * @param array $req_type Original $type constant passed to {@link request()}, in case we need to follow redirects
  * @return stdClass Contains "body" string, "headers" array, "status code" integer, "success" boolean, "redirects" integer as properties
  */
 protected function parse_response($headers, $url, $req_headers, $req_data, $req_type)
 {
     $redirects = 10;
     $headers = explode("\r\n\r\n", $headers, 2);
     $return = new stdClass();
     $return->body = array_pop($headers);
     $headers = $headers[0];
     // Pretend CRLF = LF for compatibility (RFC 2616, section 19.3)
     $headers = str_replace("\r\n", "\n", $headers);
     // Unfold headers (replace [CRLF] 1*( SP | HT ) with SP) as per RFC 2616 (section 2.2)
     $headers = preg_replace('/\\n[ \\t]/', ' ', $headers);
     $headers = explode("\n", $headers);
     preg_match('#^HTTP/1\\.\\d[ \\t]+(\\d+)#i', array_shift($headers), $matches);
     if (empty($matches)) {
         throw new Exception(_r('Response could not be parsed'));
     }
     $return->status_code = (int) $matches[1];
     $return->success = false;
     if ($return->status_code >= 200 && $return->status_code < 300) {
         $return->success = true;
     }
     $return->headers = array();
     foreach ($headers as $header) {
         list($key, $value) = explode(':', $header, 2);
         $value = trim($value);
         preg_replace('#(\\s+)#i', ' ', $value);
         $key = strtolower($key);
         if (isset($return->headers[$key])) {
             if (!is_array($return->headers[$key])) {
                 $return->headers[$key] = array($return->headers[$key]);
             }
             $return->headers[$key][] = $value;
         } else {
             $return->headers[$key] = $value;
         }
     }
     if (isset($return->headers['transfer-encoding'])) {
         $return->body = HTTPRequest::decode_chunked($return->body);
     }
     if (isset($return->headers['content-encoding'])) {
         switch ($return->headers['content-encoding']) {
             case 'gzip':
                 if (function_exists('gzdecode')) {
                     $return->body = gzdecode($return->body);
                 } else {
                     throw new Exception(_r('gzdecode is missing'));
                 }
                 break;
             case 'deflate':
                 if (function_exists('gzinflate')) {
                     $return->body = gzinflate($return->body);
                 } else {
                     throw new Exception(_r('gzinflate is missing'));
                 }
                 break;
         }
     }
     //fsockopen and cURL compatibility
     if (isset($return->headers['connection'])) {
         unset($return->headers['connection']);
     }
     if ((in_array($return->status_code, array(300, 301, 302, 303, 307)) || $return->status_code > 307 && $return->status_code < 400) && isset($return->headers['location']) && $this->redirects < $redirects) {
         $this->redirects++;
         $location = SimplePie_Misc::absolutize_url($return->headers['location'], $url);
         return $this->request($location, $req_headers, $req_data, $req_type);
     }
     $return->redirects = $this->redirects;
     return $return;
 }
Example #25
0
 * @link http://simplepie.org/ SimplePie
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 */
/**
 * SimplePie Name
 */
define('SIMPLEPIE_NAME', 'SimplePie');
/**
 * SimplePie Version
 */
define('SIMPLEPIE_VERSION', '1.3.1');
/**
 * SimplePie Build
 * @todo Hardcode for release (there's no need to have to call SimplePie_Misc::get_build() only every load of simplepie.inc)
 */
define('SIMPLEPIE_BUILD', gmdate('YmdHis', SimplePie_Misc::get_build()));
/**
 * SimplePie Website URL
 */
define('SIMPLEPIE_URL', 'http://simplepie.org');
/**
 * SimplePie Useragent
 * @see SimplePie::set_useragent()
 */
define('SIMPLEPIE_USERAGENT', SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION . ' (Feed Parser; ' . SIMPLEPIE_URL . '; Allow like Gecko) Build/' . SIMPLEPIE_BUILD);
/**
 * SimplePie Linkback
 */
define('SIMPLEPIE_LINKBACK', '<a href="' . SIMPLEPIE_URL . '" title="' . SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . '">' . SIMPLEPIE_NAME . '</a>');
/**
 * No Autodiscovery
Example #26
0
 public function get_links()
 {
     $links = SimplePie_Misc::get_element('a', $this->file->body);
     foreach ($links as $link) {
         if (isset($link['attribs']['href']['data'])) {
             $href = trim($link['attribs']['href']['data']);
             $parsed = SimplePie_Misc::parse_url($href);
             if ($parsed['scheme'] === '' || preg_match('/^(http(s)|feed)?$/i', $parsed['scheme'])) {
                 if ($this->base_location < $link['offset']) {
                     $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->base);
                 } else {
                     $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->http_base);
                 }
                 $current = SimplePie_Misc::parse_url($this->file->url);
                 if ($parsed['authority'] === '' || $parsed['authority'] === $current['authority']) {
                     $this->local[] = $href;
                 } else {
                     $this->elsewhere[] = $href;
                 }
             }
         }
     }
     $this->local = array_unique($this->local);
     $this->elsewhere = array_unique($this->elsewhere);
     if (!empty($this->local) || !empty($this->elsewhere)) {
         return true;
     }
     return null;
 }
function convert_to_utf8($html, $header = null)
{
    $encoding = null;
    if ($html || $header) {
        if (is_array($header)) {
            $header = implode("\n", $header);
        }
        if (!$header || !preg_match_all('/^Content-Type:\\s+([^;]+)(?:;\\s*charset=["\']?([^;"\'\\n]*))?/im', $header, $match, PREG_SET_ORDER)) {
            // error parsing the response
            debug('Could not find Content-Type header in HTTP response');
        } else {
            $match = end($match);
            // get last matched element (in case of redirects)
            if (isset($match[2])) {
                $encoding = trim($match[2], "\"' \r\n\v\t");
            }
        }
        // TODO: check to see if encoding is supported (can we convert it?)
        // If it's not, result will be empty string.
        // For now we'll check for invalid encoding types returned by some sites, e.g. 'none'
        // Problem URL: http://facta.co.jp/blog/archives/20111026001026.html
        if (!$encoding || $encoding == 'none') {
            // search for encoding in HTML - only look at the first 50000 characters
            // Why 50000? See, for example, http://www.lemonde.fr/festival-de-cannes/article/2012/05/23/deux-cretes-en-goguette-sur-la-croisette_1705732_766360.html
            // TODO: improve this so it looks at smaller chunks first
            $html_head = substr($html, 0, 50000);
            if (preg_match('/^<\\?xml\\s+version=(?:"[^"]*"|\'[^\']*\')\\s+encoding=("[^"]*"|\'[^\']*\')/s', $html_head, $match)) {
                $encoding = trim($match[1], '"\'');
            } elseif (preg_match('/<meta\\s+http-equiv=["\']?Content-Type["\']? content=["\'][^;]+;\\s*charset=["\']?([^;"\'>]+)/i', $html_head, $match)) {
                $encoding = trim($match[1]);
            } elseif (preg_match_all('/<meta\\s+([^>]+)>/i', $html_head, $match)) {
                foreach ($match[1] as $_test) {
                    if (preg_match('/charset=["\']?([^"\']+)/i', $_test, $_m)) {
                        $encoding = trim($_m[1]);
                        break;
                    }
                }
            }
        }
        if (isset($encoding)) {
            $encoding = trim($encoding);
        }
        // trim is important here!
        if (!$encoding || strtolower($encoding) == 'iso-8859-1') {
            // replace MS Word smart qutoes
            $trans = array();
            $trans[chr(130)] = '&sbquo;';
            // Single Low-9 Quotation Mark
            $trans[chr(131)] = '&fnof;';
            // Latin Small Letter F With Hook
            $trans[chr(132)] = '&bdquo;';
            // Double Low-9 Quotation Mark
            $trans[chr(133)] = '&hellip;';
            // Horizontal Ellipsis
            $trans[chr(134)] = '&dagger;';
            // Dagger
            $trans[chr(135)] = '&Dagger;';
            // Double Dagger
            $trans[chr(136)] = '&circ;';
            // Modifier Letter Circumflex Accent
            $trans[chr(137)] = '&permil;';
            // Per Mille Sign
            $trans[chr(138)] = '&Scaron;';
            // Latin Capital Letter S With Caron
            $trans[chr(139)] = '&lsaquo;';
            // Single Left-Pointing Angle Quotation Mark
            $trans[chr(140)] = '&OElig;';
            // Latin Capital Ligature OE
            $trans[chr(145)] = '&lsquo;';
            // Left Single Quotation Mark
            $trans[chr(146)] = '&rsquo;';
            // Right Single Quotation Mark
            $trans[chr(147)] = '&ldquo;';
            // Left Double Quotation Mark
            $trans[chr(148)] = '&rdquo;';
            // Right Double Quotation Mark
            $trans[chr(149)] = '&bull;';
            // Bullet
            $trans[chr(150)] = '&ndash;';
            // En Dash
            $trans[chr(151)] = '&mdash;';
            // Em Dash
            $trans[chr(152)] = '&tilde;';
            // Small Tilde
            $trans[chr(153)] = '&trade;';
            // Trade Mark Sign
            $trans[chr(154)] = '&scaron;';
            // Latin Small Letter S With Caron
            $trans[chr(155)] = '&rsaquo;';
            // Single Right-Pointing Angle Quotation Mark
            $trans[chr(156)] = '&oelig;';
            // Latin Small Ligature OE
            $trans[chr(159)] = '&Yuml;';
            // Latin Capital Letter Y With Diaeresis
            $html = strtr($html, $trans);
        }
        if (!$encoding) {
            debug('No character encoding found, so treating as UTF-8');
            $encoding = 'utf-8';
        } else {
            debug('Character encoding: ' . $encoding);
            if (strtolower($encoding) != 'utf-8') {
                debug('Converting to UTF-8');
                $html = SimplePie_Misc::change_encoding($html, $encoding, 'utf-8');
            }
        }
    }
    return $html;
}
Example #28
0
 /**
  * Detect XML encoding, as per XML 1.0 Appendix F.1
  *
  * @todo Add support for EBCDIC
  * @param string $data XML data
  * @param SimplePie_Registry $registry Class registry
  * @return array Possible encodings
  */
 public static function xml_encoding($data, $registry)
 {
     // UTF-32 Big Endian BOM
     if (substr($data, 0, 4) === "��") {
         $encoding[] = 'UTF-32BE';
     } elseif (substr($data, 0, 4) === "��") {
         $encoding[] = 'UTF-32LE';
     } elseif (substr($data, 0, 2) === "��") {
         $encoding[] = 'UTF-16BE';
     } elseif (substr($data, 0, 2) === "��") {
         $encoding[] = 'UTF-16LE';
     } elseif (substr($data, 0, 3) === "") {
         $encoding[] = 'UTF-8';
     } elseif (substr($data, 0, 20) === "<?xml") {
         if ($pos = strpos($data, "?>")) {
             $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8')));
             if ($parser->parse()) {
                 $encoding[] = $parser->encoding;
             }
         }
         $encoding[] = 'UTF-32BE';
     } elseif (substr($data, 0, 20) === "<?xml") {
         if ($pos = strpos($data, "?>")) {
             $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8')));
             if ($parser->parse()) {
                 $encoding[] = $parser->encoding;
             }
         }
         $encoding[] = 'UTF-32LE';
     } elseif (substr($data, 0, 10) === "<?xml") {
         if ($pos = strpos($data, "?>")) {
             $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8')));
             if ($parser->parse()) {
                 $encoding[] = $parser->encoding;
             }
         }
         $encoding[] = 'UTF-16BE';
     } elseif (substr($data, 0, 10) === "<?xml") {
         if ($pos = strpos($data, "?>")) {
             $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8')));
             if ($parser->parse()) {
                 $encoding[] = $parser->encoding;
             }
         }
         $encoding[] = 'UTF-16LE';
     } elseif (substr($data, 0, 5) === "<?xml") {
         if ($pos = strpos($data, "?>")) {
             $parser = $registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));
             if ($parser->parse()) {
                 $encoding[] = $parser->encoding;
             }
         }
         $encoding[] = 'UTF-8';
     } else {
         $encoding[] = 'UTF-8';
     }
     return $encoding;
 }
Example #29
0
 /**
  * The contructor is a copy of the stock simplepie File class which has
  * been modifed to add in use the Moodle curl class rather than php curl
  * functions.
  */
 function moodle_simplepie_file($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
 {
     $this->url = $url;
     $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL;
     $curl = new curl();
     $curl->setopt(array('CURLOPT_HEADER' => true, 'CURLOPT_TIMEOUT' => $timeout, 'CURLOPT_CONNECTTIMEOUT' => $timeout));
     if ($headers !== null) {
         // translate simplepie headers to those class curl expects
         foreach ($headers as $headername => $headervalue) {
             $headerstr = "{$headername}: {$headervalue}";
             $curl->setHeader($headerstr);
         }
     }
     $this->headers = $curl->get($url);
     if ($curl->error) {
         $this->error = 'cURL Error: ' . $curl->error;
         $this->success = false;
         return false;
     }
     $parser = new SimplePie_HTTP_Parser($this->headers);
     if ($parser->parse()) {
         $this->headers = $parser->headers;
         $this->body = $parser->body;
         $this->status_code = $parser->status_code;
         if (($this->status_code == 300 || $this->status_code == 301 || $this->status_code == 302 || $this->status_code == 303 || $this->status_code == 307 || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) {
             $this->redirects++;
             $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
             return $this->moodle_simplepie_file($location, $timeout, $redirects, $headers);
         }
     }
 }
Example #30
0
 public function test_nonexistant()
 {
     $this->assertFalse(SimplePie_Misc::change_encoding('', 'TESTENC', 'UTF-8'));
 }