[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
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
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |