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