Search moodle.org's
Developer Documentation

See Release Notes

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