Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

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