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