home *** CD-ROM | disk | FTP | other *** search
/ HTML Examples / WP.iso / wordpress / wp-includes / SimplePie / Item.php < prev    next >
Encoding:
PHP Script  |  2012-11-21  |  96.0 KB  |  2,965 lines

  1. <?php
  2. /**
  3.  * SimplePie
  4.  *
  5.  * A PHP-Based RSS and Atom Feed Framework.
  6.  * Takes the hard work out of managing a complete RSS/Atom solution.
  7.  *
  8.  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
  9.  * All rights reserved.
  10.  *
  11.  * Redistribution and use in source and binary forms, with or without modification, are
  12.  * permitted provided that the following conditions are met:
  13.  *
  14.  *     * Redistributions of source code must retain the above copyright notice, this list of
  15.  *       conditions and the following disclaimer.
  16.  *
  17.  *     * Redistributions in binary form must reproduce the above copyright notice, this list
  18.  *       of conditions and the following disclaimer in the documentation and/or other materials
  19.  *       provided with the distribution.
  20.  *
  21.  *     * Neither the name of the SimplePie Team nor the names of its contributors may be used
  22.  *       to endorse or promote products derived from this software without specific prior
  23.  *       written permission.
  24.  *
  25.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
  26.  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  27.  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
  28.  * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  29.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  30.  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  31.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  32.  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  33.  * POSSIBILITY OF SUCH DAMAGE.
  34.  *
  35.  * @package SimplePie
  36.  * @version 1.3.1
  37.  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
  38.  * @author Ryan Parman
  39.  * @author Geoffrey Sneddon
  40.  * @author Ryan McCue
  41.  * @link http://simplepie.org/ SimplePie
  42.  * @license http://www.opensource.org/licenses/bsd-license.php BSD License
  43.  */
  44.  
  45.  
  46. /**
  47.  * Manages all item-related data
  48.  *
  49.  * Used by {@see SimplePie::get_item()} and {@see SimplePie::get_items()}
  50.  *
  51.  * This class can be overloaded with {@see SimplePie::set_item_class()}
  52.  *
  53.  * @package SimplePie
  54.  * @subpackage API
  55.  */
  56. class SimplePie_Item
  57. {
  58.     /**
  59.      * Parent feed
  60.      *
  61.      * @access private
  62.      * @var SimplePie
  63.      */
  64.     var $feed;
  65.  
  66.     /**
  67.      * Raw data
  68.      *
  69.      * @access private
  70.      * @var array
  71.      */
  72.     var $data = array();
  73.  
  74.     /**
  75.      * Registry object
  76.      *
  77.      * @see set_registry
  78.      * @var SimplePie_Registry
  79.      */
  80.     protected $registry;
  81.  
  82.     /**
  83.      * Create a new item object
  84.      *
  85.      * This is usually used by {@see SimplePie::get_items} and
  86.      * {@see SimplePie::get_item}. Avoid creating this manually.
  87.      *
  88.      * @param SimplePie $feed Parent feed
  89.      * @param array $data Raw data
  90.      */
  91.     public function __construct($feed, $data)
  92.     {
  93.         $this->feed = $feed;
  94.         $this->data = $data;
  95.     }
  96.  
  97.     /**
  98.      * Set the registry handler
  99.      *
  100.      * This is usually used by {@see SimplePie_Registry::create}
  101.      *
  102.      * @since 1.3
  103.      * @param SimplePie_Registry $registry
  104.      */
  105.     public function set_registry(SimplePie_Registry $registry)
  106.     {
  107.         $this->registry = $registry;
  108.     }
  109.  
  110.     /**
  111.      * Get a string representation of the item
  112.      *
  113.      * @return string
  114.      */
  115.     public function __toString()
  116.     {
  117.         return md5(serialize($this->data));
  118.     }
  119.  
  120.     /**
  121.      * Remove items that link back to this before destroying this object
  122.      */
  123.     public function __destruct()
  124.     {
  125.         if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
  126.         {
  127.             unset($this->feed);
  128.         }
  129.     }
  130.  
  131.     /**
  132.      * Get data for an item-level element
  133.      *
  134.      * This method allows you to get access to ANY element/attribute that is a
  135.      * sub-element of the item/entry tag.
  136.      *
  137.      * See {@see SimplePie::get_feed_tags()} for a description of the return value
  138.      *
  139.      * @since 1.0
  140.      * @see http://simplepie.org/wiki/faq/supported_xml_namespaces
  141.      * @param string $namespace The URL of the XML namespace of the elements you're trying to access
  142.      * @param string $tag Tag name
  143.      * @return array
  144.      */
  145.     public function get_item_tags($namespace, $tag)
  146.     {
  147.         if (isset($this->data['child'][$namespace][$tag]))
  148.         {
  149.             return $this->data['child'][$namespace][$tag];
  150.         }
  151.         else
  152.         {
  153.             return null;
  154.         }
  155.     }
  156.  
  157.     /**
  158.      * Get the base URL value from the parent feed
  159.      *
  160.      * Uses `<xml:base>`
  161.      *
  162.      * @param array $element
  163.      * @return string
  164.      */
  165.     public function get_base($element = array())
  166.     {
  167.         return $this->feed->get_base($element);
  168.     }
  169.  
  170.     /**
  171.      * Sanitize feed data
  172.      *
  173.      * @access private
  174.      * @see SimplePie::sanitize()
  175.      * @param string $data Data to sanitize
  176.      * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants
  177.      * @param string $base Base URL to resolve URLs against
  178.      * @return string Sanitized data
  179.      */
  180.     public function sanitize($data, $type, $base = '')
  181.     {
  182.         return $this->feed->sanitize($data, $type, $base);
  183.     }
  184.  
  185.     /**
  186.      * Get the parent feed
  187.      *
  188.      * Note: this may not work as you think for multifeeds!
  189.      *
  190.      * @link http://simplepie.org/faq/typical_multifeed_gotchas#missing_data_from_feed
  191.      * @since 1.0
  192.      * @return SimplePie
  193.      */
  194.     public function get_feed()
  195.     {
  196.         return $this->feed;
  197.     }
  198.  
  199.     /**
  200.      * Get the unique identifier for the item
  201.      *
  202.      * This is usually used when writing code to check for new items in a feed.
  203.      *
  204.      * Uses `<atom:id>`, `<guid>`, `<dc:identifier>` or the `about` attribute
  205.      * for RDF. If none of these are supplied (or `$hash` is true), creates an
  206.      * MD5 hash based on the permalink and title. If either of those are not
  207.      * supplied, creates a hash based on the full feed data.
  208.      *
  209.      * @since Beta 2
  210.      * @param boolean $hash Should we force using a hash instead of the supplied ID?
  211.      * @return string
  212.      */
  213.     public function get_id($hash = false)
  214.     {
  215.         if (!$hash)
  216.         {
  217.             if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id'))
  218.             {
  219.                 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  220.             }
  221.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id'))
  222.             {
  223.                 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  224.             }
  225.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
  226.             {
  227.                 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  228.             }
  229.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier'))
  230.             {
  231.                 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  232.             }
  233.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier'))
  234.             {
  235.                 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  236.             }
  237.             elseif (isset($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about']))
  238.             {
  239.                 return $this->sanitize($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'], SIMPLEPIE_CONSTRUCT_TEXT);
  240.             }
  241.             elseif (($return = $this->get_permalink()) !== null)
  242.             {
  243.                 return $return;
  244.             }
  245.             elseif (($return = $this->get_title()) !== null)
  246.             {
  247.                 return $return;
  248.             }
  249.         }
  250.         if ($this->get_permalink() !== null || $this->get_title() !== null)
  251.         {
  252.             return md5($this->get_permalink() . $this->get_title());
  253.         }
  254.         else
  255.         {
  256.             return md5(serialize($this->data));
  257.         }
  258.     }
  259.  
  260.     /**
  261.      * Get the title of the item
  262.      *
  263.      * Uses `<atom:title>`, `<title>` or `<dc:title>`
  264.      *
  265.      * @since Beta 2 (previously called `get_item_title` since 0.8)
  266.      * @return string|null
  267.      */
  268.     public function get_title()
  269.     {
  270.         if (!isset($this->data['title']))
  271.         {
  272.             if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
  273.             {
  274.                 $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
  275.             }
  276.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
  277.             {
  278.                 $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
  279.             }
  280.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
  281.             {
  282.                 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
  283.             }
  284.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
  285.             {
  286.                 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
  287.             }
  288.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
  289.             {
  290.                 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
  291.             }
  292.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
  293.             {
  294.                 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  295.             }
  296.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
  297.             {
  298.                 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  299.             }
  300.             else
  301.             {
  302.                 $this->data['title'] = null;
  303.             }
  304.         }
  305.         return $this->data['title'];
  306.     }
  307.  
  308.     /**
  309.      * Get the content for the item
  310.      *
  311.      * Prefers summaries over full content , but will return full content if a
  312.      * summary does not exist.
  313.      *
  314.      * To prefer full content instead, use {@see get_content}
  315.      *
  316.      * Uses `<atom:summary>`, `<description>`, `<dc:description>` or
  317.      * `<itunes:subtitle>`
  318.      *
  319.      * @since 0.8
  320.      * @param boolean $description_only Should we avoid falling back to the content?
  321.      * @return string|null
  322.      */
  323.     public function get_description($description_only = false)
  324.     {
  325.         if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary'))
  326.         {
  327.             return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
  328.         }
  329.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary'))
  330.         {
  331.             return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
  332.         }
  333.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
  334.         {
  335.             return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
  336.         }
  337.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
  338.         {
  339.             return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
  340.         }
  341.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
  342.         {
  343.             return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  344.         }
  345.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
  346.         {
  347.             return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  348.         }
  349.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
  350.         {
  351.             return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
  352.         }
  353.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
  354.         {
  355.             return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  356.         }
  357.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
  358.         {
  359.             return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
  360.         }
  361.  
  362.         elseif (!$description_only)
  363.         {
  364.             return $this->get_content(true);
  365.         }
  366.         else
  367.         {
  368.             return null;
  369.         }
  370.     }
  371.  
  372.     /**
  373.      * Get the content for the item
  374.      *
  375.      * Prefers full content over summaries, but will return a summary if full
  376.      * content does not exist.
  377.      *
  378.      * To prefer summaries instead, use {@see get_description}
  379.      *
  380.      * Uses `<atom:content>` or `<content:encoded>` (RSS 1.0 Content Module)
  381.      *
  382.      * @since 1.0
  383.      * @param boolean $content_only Should we avoid falling back to the description?
  384.      * @return string|null
  385.      */
  386.     public function get_content($content_only = false)
  387.     {
  388.         if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content'))
  389.         {
  390.             return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_content_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
  391.         }
  392.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content'))
  393.         {
  394.             return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
  395.         }
  396.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded'))
  397.         {
  398.             return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
  399.         }
  400.         elseif (!$content_only)
  401.         {
  402.             return $this->get_description(true);
  403.         }
  404.         else
  405.         {
  406.             return null;
  407.         }
  408.     }
  409.  
  410.     /**
  411.      * Get a category for the item
  412.      *
  413.      * @since Beta 3 (previously called `get_categories()` since Beta 2)
  414.      * @param int $key The category that you want to return.  Remember that arrays begin with 0, not 1
  415.      * @return SimplePie_Category|null
  416.      */
  417.     public function get_category($key = 0)
  418.     {
  419.         $categories = $this->get_categories();
  420.         if (isset($categories[$key]))
  421.         {
  422.             return $categories[$key];
  423.         }
  424.         else
  425.         {
  426.             return null;
  427.         }
  428.     }
  429.  
  430.     /**
  431.      * Get all categories for the item
  432.      *
  433.      * Uses `<atom:category>`, `<category>` or `<dc:subject>`
  434.      *
  435.      * @since Beta 3
  436.      * @return array|null List of {@see SimplePie_Category} objects
  437.      */
  438.     public function get_categories()
  439.     {
  440.         $categories = array();
  441.  
  442.         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
  443.         {
  444.             $term = null;
  445.             $scheme = null;
  446.             $label = null;
  447.             if (isset($category['attribs']['']['term']))
  448.             {
  449.                 $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
  450.             }
  451.             if (isset($category['attribs']['']['scheme']))
  452.             {
  453.                 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  454.             }
  455.             if (isset($category['attribs']['']['label']))
  456.             {
  457.                 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
  458.             }
  459.             $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
  460.         }
  461.         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
  462.         {
  463.             // This is really the label, but keep this as the term also for BC.
  464.             // Label will also work on retrieving because that falls back to term.
  465.             $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  466.             if (isset($category['attribs']['']['domain']))
  467.             {
  468.                 $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
  469.             }
  470.             else
  471.             {
  472.                 $scheme = null;
  473.             }
  474.             $categories[] = $this->registry->create('Category', array($term, $scheme, null));
  475.         }
  476.         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
  477.         {
  478.             $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
  479.         }
  480.         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
  481.         {
  482.             $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
  483.         }
  484.  
  485.         if (!empty($categories))
  486.         {
  487.             return array_unique($categories);
  488.         }
  489.         else
  490.         {
  491.             return null;
  492.         }
  493.     }
  494.  
  495.     /**
  496.      * Get an author for the item
  497.      *
  498.      * @since Beta 2
  499.      * @param int $key The author that you want to return.  Remember that arrays begin with 0, not 1
  500.      * @return SimplePie_Author|null
  501.      */
  502.     public function get_author($key = 0)
  503.     {
  504.         $authors = $this->get_authors();
  505.         if (isset($authors[$key]))
  506.         {
  507.             return $authors[$key];
  508.         }
  509.         else
  510.         {
  511.             return null;
  512.         }
  513.     }
  514.  
  515.     /**
  516.      * Get a contributor for the item
  517.      *
  518.      * @since 1.1
  519.      * @param int $key The contrbutor that you want to return.  Remember that arrays begin with 0, not 1
  520.      * @return SimplePie_Author|null
  521.      */
  522.     public function get_contributor($key = 0)
  523.     {
  524.         $contributors = $this->get_contributors();
  525.         if (isset($contributors[$key]))
  526.         {
  527.             return $contributors[$key];
  528.         }
  529.         else
  530.         {
  531.             return null;
  532.         }
  533.     }
  534.  
  535.     /**
  536.      * Get all contributors for the item
  537.      *
  538.      * Uses `<atom:contributor>`
  539.      *
  540.      * @since 1.1
  541.      * @return array|null List of {@see SimplePie_Author} objects
  542.      */
  543.     public function get_contributors()
  544.     {
  545.         $contributors = array();
  546.         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
  547.         {
  548.             $name = null;
  549.             $uri = null;
  550.             $email = null;
  551.             if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
  552.             {
  553.                 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  554.             }
  555.             if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
  556.             {
  557.                 $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
  558.             }
  559.             if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
  560.             {
  561.                 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  562.             }
  563.             if ($name !== null || $email !== null || $uri !== null)
  564.             {
  565.                 $contributors[] = $this->registry->create('Author', array($name, $uri, $email));
  566.             }
  567.         }
  568.         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
  569.         {
  570.             $name = null;
  571.             $url = null;
  572.             $email = null;
  573.             if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
  574.             {
  575.                 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  576.             }
  577.             if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
  578.             {
  579.                 $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
  580.             }
  581.             if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
  582.             {
  583.                 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  584.             }
  585.             if ($name !== null || $email !== null || $url !== null)
  586.             {
  587.                 $contributors[] = $this->registry->create('Author', array($name, $url, $email));
  588.             }
  589.         }
  590.  
  591.         if (!empty($contributors))
  592.         {
  593.             return array_unique($contributors);
  594.         }
  595.         else
  596.         {
  597.             return null;
  598.         }
  599.     }
  600.  
  601.     /**
  602.      * Get all authors for the item
  603.      *
  604.      * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>`
  605.      *
  606.      * @since Beta 2
  607.      * @return array|null List of {@see SimplePie_Author} objects
  608.      */
  609.     public function get_authors()
  610.     {
  611.         $authors = array();
  612.         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
  613.         {
  614.             $name = null;
  615.             $uri = null;
  616.             $email = null;
  617.             if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
  618.             {
  619.                 $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  620.             }
  621.             if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
  622.             {
  623.                 $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
  624.             }
  625.             if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
  626.             {
  627.                 $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  628.             }
  629.             if ($name !== null || $email !== null || $uri !== null)
  630.             {
  631.                 $authors[] = $this->registry->create('Author', array($name, $uri, $email));
  632.             }
  633.         }
  634.         if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
  635.         {
  636.             $name = null;
  637.             $url = null;
  638.             $email = null;
  639.             if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
  640.             {
  641.                 $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  642.             }
  643.             if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
  644.             {
  645.                 $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
  646.             }
  647.             if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
  648.             {
  649.                 $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  650.             }
  651.             if ($name !== null || $email !== null || $url !== null)
  652.             {
  653.                 $authors[] = $this->registry->create('Author', array($name, $url, $email));
  654.             }
  655.         }
  656.         if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author'))
  657.         {
  658.             $authors[] = $this->registry->create('Author', array(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)));
  659.         }
  660.         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
  661.         {
  662.             $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
  663.         }
  664.         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
  665.         {
  666.             $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
  667.         }
  668.         foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
  669.         {
  670.             $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
  671.         }
  672.  
  673.         if (!empty($authors))
  674.         {
  675.             return array_unique($authors);
  676.         }
  677.         elseif (($source = $this->get_source()) && ($authors = $source->get_authors()))
  678.         {
  679.             return $authors;
  680.         }
  681.         elseif ($authors = $this->feed->get_authors())
  682.         {
  683.             return $authors;
  684.         }
  685.         else
  686.         {
  687.             return null;
  688.         }
  689.     }
  690.  
  691.     /**
  692.      * Get the copyright info for the item
  693.      *
  694.      * Uses `<atom:rights>` or `<dc:rights>`
  695.      *
  696.      * @since 1.1
  697.      * @return string
  698.      */
  699.     public function get_copyright()
  700.     {
  701.         if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
  702.         {
  703.             return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
  704.         }
  705.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
  706.         {
  707.             return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  708.         }
  709.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
  710.         {
  711.             return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  712.         }
  713.         else
  714.         {
  715.             return null;
  716.         }
  717.     }
  718.  
  719.     /**
  720.      * Get the posting date/time for the item
  721.      *
  722.      * Uses `<atom:published>`, `<atom:updated>`, `<atom:issued>`,
  723.      * `<atom:modified>`, `<pubDate>` or `<dc:date>`
  724.      *
  725.      * Note: obeys PHP's timezone setting. To get a UTC date/time, use
  726.      * {@see get_gmdate}
  727.      *
  728.      * @since Beta 2 (previously called `get_item_date` since 0.8)
  729.      *
  730.      * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data)
  731.      * @return int|string|null
  732.      */
  733.     public function get_date($date_format = 'j F Y, g:i a')
  734.     {
  735.         if (!isset($this->data['date']))
  736.         {
  737.             if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published'))
  738.             {
  739.                 $this->data['date']['raw'] = $return[0]['data'];
  740.             }
  741.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
  742.             {
  743.                 $this->data['date']['raw'] = $return[0]['data'];
  744.             }
  745.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
  746.             {
  747.                 $this->data['date']['raw'] = $return[0]['data'];
  748.             }
  749.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
  750.             {
  751.                 $this->data['date']['raw'] = $return[0]['data'];
  752.             }
  753.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
  754.             {
  755.                 $this->data['date']['raw'] = $return[0]['data'];
  756.             }
  757.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate'))
  758.             {
  759.                 $this->data['date']['raw'] = $return[0]['data'];
  760.             }
  761.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
  762.             {
  763.                 $this->data['date']['raw'] = $return[0]['data'];
  764.             }
  765.             elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
  766.             {
  767.                 $this->data['date']['raw'] = $return[0]['data'];
  768.             }
  769.  
  770.             if (!empty($this->data['date']['raw']))
  771.             {
  772.                 $parser = $this->registry->call('Parse_Date', 'get');
  773.                 $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']);
  774.             }
  775.             else
  776.             {
  777.                 $this->data['date'] = null;
  778.             }
  779.         }
  780.         if ($this->data['date'])
  781.         {
  782.             $date_format = (string) $date_format;
  783.             switch ($date_format)
  784.             {
  785.                 case '':
  786.                     return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);
  787.  
  788.                 case 'U':
  789.                     return $this->data['date']['parsed'];
  790.  
  791.                 default:
  792.                     return date($date_format, $this->data['date']['parsed']);
  793.             }
  794.         }
  795.         else
  796.         {
  797.             return null;
  798.         }
  799.     }
  800.  
  801.     /**
  802.      * Get the update date/time for the item
  803.      *
  804.      * Uses `<atom:updated>`
  805.      *
  806.      * Note: obeys PHP's timezone setting. To get a UTC date/time, use
  807.      * {@see get_gmdate}
  808.      *
  809.      * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data)
  810.      * @return int|string|null
  811.      */
  812.     public function get_updated_date($date_format = 'j F Y, g:i a')
  813.     {
  814.         if (!isset($this->data['updated']))
  815.         {
  816.             if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
  817.             {
  818.                 $this->data['updated']['raw'] = $return[0]['data'];
  819.             }
  820.  
  821.             if (!empty($this->data['updated']['raw']))
  822.             {
  823.                 $parser = $this->registry->call('Parse_Date', 'get');
  824.                 $this->data['updated']['parsed'] = $parser->parse($this->data['date']['raw']);
  825.             }
  826.             else
  827.             {
  828.                 $this->data['updated'] = null;
  829.             }
  830.         }
  831.         if ($this->data['updated'])
  832.         {
  833.             $date_format = (string) $date_format;
  834.             switch ($date_format)
  835.             {
  836.                 case '':
  837.                     return $this->sanitize($this->data['updated']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);
  838.  
  839.                 case 'U':
  840.                     return $this->data['updated']['parsed'];
  841.  
  842.                 default:
  843.                     return date($date_format, $this->data['updated']['parsed']);
  844.             }
  845.         }
  846.         else
  847.         {
  848.             return null;
  849.         }
  850.     }
  851.  
  852.     /**
  853.      * Get the localized posting date/time for the item
  854.      *
  855.      * Returns the date formatted in the localized language. To display in
  856.      * languages other than the server's default, you need to change the locale
  857.      * with {@link http://php.net/setlocale setlocale()}. The available
  858.      * localizations depend on which ones are installed on your web server.
  859.      *
  860.      * @since 1.0
  861.      *
  862.      * @param string $date_format Supports any PHP date format from {@see http://php.net/strftime} (empty for the raw data)
  863.      * @return int|string|null
  864.      */
  865.     public function get_local_date($date_format = '%c')
  866.     {
  867.         if (!$date_format)
  868.         {
  869.             return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
  870.         }
  871.         elseif (($date = $this->get_date('U')) !== null && $date !== false)
  872.         {
  873.             return strftime($date_format, $date);
  874.         }
  875.         else
  876.         {
  877.             return null;
  878.         }
  879.     }
  880.  
  881.     /**
  882.      * Get the posting date/time for the item (UTC time)
  883.      *
  884.      * @see get_date
  885.      * @param string $date_format Supports any PHP date format from {@see http://php.net/date}
  886.      * @return int|string|null
  887.      */
  888.     public function get_gmdate($date_format = 'j F Y, g:i a')
  889.     {
  890.         $date = $this->get_date('U');
  891.         if ($date === null)
  892.         {
  893.             return null;
  894.         }
  895.  
  896.         return gmdate($date_format, $date);
  897.     }
  898.  
  899.     /**
  900.      * Get the update date/time for the item (UTC time)
  901.      *
  902.      * @see get_updated_date
  903.      * @param string $date_format Supports any PHP date format from {@see http://php.net/date}
  904.      * @return int|string|null
  905.      */
  906.     public function get_updated_gmdate($date_format = 'j F Y, g:i a')
  907.     {
  908.         $date = $this->get_updated_date('U');
  909.         if ($date === null)
  910.         {
  911.             return null;
  912.         }
  913.  
  914.         return gmdate($date_format, $date);
  915.     }
  916.  
  917.     /**
  918.      * Get the permalink for the item
  919.      *
  920.      * Returns the first link available with a relationship of "alternate".
  921.      * Identical to {@see get_link()} with key 0
  922.      *
  923.      * @see get_link
  924.      * @since 0.8
  925.      * @return string|null Permalink URL
  926.      */
  927.     public function get_permalink()
  928.     {
  929.         $link = $this->get_link();
  930.         $enclosure = $this->get_enclosure(0);
  931.         if ($link !== null)
  932.         {
  933.             return $link;
  934.         }
  935.         elseif ($enclosure !== null)
  936.         {
  937.             return $enclosure->get_link();
  938.         }
  939.         else
  940.         {
  941.             return null;
  942.         }
  943.     }
  944.  
  945.     /**
  946.      * Get a single link for the item
  947.      *
  948.      * @since Beta 3
  949.      * @param int $key The link that you want to return.  Remember that arrays begin with 0, not 1
  950.      * @param string $rel The relationship of the link to return
  951.      * @return string|null Link URL
  952.      */
  953.     public function get_link($key = 0, $rel = 'alternate')
  954.     {
  955.         $links = $this->get_links($rel);
  956.         if ($links[$key] !== null)
  957.         {
  958.             return $links[$key];
  959.         }
  960.         else
  961.         {
  962.             return null;
  963.         }
  964.     }
  965.  
  966.     /**
  967.      * Get all links for the item
  968.      *
  969.      * Uses `<atom:link>`, `<link>` or `<guid>`
  970.      *
  971.      * @since Beta 2
  972.      * @param string $rel The relationship of links to return
  973.      * @return array|null Links found for the item (strings)
  974.      */
  975.     public function get_links($rel = 'alternate')
  976.     {
  977.         if (!isset($this->data['links']))
  978.         {
  979.             $this->data['links'] = array();
  980.             foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
  981.             {
  982.                 if (isset($link['attribs']['']['href']))
  983.                 {
  984.                     $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
  985.                     $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
  986.  
  987.                 }
  988.             }
  989.             foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
  990.             {
  991.                 if (isset($link['attribs']['']['href']))
  992.                 {
  993.                     $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
  994.                     $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
  995.                 }
  996.             }
  997.             if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
  998.             {
  999.                 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
  1000.             }
  1001.             if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
  1002.             {
  1003.                 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
  1004.             }
  1005.             if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
  1006.             {
  1007.                 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
  1008.             }
  1009.             if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
  1010.             {
  1011.                 if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true')
  1012.                 {
  1013.                     $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
  1014.                 }
  1015.             }
  1016.  
  1017.             $keys = array_keys($this->data['links']);
  1018.             foreach ($keys as $key)
  1019.             {
  1020.                 if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))
  1021.                 {
  1022.                     if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
  1023.                     {
  1024.                         $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
  1025.                         $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
  1026.                     }
  1027.                     else
  1028.                     {
  1029.                         $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
  1030.                     }
  1031.                 }
  1032.                 elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
  1033.                 {
  1034.                     $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
  1035.                 }
  1036.                 $this->data['links'][$key] = array_unique($this->data['links'][$key]);
  1037.             }
  1038.         }
  1039.         if (isset($this->data['links'][$rel]))
  1040.         {
  1041.             return $this->data['links'][$rel];
  1042.         }
  1043.         else
  1044.         {
  1045.             return null;
  1046.         }
  1047.     }
  1048.  
  1049.     /**
  1050.      * Get an enclosure from the item
  1051.      *
  1052.      * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.
  1053.      *
  1054.      * @since Beta 2
  1055.      * @todo Add ability to prefer one type of content over another (in a media group).
  1056.      * @param int $key The enclosure that you want to return.  Remember that arrays begin with 0, not 1
  1057.      * @return SimplePie_Enclosure|null
  1058.      */
  1059.     public function get_enclosure($key = 0, $prefer = null)
  1060.     {
  1061.         $enclosures = $this->get_enclosures();
  1062.         if (isset($enclosures[$key]))
  1063.         {
  1064.             return $enclosures[$key];
  1065.         }
  1066.         else
  1067.         {
  1068.             return null;
  1069.         }
  1070.     }
  1071.  
  1072.     /**
  1073.      * Get all available enclosures (podcasts, etc.)
  1074.      *
  1075.      * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.
  1076.      *
  1077.      * At this point, we're pretty much assuming that all enclosures for an item
  1078.      * are the same content.  Anything else is too complicated to
  1079.      * properly support.
  1080.      *
  1081.      * @since Beta 2
  1082.      * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4).
  1083.      * @todo If an element exists at a level, but it's value is empty, we should fall back to the value from the parent (if it exists).
  1084.      * @return array|null List of SimplePie_Enclosure items
  1085.      */
  1086.     public function get_enclosures()
  1087.     {
  1088.         if (!isset($this->data['enclosures']))
  1089.         {
  1090.             $this->data['enclosures'] = array();
  1091.  
  1092.             // Elements
  1093.             $captions_parent = null;
  1094.             $categories_parent = null;
  1095.             $copyrights_parent = null;
  1096.             $credits_parent = null;
  1097.             $description_parent = null;
  1098.             $duration_parent = null;
  1099.             $hashes_parent = null;
  1100.             $keywords_parent = null;
  1101.             $player_parent = null;
  1102.             $ratings_parent = null;
  1103.             $restrictions_parent = null;
  1104.             $thumbnails_parent = null;
  1105.             $title_parent = null;
  1106.  
  1107.             // Let's do the channel and item-level ones first, and just re-use them if we need to.
  1108.             $parent = $this->get_feed();
  1109.  
  1110.             // CAPTIONS
  1111.             if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
  1112.             {
  1113.                 foreach ($captions as $caption)
  1114.                 {
  1115.                     $caption_type = null;
  1116.                     $caption_lang = null;
  1117.                     $caption_startTime = null;
  1118.                     $caption_endTime = null;
  1119.                     $caption_text = null;
  1120.                     if (isset($caption['attribs']['']['type']))
  1121.                     {
  1122.                         $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  1123.                     }
  1124.                     if (isset($caption['attribs']['']['lang']))
  1125.                     {
  1126.                         $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
  1127.                     }
  1128.                     if (isset($caption['attribs']['']['start']))
  1129.                     {
  1130.                         $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
  1131.                     }
  1132.                     if (isset($caption['attribs']['']['end']))
  1133.                     {
  1134.                         $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
  1135.                     }
  1136.                     if (isset($caption['data']))
  1137.                     {
  1138.                         $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1139.                     }
  1140.                     $captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
  1141.                 }
  1142.             }
  1143.             elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
  1144.             {
  1145.                 foreach ($captions as $caption)
  1146.                 {
  1147.                     $caption_type = null;
  1148.                     $caption_lang = null;
  1149.                     $caption_startTime = null;
  1150.                     $caption_endTime = null;
  1151.                     $caption_text = null;
  1152.                     if (isset($caption['attribs']['']['type']))
  1153.                     {
  1154.                         $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  1155.                     }
  1156.                     if (isset($caption['attribs']['']['lang']))
  1157.                     {
  1158.                         $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
  1159.                     }
  1160.                     if (isset($caption['attribs']['']['start']))
  1161.                     {
  1162.                         $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
  1163.                     }
  1164.                     if (isset($caption['attribs']['']['end']))
  1165.                     {
  1166.                         $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
  1167.                     }
  1168.                     if (isset($caption['data']))
  1169.                     {
  1170.                         $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1171.                     }
  1172.                     $captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
  1173.                 }
  1174.             }
  1175.             if (is_array($captions_parent))
  1176.             {
  1177.                 $captions_parent = array_values(array_unique($captions_parent));
  1178.             }
  1179.  
  1180.             // CATEGORIES
  1181.             foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
  1182.             {
  1183.                 $term = null;
  1184.                 $scheme = null;
  1185.                 $label = null;
  1186.                 if (isset($category['data']))
  1187.                 {
  1188.                     $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1189.                 }
  1190.                 if (isset($category['attribs']['']['scheme']))
  1191.                 {
  1192.                     $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  1193.                 }
  1194.                 else
  1195.                 {
  1196.                     $scheme = 'http://search.yahoo.com/mrss/category_schema';
  1197.                 }
  1198.                 if (isset($category['attribs']['']['label']))
  1199.                 {
  1200.                     $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
  1201.                 }
  1202.                 $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
  1203.             }
  1204.             foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
  1205.             {
  1206.                 $term = null;
  1207.                 $scheme = null;
  1208.                 $label = null;
  1209.                 if (isset($category['data']))
  1210.                 {
  1211.                     $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1212.                 }
  1213.                 if (isset($category['attribs']['']['scheme']))
  1214.                 {
  1215.                     $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  1216.                 }
  1217.                 else
  1218.                 {
  1219.                     $scheme = 'http://search.yahoo.com/mrss/category_schema';
  1220.                 }
  1221.                 if (isset($category['attribs']['']['label']))
  1222.                 {
  1223.                     $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
  1224.                 }
  1225.                 $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
  1226.             }
  1227.             foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category)
  1228.             {
  1229.                 $term = null;
  1230.                 $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
  1231.                 $label = null;
  1232.                 if (isset($category['attribs']['']['text']))
  1233.                 {
  1234.                     $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
  1235.                 }
  1236.                 $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
  1237.  
  1238.                 if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category']))
  1239.                 {
  1240.                     foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory)
  1241.                     {
  1242.                         if (isset($subcategory['attribs']['']['text']))
  1243.                         {
  1244.                             $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
  1245.                         }
  1246.                         $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
  1247.                     }
  1248.                 }
  1249.             }
  1250.             if (is_array($categories_parent))
  1251.             {
  1252.                 $categories_parent = array_values(array_unique($categories_parent));
  1253.             }
  1254.  
  1255.             // COPYRIGHT
  1256.             if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
  1257.             {
  1258.                 $copyright_url = null;
  1259.                 $copyright_label = null;
  1260.                 if (isset($copyright[0]['attribs']['']['url']))
  1261.                 {
  1262.                     $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
  1263.                 }
  1264.                 if (isset($copyright[0]['data']))
  1265.                 {
  1266.                     $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1267.                 }
  1268.                 $copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
  1269.             }
  1270.             elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
  1271.             {
  1272.                 $copyright_url = null;
  1273.                 $copyright_label = null;
  1274.                 if (isset($copyright[0]['attribs']['']['url']))
  1275.                 {
  1276.                     $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
  1277.                 }
  1278.                 if (isset($copyright[0]['data']))
  1279.                 {
  1280.                     $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1281.                 }
  1282.                 $copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
  1283.             }
  1284.  
  1285.             // CREDITS
  1286.             if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
  1287.             {
  1288.                 foreach ($credits as $credit)
  1289.                 {
  1290.                     $credit_role = null;
  1291.                     $credit_scheme = null;
  1292.                     $credit_name = null;
  1293.                     if (isset($credit['attribs']['']['role']))
  1294.                     {
  1295.                         $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
  1296.                     }
  1297.                     if (isset($credit['attribs']['']['scheme']))
  1298.                     {
  1299.                         $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  1300.                     }
  1301.                     else
  1302.                     {
  1303.                         $credit_scheme = 'urn:ebu';
  1304.                     }
  1305.                     if (isset($credit['data']))
  1306.                     {
  1307.                         $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1308.                     }
  1309.                     $credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
  1310.                 }
  1311.             }
  1312.             elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
  1313.             {
  1314.                 foreach ($credits as $credit)
  1315.                 {
  1316.                     $credit_role = null;
  1317.                     $credit_scheme = null;
  1318.                     $credit_name = null;
  1319.                     if (isset($credit['attribs']['']['role']))
  1320.                     {
  1321.                         $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
  1322.                     }
  1323.                     if (isset($credit['attribs']['']['scheme']))
  1324.                     {
  1325.                         $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  1326.                     }
  1327.                     else
  1328.                     {
  1329.                         $credit_scheme = 'urn:ebu';
  1330.                     }
  1331.                     if (isset($credit['data']))
  1332.                     {
  1333.                         $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1334.                     }
  1335.                     $credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
  1336.                 }
  1337.             }
  1338.             if (is_array($credits_parent))
  1339.             {
  1340.                 $credits_parent = array_values(array_unique($credits_parent));
  1341.             }
  1342.  
  1343.             // DESCRIPTION
  1344.             if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
  1345.             {
  1346.                 if (isset($description_parent[0]['data']))
  1347.                 {
  1348.                     $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1349.                 }
  1350.             }
  1351.             elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
  1352.             {
  1353.                 if (isset($description_parent[0]['data']))
  1354.                 {
  1355.                     $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1356.                 }
  1357.             }
  1358.  
  1359.             // DURATION
  1360.             if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration'))
  1361.             {
  1362.                 $seconds = null;
  1363.                 $minutes = null;
  1364.                 $hours = null;
  1365.                 if (isset($duration_parent[0]['data']))
  1366.                 {
  1367.                     $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
  1368.                     if (sizeof($temp) > 0)
  1369.                     {
  1370.                         $seconds = (int) array_pop($temp);
  1371.                     }
  1372.                     if (sizeof($temp) > 0)
  1373.                     {
  1374.                         $minutes = (int) array_pop($temp);
  1375.                         $seconds += $minutes * 60;
  1376.                     }
  1377.                     if (sizeof($temp) > 0)
  1378.                     {
  1379.                         $hours = (int) array_pop($temp);
  1380.                         $seconds += $hours * 3600;
  1381.                     }
  1382.                     unset($temp);
  1383.                     $duration_parent = $seconds;
  1384.                 }
  1385.             }
  1386.  
  1387.             // HASHES
  1388.             if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
  1389.             {
  1390.                 foreach ($hashes_iterator as $hash)
  1391.                 {
  1392.                     $value = null;
  1393.                     $algo = null;
  1394.                     if (isset($hash['data']))
  1395.                     {
  1396.                         $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1397.                     }
  1398.                     if (isset($hash['attribs']['']['algo']))
  1399.                     {
  1400.                         $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
  1401.                     }
  1402.                     else
  1403.                     {
  1404.                         $algo = 'md5';
  1405.                     }
  1406.                     $hashes_parent[] = $algo.':'.$value;
  1407.                 }
  1408.             }
  1409.             elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
  1410.             {
  1411.                 foreach ($hashes_iterator as $hash)
  1412.                 {
  1413.                     $value = null;
  1414.                     $algo = null;
  1415.                     if (isset($hash['data']))
  1416.                     {
  1417.                         $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1418.                     }
  1419.                     if (isset($hash['attribs']['']['algo']))
  1420.                     {
  1421.                         $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
  1422.                     }
  1423.                     else
  1424.                     {
  1425.                         $algo = 'md5';
  1426.                     }
  1427.                     $hashes_parent[] = $algo.':'.$value;
  1428.                 }
  1429.             }
  1430.             if (is_array($hashes_parent))
  1431.             {
  1432.                 $hashes_parent = array_values(array_unique($hashes_parent));
  1433.             }
  1434.  
  1435.             // KEYWORDS
  1436.             if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
  1437.             {
  1438.                 if (isset($keywords[0]['data']))
  1439.                 {
  1440.                     $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
  1441.                     foreach ($temp as $word)
  1442.                     {
  1443.                         $keywords_parent[] = trim($word);
  1444.                     }
  1445.                 }
  1446.                 unset($temp);
  1447.             }
  1448.             elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
  1449.             {
  1450.                 if (isset($keywords[0]['data']))
  1451.                 {
  1452.                     $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
  1453.                     foreach ($temp as $word)
  1454.                     {
  1455.                         $keywords_parent[] = trim($word);
  1456.                     }
  1457.                 }
  1458.                 unset($temp);
  1459.             }
  1460.             elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
  1461.             {
  1462.                 if (isset($keywords[0]['data']))
  1463.                 {
  1464.                     $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
  1465.                     foreach ($temp as $word)
  1466.                     {
  1467.                         $keywords_parent[] = trim($word);
  1468.                     }
  1469.                 }
  1470.                 unset($temp);
  1471.             }
  1472.             elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
  1473.             {
  1474.                 if (isset($keywords[0]['data']))
  1475.                 {
  1476.                     $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
  1477.                     foreach ($temp as $word)
  1478.                     {
  1479.                         $keywords_parent[] = trim($word);
  1480.                     }
  1481.                 }
  1482.                 unset($temp);
  1483.             }
  1484.             if (is_array($keywords_parent))
  1485.             {
  1486.                 $keywords_parent = array_values(array_unique($keywords_parent));
  1487.             }
  1488.  
  1489.             // PLAYER
  1490.             if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
  1491.             {
  1492.                 if (isset($player_parent[0]['attribs']['']['url']))
  1493.                 {
  1494.                     $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
  1495.                 }
  1496.             }
  1497.             elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
  1498.             {
  1499.                 if (isset($player_parent[0]['attribs']['']['url']))
  1500.                 {
  1501.                     $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
  1502.                 }
  1503.             }
  1504.  
  1505.             // RATINGS
  1506.             if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
  1507.             {
  1508.                 foreach ($ratings as $rating)
  1509.                 {
  1510.                     $rating_scheme = null;
  1511.                     $rating_value = null;
  1512.                     if (isset($rating['attribs']['']['scheme']))
  1513.                     {
  1514.                         $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  1515.                     }
  1516.                     else
  1517.                     {
  1518.                         $rating_scheme = 'urn:simple';
  1519.                     }
  1520.                     if (isset($rating['data']))
  1521.                     {
  1522.                         $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1523.                     }
  1524.                     $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
  1525.                 }
  1526.             }
  1527.             elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
  1528.             {
  1529.                 foreach ($ratings as $rating)
  1530.                 {
  1531.                     $rating_scheme = 'urn:itunes';
  1532.                     $rating_value = null;
  1533.                     if (isset($rating['data']))
  1534.                     {
  1535.                         $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1536.                     }
  1537.                     $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
  1538.                 }
  1539.             }
  1540.             elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
  1541.             {
  1542.                 foreach ($ratings as $rating)
  1543.                 {
  1544.                     $rating_scheme = null;
  1545.                     $rating_value = null;
  1546.                     if (isset($rating['attribs']['']['scheme']))
  1547.                     {
  1548.                         $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  1549.                     }
  1550.                     else
  1551.                     {
  1552.                         $rating_scheme = 'urn:simple';
  1553.                     }
  1554.                     if (isset($rating['data']))
  1555.                     {
  1556.                         $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1557.                     }
  1558.                     $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
  1559.                 }
  1560.             }
  1561.             elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
  1562.             {
  1563.                 foreach ($ratings as $rating)
  1564.                 {
  1565.                     $rating_scheme = 'urn:itunes';
  1566.                     $rating_value = null;
  1567.                     if (isset($rating['data']))
  1568.                     {
  1569.                         $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1570.                     }
  1571.                     $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
  1572.                 }
  1573.             }
  1574.             if (is_array($ratings_parent))
  1575.             {
  1576.                 $ratings_parent = array_values(array_unique($ratings_parent));
  1577.             }
  1578.  
  1579.             // RESTRICTIONS
  1580.             if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
  1581.             {
  1582.                 foreach ($restrictions as $restriction)
  1583.                 {
  1584.                     $restriction_relationship = null;
  1585.                     $restriction_type = null;
  1586.                     $restriction_value = null;
  1587.                     if (isset($restriction['attribs']['']['relationship']))
  1588.                     {
  1589.                         $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
  1590.                     }
  1591.                     if (isset($restriction['attribs']['']['type']))
  1592.                     {
  1593.                         $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  1594.                     }
  1595.                     if (isset($restriction['data']))
  1596.                     {
  1597.                         $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1598.                     }
  1599.                     $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
  1600.                 }
  1601.             }
  1602.             elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
  1603.             {
  1604.                 foreach ($restrictions as $restriction)
  1605.                 {
  1606.                     $restriction_relationship = 'allow';
  1607.                     $restriction_type = null;
  1608.                     $restriction_value = 'itunes';
  1609.                     if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
  1610.                     {
  1611.                         $restriction_relationship = 'deny';
  1612.                     }
  1613.                     $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
  1614.                 }
  1615.             }
  1616.             elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
  1617.             {
  1618.                 foreach ($restrictions as $restriction)
  1619.                 {
  1620.                     $restriction_relationship = null;
  1621.                     $restriction_type = null;
  1622.                     $restriction_value = null;
  1623.                     if (isset($restriction['attribs']['']['relationship']))
  1624.                     {
  1625.                         $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
  1626.                     }
  1627.                     if (isset($restriction['attribs']['']['type']))
  1628.                     {
  1629.                         $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  1630.                     }
  1631.                     if (isset($restriction['data']))
  1632.                     {
  1633.                         $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1634.                     }
  1635.                     $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
  1636.                 }
  1637.             }
  1638.             elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
  1639.             {
  1640.                 foreach ($restrictions as $restriction)
  1641.                 {
  1642.                     $restriction_relationship = 'allow';
  1643.                     $restriction_type = null;
  1644.                     $restriction_value = 'itunes';
  1645.                     if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
  1646.                     {
  1647.                         $restriction_relationship = 'deny';
  1648.                     }
  1649.                     $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
  1650.                 }
  1651.             }
  1652.             if (is_array($restrictions_parent))
  1653.             {
  1654.                 $restrictions_parent = array_values(array_unique($restrictions_parent));
  1655.             }
  1656.             else
  1657.             {
  1658.                 $restrictions_parent = array(new SimplePie_Restriction('allow', null, 'default'));
  1659.             }
  1660.  
  1661.             // THUMBNAILS
  1662.             if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
  1663.             {
  1664.                 foreach ($thumbnails as $thumbnail)
  1665.                 {
  1666.                     if (isset($thumbnail['attribs']['']['url']))
  1667.                     {
  1668.                         $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
  1669.                     }
  1670.                 }
  1671.             }
  1672.             elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
  1673.             {
  1674.                 foreach ($thumbnails as $thumbnail)
  1675.                 {
  1676.                     if (isset($thumbnail['attribs']['']['url']))
  1677.                     {
  1678.                         $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
  1679.                     }
  1680.                 }
  1681.             }
  1682.  
  1683.             // TITLES
  1684.             if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
  1685.             {
  1686.                 if (isset($title_parent[0]['data']))
  1687.                 {
  1688.                     $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1689.                 }
  1690.             }
  1691.             elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
  1692.             {
  1693.                 if (isset($title_parent[0]['data']))
  1694.                 {
  1695.                     $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1696.                 }
  1697.             }
  1698.  
  1699.             // Clear the memory
  1700.             unset($parent);
  1701.  
  1702.             // Attributes
  1703.             $bitrate = null;
  1704.             $channels = null;
  1705.             $duration = null;
  1706.             $expression = null;
  1707.             $framerate = null;
  1708.             $height = null;
  1709.             $javascript = null;
  1710.             $lang = null;
  1711.             $length = null;
  1712.             $medium = null;
  1713.             $samplingrate = null;
  1714.             $type = null;
  1715.             $url = null;
  1716.             $width = null;
  1717.  
  1718.             // Elements
  1719.             $captions = null;
  1720.             $categories = null;
  1721.             $copyrights = null;
  1722.             $credits = null;
  1723.             $description = null;
  1724.             $hashes = null;
  1725.             $keywords = null;
  1726.             $player = null;
  1727.             $ratings = null;
  1728.             $restrictions = null;
  1729.             $thumbnails = null;
  1730.             $title = null;
  1731.  
  1732.             // If we have media:group tags, loop through them.
  1733.             foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
  1734.             {
  1735.                 if(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
  1736.                 {
  1737.                     // If we have media:content tags, loop through them.
  1738.                     foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
  1739.                     {
  1740.                         if (isset($content['attribs']['']['url']))
  1741.                         {
  1742.                             // Attributes
  1743.                             $bitrate = null;
  1744.                             $channels = null;
  1745.                             $duration = null;
  1746.                             $expression = null;
  1747.                             $framerate = null;
  1748.                             $height = null;
  1749.                             $javascript = null;
  1750.                             $lang = null;
  1751.                             $length = null;
  1752.                             $medium = null;
  1753.                             $samplingrate = null;
  1754.                             $type = null;
  1755.                             $url = null;
  1756.                             $width = null;
  1757.  
  1758.                             // Elements
  1759.                             $captions = null;
  1760.                             $categories = null;
  1761.                             $copyrights = null;
  1762.                             $credits = null;
  1763.                             $description = null;
  1764.                             $hashes = null;
  1765.                             $keywords = null;
  1766.                             $player = null;
  1767.                             $ratings = null;
  1768.                             $restrictions = null;
  1769.                             $thumbnails = null;
  1770.                             $title = null;
  1771.  
  1772.                             // Start checking the attributes of media:content
  1773.                             if (isset($content['attribs']['']['bitrate']))
  1774.                             {
  1775.                                 $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
  1776.                             }
  1777.                             if (isset($content['attribs']['']['channels']))
  1778.                             {
  1779.                                 $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
  1780.                             }
  1781.                             if (isset($content['attribs']['']['duration']))
  1782.                             {
  1783.                                 $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
  1784.                             }
  1785.                             else
  1786.                             {
  1787.                                 $duration = $duration_parent;
  1788.                             }
  1789.                             if (isset($content['attribs']['']['expression']))
  1790.                             {
  1791.                                 $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
  1792.                             }
  1793.                             if (isset($content['attribs']['']['framerate']))
  1794.                             {
  1795.                                 $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
  1796.                             }
  1797.                             if (isset($content['attribs']['']['height']))
  1798.                             {
  1799.                                 $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
  1800.                             }
  1801.                             if (isset($content['attribs']['']['lang']))
  1802.                             {
  1803.                                 $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
  1804.                             }
  1805.                             if (isset($content['attribs']['']['fileSize']))
  1806.                             {
  1807.                                 $length = ceil($content['attribs']['']['fileSize']);
  1808.                             }
  1809.                             if (isset($content['attribs']['']['medium']))
  1810.                             {
  1811.                                 $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
  1812.                             }
  1813.                             if (isset($content['attribs']['']['samplingrate']))
  1814.                             {
  1815.                                 $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
  1816.                             }
  1817.                             if (isset($content['attribs']['']['type']))
  1818.                             {
  1819.                                 $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  1820.                             }
  1821.                             if (isset($content['attribs']['']['width']))
  1822.                             {
  1823.                                 $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
  1824.                             }
  1825.                             $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
  1826.  
  1827.                             // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
  1828.  
  1829.                             // CAPTIONS
  1830.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
  1831.                             {
  1832.                                 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
  1833.                                 {
  1834.                                     $caption_type = null;
  1835.                                     $caption_lang = null;
  1836.                                     $caption_startTime = null;
  1837.                                     $caption_endTime = null;
  1838.                                     $caption_text = null;
  1839.                                     if (isset($caption['attribs']['']['type']))
  1840.                                     {
  1841.                                         $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  1842.                                     }
  1843.                                     if (isset($caption['attribs']['']['lang']))
  1844.                                     {
  1845.                                         $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
  1846.                                     }
  1847.                                     if (isset($caption['attribs']['']['start']))
  1848.                                     {
  1849.                                         $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
  1850.                                     }
  1851.                                     if (isset($caption['attribs']['']['end']))
  1852.                                     {
  1853.                                         $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
  1854.                                     }
  1855.                                     if (isset($caption['data']))
  1856.                                     {
  1857.                                         $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1858.                                     }
  1859.                                     $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
  1860.                                 }
  1861.                                 if (is_array($captions))
  1862.                                 {
  1863.                                     $captions = array_values(array_unique($captions));
  1864.                                 }
  1865.                             }
  1866.                             elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
  1867.                             {
  1868.                                 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
  1869.                                 {
  1870.                                     $caption_type = null;
  1871.                                     $caption_lang = null;
  1872.                                     $caption_startTime = null;
  1873.                                     $caption_endTime = null;
  1874.                                     $caption_text = null;
  1875.                                     if (isset($caption['attribs']['']['type']))
  1876.                                     {
  1877.                                         $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  1878.                                     }
  1879.                                     if (isset($caption['attribs']['']['lang']))
  1880.                                     {
  1881.                                         $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
  1882.                                     }
  1883.                                     if (isset($caption['attribs']['']['start']))
  1884.                                     {
  1885.                                         $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
  1886.                                     }
  1887.                                     if (isset($caption['attribs']['']['end']))
  1888.                                     {
  1889.                                         $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
  1890.                                     }
  1891.                                     if (isset($caption['data']))
  1892.                                     {
  1893.                                         $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1894.                                     }
  1895.                                     $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
  1896.                                 }
  1897.                                 if (is_array($captions))
  1898.                                 {
  1899.                                     $captions = array_values(array_unique($captions));
  1900.                                 }
  1901.                             }
  1902.                             else
  1903.                             {
  1904.                                 $captions = $captions_parent;
  1905.                             }
  1906.  
  1907.                             // CATEGORIES
  1908.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
  1909.                             {
  1910.                                 foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
  1911.                                 {
  1912.                                     $term = null;
  1913.                                     $scheme = null;
  1914.                                     $label = null;
  1915.                                     if (isset($category['data']))
  1916.                                     {
  1917.                                         $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1918.                                     }
  1919.                                     if (isset($category['attribs']['']['scheme']))
  1920.                                     {
  1921.                                         $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  1922.                                     }
  1923.                                     else
  1924.                                     {
  1925.                                         $scheme = 'http://search.yahoo.com/mrss/category_schema';
  1926.                                     }
  1927.                                     if (isset($category['attribs']['']['label']))
  1928.                                     {
  1929.                                         $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
  1930.                                     }
  1931.                                     $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
  1932.                                 }
  1933.                             }
  1934.                             if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
  1935.                             {
  1936.                                 foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
  1937.                                 {
  1938.                                     $term = null;
  1939.                                     $scheme = null;
  1940.                                     $label = null;
  1941.                                     if (isset($category['data']))
  1942.                                     {
  1943.                                         $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1944.                                     }
  1945.                                     if (isset($category['attribs']['']['scheme']))
  1946.                                     {
  1947.                                         $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  1948.                                     }
  1949.                                     else
  1950.                                     {
  1951.                                         $scheme = 'http://search.yahoo.com/mrss/category_schema';
  1952.                                     }
  1953.                                     if (isset($category['attribs']['']['label']))
  1954.                                     {
  1955.                                         $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
  1956.                                     }
  1957.                                     $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
  1958.                                 }
  1959.                             }
  1960.                             if (is_array($categories) && is_array($categories_parent))
  1961.                             {
  1962.                                 $categories = array_values(array_unique(array_merge($categories, $categories_parent)));
  1963.                             }
  1964.                             elseif (is_array($categories))
  1965.                             {
  1966.                                 $categories = array_values(array_unique($categories));
  1967.                             }
  1968.                             elseif (is_array($categories_parent))
  1969.                             {
  1970.                                 $categories = array_values(array_unique($categories_parent));
  1971.                             }
  1972.  
  1973.                             // COPYRIGHTS
  1974.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
  1975.                             {
  1976.                                 $copyright_url = null;
  1977.                                 $copyright_label = null;
  1978.                                 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
  1979.                                 {
  1980.                                     $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
  1981.                                 }
  1982.                                 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
  1983.                                 {
  1984.                                     $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1985.                                 }
  1986.                                 $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
  1987.                             }
  1988.                             elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
  1989.                             {
  1990.                                 $copyright_url = null;
  1991.                                 $copyright_label = null;
  1992.                                 if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
  1993.                                 {
  1994.                                     $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
  1995.                                 }
  1996.                                 if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
  1997.                                 {
  1998.                                     $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  1999.                                 }
  2000.                                 $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
  2001.                             }
  2002.                             else
  2003.                             {
  2004.                                 $copyrights = $copyrights_parent;
  2005.                             }
  2006.  
  2007.                             // CREDITS
  2008.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
  2009.                             {
  2010.                                 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
  2011.                                 {
  2012.                                     $credit_role = null;
  2013.                                     $credit_scheme = null;
  2014.                                     $credit_name = null;
  2015.                                     if (isset($credit['attribs']['']['role']))
  2016.                                     {
  2017.                                         $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
  2018.                                     }
  2019.                                     if (isset($credit['attribs']['']['scheme']))
  2020.                                     {
  2021.                                         $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  2022.                                     }
  2023.                                     else
  2024.                                     {
  2025.                                         $credit_scheme = 'urn:ebu';
  2026.                                     }
  2027.                                     if (isset($credit['data']))
  2028.                                     {
  2029.                                         $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2030.                                     }
  2031.                                     $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
  2032.                                 }
  2033.                                 if (is_array($credits))
  2034.                                 {
  2035.                                     $credits = array_values(array_unique($credits));
  2036.                                 }
  2037.                             }
  2038.                             elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
  2039.                             {
  2040.                                 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
  2041.                                 {
  2042.                                     $credit_role = null;
  2043.                                     $credit_scheme = null;
  2044.                                     $credit_name = null;
  2045.                                     if (isset($credit['attribs']['']['role']))
  2046.                                     {
  2047.                                         $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
  2048.                                     }
  2049.                                     if (isset($credit['attribs']['']['scheme']))
  2050.                                     {
  2051.                                         $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  2052.                                     }
  2053.                                     else
  2054.                                     {
  2055.                                         $credit_scheme = 'urn:ebu';
  2056.                                     }
  2057.                                     if (isset($credit['data']))
  2058.                                     {
  2059.                                         $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2060.                                     }
  2061.                                     $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
  2062.                                 }
  2063.                                 if (is_array($credits))
  2064.                                 {
  2065.                                     $credits = array_values(array_unique($credits));
  2066.                                 }
  2067.                             }
  2068.                             else
  2069.                             {
  2070.                                 $credits = $credits_parent;
  2071.                             }
  2072.  
  2073.                             // DESCRIPTION
  2074.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
  2075.                             {
  2076.                                 $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2077.                             }
  2078.                             elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
  2079.                             {
  2080.                                 $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2081.                             }
  2082.                             else
  2083.                             {
  2084.                                 $description = $description_parent;
  2085.                             }
  2086.  
  2087.                             // HASHES
  2088.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
  2089.                             {
  2090.                                 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
  2091.                                 {
  2092.                                     $value = null;
  2093.                                     $algo = null;
  2094.                                     if (isset($hash['data']))
  2095.                                     {
  2096.                                         $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2097.                                     }
  2098.                                     if (isset($hash['attribs']['']['algo']))
  2099.                                     {
  2100.                                         $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
  2101.                                     }
  2102.                                     else
  2103.                                     {
  2104.                                         $algo = 'md5';
  2105.                                     }
  2106.                                     $hashes[] = $algo.':'.$value;
  2107.                                 }
  2108.                                 if (is_array($hashes))
  2109.                                 {
  2110.                                     $hashes = array_values(array_unique($hashes));
  2111.                                 }
  2112.                             }
  2113.                             elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
  2114.                             {
  2115.                                 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
  2116.                                 {
  2117.                                     $value = null;
  2118.                                     $algo = null;
  2119.                                     if (isset($hash['data']))
  2120.                                     {
  2121.                                         $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2122.                                     }
  2123.                                     if (isset($hash['attribs']['']['algo']))
  2124.                                     {
  2125.                                         $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
  2126.                                     }
  2127.                                     else
  2128.                                     {
  2129.                                         $algo = 'md5';
  2130.                                     }
  2131.                                     $hashes[] = $algo.':'.$value;
  2132.                                 }
  2133.                                 if (is_array($hashes))
  2134.                                 {
  2135.                                     $hashes = array_values(array_unique($hashes));
  2136.                                 }
  2137.                             }
  2138.                             else
  2139.                             {
  2140.                                 $hashes = $hashes_parent;
  2141.                             }
  2142.  
  2143.                             // KEYWORDS
  2144.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
  2145.                             {
  2146.                                 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
  2147.                                 {
  2148.                                     $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
  2149.                                     foreach ($temp as $word)
  2150.                                     {
  2151.                                         $keywords[] = trim($word);
  2152.                                     }
  2153.                                     unset($temp);
  2154.                                 }
  2155.                                 if (is_array($keywords))
  2156.                                 {
  2157.                                     $keywords = array_values(array_unique($keywords));
  2158.                                 }
  2159.                             }
  2160.                             elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
  2161.                             {
  2162.                                 if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
  2163.                                 {
  2164.                                     $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
  2165.                                     foreach ($temp as $word)
  2166.                                     {
  2167.                                         $keywords[] = trim($word);
  2168.                                     }
  2169.                                     unset($temp);
  2170.                                 }
  2171.                                 if (is_array($keywords))
  2172.                                 {
  2173.                                     $keywords = array_values(array_unique($keywords));
  2174.                                 }
  2175.                             }
  2176.                             else
  2177.                             {
  2178.                                 $keywords = $keywords_parent;
  2179.                             }
  2180.  
  2181.                             // PLAYER
  2182.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
  2183.                             {
  2184.                                 $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
  2185.                             }
  2186.                             elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
  2187.                             {
  2188.                                 $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
  2189.                             }
  2190.                             else
  2191.                             {
  2192.                                 $player = $player_parent;
  2193.                             }
  2194.  
  2195.                             // RATINGS
  2196.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
  2197.                             {
  2198.                                 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
  2199.                                 {
  2200.                                     $rating_scheme = null;
  2201.                                     $rating_value = null;
  2202.                                     if (isset($rating['attribs']['']['scheme']))
  2203.                                     {
  2204.                                         $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  2205.                                     }
  2206.                                     else
  2207.                                     {
  2208.                                         $rating_scheme = 'urn:simple';
  2209.                                     }
  2210.                                     if (isset($rating['data']))
  2211.                                     {
  2212.                                         $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2213.                                     }
  2214.                                     $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
  2215.                                 }
  2216.                                 if (is_array($ratings))
  2217.                                 {
  2218.                                     $ratings = array_values(array_unique($ratings));
  2219.                                 }
  2220.                             }
  2221.                             elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
  2222.                             {
  2223.                                 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
  2224.                                 {
  2225.                                     $rating_scheme = null;
  2226.                                     $rating_value = null;
  2227.                                     if (isset($rating['attribs']['']['scheme']))
  2228.                                     {
  2229.                                         $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  2230.                                     }
  2231.                                     else
  2232.                                     {
  2233.                                         $rating_scheme = 'urn:simple';
  2234.                                     }
  2235.                                     if (isset($rating['data']))
  2236.                                     {
  2237.                                         $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2238.                                     }
  2239.                                     $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
  2240.                                 }
  2241.                                 if (is_array($ratings))
  2242.                                 {
  2243.                                     $ratings = array_values(array_unique($ratings));
  2244.                                 }
  2245.                             }
  2246.                             else
  2247.                             {
  2248.                                 $ratings = $ratings_parent;
  2249.                             }
  2250.  
  2251.                             // RESTRICTIONS
  2252.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
  2253.                             {
  2254.                                 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
  2255.                                 {
  2256.                                     $restriction_relationship = null;
  2257.                                     $restriction_type = null;
  2258.                                     $restriction_value = null;
  2259.                                     if (isset($restriction['attribs']['']['relationship']))
  2260.                                     {
  2261.                                         $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
  2262.                                     }
  2263.                                     if (isset($restriction['attribs']['']['type']))
  2264.                                     {
  2265.                                         $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  2266.                                     }
  2267.                                     if (isset($restriction['data']))
  2268.                                     {
  2269.                                         $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2270.                                     }
  2271.                                     $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
  2272.                                 }
  2273.                                 if (is_array($restrictions))
  2274.                                 {
  2275.                                     $restrictions = array_values(array_unique($restrictions));
  2276.                                 }
  2277.                             }
  2278.                             elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
  2279.                             {
  2280.                                 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
  2281.                                 {
  2282.                                     $restriction_relationship = null;
  2283.                                     $restriction_type = null;
  2284.                                     $restriction_value = null;
  2285.                                     if (isset($restriction['attribs']['']['relationship']))
  2286.                                     {
  2287.                                         $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
  2288.                                     }
  2289.                                     if (isset($restriction['attribs']['']['type']))
  2290.                                     {
  2291.                                         $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  2292.                                     }
  2293.                                     if (isset($restriction['data']))
  2294.                                     {
  2295.                                         $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2296.                                     }
  2297.                                     $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
  2298.                                 }
  2299.                                 if (is_array($restrictions))
  2300.                                 {
  2301.                                     $restrictions = array_values(array_unique($restrictions));
  2302.                                 }
  2303.                             }
  2304.                             else
  2305.                             {
  2306.                                 $restrictions = $restrictions_parent;
  2307.                             }
  2308.  
  2309.                             // THUMBNAILS
  2310.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
  2311.                             {
  2312.                                 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
  2313.                                 {
  2314.                                     $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
  2315.                                 }
  2316.                                 if (is_array($thumbnails))
  2317.                                 {
  2318.                                     $thumbnails = array_values(array_unique($thumbnails));
  2319.                                 }
  2320.                             }
  2321.                             elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
  2322.                             {
  2323.                                 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
  2324.                                 {
  2325.                                     $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
  2326.                                 }
  2327.                                 if (is_array($thumbnails))
  2328.                                 {
  2329.                                     $thumbnails = array_values(array_unique($thumbnails));
  2330.                                 }
  2331.                             }
  2332.                             else
  2333.                             {
  2334.                                 $thumbnails = $thumbnails_parent;
  2335.                             }
  2336.  
  2337.                             // TITLES
  2338.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
  2339.                             {
  2340.                                 $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2341.                             }
  2342.                             elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
  2343.                             {
  2344.                                 $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2345.                             }
  2346.                             else
  2347.                             {
  2348.                                 $title = $title_parent;
  2349.                             }
  2350.  
  2351.                             $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width));
  2352.                         }
  2353.                     }
  2354.                 }
  2355.             }
  2356.  
  2357.             // If we have standalone media:content tags, loop through them.
  2358.             if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
  2359.             {
  2360.                 foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
  2361.                 {
  2362.                     if (isset($content['attribs']['']['url']) || isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
  2363.                     {
  2364.                         // Attributes
  2365.                         $bitrate = null;
  2366.                         $channels = null;
  2367.                         $duration = null;
  2368.                         $expression = null;
  2369.                         $framerate = null;
  2370.                         $height = null;
  2371.                         $javascript = null;
  2372.                         $lang = null;
  2373.                         $length = null;
  2374.                         $medium = null;
  2375.                         $samplingrate = null;
  2376.                         $type = null;
  2377.                         $url = null;
  2378.                         $width = null;
  2379.  
  2380.                         // Elements
  2381.                         $captions = null;
  2382.                         $categories = null;
  2383.                         $copyrights = null;
  2384.                         $credits = null;
  2385.                         $description = null;
  2386.                         $hashes = null;
  2387.                         $keywords = null;
  2388.                         $player = null;
  2389.                         $ratings = null;
  2390.                         $restrictions = null;
  2391.                         $thumbnails = null;
  2392.                         $title = null;
  2393.  
  2394.                         // Start checking the attributes of media:content
  2395.                         if (isset($content['attribs']['']['bitrate']))
  2396.                         {
  2397.                             $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
  2398.                         }
  2399.                         if (isset($content['attribs']['']['channels']))
  2400.                         {
  2401.                             $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
  2402.                         }
  2403.                         if (isset($content['attribs']['']['duration']))
  2404.                         {
  2405.                             $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
  2406.                         }
  2407.                         else
  2408.                         {
  2409.                             $duration = $duration_parent;
  2410.                         }
  2411.                         if (isset($content['attribs']['']['expression']))
  2412.                         {
  2413.                             $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
  2414.                         }
  2415.                         if (isset($content['attribs']['']['framerate']))
  2416.                         {
  2417.                             $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
  2418.                         }
  2419.                         if (isset($content['attribs']['']['height']))
  2420.                         {
  2421.                             $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
  2422.                         }
  2423.                         if (isset($content['attribs']['']['lang']))
  2424.                         {
  2425.                             $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
  2426.                         }
  2427.                         if (isset($content['attribs']['']['fileSize']))
  2428.                         {
  2429.                             $length = ceil($content['attribs']['']['fileSize']);
  2430.                         }
  2431.                         if (isset($content['attribs']['']['medium']))
  2432.                         {
  2433.                             $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
  2434.                         }
  2435.                         if (isset($content['attribs']['']['samplingrate']))
  2436.                         {
  2437.                             $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
  2438.                         }
  2439.                         if (isset($content['attribs']['']['type']))
  2440.                         {
  2441.                             $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  2442.                         }
  2443.                         if (isset($content['attribs']['']['width']))
  2444.                         {
  2445.                             $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
  2446.                         }
  2447.                         if (isset($content['attribs']['']['url']))
  2448.                         {
  2449.                             $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
  2450.                         }
  2451.                         // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
  2452.  
  2453.                         // CAPTIONS
  2454.                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
  2455.                         {
  2456.                             foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
  2457.                             {
  2458.                                 $caption_type = null;
  2459.                                 $caption_lang = null;
  2460.                                 $caption_startTime = null;
  2461.                                 $caption_endTime = null;
  2462.                                 $caption_text = null;
  2463.                                 if (isset($caption['attribs']['']['type']))
  2464.                                 {
  2465.                                     $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  2466.                                 }
  2467.                                 if (isset($caption['attribs']['']['lang']))
  2468.                                 {
  2469.                                     $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
  2470.                                 }
  2471.                                 if (isset($caption['attribs']['']['start']))
  2472.                                 {
  2473.                                     $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
  2474.                                 }
  2475.                                 if (isset($caption['attribs']['']['end']))
  2476.                                 {
  2477.                                     $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
  2478.                                 }
  2479.                                 if (isset($caption['data']))
  2480.                                 {
  2481.                                     $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2482.                                 }
  2483.                                 $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
  2484.                             }
  2485.                             if (is_array($captions))
  2486.                             {
  2487.                                 $captions = array_values(array_unique($captions));
  2488.                             }
  2489.                         }
  2490.                         else
  2491.                         {
  2492.                             $captions = $captions_parent;
  2493.                         }
  2494.  
  2495.                         // CATEGORIES
  2496.                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
  2497.                         {
  2498.                             foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
  2499.                             {
  2500.                                 $term = null;
  2501.                                 $scheme = null;
  2502.                                 $label = null;
  2503.                                 if (isset($category['data']))
  2504.                                 {
  2505.                                     $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2506.                                 }
  2507.                                 if (isset($category['attribs']['']['scheme']))
  2508.                                 {
  2509.                                     $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  2510.                                 }
  2511.                                 else
  2512.                                 {
  2513.                                     $scheme = 'http://search.yahoo.com/mrss/category_schema';
  2514.                                 }
  2515.                                 if (isset($category['attribs']['']['label']))
  2516.                                 {
  2517.                                     $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
  2518.                                 }
  2519.                                 $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
  2520.                             }
  2521.                         }
  2522.                         if (is_array($categories) && is_array($categories_parent))
  2523.                         {
  2524.                             $categories = array_values(array_unique(array_merge($categories, $categories_parent)));
  2525.                         }
  2526.                         elseif (is_array($categories))
  2527.                         {
  2528.                             $categories = array_values(array_unique($categories));
  2529.                         }
  2530.                         elseif (is_array($categories_parent))
  2531.                         {
  2532.                             $categories = array_values(array_unique($categories_parent));
  2533.                         }
  2534.                         else
  2535.                         {
  2536.                             $categories = null;
  2537.                         }
  2538.  
  2539.                         // COPYRIGHTS
  2540.                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
  2541.                         {
  2542.                             $copyright_url = null;
  2543.                             $copyright_label = null;
  2544.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
  2545.                             {
  2546.                                 $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
  2547.                             }
  2548.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
  2549.                             {
  2550.                                 $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2551.                             }
  2552.                             $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
  2553.                         }
  2554.                         else
  2555.                         {
  2556.                             $copyrights = $copyrights_parent;
  2557.                         }
  2558.  
  2559.                         // CREDITS
  2560.                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
  2561.                         {
  2562.                             foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
  2563.                             {
  2564.                                 $credit_role = null;
  2565.                                 $credit_scheme = null;
  2566.                                 $credit_name = null;
  2567.                                 if (isset($credit['attribs']['']['role']))
  2568.                                 {
  2569.                                     $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
  2570.                                 }
  2571.                                 if (isset($credit['attribs']['']['scheme']))
  2572.                                 {
  2573.                                     $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  2574.                                 }
  2575.                                 else
  2576.                                 {
  2577.                                     $credit_scheme = 'urn:ebu';
  2578.                                 }
  2579.                                 if (isset($credit['data']))
  2580.                                 {
  2581.                                     $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2582.                                 }
  2583.                                 $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
  2584.                             }
  2585.                             if (is_array($credits))
  2586.                             {
  2587.                                 $credits = array_values(array_unique($credits));
  2588.                             }
  2589.                         }
  2590.                         else
  2591.                         {
  2592.                             $credits = $credits_parent;
  2593.                         }
  2594.  
  2595.                         // DESCRIPTION
  2596.                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
  2597.                         {
  2598.                             $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2599.                         }
  2600.                         else
  2601.                         {
  2602.                             $description = $description_parent;
  2603.                         }
  2604.  
  2605.                         // HASHES
  2606.                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
  2607.                         {
  2608.                             foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
  2609.                             {
  2610.                                 $value = null;
  2611.                                 $algo = null;
  2612.                                 if (isset($hash['data']))
  2613.                                 {
  2614.                                     $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2615.                                 }
  2616.                                 if (isset($hash['attribs']['']['algo']))
  2617.                                 {
  2618.                                     $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
  2619.                                 }
  2620.                                 else
  2621.                                 {
  2622.                                     $algo = 'md5';
  2623.                                 }
  2624.                                 $hashes[] = $algo.':'.$value;
  2625.                             }
  2626.                             if (is_array($hashes))
  2627.                             {
  2628.                                 $hashes = array_values(array_unique($hashes));
  2629.                             }
  2630.                         }
  2631.                         else
  2632.                         {
  2633.                             $hashes = $hashes_parent;
  2634.                         }
  2635.  
  2636.                         // KEYWORDS
  2637.                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
  2638.                         {
  2639.                             if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
  2640.                             {
  2641.                                 $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
  2642.                                 foreach ($temp as $word)
  2643.                                 {
  2644.                                     $keywords[] = trim($word);
  2645.                                 }
  2646.                                 unset($temp);
  2647.                             }
  2648.                             if (is_array($keywords))
  2649.                             {
  2650.                                 $keywords = array_values(array_unique($keywords));
  2651.                             }
  2652.                         }
  2653.                         else
  2654.                         {
  2655.                             $keywords = $keywords_parent;
  2656.                         }
  2657.  
  2658.                         // PLAYER
  2659.                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
  2660.                         {
  2661.                             $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
  2662.                         }
  2663.                         else
  2664.                         {
  2665.                             $player = $player_parent;
  2666.                         }
  2667.  
  2668.                         // RATINGS
  2669.                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
  2670.                         {
  2671.                             foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
  2672.                             {
  2673.                                 $rating_scheme = null;
  2674.                                 $rating_value = null;
  2675.                                 if (isset($rating['attribs']['']['scheme']))
  2676.                                 {
  2677.                                     $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
  2678.                                 }
  2679.                                 else
  2680.                                 {
  2681.                                     $rating_scheme = 'urn:simple';
  2682.                                 }
  2683.                                 if (isset($rating['data']))
  2684.                                 {
  2685.                                     $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2686.                                 }
  2687.                                 $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
  2688.                             }
  2689.                             if (is_array($ratings))
  2690.                             {
  2691.                                 $ratings = array_values(array_unique($ratings));
  2692.                             }
  2693.                         }
  2694.                         else
  2695.                         {
  2696.                             $ratings = $ratings_parent;
  2697.                         }
  2698.  
  2699.                         // RESTRICTIONS
  2700.                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
  2701.                         {
  2702.                             foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
  2703.                             {
  2704.                                 $restriction_relationship = null;
  2705.                                 $restriction_type = null;
  2706.                                 $restriction_value = null;
  2707.                                 if (isset($restriction['attribs']['']['relationship']))
  2708.                                 {
  2709.                                     $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
  2710.                                 }
  2711.                                 if (isset($restriction['attribs']['']['type']))
  2712.                                 {
  2713.                                     $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  2714.                                 }
  2715.                                 if (isset($restriction['data']))
  2716.                                 {
  2717.                                     $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2718.                                 }
  2719.                                 $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
  2720.                             }
  2721.                             if (is_array($restrictions))
  2722.                             {
  2723.                                 $restrictions = array_values(array_unique($restrictions));
  2724.                             }
  2725.                         }
  2726.                         else
  2727.                         {
  2728.                             $restrictions = $restrictions_parent;
  2729.                         }
  2730.  
  2731.                         // THUMBNAILS
  2732.                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
  2733.                         {
  2734.                             foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
  2735.                             {
  2736.                                 $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
  2737.                             }
  2738.                             if (is_array($thumbnails))
  2739.                             {
  2740.                                 $thumbnails = array_values(array_unique($thumbnails));
  2741.                             }
  2742.                         }
  2743.                         else
  2744.                         {
  2745.                             $thumbnails = $thumbnails_parent;
  2746.                         }
  2747.  
  2748.                         // TITLES
  2749.                         if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
  2750.                         {
  2751.                             $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
  2752.                         }
  2753.                         else
  2754.                         {
  2755.                             $title = $title_parent;
  2756.                         }
  2757.  
  2758.                         $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width));
  2759.                     }
  2760.                 }
  2761.             }
  2762.  
  2763.             foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
  2764.             {
  2765.                 if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')
  2766.                 {
  2767.                     // Attributes
  2768.                     $bitrate = null;
  2769.                     $channels = null;
  2770.                     $duration = null;
  2771.                     $expression = null;
  2772.                     $framerate = null;
  2773.                     $height = null;
  2774.                     $javascript = null;
  2775.                     $lang = null;
  2776.                     $length = null;
  2777.                     $medium = null;
  2778.                     $samplingrate = null;
  2779.                     $type = null;
  2780.                     $url = null;
  2781.                     $width = null;
  2782.  
  2783.                     $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
  2784.                     if (isset($link['attribs']['']['type']))
  2785.                     {
  2786.                         $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  2787.                     }
  2788.                     if (isset($link['attribs']['']['length']))
  2789.                     {
  2790.                         $length = ceil($link['attribs']['']['length']);
  2791.                     }
  2792.  
  2793.                     // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
  2794.                     $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
  2795.                 }
  2796.             }
  2797.  
  2798.             foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
  2799.             {
  2800.                 if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')
  2801.                 {
  2802.                     // Attributes
  2803.                     $bitrate = null;
  2804.                     $channels = null;
  2805.                     $duration = null;
  2806.                     $expression = null;
  2807.                     $framerate = null;
  2808.                     $height = null;
  2809.                     $javascript = null;
  2810.                     $lang = null;
  2811.                     $length = null;
  2812.                     $medium = null;
  2813.                     $samplingrate = null;
  2814.                     $type = null;
  2815.                     $url = null;
  2816.                     $width = null;
  2817.  
  2818.                     $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
  2819.                     if (isset($link['attribs']['']['type']))
  2820.                     {
  2821.                         $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  2822.                     }
  2823.                     if (isset($link['attribs']['']['length']))
  2824.                     {
  2825.                         $length = ceil($link['attribs']['']['length']);
  2826.                     }
  2827.  
  2828.                     // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
  2829.                     $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
  2830.                 }
  2831.             }
  2832.  
  2833.             if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure'))
  2834.             {
  2835.                 if (isset($enclosure[0]['attribs']['']['url']))
  2836.                 {
  2837.                     // Attributes
  2838.                     $bitrate = null;
  2839.                     $channels = null;
  2840.                     $duration = null;
  2841.                     $expression = null;
  2842.                     $framerate = null;
  2843.                     $height = null;
  2844.                     $javascript = null;
  2845.                     $lang = null;
  2846.                     $length = null;
  2847.                     $medium = null;
  2848.                     $samplingrate = null;
  2849.                     $type = null;
  2850.                     $url = null;
  2851.                     $width = null;
  2852.  
  2853.                     $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));
  2854.                     if (isset($enclosure[0]['attribs']['']['type']))
  2855.                     {
  2856.                         $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
  2857.                     }
  2858.                     if (isset($enclosure[0]['attribs']['']['length']))
  2859.                     {
  2860.                         $length = ceil($enclosure[0]['attribs']['']['length']);
  2861.                     }
  2862.  
  2863.                     // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
  2864.                     $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
  2865.                 }
  2866.             }
  2867.  
  2868.             if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width))
  2869.             {
  2870.                 // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
  2871.                 $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
  2872.             }
  2873.  
  2874.             $this->data['enclosures'] = array_values(array_unique($this->data['enclosures']));
  2875.         }
  2876.         if (!empty($this->data['enclosures']))
  2877.         {
  2878.             return $this->data['enclosures'];
  2879.         }
  2880.         else
  2881.         {
  2882.             return null;
  2883.         }
  2884.     }
  2885.  
  2886.     /**
  2887.      * Get the latitude coordinates for the item
  2888.      *
  2889.      * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications
  2890.      *
  2891.      * Uses `<geo:lat>` or `<georss:point>`
  2892.      *
  2893.      * @since 1.0
  2894.      * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo
  2895.      * @link http://www.georss.org/ GeoRSS
  2896.      * @return string|null
  2897.      */
  2898.     public function get_latitude()
  2899.     {
  2900.         if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
  2901.         {
  2902.             return (float) $return[0]['data'];
  2903.         }
  2904.         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))
  2905.         {
  2906.             return (float) $match[1];
  2907.         }
  2908.         else
  2909.         {
  2910.             return null;
  2911.         }
  2912.     }
  2913.  
  2914.     /**
  2915.      * Get the longitude coordinates for the item
  2916.      *
  2917.      * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications
  2918.      *
  2919.      * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>`
  2920.      *
  2921.      * @since 1.0
  2922.      * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo
  2923.      * @link http://www.georss.org/ GeoRSS
  2924.      * @return string|null
  2925.      */
  2926.     public function get_longitude()
  2927.     {
  2928.         if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
  2929.         {
  2930.             return (float) $return[0]['data'];
  2931.         }
  2932.         elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
  2933.         {
  2934.             return (float) $return[0]['data'];
  2935.         }
  2936.         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))
  2937.         {
  2938.             return (float) $match[2];
  2939.         }
  2940.         else
  2941.         {
  2942.             return null;
  2943.         }
  2944.     }
  2945.  
  2946.     /**
  2947.      * Get the `<atom:source>` for the item
  2948.      *
  2949.      * @since 1.1
  2950.      * @return SimplePie_Source|null
  2951.      */
  2952.     public function get_source()
  2953.     {
  2954.         if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source'))
  2955.         {
  2956.             return $this->registry->create('Source', array($this, $return[0]));
  2957.         }
  2958.         else
  2959.         {
  2960.             return null;
  2961.         }
  2962.     }
  2963. }
  2964.  
  2965.