Completed
Pull Request — master (#2)
by Stephen
09:32
created

SimplePie_Item   D

Complexity

Total Complexity 530

Size/Duplication

Total Lines 2908
Duplicated Lines 41.33 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 0
Metric Value
dl 1202
loc 2908
rs 4.4102
c 0
b 0
f 0
wmc 530
lcom 1
cbo 4

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like SimplePie_Item often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use SimplePie_Item, and based on these observations, apply Extract Interface, too.

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