]> scripts.mit.edu Git - autoinstalls/wordpress.git/blobdiff - wp-includes/class-simplepie.php
WordPress 3.4
[autoinstalls/wordpress.git] / wp-includes / class-simplepie.php
index 275033a822919fd101de6426664ba48671e4c59c..6128495d88c08007cc799d0c71f59ff83e310330 100644 (file)
@@ -1,12 +1,12 @@
 <?php
 <?php
-if ( !class_exists( 'SimplePie' ) ) :
+if ( ! class_exists( 'SimplePie' ) ) :
 /**
  * SimplePie
  *
  * A PHP-Based RSS and Atom Feed Framework.
  * Takes the hard work out of managing a complete RSS/Atom solution.
  *
 /**
  * SimplePie
  *
  * A PHP-Based RSS and Atom Feed Framework.
  * Takes the hard work out of managing a complete RSS/Atom solution.
  *
- * Copyright (c) 2004-2009, Ryan Parman and Geoffrey Sneddon
+ * Copyright (c) 2004-2011, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without modification, are
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without modification, are
@@ -34,10 +34,11 @@ if ( !class_exists( 'SimplePie' ) ) :
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * @package SimplePie
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * @package SimplePie
- * @version 1.2
- * @copyright 2004-2009 Ryan Parman, Geoffrey Sneddon
+ * @version 1.2.1
+ * @copyright 2004-2011 Ryan Parman, Geoffrey Sneddon, Ryan McCue
  * @author Ryan Parman
  * @author Geoffrey Sneddon
  * @author Ryan Parman
  * @author Geoffrey Sneddon
+ * @author Ryan McCue
  * @link http://simplepie.org/ SimplePie
  * @link http://simplepie.org/support/ Please submit all bug reports and feature requests to the SimplePie forums
  * @license http://www.opensource.org/licenses/bsd-license.php BSD License
  * @link http://simplepie.org/ SimplePie
  * @link http://simplepie.org/support/ Please submit all bug reports and feature requests to the SimplePie forums
  * @license http://www.opensource.org/licenses/bsd-license.php BSD License
@@ -52,12 +53,12 @@ define('SIMPLEPIE_NAME', 'SimplePie');
 /**
  * SimplePie Version
  */
 /**
  * SimplePie Version
  */
-define('SIMPLEPIE_VERSION', '1.2');
+define('SIMPLEPIE_VERSION', '1.2.1');
 
 /**
  * SimplePie Build
  */
 
 /**
  * SimplePie Build
  */
-define('SIMPLEPIE_BUILD', '20090627192103');
+define('SIMPLEPIE_BUILD', '20111015034325');
 
 /**
  * SimplePie Website URL
 
 /**
  * SimplePie Website URL
@@ -1672,7 +1673,7 @@ class SimplePie
                                                                $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
                                                                if (!$cache->save($this))
                                                                {
                                                                $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
                                                                if (!$cache->save($this))
                                                                {
-                                                                       trigger_error("$this->cache_location is not writeable", E_USER_WARNING);
+                                                                       trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
                                                                }
                                                                $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc');
                                                        }
                                                                }
                                                                $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc');
                                                        }
@@ -1680,7 +1681,7 @@ class SimplePie
                                                }
                                                else
                                                {
                                                }
                                                else
                                                {
-                                                       $this->error = "A feed could not be found at $this->feed_url";
+                                                       $this->error = "A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or " . SIMPLEPIE_NAME . " was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed.";
                                                        SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
                                                        return false;
                                                }
                                                        SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
                                                        return false;
                                                }
@@ -1777,27 +1778,27 @@ class SimplePie
                                                        // Cache the file if caching is enabled
                                                        if ($cache && !$cache->save($this))
                                                        {
                                                        // Cache the file if caching is enabled
                                                        if ($cache && !$cache->save($this))
                                                        {
-                                                               trigger_error("$cache->name is not writeable", E_USER_WARNING);
+                                                               trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
                                                        }
                                                        return true;
                                                }
                                                else
                                                {
                                                        }
                                                        return true;
                                                }
                                                else
                                                {
-                                                       $this->error = "A feed could not be found at $this->feed_url";
+                                                       $this->error = "A feed could not be found at $this->feed_url. This does not appear to be a valid RSS or Atom feed.";
                                                        SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
                                                        return false;
                                                }
                                        }
                                }
                        }
                                                        SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
                                                        return false;
                                                }
                                        }
                                }
                        }
-                       if(isset($parser))
+                       if (isset($parser))
                        {
                                // We have an error, just set SimplePie_Misc::error to it and quit
                        {
                                // We have an error, just set SimplePie_Misc::error to it and quit
-                               $this->error = sprintf('XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());
+                               $this->error = sprintf('This XML document is invalid, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());
                        }
                        else
                        {
                        }
                        else
                        {
-                               $this->error = 'The data could not be converted to UTF-8';
+                               $this->error = 'The data could not be converted to UTF-8. You MUST have either the iconv or mbstring extension installed. Upgrading to PHP 5.x (which includes iconv) is highly recommended.';
                        }
                        SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
                        return false;
                        }
                        SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
                        return false;
@@ -1831,7 +1832,7 @@ class SimplePie
        }
 
        /**
        }
 
        /**
-        * Return the error message for the occurred error
+        * Return the error message for the occured error
         *
         * @access public
         * @return string Error message
         *
         * @access public
         * @return string Error message
@@ -1984,7 +1985,7 @@ class SimplePie
                                                        }
                                                        else
                                                        {
                                                        }
                                                        else
                                                        {
-                                                               trigger_error("$cache->name is not writeable", E_USER_WARNING);
+                                                               trigger_error("$cache->name is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
                                                                return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
                                                        }
                                                }
                                                                return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
                                                        }
                                                }
@@ -2774,11 +2775,12 @@ class SimplePie
 
        function get_latitude()
        {
 
        function get_latitude()
        {
+
                if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
                {
                        return (float) $return[0]['data'];
                }
                if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
                {
                        return (float) $return[0]['data'];
                }
-               elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+               elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
                {
                        return (float) $match[1];
                }
                {
                        return (float) $match[1];
                }
@@ -2798,7 +2800,7 @@ class SimplePie
                {
                        return (float) $return[0]['data'];
                }
                {
                        return (float) $return[0]['data'];
                }
-               elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+               elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
                {
                        return (float) $match[2];
                }
                {
                        return (float) $match[2];
                }
@@ -3278,6 +3280,11 @@ class SimplePie_Item
                {
                        return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                }
                {
                        return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                }
+               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
+               {
+                       return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
+               }
+
                elseif (!$description_only)
                {
                        return $this->get_content(true);
                elseif (!$description_only)
                {
                        return $this->get_content(true);
@@ -3642,7 +3649,7 @@ class SimplePie_Item
                {
                        return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
                }
                {
                        return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
                }
-               elseif (($date = $this->get_date('U')) !== null)
+               elseif (($date = $this->get_date('U')) !== null && $date !== false)
                {
                        return strftime($date_format, $date);
                }
                {
                        return strftime($date_format, $date);
                }
@@ -4428,621 +4435,624 @@ class SimplePie_Item
                        // If we have media:group tags, loop through them.
                        foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
                        {
                        // If we have media:group tags, loop through them.
                        foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
                        {
-                               // 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)
+                               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']))
                                                        {
                                                        {
-                                                               $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);
+                                                               $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                        }
                                                        }
-                                                       if (is_array($captions))
+                                                       if (isset($content['attribs']['']['channels']))
                                                        {
                                                        {
-                                                               $captions = array_values(SimplePie_Misc::array_unique($captions));
+                                                               $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                        }
                                                        }
-                                               }
-                                               elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
-                                               {
-                                                       foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
+                                                       if (isset($content['attribs']['']['duration']))
                                                        {
                                                        {
-                                                               $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);
+                                                               $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                        }
                                                        }
-                                                       if (is_array($captions))
+                                                       else
                                                        {
                                                        {
-                                                               $captions = array_values(SimplePie_Misc::array_unique($captions));
+                                                               $duration = $duration_parent;
                                                        }
                                                        }
-                                               }
-                                               else
-                                               {
-                                                       $captions = $captions_parent;
-                                               }
-
-                                               // CATEGORIES
-                                               if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
-                                               {
-                                                       foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
+                                                       if (isset($content['attribs']['']['expression']))
                                                        {
                                                        {
-                                                               $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);
+                                                               $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                        }
                                                        }
-                                               }
-                                               if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
-                                               {
-                                                       foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
+                                                       if (isset($content['attribs']['']['framerate']))
                                                        {
                                                        {
-                                                               $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);
+                                                               $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                        }
                                                        }
-                                               }
-                                               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']))
+                                                       if (isset($content['attribs']['']['height']))
                                                        {
                                                        {
-                                                               $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                               $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                        }
                                                        }
-                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
+                                                       if (isset($content['attribs']['']['lang']))
                                                        {
                                                        {
-                                                               $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                               $lang = $this->sanitize($content['attribs']['']['lang'], 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']))
+                                                       if (isset($content['attribs']['']['fileSize']))
                                                        {
                                                        {
-                                                               $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                               $length = ceil($content['attribs']['']['fileSize']);
                                                        }
                                                        }
-                                                       if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
+                                                       if (isset($content['attribs']['']['medium']))
                                                        {
                                                        {
-                                                               $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                               $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                        }
                                                        }
-                                                       $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label);
-                                               }
-                                               else
-                                               {
-                                                       $copyrights = $copyrights_parent;
-                                               }
+                                                       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);
 
 
-                                               // CREDITS
-                                               if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
-                                               {
-                                                       foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
+                                                       // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
+
+                                                       // CAPTIONS
+                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
                                                        {
                                                        {
-                                                               $credit_role = null;
-                                                               $credit_scheme = null;
-                                                               $credit_name = null;
-                                                               if (isset($credit['attribs']['']['role']))
+                                                               foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
                                                                {
                                                                {
-                                                                       $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $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 (isset($credit['attribs']['']['scheme']))
+                                                               if (is_array($captions))
                                                                {
                                                                {
-                                                                       $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $captions = array_values(SimplePie_Misc::array_unique($captions));
                                                                }
                                                                }
-                                                               else
+                                                       }
+                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
+                                                       {
+                                                               foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
                                                                {
                                                                {
-                                                                       $credit_scheme = 'urn:ebu';
+                                                                       $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 (isset($credit['data']))
+                                                               if (is_array($captions))
                                                                {
                                                                {
-                                                                       $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $captions = array_values(SimplePie_Misc::array_unique($captions));
                                                                }
                                                                }
-                                                               $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
                                                        }
                                                        }
-                                                       if (is_array($credits))
+                                                       else
                                                        {
                                                        {
-                                                               $credits = array_values(SimplePie_Misc::array_unique($credits));
+                                                               $captions = $captions_parent;
                                                        }
                                                        }
-                                               }
-                                               elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
-                                               {
-                                                       foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
+
+                                                       // CATEGORIES
+                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
                                                        {
                                                        {
-                                                               $credit_role = null;
-                                                               $credit_scheme = null;
-                                                               $credit_name = null;
-                                                               if (isset($credit['attribs']['']['role']))
+                                                               foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
                                                                {
                                                                {
-                                                                       $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';
+                                                                       $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($credit['data']))
+                                                       }
+                                                       if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
+                                                       {
+                                                               foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
                                                                {
                                                                {
-                                                                       $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $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);
                                                                }
                                                                }
-                                                               $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
                                                        }
                                                        }
-                                                       if (is_array($credits))
+                                                       if (is_array($categories) && is_array($categories_parent))
                                                        {
                                                        {
-                                                               $credits = array_values(SimplePie_Misc::array_unique($credits));
+                                                               $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
-                                               {
-                                                       $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)
+                                                       // COPYRIGHTS
+                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
                                                        {
                                                        {
-                                                               $value = null;
-                                                               $algo = null;
-                                                               if (isset($hash['data']))
+                                                               $copyright_url = null;
+                                                               $copyright_label = null;
+                                                               if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
                                                                {
                                                                {
-                                                                       $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                                }
                                                                }
-                                                               if (isset($hash['attribs']['']['algo']))
+                                                               if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
                                                                {
                                                                {
-                                                                       $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                                }
                                                                }
-                                                               else
+                                                               $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']))
                                                                {
                                                                {
-                                                                       $algo = 'md5';
+                                                                       $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                                }
                                                                }
-                                                               $hashes[] = $algo.':'.$value;
+                                                               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);
                                                        }
                                                        }
-                                                       if (is_array($hashes))
+                                                       else
                                                        {
                                                        {
-                                                               $hashes = array_values(SimplePie_Misc::array_unique($hashes));
+                                                               $copyrights = $copyrights_parent;
                                                        }
                                                        }
-                                               }
-                                               elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
-                                               {
-                                                       foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
+
+                                                       // CREDITS
+                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
                                                        {
                                                        {
-                                                               $value = null;
-                                                               $algo = null;
-                                                               if (isset($hash['data']))
+                                                               foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
                                                                {
                                                                {
-                                                                       $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $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 (isset($hash['attribs']['']['algo']))
+                                                               if (is_array($credits))
                                                                {
                                                                {
-                                                                       $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $credits = array_values(SimplePie_Misc::array_unique($credits));
                                                                }
                                                                }
-                                                               else
+                                                       }
+                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
+                                                       {
+                                                               foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
                                                                {
                                                                {
-                                                                       $algo = 'md5';
+                                                                       $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));
                                                                }
                                                                }
-                                                               $hashes[] = $algo.':'.$value;
                                                        }
                                                        }
-                                                       if (is_array($hashes))
+                                                       else
                                                        {
                                                        {
-                                                               $hashes = array_values(SimplePie_Misc::array_unique($hashes));
+                                                               $credits = $credits_parent;
                                                        }
                                                        }
-                                               }
-                                               else
-                                               {
-                                                       $hashes = $hashes_parent;
-                                               }
 
 
-                                               // KEYWORDS
-                                               if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
-                                               {
-                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
+                                                       // DESCRIPTION
+                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
                                                        {
                                                        {
-                                                               $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
-                                                               foreach ($temp as $word)
-                                                               {
-                                                                       $keywords[] = trim($word);
-                                                               }
-                                                               unset($temp);
+                                                               $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                        }
                                                        }
-                                                       if (is_array($keywords))
+                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
                                                        {
                                                        {
-                                                               $keywords = array_values(SimplePie_Misc::array_unique($keywords));
+                                                               $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                        }
                                                        }
-                                               }
-                                               elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
-                                               {
-                                                       if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
+                                                       else
                                                        {
                                                        {
-                                                               $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
-                                                               foreach ($temp as $word)
+                                                               $description = $description_parent;
+                                                       }
+
+                                                       // HASHES
+                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
+                                                       {
+                                                               foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
                                                                {
                                                                {
-                                                                       $keywords[] = trim($word);
+                                                                       $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));
                                                                }
                                                                }
-                                                               unset($temp);
                                                        }
                                                        }
-                                                       if (is_array($keywords))
+                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
                                                        {
                                                        {
-                                                               $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;
-                                               }
+                                                               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;
+                                                       }
 
 
-                                               // RATINGS
-                                               if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
-                                               {
-                                                       foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
+                                                       // KEYWORDS
+                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
                                                        {
                                                        {
-                                                               $rating_scheme = null;
-                                                               $rating_value = null;
-                                                               if (isset($rating['attribs']['']['scheme']))
+                                                               if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
                                                                {
                                                                {
-                                                                       $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
+                                                                       foreach ($temp as $word)
+                                                                       {
+                                                                               $keywords[] = trim($word);
+                                                                       }
+                                                                       unset($temp);
                                                                }
                                                                }
-                                                               else
+                                                               if (is_array($keywords))
                                                                {
                                                                {
-                                                                       $rating_scheme = 'urn:simple';
+                                                                       $keywords = array_values(SimplePie_Misc::array_unique($keywords));
                                                                }
                                                                }
-                                                               if (isset($rating['data']))
+                                                       }
+                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
+                                                       {
+                                                               if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
                                                                {
                                                                {
-                                                                       $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $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));
                                                                }
                                                                }
-                                                               $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
                                                        }
                                                        }
-                                                       if (is_array($ratings))
+                                                       else
                                                        {
                                                        {
-                                                               $ratings = array_values(SimplePie_Misc::array_unique($ratings));
+                                                               $keywords = $keywords_parent;
                                                        }
                                                        }
-                                               }
-                                               elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
-                                               {
-                                                       foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
+
+                                                       // PLAYER
+                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
                                                        {
                                                        {
-                                                               $rating_scheme = null;
-                                                               $rating_value = null;
-                                                               if (isset($rating['attribs']['']['scheme']))
+                                                               $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 = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $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);
                                                                }
                                                                }
-                                                               else
+                                                               if (is_array($ratings))
                                                                {
                                                                {
-                                                                       $rating_scheme = 'urn:simple';
+                                                                       $ratings = array_values(SimplePie_Misc::array_unique($ratings));
                                                                }
                                                                }
-                                                               if (isset($rating['data']))
+                                                       }
+                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
+                                                       {
+                                                               foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
                                                                {
                                                                {
-                                                                       $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $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));
                                                                }
                                                                }
-                                                               $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
                                                        }
                                                        }
-                                                       if (is_array($ratings))
+                                                       else
                                                        {
                                                        {
-                                                               $ratings = array_values(SimplePie_Misc::array_unique($ratings));
+                                                               $ratings = $ratings_parent;
                                                        }
                                                        }
-                                               }
-                                               else
-                                               {
-                                                       $ratings = $ratings_parent;
-                                               }
 
 
-                                               // RESTRICTIONS
-                                               if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
-                                               {
-                                                       foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
+                                                       // RESTRICTIONS
+                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
                                                        {
                                                        {
-                                                               $restriction_relationship = null;
-                                                               $restriction_type = null;
-                                                               $restriction_value = null;
-                                                               if (isset($restriction['attribs']['']['relationship']))
+                                                               foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
                                                                {
                                                                {
-                                                                       $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $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 (isset($restriction['attribs']['']['type']))
+                                                               if (is_array($restrictions))
                                                                {
                                                                {
-                                                                       $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
                                                                }
                                                                }
-                                                               if (isset($restriction['data']))
+                                                       }
+                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
+                                                       {
+                                                               foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
                                                                {
                                                                {
-                                                                       $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $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));
                                                                }
                                                                }
-                                                               $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
                                                        }
                                                        }
-                                                       if (is_array($restrictions))
+                                                       else
                                                        {
                                                        {
-                                                               $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
+                                                               $restrictions = $restrictions_parent;
                                                        }
                                                        }
-                                               }
-                                               elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
-                                               {
-                                                       foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
+
+                                                       // THUMBNAILS
+                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
                                                        {
                                                        {
-                                                               $restriction_relationship = null;
-                                                               $restriction_type = null;
-                                                               $restriction_value = null;
-                                                               if (isset($restriction['attribs']['']['relationship']))
+                                                               foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
                                                                {
                                                                {
-                                                                       $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
                                                                }
                                                                }
-                                                               if (isset($restriction['attribs']['']['type']))
+                                                               if (is_array($thumbnails))
                                                                {
                                                                {
-                                                                       $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
                                                                }
                                                                }
-                                                               if (isset($restriction['data']))
+                                                       }
+                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
+                                                       {
+                                                               foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
                                                                {
                                                                {
-                                                                       $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
+                                                                       $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+                                                               }
+                                                               if (is_array($thumbnails))
+                                                               {
+                                                                       $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
                                                                }
                                                                }
-                                                               $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
                                                        }
                                                        }
-                                                       if (is_array($restrictions))
+                                                       else
                                                        {
                                                        {
-                                                               $restrictions = array_values(SimplePie_Misc::array_unique($restrictions));
+                                                               $thumbnails = $thumbnails_parent;
                                                        }
                                                        }
-                                               }
-                                               else
-                                               {
-                                                       $restrictions = $restrictions_parent;
-                                               }
 
 
-                                               // THUMBNAILS
-                                               if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
-                                               {
-                                                       foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
+                                                       // TITLES
+                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
                                                        {
                                                        {
-                                                               $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
-                                                       }
-                                                       if (is_array($thumbnails))
-                                                       {
-                                                               $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
+                                                               $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                        }
                                                        }
-                                               }
-                                               elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
-                                               {
-                                                       foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
+                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
                                                        {
                                                        {
-                                                               $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
+                                                               $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                        }
                                                        }
-                                                       if (is_array($thumbnails))
+                                                       else
                                                        {
                                                        {
-                                                               $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails));
+                                                               $title = $title_parent;
                                                        }
                                                        }
-                                               }
-                                               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, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width);
                                                }
                                                }
-
-                                               $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width);
                                        }
                                }
                        }
                                        }
                                }
                        }
@@ -5052,7 +5062,7 @@ class SimplePie_Item
                        {
                                foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
                                {
                        {
                                foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
                                {
-                                       if (isset($content['attribs']['']['url']))
+                                       if (isset($content['attribs']['']['url']) || isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
                                        {
                                                // Attributes
                                                $bitrate = null;
                                        {
                                                // Attributes
                                                $bitrate = null;
@@ -5137,8 +5147,10 @@ class SimplePie_Item
                                                {
                                                        $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                }
                                                {
                                                        $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
                                                }
-                                               $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
-
+                                               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
                                                // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
 
                                                // CAPTIONS
@@ -5580,7 +5592,7 @@ class SimplePie_Item
                {
                        return (float) $return[0]['data'];
                }
                {
                        return (float) $return[0]['data'];
                }
-               elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+               elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
                {
                        return (float) $match[1];
                }
                {
                        return (float) $match[1];
                }
@@ -5600,7 +5612,7 @@ class SimplePie_Item
                {
                        return (float) $return[0]['data'];
                }
                {
                        return (float) $return[0]['data'];
                }
-               elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+               elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
                {
                        return (float) $match[2];
                }
                {
                        return (float) $match[2];
                }
@@ -6223,7 +6235,7 @@ class SimplePie_Source
                {
                        return (float) $return[0]['data'];
                }
                {
                        return (float) $return[0]['data'];
                }
-               elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+               elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
                {
                        return (float) $match[1];
                }
                {
                        return (float) $match[1];
                }
@@ -6243,7 +6255,7 @@ class SimplePie_Source
                {
                        return (float) $return[0]['data'];
                }
                {
                        return (float) $return[0]['data'];
                }
-               elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match))
+               elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
                {
                        return (float) $match[2];
                }
                {
                        return (float) $match[2];
                }
@@ -7727,16 +7739,17 @@ class SimplePie_File
                        {
                                $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
                                $url_parts = parse_url($url);
                        {
                                $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')
                                {
                                if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https')
                                {
-                                       $url_parts['host'] = "ssl://$url_parts[host]";
+                                       $socket_host = "ssl://$url_parts[host]";
                                        $url_parts['port'] = 443;
                                }
                                if (!isset($url_parts['port']))
                                {
                                        $url_parts['port'] = 80;
                                }
                                        $url_parts['port'] = 443;
                                }
                                if (!isset($url_parts['port']))
                                {
                                        $url_parts['port'] = 80;
                                }
-                               $fp = @fsockopen($url_parts['host'], $url_parts['port'], $errno, $errstr, $timeout);
+                               $fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout);
                                if (!$fp)
                                {
                                        $this->error = 'fsockopen error: ' . $errstr;
                                if (!$fp)
                                {
                                        $this->error = 'fsockopen error: ' . $errstr;
@@ -8482,7 +8495,7 @@ class SimplePie_gzdecode
 
                                // Get the length of the extra field
                                $len = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
 
                                // Get the length of the extra field
                                $len = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
-                               $position += 2;
+                               $this->position += 2;
 
                                // Check the length of the string is still valid
                                $this->min_compressed_size += $len + 4;
 
                                // Check the length of the string is still valid
                                $this->min_compressed_size += $len + 4;
@@ -9234,8 +9247,25 @@ class SimplePie_Misc
                                        $note = 'Unknown Error';
                                        break;
                        }
                                        $note = 'Unknown Error';
                                        break;
                        }
-                       error_log("$note: $message in $file on line $line", 0);
+
+                       $log_error = true;
+                       if (!function_exists('error_log'))
+                       {
+                               $log_error = false;
+                       }
+
+                       $log_file = @ini_get('error_log');
+                       if (!empty($log_file) && ('syslog' != $log_file) && !@is_writable($log_file))
+                       {
+                               $log_error = false;
+                       }
+
+                       if ($log_error)
+                       {
+                               @error_log("$note: $message in $file on line $line", 0);
+                       }
                }
                }
+
                return $message;
        }
 
                return $message;
        }
 
@@ -9432,7 +9462,7 @@ class SimplePie_Misc
                        return SimplePie_Misc::windows_1252_to_utf8($data);
                }
                // This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported).
                        return SimplePie_Misc::windows_1252_to_utf8($data);
                }
                // This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported).
-               elseif (function_exists('mb_convert_encoding') && @mb_convert_encoding("\x80", 'UTF-16BE', $input) !== "\x00\x80" && ($return = @mb_convert_encoding($data, $output, $input)))
+               elseif (function_exists('mb_convert_encoding') && @mb_convert_encoding("\x80", 'UTF-16BE', $input) !== "\x00\x80" && in_array($input, mb_list_encodings()) && ($return = @mb_convert_encoding($data, $output, $input)))
                {
                        return $return;
                }
                {
                        return $return;
                }
@@ -9448,6 +9478,17 @@ class SimplePie_Misc
                }
        }
 
                }
        }
 
+       /**
+        * Normalize an encoding name
+        *
+        * This is automatically generated by create.php
+        *
+        * To generate it, run `php create.php` on the command line, and copy the
+        * output to replace this function.
+        *
+        * @param string $charset Character set to standardise
+        * @return string Standardised name
+        */
        function encoding($charset)
        {
                // Normalization from UTS #22
        function encoding($charset)
        {
                // Normalization from UTS #22
@@ -9481,7 +9522,6 @@ class SimplePie_Misc
 
                        case 'big5':
                        case 'csbig5':
 
                        case 'big5':
                        case 'csbig5':
-                       case 'xxbig5':
                                return 'Big5';
 
                        case 'big5hkscs':
                                return 'Big5';
 
                        case 'big5hkscs':
@@ -9637,14 +9677,14 @@ class SimplePie_Misc
                        case 'isoir85':
                                return 'ES2';
 
                        case 'isoir85':
                                return 'ES2';
 
-                       case 'cseucfixwidjapanese':
-                       case 'extendedunixcodefixedwidthforjapanese':
-                               return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
-
                        case 'cseucpkdfmtjapanese':
                        case 'eucjp':
                        case 'extendedunixcodepackedformatforjapanese':
                        case 'cseucpkdfmtjapanese':
                        case 'eucjp':
                        case 'extendedunixcodepackedformatforjapanese':
-                               return 'Extended_UNIX_Code_Packed_Format_for_Japanese';
+                               return 'EUC-JP';
+
+                       case 'cseucfixwidjapanese':
+                       case 'extendedunixcodefixedwidthforjapanese':
+                               return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
 
                        case 'gb18030':
                                return 'GB18030';
 
                        case 'gb18030':
                                return 'GB18030';
@@ -9695,107 +9735,33 @@ class SimplePie_Misc
                                return 'HP-DeskTop';
 
                        case 'cshplegal':
                                return 'HP-DeskTop';
 
                        case 'cshplegal':
-                       case 'hplegal':
-                               return 'HP-Legal';
-
-                       case 'cshpmath8':
-                       case 'hpmath8':
-                               return 'HP-Math8';
-
-                       case 'cshppifont':
-                       case 'hppifont':
-                               return 'HP-Pi-font';
-
-                       case 'cshproman8':
-                       case 'hproman8':
-                       case 'r8':
-                       case 'roman8':
-                               return 'hp-roman8';
-
-                       case 'hzgb2312':
-                               return 'HZ-GB-2312';
-
-                       case 'csibmsymbols':
-                       case 'ibmsymbols':
-                               return 'IBM-Symbols';
-
-                       case 'csibmthai':
-                       case 'ibmthai':
-                               return 'IBM-Thai';
-
-                       case 'ccsid858':
-                       case 'cp858':
-                       case 'ibm858':
-                       case 'pcmultilingual850euro':
-                               return 'IBM00858';
-
-                       case 'ccsid924':
-                       case 'cp924':
-                       case 'ebcdiclatin9euro':
-                       case 'ibm924':
-                               return 'IBM00924';
-
-                       case 'ccsid1140':
-                       case 'cp1140':
-                       case 'ebcdicus37euro':
-                       case 'ibm1140':
-                               return 'IBM01140';
-
-                       case 'ccsid1141':
-                       case 'cp1141':
-                       case 'ebcdicde273euro':
-                       case 'ibm1141':
-                               return 'IBM01141';
-
-                       case 'ccsid1142':
-                       case 'cp1142':
-                       case 'ebcdicdk277euro':
-                       case 'ebcdicno277euro':
-                       case 'ibm1142':
-                               return 'IBM01142';
-
-                       case 'ccsid1143':
-                       case 'cp1143':
-                       case 'ebcdicfi278euro':
-                       case 'ebcdicse278euro':
-                       case 'ibm1143':
-                               return 'IBM01143';
+                       case 'hplegal':
+                               return 'HP-Legal';
 
 
-                       case 'ccsid1144':
-                       case 'cp1144':
-                       case 'ebcdicit280euro':
-                       case 'ibm1144':
-                               return 'IBM01144';
+                       case 'cshpmath8':
+                       case 'hpmath8':
+                               return 'HP-Math8';
 
 
-                       case 'ccsid1145':
-                       case 'cp1145':
-                       case 'ebcdices284euro':
-                       case 'ibm1145':
-                               return 'IBM01145';
+                       case 'cshppifont':
+                       case 'hppifont':
+                               return 'HP-Pi-font';
 
 
-                       case 'ccsid1146':
-                       case 'cp1146':
-                       case 'ebcdicgb285euro':
-                       case 'ibm1146':
-                               return 'IBM01146';
+                       case 'cshproman8':
+                       case 'hproman8':
+                       case 'r8':
+                       case 'roman8':
+                               return 'hp-roman8';
 
 
-                       case 'ccsid1147':
-                       case 'cp1147':
-                       case 'ebcdicfr297euro':
-                       case 'ibm1147':
-                               return 'IBM01147';
+                       case 'hzgb2312':
+                               return 'HZ-GB-2312';
 
 
-                       case 'ccsid1148':
-                       case 'cp1148':
-                       case 'ebcdicinternational500euro':
-                       case 'ibm1148':
-                               return 'IBM01148';
+                       case 'csibmsymbols':
+                       case 'ibmsymbols':
+                               return 'IBM-Symbols';
 
 
-                       case 'ccsid1149':
-                       case 'cp1149':
-                       case 'ebcdicis871euro':
-                       case 'ibm1149':
-                               return 'IBM01149';
+                       case 'csibmthai':
+                       case 'ibmthai':
+                               return 'IBM-Thai';
 
                        case 'cp37':
                        case 'csibm37':
 
                        case 'cp37':
                        case 'csibm37':
@@ -9944,6 +9910,12 @@ class SimplePie_Misc
                        case 'ibm857':
                                return 'IBM857';
 
                        case 'ibm857':
                                return 'IBM857';
 
+                       case 'ccsid858':
+                       case 'cp858':
+                       case 'ibm858':
+                       case 'pcmultilingual850euro':
+                               return 'IBM00858';
+
                        case '860':
                        case 'cp860':
                        case 'csibm860':
                        case '860':
                        case 'cp860':
                        case 'csibm860':
@@ -10046,6 +10018,12 @@ class SimplePie_Misc
                        case 'ibm918':
                                return 'IBM918';
 
                        case 'ibm918':
                                return 'IBM918';
 
+                       case 'ccsid924':
+                       case 'cp924':
+                       case 'ebcdiclatin9euro':
+                       case 'ibm924':
+                               return 'IBM00924';
+
                        case 'cp1026':
                        case 'csibm1026':
                        case 'ibm1026':
                        case 'cp1026':
                        case 'csibm1026':
                        case 'ibm1026':
@@ -10054,6 +10032,68 @@ class SimplePie_Misc
                        case 'ibm1047':
                                return 'IBM1047';
 
                        case 'ibm1047':
                                return 'IBM1047';
 
+                       case 'ccsid1140':
+                       case 'cp1140':
+                       case 'ebcdicus37euro':
+                       case 'ibm1140':
+                               return 'IBM01140';
+
+                       case 'ccsid1141':
+                       case 'cp1141':
+                       case 'ebcdicde273euro':
+                       case 'ibm1141':
+                               return 'IBM01141';
+
+                       case 'ccsid1142':
+                       case 'cp1142':
+                       case 'ebcdicdk277euro':
+                       case 'ebcdicno277euro':
+                       case 'ibm1142':
+                               return 'IBM01142';
+
+                       case 'ccsid1143':
+                       case 'cp1143':
+                       case 'ebcdicfi278euro':
+                       case 'ebcdicse278euro':
+                       case 'ibm1143':
+                               return 'IBM01143';
+
+                       case 'ccsid1144':
+                       case 'cp1144':
+                       case 'ebcdicit280euro':
+                       case 'ibm1144':
+                               return 'IBM01144';
+
+                       case 'ccsid1145':
+                       case 'cp1145':
+                       case 'ebcdices284euro':
+                       case 'ibm1145':
+                               return 'IBM01145';
+
+                       case 'ccsid1146':
+                       case 'cp1146':
+                       case 'ebcdicgb285euro':
+                       case 'ibm1146':
+                               return 'IBM01146';
+
+                       case 'ccsid1147':
+                       case 'cp1147':
+                       case 'ebcdicfr297euro':
+                       case 'ibm1147':
+                               return 'IBM01147';
+
+                       case 'ccsid1148':
+                       case 'cp1148':
+                       case 'ebcdicinternational500euro':
+                       case 'ibm1148':
+                               return 'IBM01148';
+
+                       case 'ccsid1149':
+                       case 'cp1149':
+                       case 'ebcdicis871euro':
+                       case 'ibm1149':
+                               return 'IBM01149';
+
                        case 'csiso143iecp271':
                        case 'iecp271':
                        case 'isoir143':
                        case 'csiso143iecp271':
                        case 'iecp271':
                        case 'isoir143':
@@ -10596,11 +10636,6 @@ class SimplePie_Misc
                        case 'sen850200c':
                                return 'SEN_850200_C';
 
                        case 'sen850200c':
                                return 'SEN_850200_C';
 
-                       case 'csshiftjis':
-                       case 'mskanji':
-                       case 'shiftjis':
-                               return 'Shift_JIS';
-
                        case 'csiso102t617bit':
                        case 'isoir102':
                        case 't617bit':
                        case 'csiso102t617bit':
                        case 'isoir102':
                        case 't617bit':
@@ -10699,7 +10734,10 @@ class SimplePie_Misc
                        case 'viscii':
                                return 'VISCII';
 
                        case 'viscii':
                                return 'VISCII';
 
+                       case 'csshiftjis':
                        case 'cswindows31j':
                        case 'cswindows31j':
+                       case 'mskanji':
+                       case 'shiftjis':
                        case 'windows31j':
                                return 'Windows-31J';
 
                        case 'windows31j':
                                return 'Windows-31J';
 
@@ -11360,6 +11398,58 @@ function embed_wmedia(width, height, link) {
 }
                <?php
        }
 }
                <?php
        }
+
+
+
+       /**
+        * Format debugging information
+        */
+       function debug($sp)
+       {
+               $info = 'SimplePie ' . SIMPLEPIE_VERSION . ' Build ' . SIMPLEPIE_BUILD . "\n";
+               $info .= 'PHP ' . PHP_VERSION . "\n";
+               if ($sp->error() !== null)
+               {
+                       $info .= 'Error occurred: ' . $sp->error() . "\n";
+               }
+               else
+               {
+                       $info .= "No error found.\n";
+               }
+               $info .= "Extensions:\n";
+               $extensions = array('pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml');
+               foreach ($extensions as $ext)
+               {
+                       if (extension_loaded($ext))
+                       {
+                               $info .= "    $ext loaded\n";
+                               switch ($ext)
+                               {
+                                       case 'pcre':
+                                               $info .= '      Version ' . PCRE_VERSION . "\n";
+                                               break;
+                                       case 'curl':
+                                               $version = curl_version();
+                                               $info .= '      Version ' . $version['version'] . "\n";
+                                               break;
+                                       case 'mbstring':
+                                               $info .= '      Overloading: ' . mb_get_info('func_overload') . "\n";
+                                               break;
+                                       case 'iconv':
+                                               $info .= '      Version ' . ICONV_VERSION . "\n";
+                                               break;
+                                       case 'xml':
+                                               $info .= '      Version ' . LIBXML_DOTTED_VERSION . "\n";
+                                               break;
+                               }
+                       }
+                       else
+                       {
+                               $info .= "    $ext not loaded\n";
+                       }
+               }
+               return $info;
+       }
 }
 
 /**
 }
 
 /**
@@ -11831,14 +11921,135 @@ class SimplePie_IRI
        /**
         * Replace invalid character with percent encoding
         *
        /**
         * Replace invalid character with percent encoding
         *
-        * @access private
         * @param string $string Input string
         * @param string $valid_chars Valid characters
         * @param int $case Normalise case
         * @return string
         */
         * @param string $string Input string
         * @param string $valid_chars Valid characters
         * @param int $case Normalise case
         * @return string
         */
-       function replace_invalid_with_pct_encoding($string, $valid_chars, $case = SIMPLEPIE_SAME_CASE)
+       function replace_invalid_with_pct_encoding($string, $valid_chars, $case = SIMPLEPIE_SAME_CASE, $iprivate = false)
        {
        {
+               // Normalize as many pct-encoded sections as possible
+               $string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array(&$this, 'remove_iunreserved_percent_encoded'), $string);
+
+               // Replace invalid percent characters
+               $string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string);
+
+               // Add unreserved and % to $valid_chars (the latter is safe because all
+               // pct-encoded sections are now valid).
+               $valid_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%';
+
+               // Now replace any bytes that aren't allowed with their pct-encoded versions
+               $position = 0;
+               $strlen = strlen($string);
+               while (($position += strspn($string, $valid_chars, $position)) < $strlen)
+               {
+                       $value = ord($string[$position]);
+
+                       // Start position
+                       $start = $position;
+
+                       // By default we are valid
+                       $valid = true;
+
+                       // No one byte sequences are valid due to the while.
+                       // Two byte sequence:
+                       if (($value & 0xE0) === 0xC0)
+                       {
+                               $character = ($value & 0x1F) << 6;
+                               $length = 2;
+                               $remaining = 1;
+                       }
+                       // Three byte sequence:
+                       elseif (($value & 0xF0) === 0xE0)
+                       {
+                               $character = ($value & 0x0F) << 12;
+                               $length = 3;
+                               $remaining = 2;
+                       }
+                       // Four byte sequence:
+                       elseif (($value & 0xF8) === 0xF0)
+                       {
+                               $character = ($value & 0x07) << 18;
+                               $length = 4;
+                               $remaining = 3;
+                       }
+                       // Invalid byte:
+                       else
+                       {
+                               $valid = false;
+                               $length = 1;
+                               $remaining = 0;
+                       }
+
+                       if ($remaining)
+                       {
+                               if ($position + $length <= $strlen)
+                               {
+                                       for ($position++; $remaining; $position++)
+                                       {
+                                               $value = ord($string[$position]);
+
+                                               // Check that the byte is valid, then add it to the character:
+                                               if (($value & 0xC0) === 0x80)
+                                               {
+                                                       $character |= ($value & 0x3F) << (--$remaining * 6);
+                                               }
+                                               // If it is invalid, count the sequence as invalid and reprocess the current byte:
+                                               else
+                                               {
+                                                       $valid = false;
+                                                       $position--;
+                                                       break;
+                                               }
+                                       }
+                               }
+                               else
+                               {
+                                       $position = $strlen - 1;
+                                       $valid = false;
+                               }
+                       }
+
+                       // Percent encode anything invalid or not in ucschar
+                       if (
+                               // Invalid sequences
+                               !$valid
+                               // Non-shortest form sequences are invalid
+                               || $length > 1 && $character <= 0x7F
+                               || $length > 2 && $character <= 0x7FF
+                               || $length > 3 && $character <= 0xFFFF
+                               // Outside of range of ucschar codepoints
+                               // Noncharacters
+                               || ($character & 0xFFFE) === 0xFFFE
+                               || $character >= 0xFDD0 && $character <= 0xFDEF
+                               || (
+                                       // Everything else not in ucschar
+                                          $character > 0xD7FF && $character < 0xF900
+                                       || $character < 0xA0
+                                       || $character > 0xEFFFD
+                               )
+                               && (
+                                       // Everything not in iprivate, if it applies
+                                          !$iprivate
+                                       || $character < 0xE000
+                                       || $character > 0x10FFFD
+                               )
+                       )
+                       {
+                               // If we were a character, pretend we weren't, but rather an error.
+                               if ($valid)
+                                       $position--;
+
+                               for ($j = $start; $j <= $position; $j++)
+                               {
+                                       $string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1);
+                                       $j += 2;
+                                       $position += 2;
+                                       $strlen += 2;
+                               }
+                       }
+               }
+
                // Normalise case
                if ($case & SIMPLEPIE_LOWERCASE)
                {
                // Normalise case
                if ($case & SIMPLEPIE_LOWERCASE)
                {
@@ -11849,61 +12060,148 @@ class SimplePie_IRI
                        $string = strtoupper($string);
                }
 
                        $string = strtoupper($string);
                }
 
-               // Store position and string length (to avoid constantly recalculating this)
-               $position = 0;
-               $strlen = strlen($string);
+               return $string;
+       }
 
 
-               // Loop as long as we have invalid characters, advancing the position to the next invalid character
-               while (($position += strspn($string, $valid_chars, $position)) < $strlen)
+       /**
+        * Callback function for preg_replace_callback.
+        *
+        * Removes sequences of percent encoded bytes that represent UTF-8
+        * encoded characters in iunreserved
+        *
+        * @access private
+        * @param array $match PCRE match
+        * @return string Replacement
+        */
+       function remove_iunreserved_percent_encoded($match)
+       {
+               // As we just have valid percent encoded sequences we can just explode
+               // and ignore the first member of the returned array (an empty string).
+               $bytes = explode('%', $match[0]);
+
+               // Initialize the new string (this is what will be returned) and that
+               // there are no bytes remaining in the current sequence (unsurprising
+               // at the first byte!).
+               $string = '';
+               $remaining = 0;
+
+               // Loop over each and every byte, and set $value to its value
+               for ($i = 1, $len = count($bytes); $i < $len; $i++)
                {
                {
-                       // If we have a % character
-                       if ($string[$position] === '%')
+                       $value = hexdec($bytes[$i]);
+
+                       // If we're the first byte of sequence:
+                       if (!$remaining)
                        {
                        {
-                               // If we have a pct-encoded section
-                               if ($position + 2 < $strlen && strspn($string, '0123456789ABCDEFabcdef', $position + 1, 2) === 2)
-                               {
-                                       // Get the the represented character
-                                       $chr = chr(hexdec(substr($string, $position + 1, 2)));
+                               // Start position
+                               $start = $i;
 
 
-                                       // If the character is valid, replace the pct-encoded with the actual character while normalising case
-                                       if (strpos($valid_chars, $chr) !== false)
-                                       {
-                                               if ($case & SIMPLEPIE_LOWERCASE)
-                                               {
-                                                       $chr = strtolower($chr);
-                                               }
-                                               elseif ($case & SIMPLEPIE_UPPERCASE)
-                                               {
-                                                       $chr = strtoupper($chr);
-                                               }
-                                               $string = substr_replace($string, $chr, $position, 3);
-                                               $strlen -= 2;
-                                               $position++;
-                                       }
+                               // By default we are valid
+                               $valid = true;
 
 
-                                       // Otherwise just normalise the pct-encoded to uppercase
-                                       else
+                               // One byte sequence:
+                               if ($value <= 0x7F)
+                               {
+                                       $character = $value;
+                                       $length = 1;
+                               }
+                               // Two byte sequence:
+                               elseif (($value & 0xE0) === 0xC0)
+                               {
+                                       $character = ($value & 0x1F) << 6;
+                                       $length = 2;
+                                       $remaining = 1;
+                               }
+                               // Three byte sequence:
+                               elseif (($value & 0xF0) === 0xE0)
+                               {
+                                       $character = ($value & 0x0F) << 12;
+                                       $length = 3;
+                                       $remaining = 2;
+                               }
+                               // Four byte sequence:
+                               elseif (($value & 0xF8) === 0xF0)
+                               {
+                                       $character = ($value & 0x07) << 18;
+                                       $length = 4;
+                                       $remaining = 3;
+                               }
+                               // Invalid byte:
+                               else
+                               {
+                                       $valid = false;
+                                       $remaining = 0;
+                               }
+                       }
+                       // Continuation byte:
+                       else
+                       {
+                               // Check that the byte is valid, then add it to the character:
+                               if (($value & 0xC0) === 0x80)
+                               {
+                                       $remaining--;
+                                       $character |= ($value & 0x3F) << ($remaining * 6);
+                               }
+                               // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence:
+                               else
+                               {
+                                       $valid = false;
+                                       $remaining = 0;
+                                       $i--;
+                               }
+                       }
+
+                       // If we've reached the end of the current byte sequence, append it to Unicode::$data
+                       if (!$remaining)
+                       {
+                               // Percent encode anything invalid or not in iunreserved
+                               if (
+                                       // Invalid sequences
+                                       !$valid
+                                       // Non-shortest form sequences are invalid
+                                       || $length > 1 && $character <= 0x7F
+                                       || $length > 2 && $character <= 0x7FF
+                                       || $length > 3 && $character <= 0xFFFF
+                                       // Outside of range of iunreserved codepoints
+                                       || $character < 0x2D
+                                       || $character > 0xEFFFD
+                                       // Noncharacters
+                                       || ($character & 0xFFFE) === 0xFFFE
+                                       || $character >= 0xFDD0 && $character <= 0xFDEF
+                                       // Everything else not in iunreserved (this is all BMP)
+                                       || $character === 0x2F
+                                       || $character > 0x39 && $character < 0x41
+                                       || $character > 0x5A && $character < 0x61
+                                       || $character > 0x7A && $character < 0x7E
+                                       || $character > 0x7E && $character < 0xA0
+                                       || $character > 0xD7FF && $character < 0xF900
+                               )
+                               {
+                                       for ($j = $start; $j <= $i; $j++)
                                        {
                                        {
-                                               $string = substr_replace($string, strtoupper(substr($string, $position + 1, 2)), $position + 1, 2);
-                                               $position += 3;
+                                               $string .= '%' . strtoupper($bytes[$j]);
                                        }
                                }
                                        }
                                }
-                               // If we don't have a pct-encoded section, just replace the % with its own esccaped form
                                else
                                {
                                else
                                {
-                                       $string = substr_replace($string, '%25', $position, 1);
-                                       $strlen += 2;
-                                       $position += 3;
+                                       for ($j = $start; $j <= $i; $j++)
+                                       {
+                                               $string .= chr(hexdec($bytes[$j]));
+                                       }
                                }
                        }
                                }
                        }
-                       // If we have an invalid character, change into its pct-encoded form
-                       else
+               }
+
+               // If we have any bytes left over they are invalid (i.e., we are
+               // mid-way through a multi-byte sequence)
+               if ($remaining)
+               {
+                       for ($j = $start; $j < $len; $j++)
                        {
                        {
-                               $replacement = sprintf("%%%02X", ord($string[$position]));
-                               $string = str_replace($string[$position], $replacement, $string);
-                               $strlen = strlen($string);
+                               $string .= '%' . strtoupper($bytes[$j]);
                        }
                }
                        }
                }
+
                return $string;
        }
 
                return $string;
        }
 
@@ -12031,7 +12329,7 @@ class SimplePie_IRI
                }
                elseif ($host[0] === '[' && substr($host, -1) === ']')
                {
                }
                elseif ($host[0] === '[' && substr($host, -1) === ']')
                {
-                       if (Net_IPv6::checkIPv6(substr($host, 1, -1)))
+                       if (SimplePie_Net_IPv6::checkIPv6(substr($host, 1, -1)))
                        {
                                $this->host = $host;
                                $this->valid[__FUNCTION__] = true;
                        {
                                $this->host = $host;
                                $this->valid[__FUNCTION__] = true;
@@ -12130,7 +12428,7 @@ class SimplePie_IRI
                }
                else
                {
                }
                else
                {
-                       $this->query = $this->replace_invalid_with_pct_encoding($query, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:@/?');
+                       $this->query = $this->replace_invalid_with_pct_encoding($query, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$\'()*+,;:@/?&=');
                }
                $this->valid[__FUNCTION__] = true;
                return true;
                }
                $this->valid[__FUNCTION__] = true;
                return true;
@@ -13933,7 +14231,7 @@ class SimplePie_XML_Declaration_Parser
                }
                else
                {
                }
                else
                {
-                       $this->state = 'standalone_name';
+                       $this->state = false;
                }
        }
 
                }
        }
 
@@ -13947,7 +14245,7 @@ class SimplePie_XML_Declaration_Parser
                }
                else
                {
                }
                else
                {
-                       $this->state = false;
+                       $this->state = 'standalone_name';
                }
        }
 
                }
        }
 
@@ -14425,7 +14723,7 @@ class SimplePie_Parser
                                        case constant('XMLReader::END_ELEMENT'):
                                                if ($xml->namespaceURI !== '')
                                                {
                                        case constant('XMLReader::END_ELEMENT'):
                                                if ($xml->namespaceURI !== '')
                                                {
-                                                       $tagName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}";
+                                                       $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
                                                }
                                                else
                                                {
                                                }
                                                else
                                                {
@@ -14437,7 +14735,7 @@ class SimplePie_Parser
                                                $empty = $xml->isEmptyElement;
                                                if ($xml->namespaceURI !== '')
                                                {
                                                $empty = $xml->isEmptyElement;
                                                if ($xml->namespaceURI !== '')
                                                {
-                                                       $tagName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}";
+                                                       $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
                                                }
                                                else
                                                {
                                                }
                                                else
                                                {
@@ -14448,7 +14746,7 @@ class SimplePie_Parser
                                                {
                                                        if ($xml->namespaceURI !== '')
                                                        {
                                                {
                                                        if ($xml->namespaceURI !== '')
                                                        {
-                                                               $attrName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}";
+                                                               $attrName = $xml->namespaceURI . $this->separator . $xml->localName;
                                                        }
                                                        else
                                                        {
                                                        }
                                                        else
                                                        {
@@ -14913,7 +15211,7 @@ class SimplePie_Sanitize
                                                                        }
                                                                        else
                                                                        {
                                                                        }
                                                                        else
                                                                        {
-                                                                               trigger_error("$this->cache_location is not writeable", E_USER_WARNING);
+                                                                               trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
                                                                        }
                                                                }
                                                        }
                                                                        }
                                                                }
                                                        }