]> git.immae.eu Git - github/wallabag/wallabag.git/blob - inc/3rdparty/libraries/simplepie/library/SimplePie/Item.php
[add] add RSS feed for archive
[github/wallabag/wallabag.git] / inc / 3rdparty / libraries / simplepie / library / SimplePie / Item.php
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