| [ Index ] |
PHP Cross Reference of Joomla 1.5.26 DE |
[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-2009, Ryan Parman and Geoffrey Sneddon 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.2 37 * @copyright 2004-2009 Ryan Parman, Geoffrey Sneddon 38 * @author Ryan Parman 39 * @author Geoffrey Sneddon 40 * @link http://simplepie.org/ SimplePie 41 * @link http://simplepie.org/support/ Please submit all bug reports and feature requests to the SimplePie forums 42 * @license http://www.opensource.org/licenses/bsd-license.php BSD License 43 * @todo phpDoc comments 44 */ 45 46 /** 47 * SimplePie Name 48 */ 49 define('SIMPLEPIE_NAME', 'SimplePie'); 50 51 /** 52 * SimplePie Version 53 */ 54 define('SIMPLEPIE_VERSION', '1.2'); 55 56 /** 57 * SimplePie Build 58 */ 59 define('SIMPLEPIE_BUILD', '20090627192103'); 60 61 /** 62 * SimplePie Website URL 63 */ 64 define('SIMPLEPIE_URL', 'http://simplepie.org'); 65 66 /** 67 * SimplePie Useragent 68 * @see SimplePie::set_useragent() 69 */ 70 define('SIMPLEPIE_USERAGENT', SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION . ' (Feed Parser; ' . SIMPLEPIE_URL . '; Allow like Gecko) Build/' . SIMPLEPIE_BUILD); 71 72 /** 73 * SimplePie Linkback 74 */ 75 define('SIMPLEPIE_LINKBACK', '<a href="' . SIMPLEPIE_URL . '" title="' . SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . '">' . SIMPLEPIE_NAME . '</a>'); 76 77 /** 78 * No Autodiscovery 79 * @see SimplePie::set_autodiscovery_level() 80 */ 81 define('SIMPLEPIE_LOCATOR_NONE', 0); 82 83 /** 84 * Feed Link Element Autodiscovery 85 * @see SimplePie::set_autodiscovery_level() 86 */ 87 define('SIMPLEPIE_LOCATOR_AUTODISCOVERY', 1); 88 89 /** 90 * Local Feed Extension Autodiscovery 91 * @see SimplePie::set_autodiscovery_level() 92 */ 93 define('SIMPLEPIE_LOCATOR_LOCAL_EXTENSION', 2); 94 95 /** 96 * Local Feed Body Autodiscovery 97 * @see SimplePie::set_autodiscovery_level() 98 */ 99 define('SIMPLEPIE_LOCATOR_LOCAL_BODY', 4); 100 101 /** 102 * Remote Feed Extension Autodiscovery 103 * @see SimplePie::set_autodiscovery_level() 104 */ 105 define('SIMPLEPIE_LOCATOR_REMOTE_EXTENSION', 8); 106 107 /** 108 * Remote Feed Body Autodiscovery 109 * @see SimplePie::set_autodiscovery_level() 110 */ 111 define('SIMPLEPIE_LOCATOR_REMOTE_BODY', 16); 112 113 /** 114 * All Feed Autodiscovery 115 * @see SimplePie::set_autodiscovery_level() 116 */ 117 define('SIMPLEPIE_LOCATOR_ALL', 31); 118 119 /** 120 * No known feed type 121 */ 122 define('SIMPLEPIE_TYPE_NONE', 0); 123 124 /** 125 * RSS 0.90 126 */ 127 define('SIMPLEPIE_TYPE_RSS_090', 1); 128 129 /** 130 * RSS 0.91 (Netscape) 131 */ 132 define('SIMPLEPIE_TYPE_RSS_091_NETSCAPE', 2); 133 134 /** 135 * RSS 0.91 (Userland) 136 */ 137 define('SIMPLEPIE_TYPE_RSS_091_USERLAND', 4); 138 139 /** 140 * RSS 0.91 (both Netscape and Userland) 141 */ 142 define('SIMPLEPIE_TYPE_RSS_091', 6); 143 144 /** 145 * RSS 0.92 146 */ 147 define('SIMPLEPIE_TYPE_RSS_092', 8); 148 149 /** 150 * RSS 0.93 151 */ 152 define('SIMPLEPIE_TYPE_RSS_093', 16); 153 154 /** 155 * RSS 0.94 156 */ 157 define('SIMPLEPIE_TYPE_RSS_094', 32); 158 159 /** 160 * RSS 1.0 161 */ 162 define('SIMPLEPIE_TYPE_RSS_10', 64); 163 164 /** 165 * RSS 2.0 166 */ 167 define('SIMPLEPIE_TYPE_RSS_20', 128); 168 169 /** 170 * RDF-based RSS 171 */ 172 define('SIMPLEPIE_TYPE_RSS_RDF', 65); 173 174 /** 175 * Non-RDF-based RSS (truly intended as syndication format) 176 */ 177 define('SIMPLEPIE_TYPE_RSS_SYNDICATION', 190); 178 179 /** 180 * All RSS 181 */ 182 define('SIMPLEPIE_TYPE_RSS_ALL', 255); 183 184 /** 185 * Atom 0.3 186 */ 187 define('SIMPLEPIE_TYPE_ATOM_03', 256); 188 189 /** 190 * Atom 1.0 191 */ 192 define('SIMPLEPIE_TYPE_ATOM_10', 512); 193 194 /** 195 * All Atom 196 */ 197 define('SIMPLEPIE_TYPE_ATOM_ALL', 768); 198 199 /** 200 * All feed types 201 */ 202 define('SIMPLEPIE_TYPE_ALL', 1023); 203 204 /** 205 * No construct 206 */ 207 define('SIMPLEPIE_CONSTRUCT_NONE', 0); 208 209 /** 210 * Text construct 211 */ 212 define('SIMPLEPIE_CONSTRUCT_TEXT', 1); 213 214 /** 215 * HTML construct 216 */ 217 define('SIMPLEPIE_CONSTRUCT_HTML', 2); 218 219 /** 220 * XHTML construct 221 */ 222 define('SIMPLEPIE_CONSTRUCT_XHTML', 4); 223 224 /** 225 * base64-encoded construct 226 */ 227 define('SIMPLEPIE_CONSTRUCT_BASE64', 8); 228 229 /** 230 * IRI construct 231 */ 232 define('SIMPLEPIE_CONSTRUCT_IRI', 16); 233 234 /** 235 * A construct that might be HTML 236 */ 237 define('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32); 238 239 /** 240 * All constructs 241 */ 242 define('SIMPLEPIE_CONSTRUCT_ALL', 63); 243 244 /** 245 * Don't change case 246 */ 247 define('SIMPLEPIE_SAME_CASE', 1); 248 249 /** 250 * Change to lowercase 251 */ 252 define('SIMPLEPIE_LOWERCASE', 2); 253 254 /** 255 * Change to uppercase 256 */ 257 define('SIMPLEPIE_UPPERCASE', 4); 258 259 /** 260 * PCRE for HTML attributes 261 */ 262 define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*'); 263 264 /** 265 * PCRE for XML attributes 266 */ 267 define('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*'); 268 269 /** 270 * XML Namespace 271 */ 272 define('SIMPLEPIE_NAMESPACE_XML', 'http://www.w3.org/XML/1998/namespace'); 273 274 /** 275 * Atom 1.0 Namespace 276 */ 277 define('SIMPLEPIE_NAMESPACE_ATOM_10', 'http://www.w3.org/2005/Atom'); 278 279 /** 280 * Atom 0.3 Namespace 281 */ 282 define('SIMPLEPIE_NAMESPACE_ATOM_03', 'http://purl.org/atom/ns#'); 283 284 /** 285 * RDF Namespace 286 */ 287 define('SIMPLEPIE_NAMESPACE_RDF', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); 288 289 /** 290 * RSS 0.90 Namespace 291 */ 292 define('SIMPLEPIE_NAMESPACE_RSS_090', 'http://my.netscape.com/rdf/simple/0.9/'); 293 294 /** 295 * RSS 1.0 Namespace 296 */ 297 define('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/'); 298 299 /** 300 * RSS 1.0 Content Module Namespace 301 */ 302 define('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/'); 303 304 /** 305 * RSS 2.0 Namespace 306 * (Stupid, I know, but I'm certain it will confuse people less with support.) 307 */ 308 define('SIMPLEPIE_NAMESPACE_RSS_20', ''); 309 310 /** 311 * DC 1.0 Namespace 312 */ 313 define('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/'); 314 315 /** 316 * DC 1.1 Namespace 317 */ 318 define('SIMPLEPIE_NAMESPACE_DC_11', 'http://purl.org/dc/elements/1.1/'); 319 320 /** 321 * W3C Basic Geo (WGS84 lat/long) Vocabulary Namespace 322 */ 323 define('SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO', 'http://www.w3.org/2003/01/geo/wgs84_pos#'); 324 325 /** 326 * GeoRSS Namespace 327 */ 328 define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss'); 329 330 /** 331 * Media RSS Namespace 332 */ 333 define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/'); 334 335 /** 336 * Wrong Media RSS Namespace 337 */ 338 define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss'); 339 340 /** 341 * iTunes RSS Namespace 342 */ 343 define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); 344 345 /** 346 * XHTML Namespace 347 */ 348 define('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml'); 349 350 /** 351 * IANA Link Relations Registry 352 */ 353 define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/'); 354 355 /** 356 * Whether we're running on PHP5 357 */ 358 define('SIMPLEPIE_PHP5', version_compare(PHP_VERSION, '5.0.0', '>=')); 359 360 /** 361 * No file source 362 */ 363 define('SIMPLEPIE_FILE_SOURCE_NONE', 0); 364 365 /** 366 * Remote file source 367 */ 368 define('SIMPLEPIE_FILE_SOURCE_REMOTE', 1); 369 370 /** 371 * Local file source 372 */ 373 define('SIMPLEPIE_FILE_SOURCE_LOCAL', 2); 374 375 /** 376 * fsockopen() file source 377 */ 378 define('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4); 379 380 /** 381 * cURL file source 382 */ 383 define('SIMPLEPIE_FILE_SOURCE_CURL', 8); 384 385 /** 386 * file_get_contents() file source 387 */ 388 define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16); 389 390 /** 391 * SimplePie 392 * 393 * @package SimplePie 394 */ 395 class SimplePie 396 { 397 /** 398 * @var array Raw data 399 * @access private 400 */ 401 var $data = array(); 402 403 /** 404 * @var mixed Error string 405 * @access private 406 */ 407 var $error; 408 409 /** 410 * @var object Instance of SimplePie_Sanitize (or other class) 411 * @see SimplePie::set_sanitize_class() 412 * @access private 413 */ 414 var $sanitize; 415 416 /** 417 * @var string SimplePie Useragent 418 * @see SimplePie::set_useragent() 419 * @access private 420 */ 421 var $useragent = SIMPLEPIE_USERAGENT; 422 423 /** 424 * @var string Feed URL 425 * @see SimplePie::set_feed_url() 426 * @access private 427 */ 428 var $feed_url; 429 430 /** 431 * @var object Instance of SimplePie_File to use as a feed 432 * @see SimplePie::set_file() 433 * @access private 434 */ 435 var $file; 436 437 /** 438 * @var string Raw feed data 439 * @see SimplePie::set_raw_data() 440 * @access private 441 */ 442 var $raw_data; 443 444 /** 445 * @var int Timeout for fetching remote files 446 * @see SimplePie::set_timeout() 447 * @access private 448 */ 449 var $timeout = 10; 450 451 /** 452 * @var bool Forces fsockopen() to be used for remote files instead 453 * of cURL, even if a new enough version is installed 454 * @see SimplePie::force_fsockopen() 455 * @access private 456 */ 457 var $force_fsockopen = false; 458 459 /** 460 * @var bool Force the given data/URL to be treated as a feed no matter what 461 * it appears like 462 * @see SimplePie::force_feed() 463 * @access private 464 */ 465 var $force_feed = false; 466 467 /** 468 * @var bool Enable/Disable XML dump 469 * @see SimplePie::enable_xml_dump() 470 * @access private 471 */ 472 var $xml_dump = false; 473 474 /** 475 * @var bool Enable/Disable Caching 476 * @see SimplePie::enable_cache() 477 * @access private 478 */ 479 var $cache = true; 480 481 /** 482 * @var int Cache duration (in seconds) 483 * @see SimplePie::set_cache_duration() 484 * @access private 485 */ 486 var $cache_duration = 3600; 487 488 /** 489 * @var int Auto-discovery cache duration (in seconds) 490 * @see SimplePie::set_autodiscovery_cache_duration() 491 * @access private 492 */ 493 var $autodiscovery_cache_duration = 604800; // 7 Days. 494 495 /** 496 * @var string Cache location (relative to executing script) 497 * @see SimplePie::set_cache_location() 498 * @access private 499 */ 500 var $cache_location = './cache'; 501 502 /** 503 * @var string Function that creates the cache filename 504 * @see SimplePie::set_cache_name_function() 505 * @access private 506 */ 507 var $cache_name_function = 'md5'; 508 509 /** 510 * @var bool Reorder feed by date descending 511 * @see SimplePie::enable_order_by_date() 512 * @access private 513 */ 514 var $order_by_date = true; 515 516 /** 517 * @var mixed Force input encoding to be set to the follow value 518 * (false, or anything type-cast to false, disables this feature) 519 * @see SimplePie::set_input_encoding() 520 * @access private 521 */ 522 var $input_encoding = false; 523 524 /** 525 * @var int Feed Autodiscovery Level 526 * @see SimplePie::set_autodiscovery_level() 527 * @access private 528 */ 529 var $autodiscovery = SIMPLEPIE_LOCATOR_ALL; 530 531 /** 532 * @var string Class used for caching feeds 533 * @see SimplePie::set_cache_class() 534 * @access private 535 */ 536 var $cache_class = 'SimplePie_Cache'; 537 538 /** 539 * @var string Class used for locating feeds 540 * @see SimplePie::set_locator_class() 541 * @access private 542 */ 543 var $locator_class = 'SimplePie_Locator'; 544 545 /** 546 * @var string Class used for parsing feeds 547 * @see SimplePie::set_parser_class() 548 * @access private 549 */ 550 var $parser_class = 'SimplePie_Parser'; 551 552 /** 553 * @var string Class used for fetching feeds 554 * @see SimplePie::set_file_class() 555 * @access private 556 */ 557 var $file_class = 'SimplePie_File'; 558 559 /** 560 * @var string Class used for items 561 * @see SimplePie::set_item_class() 562 * @access private 563 */ 564 var $item_class = 'SimplePie_Item'; 565 566 /** 567 * @var string Class used for authors 568 * @see SimplePie::set_author_class() 569 * @access private 570 */ 571 var $author_class = 'SimplePie_Author'; 572 573 /** 574 * @var string Class used for categories 575 * @see SimplePie::set_category_class() 576 * @access private 577 */ 578 var $category_class = 'SimplePie_Category'; 579 580 /** 581 * @var string Class used for enclosures 582 * @see SimplePie::set_enclosures_class() 583 * @access private 584 */ 585 var $enclosure_class = 'SimplePie_Enclosure'; 586 587 /** 588 * @var string Class used for Media RSS <media:text> captions 589 * @see SimplePie::set_caption_class() 590 * @access private 591 */ 592 var $caption_class = 'SimplePie_Caption'; 593 594 /** 595 * @var string Class used for Media RSS <media:copyright> 596 * @see SimplePie::set_copyright_class() 597 * @access private 598 */ 599 var $copyright_class = 'SimplePie_Copyright'; 600 601 /** 602 * @var string Class used for Media RSS <media:credit> 603 * @see SimplePie::set_credit_class() 604 * @access private 605 */ 606 var $credit_class = 'SimplePie_Credit'; 607 608 /** 609 * @var string Class used for Media RSS <media:rating> 610 * @see SimplePie::set_rating_class() 611 * @access private 612 */ 613 var $rating_class = 'SimplePie_Rating'; 614 615 /** 616 * @var string Class used for Media RSS <media:restriction> 617 * @see SimplePie::set_restriction_class() 618 * @access private 619 */ 620 var $restriction_class = 'SimplePie_Restriction'; 621 622 /** 623 * @var string Class used for content-type sniffing 624 * @see SimplePie::set_content_type_sniffer_class() 625 * @access private 626 */ 627 var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer'; 628 629 /** 630 * @var string Class used for item sources. 631 * @see SimplePie::set_source_class() 632 * @access private 633 */ 634 var $source_class = 'SimplePie_Source'; 635 636 /** 637 * @var mixed Set javascript query string parameter (false, or 638 * anything type-cast to false, disables this feature) 639 * @see SimplePie::set_javascript() 640 * @access private 641 */ 642 var $javascript = 'js'; 643 644 /** 645 * @var int Maximum number of feeds to check with autodiscovery 646 * @see SimplePie::set_max_checked_feeds() 647 * @access private 648 */ 649 var $max_checked_feeds = 10; 650 651 /** 652 * @var array All the feeds found during the autodiscovery process 653 * @see SimplePie::get_all_discovered_feeds() 654 * @access private 655 */ 656 var $all_discovered_feeds = array(); 657 658 /** 659 * @var string Web-accessible path to the handler_favicon.php file. 660 * @see SimplePie::set_favicon_handler() 661 * @access private 662 */ 663 var $favicon_handler = ''; 664 665 /** 666 * @var string Web-accessible path to the handler_image.php file. 667 * @see SimplePie::set_image_handler() 668 * @access private 669 */ 670 var $image_handler = ''; 671 672 /** 673 * @var array Stores the URLs when multiple feeds are being initialized. 674 * @see SimplePie::set_feed_url() 675 * @access private 676 */ 677 var $multifeed_url = array(); 678 679 /** 680 * @var array Stores SimplePie objects when multiple feeds initialized. 681 * @access private 682 */ 683 var $multifeed_objects = array(); 684 685 /** 686 * @var array Stores the get_object_vars() array for use with multifeeds. 687 * @see SimplePie::set_feed_url() 688 * @access private 689 */ 690 var $config_settings = null; 691 692 /** 693 * @var integer Stores the number of items to return per-feed with multifeeds. 694 * @see SimplePie::set_item_limit() 695 * @access private 696 */ 697 var $item_limit = 0; 698 699 /** 700 * @var array Stores the default attributes to be stripped by strip_attributes(). 701 * @see SimplePie::strip_attributes() 702 * @access private 703 */ 704 var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'); 705 706 /** 707 * @var array Stores the default tags to be stripped by strip_htmltags(). 708 * @see SimplePie::strip_htmltags() 709 * @access private 710 */ 711 var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'); 712 713 /** 714 * The SimplePie class contains feed level data and options 715 * 716 * There are two ways that you can create a new SimplePie object. The first 717 * is by passing a feed URL as a parameter to the SimplePie constructor 718 * (as well as optionally setting the cache location and cache expiry). This 719 * will initialise the whole feed with all of the default settings, and you 720 * can begin accessing methods and properties immediately. 721 * 722 * The second way is to create the SimplePie object with no parameters 723 * at all. This will enable you to set configuration options. After setting 724 * them, you must initialise the feed using $feed->init(). At that point the 725 * object's methods and properties will be available to you. This format is 726 * what is used throughout this documentation. 727 * 728 * @access public 729 * @since 1.0 Preview Release 730 * @param string $feed_url This is the URL you want to parse. 731 * @param string $cache_location This is where you want the cache to be stored. 732 * @param int $cache_duration This is the number of seconds that you want to store the cache file for. 733 */ 734 function SimplePie($feed_url = null, $cache_location = null, $cache_duration = null) 735 { 736 // Other objects, instances created here so we can set options on them 737 $this->sanitize = new SimplePie_Sanitize; 738 739 // Set options if they're passed to the constructor 740 if ($cache_location !== null) 741 { 742 $this->set_cache_location($cache_location); 743 } 744 745 if ($cache_duration !== null) 746 { 747 $this->set_cache_duration($cache_duration); 748 } 749 750 // Only init the script if we're passed a feed URL 751 if ($feed_url !== null) 752 { 753 $this->set_feed_url($feed_url); 754 $this->init(); 755 } 756 } 757 758 /** 759 * Used for converting object to a string 760 */ 761 function __toString() 762 { 763 return md5(serialize($this->data)); 764 } 765 766 /** 767 * Remove items that link back to this before destroying this object 768 */ 769 function __destruct() 770 { 771 if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode')) 772 { 773 if (!empty($this->data['items'])) 774 { 775 foreach ($this->data['items'] as $item) 776 { 777 $item->__destruct(); 778 } 779 unset($item, $this->data['items']); 780 } 781 if (!empty($this->data['ordered_items'])) 782 { 783 foreach ($this->data['ordered_items'] as $item) 784 { 785 $item->__destruct(); 786 } 787 unset($item, $this->data['ordered_items']); 788 } 789 } 790 } 791 792 /** 793 * Force the given data/URL to be treated as a feed no matter what it 794 * appears like 795 * 796 * @access public 797 * @since 1.1 798 * @param bool $enable Force the given data/URL to be treated as a feed 799 */ 800 function force_feed($enable = false) 801 { 802 $this->force_feed = (bool) $enable; 803 } 804 805 /** 806 * This is the URL of the feed you want to parse. 807 * 808 * This allows you to enter the URL of the feed you want to parse, or the 809 * website you want to try to use auto-discovery on. This takes priority 810 * over any set raw data. 811 * 812 * You can set multiple feeds to mash together by passing an array instead 813 * of a string for the $url. Remember that with each additional feed comes 814 * additional processing and resources. 815 * 816 * @access public 817 * @since 1.0 Preview Release 818 * @param mixed $url This is the URL (or array of URLs) that you want to parse. 819 * @see SimplePie::set_raw_data() 820 */ 821 function set_feed_url($url) 822 { 823 if (is_array($url)) 824 { 825 $this->multifeed_url = array(); 826 foreach ($url as $value) 827 { 828 $this->multifeed_url[] = SimplePie_Misc::fix_protocol($value, 1); 829 } 830 } 831 else 832 { 833 $this->feed_url = SimplePie_Misc::fix_protocol($url, 1); 834 } 835 } 836 837 /** 838 * Provides an instance of SimplePie_File to use as a feed 839 * 840 * @access public 841 * @param object &$file Instance of SimplePie_File (or subclass) 842 * @return bool True on success, false on failure 843 */ 844 function set_file(&$file) 845 { 846 if (is_a($file, 'SimplePie_File')) 847 { 848 $this->feed_url = $file->url; 849 $this->file =& $file; 850 return true; 851 } 852 return false; 853 } 854 855 /** 856 * Allows you to use a string of RSS/Atom data instead of a remote feed. 857 * 858 * If you have a feed available as a string in PHP, you can tell SimplePie 859 * to parse that data string instead of a remote feed. Any set feed URL 860 * takes precedence. 861 * 862 * @access public 863 * @since 1.0 Beta 3 864 * @param string $data RSS or Atom data as a string. 865 * @see SimplePie::set_feed_url() 866 */ 867 function set_raw_data($data) 868 { 869 $this->raw_data = $data; 870 } 871 872 /** 873 * Allows you to override the default timeout for fetching remote feeds. 874 * 875 * This allows you to change the maximum time the feed's server to respond 876 * and send the feed back. 877 * 878 * @access public 879 * @since 1.0 Beta 3 880 * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed. 881 */ 882 function set_timeout($timeout = 10) 883 { 884 $this->timeout = (int) $timeout; 885 } 886 887 /** 888 * Forces SimplePie to use fsockopen() instead of the preferred cURL 889 * functions. 890 * 891 * @access public 892 * @since 1.0 Beta 3 893 * @param bool $enable Force fsockopen() to be used 894 */ 895 function force_fsockopen($enable = false) 896 { 897 $this->force_fsockopen = (bool) $enable; 898 } 899 900 /** 901 * Outputs the raw XML content of the feed, after it has gone through 902 * SimplePie's filters. 903 * 904 * Used only for debugging, this function will output the XML content as 905 * text/xml. When SimplePie reads in a feed, it does a bit of cleaning up 906 * before trying to parse it. Many parts of the feed are re-written in 907 * memory, and in the end, you have a parsable feed. XML dump shows you the 908 * actual XML that SimplePie tries to parse, which may or may not be very 909 * different from the original feed. 910 * 911 * @access public 912 * @since 1.0 Preview Release 913 * @param bool $enable Enable XML dump 914 */ 915 function enable_xml_dump($enable = false) 916 { 917 $this->xml_dump = (bool) $enable; 918 } 919 920 /** 921 * Enables/disables caching in SimplePie. 922 * 923 * This option allows you to disable caching all-together in SimplePie. 924 * However, disabling the cache can lead to longer load times. 925 * 926 * @access public 927 * @since 1.0 Preview Release 928 * @param bool $enable Enable caching 929 */ 930 function enable_cache($enable = true) 931 { 932 $this->cache = (bool) $enable; 933 } 934 935 /** 936 * Set the length of time (in seconds) that the contents of a feed 937 * will be cached. 938 * 939 * @access public 940 * @param int $seconds The feed content cache duration. 941 */ 942 function set_cache_duration($seconds = 3600) 943 { 944 $this->cache_duration = (int) $seconds; 945 } 946 947 /** 948 * Set the length of time (in seconds) that the autodiscovered feed 949 * URL will be cached. 950 * 951 * @access public 952 * @param int $seconds The autodiscovered feed URL cache duration. 953 */ 954 function set_autodiscovery_cache_duration($seconds = 604800) 955 { 956 $this->autodiscovery_cache_duration = (int) $seconds; 957 } 958 959 /** 960 * Set the file system location where the cached files should be stored. 961 * 962 * @access public 963 * @param string $location The file system location. 964 */ 965 function set_cache_location($location = './cache') 966 { 967 $this->cache_location = (string) $location; 968 } 969 970 /** 971 * Determines whether feed items should be sorted into reverse chronological order. 972 * 973 * @access public 974 * @param bool $enable Sort as reverse chronological order. 975 */ 976 function enable_order_by_date($enable = true) 977 { 978 $this->order_by_date = (bool) $enable; 979 } 980 981 /** 982 * Allows you to override the character encoding reported by the feed. 983 * 984 * @access public 985 * @param string $encoding Character encoding. 986 */ 987 function set_input_encoding($encoding = false) 988 { 989 if ($encoding) 990 { 991 $this->input_encoding = (string) $encoding; 992 } 993 else 994 { 995 $this->input_encoding = false; 996 } 997 } 998 999 /** 1000 * Set how much feed autodiscovery to do 1001 * 1002 * @access public 1003 * @see SIMPLEPIE_LOCATOR_NONE 1004 * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY 1005 * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION 1006 * @see SIMPLEPIE_LOCATOR_LOCAL_BODY 1007 * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION 1008 * @see SIMPLEPIE_LOCATOR_REMOTE_BODY 1009 * @see SIMPLEPIE_LOCATOR_ALL 1010 * @param int $level Feed Autodiscovery Level (level can be a 1011 * combination of the above constants, see bitwise OR operator) 1012 */ 1013 function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL) 1014 { 1015 $this->autodiscovery = (int) $level; 1016 } 1017 1018 /** 1019 * Allows you to change which class SimplePie uses for caching. 1020 * Useful when you are overloading or extending SimplePie's default classes. 1021 * 1022 * @access public 1023 * @param string $class Name of custom class. 1024 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1025 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1026 */ 1027 function set_cache_class($class = 'SimplePie_Cache') 1028 { 1029 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Cache')) 1030 { 1031 $this->cache_class = $class; 1032 return true; 1033 } 1034 return false; 1035 } 1036 1037 /** 1038 * Allows you to change which class SimplePie uses for auto-discovery. 1039 * Useful when you are overloading or extending SimplePie's default classes. 1040 * 1041 * @access public 1042 * @param string $class Name of custom class. 1043 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1044 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1045 */ 1046 function set_locator_class($class = 'SimplePie_Locator') 1047 { 1048 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Locator')) 1049 { 1050 $this->locator_class = $class; 1051 return true; 1052 } 1053 return false; 1054 } 1055 1056 /** 1057 * Allows you to change which class SimplePie uses for XML parsing. 1058 * Useful when you are overloading or extending SimplePie's default classes. 1059 * 1060 * @access public 1061 * @param string $class Name of custom class. 1062 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1063 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1064 */ 1065 function set_parser_class($class = 'SimplePie_Parser') 1066 { 1067 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Parser')) 1068 { 1069 $this->parser_class = $class; 1070 return true; 1071 } 1072 return false; 1073 } 1074 1075 /** 1076 * Allows you to change which class SimplePie uses for remote file fetching. 1077 * Useful when you are overloading or extending SimplePie's default classes. 1078 * 1079 * @access public 1080 * @param string $class Name of custom class. 1081 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1082 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1083 */ 1084 function set_file_class($class = 'SimplePie_File') 1085 { 1086 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_File')) 1087 { 1088 $this->file_class = $class; 1089 return true; 1090 } 1091 return false; 1092 } 1093 1094 /** 1095 * Allows you to change which class SimplePie uses for data sanitization. 1096 * Useful when you are overloading or extending SimplePie's default classes. 1097 * 1098 * @access public 1099 * @param string $class Name of custom class. 1100 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1101 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1102 */ 1103 function set_sanitize_class($class = 'SimplePie_Sanitize') 1104 { 1105 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Sanitize')) 1106 { 1107 $this->sanitize = new $class; 1108 return true; 1109 } 1110 return false; 1111 } 1112 1113 /** 1114 * Allows you to change which class SimplePie uses for handling feed items. 1115 * Useful when you are overloading or extending SimplePie's default classes. 1116 * 1117 * @access public 1118 * @param string $class Name of custom class. 1119 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1120 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1121 */ 1122 function set_item_class($class = 'SimplePie_Item') 1123 { 1124 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Item')) 1125 { 1126 $this->item_class = $class; 1127 return true; 1128 } 1129 return false; 1130 } 1131 1132 /** 1133 * Allows you to change which class SimplePie uses for handling author data. 1134 * Useful when you are overloading or extending SimplePie's default classes. 1135 * 1136 * @access public 1137 * @param string $class Name of custom class. 1138 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1139 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1140 */ 1141 function set_author_class($class = 'SimplePie_Author') 1142 { 1143 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Author')) 1144 { 1145 $this->author_class = $class; 1146 return true; 1147 } 1148 return false; 1149 } 1150 1151 /** 1152 * Allows you to change which class SimplePie uses for handling category data. 1153 * Useful when you are overloading or extending SimplePie's default classes. 1154 * 1155 * @access public 1156 * @param string $class Name of custom class. 1157 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1158 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1159 */ 1160 function set_category_class($class = 'SimplePie_Category') 1161 { 1162 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Category')) 1163 { 1164 $this->category_class = $class; 1165 return true; 1166 } 1167 return false; 1168 } 1169 1170 /** 1171 * Allows you to change which class SimplePie uses for feed enclosures. 1172 * Useful when you are overloading or extending SimplePie's default classes. 1173 * 1174 * @access public 1175 * @param string $class Name of custom class. 1176 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1177 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1178 */ 1179 function set_enclosure_class($class = 'SimplePie_Enclosure') 1180 { 1181 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Enclosure')) 1182 { 1183 $this->enclosure_class = $class; 1184 return true; 1185 } 1186 return false; 1187 } 1188 1189 /** 1190 * Allows you to change which class SimplePie uses for <media:text> captions 1191 * Useful when you are overloading or extending SimplePie's default classes. 1192 * 1193 * @access public 1194 * @param string $class Name of custom class. 1195 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1196 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1197 */ 1198 function set_caption_class($class = 'SimplePie_Caption') 1199 { 1200 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Caption')) 1201 { 1202 $this->caption_class = $class; 1203 return true; 1204 } 1205 return false; 1206 } 1207 1208 /** 1209 * Allows you to change which class SimplePie uses for <media:copyright> 1210 * Useful when you are overloading or extending SimplePie's default classes. 1211 * 1212 * @access public 1213 * @param string $class Name of custom class. 1214 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1215 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1216 */ 1217 function set_copyright_class($class = 'SimplePie_Copyright') 1218 { 1219 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Copyright')) 1220 { 1221 $this->copyright_class = $class; 1222 return true; 1223 } 1224 return false; 1225 } 1226 1227 /** 1228 * Allows you to change which class SimplePie uses for <media:credit> 1229 * Useful when you are overloading or extending SimplePie's default classes. 1230 * 1231 * @access public 1232 * @param string $class Name of custom class. 1233 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1234 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1235 */ 1236 function set_credit_class($class = 'SimplePie_Credit') 1237 { 1238 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Credit')) 1239 { 1240 $this->credit_class = $class; 1241 return true; 1242 } 1243 return false; 1244 } 1245 1246 /** 1247 * Allows you to change which class SimplePie uses for <media:rating> 1248 * Useful when you are overloading or extending SimplePie's default classes. 1249 * 1250 * @access public 1251 * @param string $class Name of custom class. 1252 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1253 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1254 */ 1255 function set_rating_class($class = 'SimplePie_Rating') 1256 { 1257 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Rating')) 1258 { 1259 $this->rating_class = $class; 1260 return true; 1261 } 1262 return false; 1263 } 1264 1265 /** 1266 * Allows you to change which class SimplePie uses for <media:restriction> 1267 * Useful when you are overloading or extending SimplePie's default classes. 1268 * 1269 * @access public 1270 * @param string $class Name of custom class. 1271 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1272 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1273 */ 1274 function set_restriction_class($class = 'SimplePie_Restriction') 1275 { 1276 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Restriction')) 1277 { 1278 $this->restriction_class = $class; 1279 return true; 1280 } 1281 return false; 1282 } 1283 1284 /** 1285 * Allows you to change which class SimplePie uses for content-type sniffing. 1286 * Useful when you are overloading or extending SimplePie's default classes. 1287 * 1288 * @access public 1289 * @param string $class Name of custom class. 1290 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1291 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1292 */ 1293 function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer') 1294 { 1295 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Content_Type_Sniffer')) 1296 { 1297 $this->content_type_sniffer_class = $class; 1298 return true; 1299 } 1300 return false; 1301 } 1302 1303 /** 1304 * Allows you to change which class SimplePie uses item sources. 1305 * Useful when you are overloading or extending SimplePie's default classes. 1306 * 1307 * @access public 1308 * @param string $class Name of custom class. 1309 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1310 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1311 */ 1312 function set_source_class($class = 'SimplePie_Source') 1313 { 1314 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Source')) 1315 { 1316 $this->source_class = $class; 1317 return true; 1318 } 1319 return false; 1320 } 1321 1322 /** 1323 * Allows you to override the default user agent string. 1324 * 1325 * @access public 1326 * @param string $ua New user agent string. 1327 */ 1328 function set_useragent($ua = SIMPLEPIE_USERAGENT) 1329 { 1330 $this->useragent = (string) $ua; 1331 } 1332 1333 /** 1334 * Set callback function to create cache filename with 1335 * 1336 * @access public 1337 * @param mixed $function Callback function 1338 */ 1339 function set_cache_name_function($function = 'md5') 1340 { 1341 if (is_callable($function)) 1342 { 1343 $this->cache_name_function = $function; 1344 } 1345 } 1346 1347 /** 1348 * Set javascript query string parameter 1349 * 1350 * @access public 1351 * @param mixed $get Javascript query string parameter 1352 */ 1353 function set_javascript($get = 'js') 1354 { 1355 if ($get) 1356 { 1357 $this->javascript = (string) $get; 1358 } 1359 else 1360 { 1361 $this->javascript = false; 1362 } 1363 } 1364 1365 /** 1366 * Set options to make SP as fast as possible. Forgoes a 1367 * substantial amount of data sanitization in favor of speed. 1368 * 1369 * @access public 1370 * @param bool $set Whether to set them or not 1371 */ 1372 function set_stupidly_fast($set = false) 1373 { 1374 if ($set) 1375 { 1376 $this->enable_order_by_date(false); 1377 $this->remove_div(false); 1378 $this->strip_comments(false); 1379 $this->strip_htmltags(false); 1380 $this->strip_attributes(false); 1381 $this->set_image_handler(false); 1382 } 1383 } 1384 1385 /** 1386 * Set maximum number of feeds to check with autodiscovery 1387 * 1388 * @access public 1389 * @param int $max Maximum number of feeds to check 1390 */ 1391 function set_max_checked_feeds($max = 10) 1392 { 1393 $this->max_checked_feeds = (int) $max; 1394 } 1395 1396 function remove_div($enable = true) 1397 { 1398 $this->sanitize->remove_div($enable); 1399 } 1400 1401 function strip_htmltags($tags = '', $encode = null) 1402 { 1403 if ($tags === '') 1404 { 1405 $tags = $this->strip_htmltags; 1406 } 1407 $this->sanitize->strip_htmltags($tags); 1408 if ($encode !== null) 1409 { 1410 $this->sanitize->encode_instead_of_strip($tags); 1411 } 1412 } 1413 1414 function encode_instead_of_strip($enable = true) 1415 { 1416 $this->sanitize->encode_instead_of_strip($enable); 1417 } 1418 1419 function strip_attributes($attribs = '') 1420 { 1421 if ($attribs === '') 1422 { 1423 $attribs = $this->strip_attributes; 1424 } 1425 $this->sanitize->strip_attributes($attribs); 1426 } 1427 1428 function set_output_encoding($encoding = 'UTF-8') 1429 { 1430 $this->sanitize->set_output_encoding($encoding); 1431 } 1432 1433 function strip_comments($strip = false) 1434 { 1435 $this->sanitize->strip_comments($strip); 1436 } 1437 1438 /** 1439 * Set element/attribute key/value pairs of HTML attributes 1440 * containing URLs that need to be resolved relative to the feed 1441 * 1442 * @access public 1443 * @since 1.0 1444 * @param array $element_attribute Element/attribute key/value pairs 1445 */ 1446 function set_url_replacements($element_attribute = array('a' => 'href', 'area' => 'href', 'blockquote' => 'cite', 'del' => 'cite', 'form' => 'action', 'img' => array('longdesc', 'src'), 'input' => 'src', 'ins' => 'cite', 'q' => 'cite')) 1447 { 1448 $this->sanitize->set_url_replacements($element_attribute); 1449 } 1450 1451 /** 1452 * Set the handler to enable the display of cached favicons. 1453 * 1454 * @access public 1455 * @param str $page Web-accessible path to the handler_favicon.php file. 1456 * @param str $qs The query string that the value should be passed to. 1457 */ 1458 function set_favicon_handler($page = false, $qs = 'i') 1459 { 1460 if ($page !== false) 1461 { 1462 $this->favicon_handler = $page . '?' . $qs . '='; 1463 } 1464 else 1465 { 1466 $this->favicon_handler = ''; 1467 } 1468 } 1469 1470 /** 1471 * Set the handler to enable the display of cached images. 1472 * 1473 * @access public 1474 * @param str $page Web-accessible path to the handler_image.php file. 1475 * @param str $qs The query string that the value should be passed to. 1476 */ 1477 function set_image_handler($page = false, $qs = 'i') 1478 { 1479 if ($page !== false) 1480 { 1481 $this->sanitize->set_image_handler($page . '?' . $qs . '='); 1482 } 1483 else 1484 { 1485 $this->image_handler = ''; 1486 } 1487 } 1488 1489 /** 1490 * Set the limit for items returned per-feed with multifeeds. 1491 * 1492 * @access public 1493 * @param integer $limit The maximum number of items to return. 1494 */ 1495 function set_item_limit($limit = 0) 1496 { 1497 $this->item_limit = (int) $limit; 1498 } 1499 1500 function init() 1501 { 1502 // Check absolute bare minimum requirements. 1503 if ((function_exists('version_compare') && version_compare(PHP_VERSION, '4.3.0', '<')) || !extension_loaded('xml') || !extension_loaded('pcre')) 1504 { 1505 return false; 1506 } 1507 // Then check the xml extension is sane (i.e., libxml 2.7.x issue on PHP < 5.2.9 and libxml 2.7.0 to 2.7.2 on any version) if we don't have xmlreader. 1508 elseif (!extension_loaded('xmlreader')) 1509 { 1510 static $xml_is_sane = null; 1511 if ($xml_is_sane === null) 1512 { 1513 $parser_check = xml_parser_create(); 1514 xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); 1515 xml_parser_free($parser_check); 1516 $xml_is_sane = isset($values[0]['value']); 1517 } 1518 if (!$xml_is_sane) 1519 { 1520 return false; 1521 } 1522 } 1523 1524 if (isset($_GET[$this->javascript])) 1525 { 1526 SimplePie_Misc::output_javascript(); 1527 exit; 1528 } 1529 1530 // Pass whatever was set with config options over to the sanitizer. 1531 $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->cache_class); 1532 $this->sanitize->pass_file_data($this->file_class, $this->timeout, $this->useragent, $this->force_fsockopen); 1533 1534 if ($this->feed_url !== null || $this->raw_data !== null) 1535 { 1536 $this->data = array(); 1537 $this->multifeed_objects = array(); 1538 $cache = false; 1539 1540 if ($this->feed_url !== null) 1541 { 1542 $parsed_feed_url = SimplePie_Misc::parse_url($this->feed_url); 1543 // Decide whether to enable caching 1544 if ($this->cache && $parsed_feed_url['scheme'] !== '') 1545 { 1546 $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'); 1547 } 1548 // If it's enabled and we don't want an XML dump, use the cache 1549 if ($cache && !$this->xml_dump) 1550 { 1551 // Load the Cache 1552 $this->data = $cache->load(); 1553 if (!empty($this->data)) 1554 { 1555 // If the cache is for an outdated build of SimplePie 1556 if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD) 1557 { 1558 $cache->unlink(); 1559 $this->data = array(); 1560 } 1561 // If we've hit a collision just rerun it with caching disabled 1562 elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url) 1563 { 1564 $cache = false; 1565 $this->data = array(); 1566 } 1567 // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL. 1568 elseif (isset($this->data['feed_url'])) 1569 { 1570 // If the autodiscovery cache is still valid use it. 1571 if ($cache->mtime() + $this->autodiscovery_cache_duration > time()) 1572 { 1573 // Do not need to do feed autodiscovery yet. 1574 if ($this->data['feed_url'] === $this->data['url']) 1575 { 1576 $cache->unlink(); 1577 $this->data = array(); 1578 } 1579 else 1580 { 1581 $this->set_feed_url($this->data['feed_url']); 1582 return $this->init(); 1583 } 1584 } 1585 } 1586 // Check if the cache has been updated 1587 elseif ($cache->mtime() + $this->cache_duration < time()) 1588 { 1589 // If we have last-modified and/or etag set 1590 if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag'])) 1591 { 1592 $headers = array(); 1593 if (isset($this->data['headers']['last-modified'])) 1594 { 1595 $headers['if-modified-since'] = $this->data['headers']['last-modified']; 1596 } 1597 if (isset($this->data['headers']['etag'])) 1598 { 1599 $headers['if-none-match'] = '"' . $this->data['headers']['etag'] . '"'; 1600 } 1601 $file = new $this->file_class($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen); 1602 if ($file->success) 1603 { 1604 if ($file->status_code === 304) 1605 { 1606 $cache->touch(); 1607 return true; 1608 } 1609 else 1610 { 1611 $headers = $file->headers; 1612 } 1613 } 1614 else 1615 { 1616 unset($file); 1617 } 1618 } 1619 } 1620 // If the cache is still valid, just return true 1621 else 1622 { 1623 return true; 1624 } 1625 } 1626 // If the cache is empty, delete it 1627 else 1628 { 1629 $cache->unlink(); 1630 $this->data = array(); 1631 } 1632 } 1633 // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it. 1634 if (!isset($file)) 1635 { 1636 if (is_a($this->file, 'SimplePie_File') && $this->file->url === $this->feed_url) 1637 { 1638 $file =& $this->file; 1639 } 1640 else 1641 { 1642 $file = new $this->file_class($this->feed_url, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen); 1643 } 1644 } 1645 // If the file connection has an error, set SimplePie::error to that and quit 1646 if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) 1647 { 1648 $this->error = $file->error; 1649 if (!empty($this->data)) 1650 { 1651 return true; 1652 } 1653 else 1654 { 1655 return false; 1656 } 1657 } 1658 1659 if (!$this->force_feed) 1660 { 1661 // Check if the supplied URL is a feed, if it isn't, look for it. 1662 $locate = new $this->locator_class($file, $this->timeout, $this->useragent, $this->file_class, $this->max_checked_feeds, $this->content_type_sniffer_class); 1663 if (!$locate->is_feed($file)) 1664 { 1665 // We need to unset this so that if SimplePie::set_file() has been called that object is untouched 1666 unset($file); 1667 if ($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds)) 1668 { 1669 if ($cache) 1670 { 1671 $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD); 1672 if (!$cache->save($this)) 1673 { 1674 trigger_error("$this->cache_location is not writeable", E_USER_WARNING); 1675 } 1676 $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'); 1677 } 1678 $this->feed_url = $file->url; 1679 } 1680 else 1681 { 1682 $this->error = "A feed could not be found at $this->feed_url"; 1683 SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); 1684 return false; 1685 } 1686 } 1687 $locate = null; 1688 } 1689 1690 $headers = $file->headers; 1691 $data = $file->body; 1692 $sniffer = new $this->content_type_sniffer_class($file); 1693 $sniffed = $sniffer->get_type(); 1694 } 1695 else 1696 { 1697 $data = $this->raw_data; 1698 } 1699 1700 // Set up array of possible encodings 1701 $encodings = array(); 1702 1703 // First check to see if input has been overridden. 1704 if ($this->input_encoding !== false) 1705 { 1706 $encodings[] = $this->input_encoding; 1707 } 1708 1709 $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity'); 1710 $text_types = array('text/xml', 'text/xml-external-parsed-entity'); 1711 1712 // RFC 3023 (only applies to sniffed content) 1713 if (isset($sniffed)) 1714 { 1715 if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml') 1716 { 1717 if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) 1718 { 1719 $encodings[] = strtoupper($charset[1]); 1720 } 1721 $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data)); 1722 $encodings[] = 'UTF-8'; 1723 } 1724 elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml') 1725 { 1726 if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) 1727 { 1728 $encodings[] = $charset[1]; 1729 } 1730 $encodings[] = 'US-ASCII'; 1731 } 1732 // Text MIME-type default 1733 elseif (substr($sniffed, 0, 5) === 'text/') 1734 { 1735 $encodings[] = 'US-ASCII'; 1736 } 1737 } 1738 1739 // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1 1740 $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data)); 1741 $encodings[] = 'UTF-8'; 1742 $encodings[] = 'ISO-8859-1'; 1743 1744 // There's no point in trying an encoding twice 1745 $encodings = array_unique($encodings); 1746 1747 // If we want the XML, just output that with the most likely encoding and quit 1748 if ($this->xml_dump) 1749 { 1750 header('Content-type: text/xml; charset=' . $encodings[0]); 1751 echo $data; 1752 exit; 1753 } 1754 1755 // Loop through each possible encoding, till we return something, or run out of possibilities 1756 foreach ($encodings as $encoding) 1757 { 1758 // Change the encoding to UTF-8 (as we always use UTF-8 internally) 1759 if ($utf8_data = SimplePie_Misc::change_encoding($data, $encoding, 'UTF-8')) 1760 { 1761 // Create new parser 1762 $parser = new $this->parser_class(); 1763 1764 // If it's parsed fine 1765 if ($parser->parse($utf8_data, 'UTF-8')) 1766 { 1767 $this->data = $parser->get_data(); 1768 if ($this->get_type() & ~SIMPLEPIE_TYPE_NONE) 1769 { 1770 if (isset($headers)) 1771 { 1772 $this->data['headers'] = $headers; 1773 } 1774 $this->data['build'] = SIMPLEPIE_BUILD; 1775 1776 // Cache the file if caching is enabled 1777 if ($cache && !$cache->save($this)) 1778 { 1779 trigger_error("$cache->name is not writeable", E_USER_WARNING); 1780 } 1781 return true; 1782 } 1783 else 1784 { 1785 $this->error = "A feed could not be found at $this->feed_url"; 1786 SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); 1787 return false; 1788 } 1789 } 1790 } 1791 } 1792 if(isset($parser)) 1793 { 1794 // We have an error, just set SimplePie_Misc::error to it and quit 1795 $this->error = sprintf('XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column()); 1796 } 1797 else 1798 { 1799 $this->error = 'The data could not be converted to UTF-8'; 1800 } 1801 SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); 1802 return false; 1803 } 1804 elseif (!empty($this->multifeed_url)) 1805 { 1806 $i = 0; 1807 $success = 0; 1808 $this->multifeed_objects = array(); 1809 foreach ($this->multifeed_url as $url) 1810 { 1811 if (SIMPLEPIE_PHP5) 1812 { 1813 // This keyword needs to defy coding standards for PHP4 compatibility 1814 $this->multifeed_objects[$i] = clone($this); 1815 } 1816 else 1817 { 1818 $this->multifeed_objects[$i] = $this; 1819 } 1820 $this->multifeed_objects[$i]->set_feed_url($url); 1821 $success |= $this->multifeed_objects[$i]->init(); 1822 $i++; 1823 } 1824 return (bool) $success; 1825 } 1826 else 1827 { 1828 return false; 1829 } 1830 } 1831 1832 /** 1833 * Return the error message for the occured error 1834 * 1835 * @access public 1836 * @return string Error message 1837 */ 1838 function error() 1839 { 1840 return $this->error; 1841 } 1842 1843 function get_encoding() 1844 { 1845 return $this->sanitize->output_encoding; 1846 } 1847 1848 function handle_content_type($mime = 'text/html') 1849 { 1850 if (!headers_sent()) 1851 { 1852 $header = "Content-type: $mime;"; 1853 if ($this->get_encoding()) 1854 { 1855 $header .= ' charset=' . $this->get_encoding(); 1856 } 1857 else 1858 { 1859 $header .= ' charset=UTF-8'; 1860 } 1861 header($header); 1862 } 1863 } 1864 1865 function get_type() 1866 { 1867 if (!isset($this->data['type'])) 1868 { 1869 $this->data['type'] = SIMPLEPIE_TYPE_ALL; 1870 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'])) 1871 { 1872 $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10; 1873 } 1874 elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'])) 1875 { 1876 $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03; 1877 } 1878 elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'])) 1879 { 1880 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel']) 1881 || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image']) 1882 || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']) 1883 || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput'])) 1884 { 1885 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_10; 1886 } 1887 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel']) 1888 || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image']) 1889 || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']) 1890 || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput'])) 1891 { 1892 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090; 1893 } 1894 } 1895 elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'])) 1896 { 1897 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL; 1898 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) 1899 { 1900 switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) 1901 { 1902 case '0.91': 1903 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091; 1904 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) 1905 { 1906 switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) 1907 { 1908 case '0': 1909 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE; 1910 break; 1911 1912 case '24': 1913 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND; 1914 break; 1915 } 1916 } 1917 break; 1918 1919 case '0.92': 1920 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_092; 1921 break; 1922 1923 case '0.93': 1924 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_093; 1925 break; 1926 1927 case '0.94': 1928 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_094; 1929 break; 1930 1931 case '2.0': 1932 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_20; 1933 break; 1934 } 1935 } 1936 } 1937 else 1938 { 1939 $this->data['type'] = SIMPLEPIE_TYPE_NONE; 1940 } 1941 } 1942 return $this->data['type']; 1943 } 1944 1945 /** 1946 * Returns the URL for the favicon of the feed's website. 1947 * 1948 * @todo Cache atom:icon 1949 * @access public 1950 * @since 1.0 1951 */ 1952 function get_favicon() 1953 { 1954 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) 1955 { 1956 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 1957 } 1958 elseif (($url = $this->get_link()) !== null && preg_match('/^http(s)?:\/\//i', $url)) 1959 { 1960 $favicon = SimplePie_Misc::absolutize_url('/favicon.ico', $url); 1961 1962 if ($this->cache && $this->favicon_handler) 1963 { 1964 $favicon_filename = call_user_func($this->cache_name_function, $favicon); 1965 $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $favicon_filename, 'spi'); 1966 1967 if ($cache->load()) 1968 { 1969 return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI); 1970 } 1971 else 1972 { 1973 $file = new $this->file_class($favicon, $this->timeout / 10, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen); 1974 1975 if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)) && strlen($file->body) > 0) 1976 { 1977 $sniffer = new $this->content_type_sniffer_class($file); 1978 if (substr($sniffer->get_type(), 0, 6) === 'image/') 1979 { 1980 if ($cache->save(array('headers' => $file->headers, 'body' => $file->body))) 1981 { 1982 return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI); 1983 } 1984 else 1985 { 1986 trigger_error("$cache->name is not writeable", E_USER_WARNING); 1987 return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI); 1988 } 1989 } 1990 // not an image 1991 else 1992 { 1993 return false; 1994 } 1995 } 1996 } 1997 } 1998 else 1999 { 2000 return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI); 2001 } 2002 } 2003 return false; 2004 } 2005 2006 /** 2007 * @todo If we have a perm redirect we should return the new URL 2008 * @todo When we make the above change, let's support <itunes:new-feed-url> as well 2009 * @todo Also, |atom:link|@rel=self 2010 */ 2011 function subscribe_url() 2012 { 2013 if ($this->feed_url !== null) 2014 { 2015 return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI); 2016 } 2017 else 2018 { 2019 return null; 2020 } 2021 } 2022 2023 function subscribe_feed() 2024 { 2025 if ($this->feed_url !== null) 2026 { 2027 return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI); 2028 } 2029 else 2030 { 2031 return null; 2032 } 2033 } 2034 2035 function subscribe_outlook() 2036 { 2037 if ($this->feed_url !== null) 2038 { 2039 return $this->sanitize('outlook' . SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI); 2040 } 2041 else 2042 { 2043 return null; 2044 } 2045 } 2046 2047 function subscribe_podcast() 2048 { 2049 if ($this->feed_url !== null) 2050 { 2051 return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 3), SIMPLEPIE_CONSTRUCT_IRI); 2052 } 2053 else 2054 { 2055 return null; 2056 } 2057 } 2058 2059 function subscribe_itunes() 2060 { 2061 if ($this->feed_url !== null) 2062 { 2063 return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 4), SIMPLEPIE_CONSTRUCT_IRI); 2064 } 2065 else 2066 { 2067 return null; 2068 } 2069 } 2070 2071 /** 2072 * Creates the subscribe_* methods' return data 2073 * 2074 * @access private 2075 * @param string $feed_url String to prefix to the feed URL 2076 * @param string $site_url String to prefix to the site URL (and 2077 * suffix to the feed URL) 2078 * @return mixed URL if feed exists, false otherwise 2079 */ 2080 function subscribe_service($feed_url, $site_url = null) 2081 { 2082 if ($this->subscribe_url()) 2083 { 2084 $return = $feed_url . rawurlencode($this->feed_url); 2085 if ($site_url !== null && $this->get_link() !== null) 2086 { 2087 $return .= $site_url . rawurlencode($this->get_link()); 2088 } 2089 return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI); 2090 } 2091 else 2092 { 2093 return null; 2094 } 2095 } 2096 2097 function subscribe_aol() 2098 { 2099 return $this->subscribe_service('http://feeds.my.aol.com/add.jsp?url='); 2100 } 2101 2102 function subscribe_bloglines() 2103 { 2104 return $this->subscribe_service('http://www.bloglines.com/sub/'); 2105 } 2106 2107 function subscribe_eskobo() 2108 { 2109 return $this->subscribe_service('http://www.eskobo.com/?AddToMyPage='); 2110 } 2111 2112 function subscribe_feedfeeds() 2113 { 2114 return $this->subscribe_service('http://www.feedfeeds.com/add?feed='); 2115 } 2116 2117 function subscribe_feedster() 2118 { 2119 return $this->subscribe_service('http://www.feedster.com/myfeedster.php?action=addrss&confirm=no&rssurl='); 2120 } 2121 2122 function subscribe_google() 2123 { 2124 return $this->subscribe_service('http://fusion.google.com/add?feedurl='); 2125 } 2126 2127 function subscribe_gritwire() 2128 { 2129 return $this->subscribe_service('http://my.gritwire.com/feeds/addExternalFeed.aspx?FeedUrl='); 2130 } 2131 2132 function subscribe_msn() 2133 { 2134 return $this->subscribe_service('http://my.msn.com/addtomymsn.armx?id=rss&ut=', '&ru='); 2135 } 2136 2137 function subscribe_netvibes() 2138 { 2139 return $this->subscribe_service('http://www.netvibes.com/subscribe.php?url='); 2140 } 2141 2142 function subscribe_newsburst() 2143 { 2144 return $this->subscribe_service('http://www.newsburst.com/Source/?add='); 2145 } 2146 2147 function subscribe_newsgator() 2148 { 2149 return $this->subscribe_service('http://www.newsgator.com/ngs/subscriber/subext.aspx?url='); 2150 } 2151 2152 function subscribe_odeo() 2153 { 2154 return $this->subscribe_service('http://www.odeo.com/listen/subscribe?feed='); 2155 } 2156 2157 function subscribe_podnova() 2158 { 2159 return $this->subscribe_service('http://www.podnova.com/index_your_podcasts.srf?action=add&url='); 2160 } 2161 2162 function subscribe_rojo() 2163 { 2164 return $this->subscribe_service('http://www.rojo.com/add-subscription?resource='); 2165 } 2166 2167 function subscribe_yahoo() 2168 { 2169 return $this->subscribe_service('http://add.my.yahoo.com/rss?url='); 2170 } 2171 2172 function get_feed_tags($namespace, $tag) 2173 { 2174 $type = $this->get_type(); 2175 if ($type & SIMPLEPIE_TYPE_ATOM_10) 2176 { 2177 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag])) 2178 { 2179 return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]; 2180 } 2181 } 2182 if ($type & SIMPLEPIE_TYPE_ATOM_03) 2183 { 2184 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag])) 2185 { 2186 return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]; 2187 } 2188 } 2189 if ($type & SIMPLEPIE_TYPE_RSS_RDF) 2190 { 2191 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag])) 2192 { 2193 return $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]; 2194 } 2195 } 2196 if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) 2197 { 2198 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag])) 2199 { 2200 return $this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]; 2201 } 2202 } 2203 return null; 2204 } 2205 2206 function get_channel_tags($namespace, $tag) 2207 { 2208 $type = $this->get_type(); 2209 if ($type & SIMPLEPIE_TYPE_ATOM_ALL) 2210 { 2211 if ($return = $this->get_feed_tags($namespace, $tag)) 2212 { 2213 return $return; 2214 } 2215 } 2216 if ($type & SIMPLEPIE_TYPE_RSS_10) 2217 { 2218 if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel')) 2219 { 2220 if (isset($channel[0]['child'][$namespace][$tag])) 2221 { 2222 return $channel[0]['child'][$namespace][$tag]; 2223 } 2224 } 2225 } 2226 if ($type & SIMPLEPIE_TYPE_RSS_090) 2227 { 2228 if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel')) 2229 { 2230 if (isset($channel[0]['child'][$namespace][$tag])) 2231 { 2232 return $channel[0]['child'][$namespace][$tag]; 2233 } 2234 } 2235 } 2236 if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) 2237 { 2238 if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel')) 2239 { 2240 if (isset($channel[0]['child'][$namespace][$tag])) 2241 { 2242 return $channel[0]['child'][$namespace][$tag]; 2243 } 2244 } 2245 } 2246 return null; 2247 } 2248 2249 function get_image_tags($namespace, $tag) 2250 { 2251 $type = $this->get_type(); 2252 if ($type & SIMPLEPIE_TYPE_RSS_10) 2253 { 2254 if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image')) 2255 { 2256 if (isset($image[0]['child'][$namespace][$tag])) 2257 { 2258 return $image[0]['child'][$namespace][$tag]; 2259 } 2260 } 2261 } 2262 if ($type & SIMPLEPIE_TYPE_RSS_090) 2263 { 2264 if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image')) 2265 { 2266 if (isset($image[0]['child'][$namespace][$tag])) 2267 { 2268 return $image[0]['child'][$namespace][$tag]; 2269 } 2270 } 2271 } 2272 if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) 2273 { 2274 if ($image = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'image')) 2275 { 2276 if (isset($image[0]['child'][$namespace][$tag])) 2277 { 2278 return $image[0]['child'][$namespace][$tag]; 2279 } 2280 } 2281 } 2282 return null; 2283 } 2284 2285 function get_base($element = array()) 2286 { 2287 if (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base'])) 2288 { 2289 return $element['xml_base']; 2290 } 2291 elseif ($this->get_link() !== null) 2292 { 2293 return $this->get_link(); 2294 } 2295 else 2296 { 2297 return $this->subscribe_url(); 2298 } 2299 } 2300 2301 function sanitize($data, $type, $base = '') 2302 { 2303 return $this->sanitize->sanitize($data, $type, $base); 2304 } 2305 2306 function get_title() 2307 { 2308 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) 2309 { 2310 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 2311 } 2312 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) 2313 { 2314 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 2315 } 2316 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) 2317 { 2318 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 2319 } 2320 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) 2321 { 2322 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 2323 } 2324 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) 2325 { 2326 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 2327 } 2328 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) 2329 { 2330 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2331 } 2332 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) 2333 { 2334 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2335 } 2336 else 2337 { 2338 return null; 2339 } 2340 } 2341 2342 function get_category($key = 0) 2343 { 2344 $categories = $this->get_categories(); 2345 if (isset($categories[$key])) 2346 { 2347 return $categories[$key]; 2348 } 2349 else 2350 { 2351 return null; 2352 } 2353 } 2354 2355 function get_categories() 2356 { 2357 $categories = array(); 2358 2359 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) 2360 { 2361 $term = null; 2362 $scheme = null; 2363 $label = null; 2364 if (isset($category['attribs']['']['term'])) 2365 { 2366 $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); 2367 } 2368 if (isset($category['attribs']['']['scheme'])) 2369 { 2370 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 2371 } 2372 if (isset($category['attribs']['']['label'])) 2373 { 2374 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 2375 } 2376 $categories[] = new $this->category_class($term, $scheme, $label); 2377 } 2378 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) 2379 { 2380 // This is really the label, but keep this as the term also for BC. 2381 // Label will also work on retrieving because that falls back to term. 2382 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2383 if (isset($category['attribs']['']['domain'])) 2384 { 2385 $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); 2386 } 2387 else 2388 { 2389 $scheme = null; 2390 } 2391 $categories[] = new $this->category_class($term, $scheme, null); 2392 } 2393 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) 2394 { 2395 $categories[] = new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 2396 } 2397 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) 2398 { 2399 $categories[] = new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 2400 } 2401 2402 if (!empty($categories)) 2403 { 2404 return SimplePie_Misc::array_unique($categories); 2405 } 2406 else 2407 { 2408 return null; 2409 } 2410 } 2411 2412 function get_author($key = 0) 2413 { 2414 $authors = $this->get_authors(); 2415 if (isset($authors[$key])) 2416 { 2417 return $authors[$key]; 2418 } 2419 else 2420 { 2421 return null; 2422 } 2423 } 2424 2425 function get_authors() 2426 { 2427 $authors = array(); 2428 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) 2429 { 2430 $name = null; 2431 $uri = null; 2432 $email = null; 2433 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) 2434 { 2435 $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2436 } 2437 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) 2438 { 2439 $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])); 2440 } 2441 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) 2442 { 2443 $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2444 } 2445 if ($name !== null || $email !== null || $uri !== null) 2446 { 2447 $authors[] = new $this->author_class($name, $uri, $email); 2448 } 2449 } 2450 if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) 2451 { 2452 $name = null; 2453 $url = null; 2454 $email = null; 2455 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) 2456 { 2457 $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2458 } 2459 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) 2460 { 2461 $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])); 2462 } 2463 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) 2464 { 2465 $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2466 } 2467 if ($name !== null || $email !== null || $url !== null) 2468 { 2469 $authors[] = new $this->author_class($name, $url, $email); 2470 } 2471 } 2472 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) 2473 { 2474 $authors[] = new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 2475 } 2476 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) 2477 { 2478 $authors[] = new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 2479 } 2480 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) 2481 { 2482 $authors[] = new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 2483 } 2484 2485 if (!empty($authors)) 2486 { 2487 return SimplePie_Misc::array_unique($authors); 2488 } 2489 else 2490 { 2491 return null; 2492 } 2493 } 2494 2495 function get_contributor($key = 0) 2496 { 2497 $contributors = $this->get_contributors(); 2498 if (isset($contributors[$key])) 2499 { 2500 return $contributors[$key]; 2501 } 2502 else 2503 { 2504 return null; 2505 } 2506 } 2507 2508 function get_contributors() 2509 { 2510 $contributors = array(); 2511 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) 2512 { 2513 $name = null; 2514 $uri = null; 2515 $email = null; 2516 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) 2517 { 2518 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2519 } 2520 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) 2521 { 2522 $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])); 2523 } 2524 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) 2525 { 2526 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2527 } 2528 if ($name !== null || $email !== null || $uri !== null) 2529 { 2530 $contributors[] = new $this->author_class($name, $uri, $email); 2531 } 2532 } 2533 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) 2534 { 2535 $name = null; 2536 $url = null; 2537 $email = null; 2538 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) 2539 { 2540 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2541 } 2542 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) 2543 { 2544 $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])); 2545 } 2546 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) 2547 { 2548 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2549 } 2550 if ($name !== null || $email !== null || $url !== null) 2551 { 2552 $contributors[] = new $this->author_class($name, $url, $email); 2553 } 2554 } 2555 2556 if (!empty($contributors)) 2557 { 2558 return SimplePie_Misc::array_unique($contributors); 2559 } 2560 else 2561 { 2562 return null; 2563 } 2564 } 2565 2566 function get_link($key = 0, $rel = 'alternate') 2567 { 2568 $links = $this->get_links($rel); 2569 if (isset($links[$key])) 2570 { 2571 return $links[$key]; 2572 } 2573 else 2574 { 2575 return null; 2576 } 2577 } 2578 2579 /** 2580 * Added for parity between the parent-level and the item/entry-level. 2581 */ 2582 function get_permalink() 2583 { 2584 return $this->get_link(0); 2585 } 2586 2587 function get_links($rel = 'alternate') 2588 { 2589 if (!isset($this->data['links'])) 2590 { 2591 $this->data['links'] = array(); 2592 if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link')) 2593 { 2594 foreach ($links as $link) 2595 { 2596 if (isset($link['attribs']['']['href'])) 2597 { 2598 $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; 2599 $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 2600 } 2601 } 2602 } 2603 if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link')) 2604 { 2605 foreach ($links as $link) 2606 { 2607 if (isset($link['attribs']['']['href'])) 2608 { 2609 $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; 2610 $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 2611 2612 } 2613 } 2614 } 2615 if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) 2616 { 2617 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 2618 } 2619 if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) 2620 { 2621 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 2622 } 2623 if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) 2624 { 2625 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 2626 } 2627 2628 $keys = array_keys($this->data['links']); 2629 foreach ($keys as $key) 2630 { 2631 if (SimplePie_Misc::is_isegment_nz_nc($key)) 2632 { 2633 if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) 2634 { 2635 $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); 2636 $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; 2637 } 2638 else 2639 { 2640 $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; 2641 } 2642 } 2643 elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) 2644 { 2645 $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; 2646 } 2647 $this->data['links'][$key] = array_unique($this->data['links'][$key]); 2648 } 2649 } 2650 2651 if (isset($this->data['links'][$rel])) 2652 { 2653 return $this->data['links'][$rel]; 2654 } 2655 else 2656 { 2657 return null; 2658 } 2659 } 2660 2661 function get_all_discovered_feeds() 2662 { 2663 return $this->all_discovered_feeds; 2664 } 2665 2666 function get_description() 2667 { 2668 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) 2669 { 2670 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 2671 } 2672 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline')) 2673 { 2674 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 2675 } 2676 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) 2677 { 2678 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 2679 } 2680 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) 2681 { 2682 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 2683 } 2684 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) 2685 { 2686 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 2687 } 2688 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) 2689 { 2690 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2691 } 2692 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) 2693 { 2694 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2695 } 2696 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) 2697 { 2698 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 2699 } 2700 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) 2701 { 2702 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 2703 } 2704 else 2705 { 2706 return null; 2707 } 2708 } 2709 2710 function get_copyright() 2711 { 2712 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) 2713 { 2714 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 2715 } 2716 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright')) 2717 { 2718 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 2719 } 2720 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright')) 2721 { 2722 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2723 } 2724 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) 2725 { 2726 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2727 } 2728 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) 2729 { 2730 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2731 } 2732 else 2733 { 2734 return null; 2735 } 2736 } 2737 2738 function get_language() 2739 { 2740 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language')) 2741 { 2742 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2743 } 2744 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language')) 2745 { 2746 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2747 } 2748 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language')) 2749 { 2750 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2751 } 2752 elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'])) 2753 { 2754 return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); 2755 } 2756 elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'])) 2757 { 2758 return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); 2759 } 2760 elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'])) 2761 { 2762 return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); 2763 } 2764 elseif (isset($this->data['headers']['content-language'])) 2765 { 2766 return $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT); 2767 } 2768 else 2769 { 2770 return null; 2771 } 2772 } 2773 2774 function get_latitude() 2775 { 2776 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) 2777 { 2778 return (float) $return[0]['data']; 2779 } 2780 elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) 2781 { 2782 return (float) $match[1]; 2783 } 2784 else 2785 { 2786 return null; 2787 } 2788 } 2789 2790 function get_longitude() 2791 { 2792 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) 2793 { 2794 return (float) $return[0]['data']; 2795 } 2796 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) 2797 { 2798 return (float) $return[0]['data']; 2799 } 2800 elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) 2801 { 2802 return (float) $match[2]; 2803 } 2804 else 2805 { 2806 return null; 2807 } 2808 } 2809 2810 function get_image_title() 2811 { 2812 if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) 2813 { 2814 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2815 } 2816 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) 2817 { 2818 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2819 } 2820 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) 2821 { 2822 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2823 } 2824 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) 2825 { 2826 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2827 } 2828 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) 2829 { 2830 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2831 } 2832 else 2833 { 2834 return null; 2835 } 2836 } 2837 2838 function get_image_url() 2839 { 2840 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image')) 2841 { 2842 return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI); 2843 } 2844 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo')) 2845 { 2846 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2847 } 2848 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) 2849 { 2850 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2851 } 2852 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'url')) 2853 { 2854 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2855 } 2856 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'url')) 2857 { 2858 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2859 } 2860 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) 2861 { 2862 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2863 } 2864 else 2865 { 2866 return null; 2867 } 2868 } 2869 2870 function get_image_link() 2871 { 2872 if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) 2873 { 2874 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2875 } 2876 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) 2877 { 2878 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2879 } 2880 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) 2881 { 2882 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2883 } 2884 else 2885 { 2886 return null; 2887 } 2888 } 2889 2890 function get_image_width() 2891 { 2892 if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'width')) 2893 { 2894 return round($return[0]['data']); 2895 } 2896 elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) 2897 { 2898 return 88.0; 2899 } 2900 else 2901 { 2902 return null; 2903 } 2904 } 2905 2906 function get_image_height() 2907 { 2908 if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'height')) 2909 { 2910 return round($return[0]['data']); 2911 } 2912 elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) 2913 { 2914 return 31.0; 2915 } 2916 else 2917 { 2918 return null; 2919 } 2920 } 2921 2922 function get_item_quantity($max = 0) 2923 { 2924 $max = (int) $max; 2925 $qty = count($this->get_items()); 2926 if ($max === 0) 2927 { 2928 return $qty; 2929 } 2930 else 2931 { 2932 return ($qty > $max) ? $max : $qty; 2933 } 2934 } 2935 2936 function get_item($key = 0) 2937 { 2938 $items = $this->get_items(); 2939 if (isset($items[$key])) 2940 { 2941 return $items[$key]; 2942 } 2943 else 2944 { 2945 return null; 2946 } 2947 } 2948 2949 function get_items($start = 0, $end = 0) 2950 { 2951 if (!isset($this->data['items'])) 2952 { 2953 if (!empty($this->multifeed_objects)) 2954 { 2955 $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit); 2956 } 2957 else 2958 { 2959 $this->data['items'] = array(); 2960 if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry')) 2961 { 2962 $keys = array_keys($items); 2963 foreach ($keys as $key) 2964 { 2965 $this->data['items'][] = new $this->item_class($this, $items[$key]); 2966 } 2967 } 2968 if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry')) 2969 { 2970 $keys = array_keys($items); 2971 foreach ($keys as $key) 2972 { 2973 $this->data['items'][] = new $this->item_class($this, $items[$key]); 2974 } 2975 } 2976 if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item')) 2977 { 2978 $keys = array_keys($items); 2979 foreach ($keys as $key) 2980 { 2981 $this->data['items'][] = new $this->item_class($this, $items[$key]); 2982 } 2983 } 2984 if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item')) 2985 { 2986 $keys = array_keys($items); 2987 foreach ($keys as $key) 2988 { 2989 $this->data['items'][] = new $this->item_class($this, $items[$key]); 2990 } 2991 } 2992 if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item')) 2993 { 2994 $keys = array_keys($items); 2995 foreach ($keys as $key) 2996 { 2997 $this->data['items'][] = new $this->item_class($this, $items[$key]); 2998 } 2999 } 3000 } 3001 } 3002 3003 if (!empty($this->data['items'])) 3004 { 3005 // If we want to order it by date, check if all items have a date, and then sort it 3006 if ($this->order_by_date && empty($this->multifeed_objects)) 3007 { 3008 if (!isset($this->data['ordered_items'])) 3009 { 3010 $do_sort = true; 3011 foreach ($this->data['items'] as $item) 3012 { 3013 if (!$item->get_date('U')) 3014 { 3015 $do_sort = false; 3016 break; 3017 } 3018 } 3019 $item = null; 3020 $this->data['ordered_items'] = $this->data['items']; 3021 if ($do_sort) 3022 { 3023 usort($this->data['ordered_items'], array(&$this, 'sort_items')); 3024 } 3025 } 3026 $items = $this->data['ordered_items']; 3027 } 3028 else 3029 { 3030 $items = $this->data['items']; 3031 } 3032 3033 // Slice the data as desired 3034 if ($end === 0) 3035 { 3036 return array_slice($items, $start); 3037 } 3038 else 3039 { 3040 return array_slice($items, $start, $end); 3041 } 3042 } 3043 else 3044 { 3045 return array(); 3046 } 3047 } 3048 3049 /** 3050 * @static 3051 */ 3052 function sort_items($a, $b) 3053 { 3054 return $a->get_date('U') <= $b->get_date('U'); 3055 } 3056 3057 /** 3058 * @static 3059 */ 3060 function merge_items($urls, $start = 0, $end = 0, $limit = 0) 3061 { 3062 if (is_array($urls) && sizeof($urls) > 0) 3063 { 3064 $items = array(); 3065 foreach ($urls as $arg) 3066 { 3067 if (is_a($arg, 'SimplePie')) 3068 { 3069 $items = array_merge($items, $arg->get_items(0, $limit)); 3070 } 3071 else 3072 { 3073 trigger_error('Arguments must be SimplePie objects', E_USER_WARNING); 3074 } 3075 } 3076 3077 $do_sort = true; 3078 foreach ($items as $item) 3079 { 3080 if (!$item->get_date('U')) 3081 { 3082 $do_sort = false; 3083 break; 3084 } 3085 } 3086 $item = null; 3087 if ($do_sort) 3088 { 3089 usort($items, array('SimplePie', 'sort_items')); 3090 } 3091 3092 if ($end === 0) 3093 { 3094 return array_slice($items, $start); 3095 } 3096 else 3097 { 3098 return array_slice($items, $start, $end); 3099 } 3100 } 3101 else 3102 { 3103 trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING); 3104 return array(); 3105 } 3106 } 3107 } 3108 3109 class SimplePie_Item 3110 { 3111 var $feed; 3112 var $data = array(); 3113 3114 function SimplePie_Item($feed, $data) 3115 { 3116 $this->feed = $feed; 3117 $this->data = $data; 3118 } 3119 3120 function __toString() 3121 { 3122 return md5(serialize($this->data)); 3123 } 3124 3125 /** 3126 * Remove items that link back to this before destroying this object 3127 */ 3128 function __destruct() 3129 { 3130 if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode')) 3131 { 3132 unset($this->feed); 3133 } 3134 } 3135 3136 function get_item_tags($namespace, $tag) 3137 { 3138 if (isset($this->data['child'][$namespace][$tag])) 3139 { 3140 return $this->data['child'][$namespace][$tag]; 3141 } 3142 else 3143 { 3144 return null; 3145 } 3146 } 3147 3148 function get_base($element = array()) 3149 { 3150 return $this->feed->get_base($element); 3151 } 3152 3153 function sanitize($data, $type, $base = '') 3154 { 3155 return $this->feed->sanitize($data, $type, $base); 3156 } 3157 3158 function get_feed() 3159 { 3160 return $this->feed; 3161 } 3162 3163 function get_id($hash = false) 3164 { 3165 if (!$hash) 3166 { 3167 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id')) 3168 { 3169 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3170 } 3171 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id')) 3172 { 3173 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3174 } 3175 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid')) 3176 { 3177 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3178 } 3179 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier')) 3180 { 3181 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3182 } 3183 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier')) 3184 { 3185 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3186 } 3187 elseif (($return = $this->get_permalink()) !== null) 3188 { 3189 return $return; 3190 } 3191 elseif (($return = $this->get_title()) !== null) 3192 { 3193 return $return; 3194 } 3195 } 3196 if ($this->get_permalink() !== null || $this->get_title() !== null) 3197 { 3198 return md5($this->get_permalink() . $this->get_title()); 3199 } 3200 else 3201 { 3202 return md5(serialize($this->data)); 3203 } 3204 } 3205 3206 function get_title() 3207 { 3208 if (!isset($this->data['title'])) 3209 { 3210 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) 3211 { 3212 $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3213 } 3214 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) 3215 { 3216 $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3217 } 3218 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) 3219 { 3220 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 3221 } 3222 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) 3223 { 3224 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 3225 } 3226 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) 3227 { 3228 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 3229 } 3230 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) 3231 { 3232 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3233 } 3234 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) 3235 { 3236 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3237 } 3238 else 3239 { 3240 $this->data['title'] = null; 3241 } 3242 } 3243 return $this->data['title']; 3244 } 3245 3246 function get_description($description_only = false) 3247 { 3248 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary')) 3249 { 3250 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3251 } 3252 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary')) 3253 { 3254 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3255 } 3256 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) 3257 { 3258 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 3259 } 3260 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) 3261 { 3262 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 3263 } 3264 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) 3265 { 3266 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3267 } 3268 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) 3269 { 3270 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3271 } 3272 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) 3273 { 3274 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 3275 } 3276 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) 3277 { 3278 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3279 } 3280 elseif (!$description_only) 3281 { 3282 return $this->get_content(true); 3283 } 3284 else 3285 { 3286 return null; 3287 } 3288 } 3289 3290 function get_content($content_only = false) 3291 { 3292 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content')) 3293 { 3294 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_content_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3295 } 3296 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content')) 3297 { 3298 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3299 } 3300 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded')) 3301 { 3302 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 3303 } 3304 elseif (!$content_only) 3305 { 3306 return $this->get_description(true); 3307 } 3308 else 3309 { 3310 return null; 3311 } 3312 } 3313 3314 function get_category($key = 0) 3315 { 3316 $categories = $this->get_categories(); 3317 if (isset($categories[$key])) 3318 { 3319 return $categories[$key]; 3320 } 3321 else 3322 { 3323 return null; 3324 } 3325 } 3326 3327 function get_categories() 3328 { 3329 $categories = array(); 3330 3331 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) 3332 { 3333 $term = null; 3334 $scheme = null; 3335 $label = null; 3336 if (isset($category['attribs']['']['term'])) 3337 { 3338 $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); 3339 } 3340 if (isset($category['attribs']['']['scheme'])) 3341 { 3342 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 3343 } 3344 if (isset($category['attribs']['']['label'])) 3345 { 3346 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 3347 } 3348 $categories[] = new $this->feed->category_class($term, $scheme, $label); 3349 } 3350 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) 3351 { 3352 // This is really the label, but keep this as the term also for BC. 3353 // Label will also work on retrieving because that falls back to term. 3354 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3355 if (isset($category['attribs']['']['domain'])) 3356 { 3357 $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); 3358 } 3359 else 3360 { 3361 $scheme = null; 3362 } 3363 $categories[] = new $this->feed->category_class($term, $scheme, null); 3364 } 3365 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) 3366 { 3367 $categories[] = new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 3368 } 3369 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) 3370 { 3371 $categories[] = new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 3372 } 3373 3374 if (!empty($categories)) 3375 { 3376 return SimplePie_Misc::array_unique($categories); 3377 } 3378 else 3379 { 3380 return null; 3381 } 3382 } 3383 3384 function get_author($key = 0) 3385 { 3386 $authors = $this->get_authors(); 3387 if (isset($authors[$key])) 3388 { 3389 return $authors[$key]; 3390 } 3391 else 3392 { 3393 return null; 3394 } 3395 } 3396 3397 function get_contributor($key = 0) 3398 { 3399 $contributors = $this->get_contributors(); 3400 if (isset($contributors[$key])) 3401 { 3402 return $contributors[$key]; 3403 } 3404 else 3405 { 3406 return null; 3407 } 3408 } 3409 3410 function get_contributors() 3411 { 3412 $contributors = array(); 3413 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) 3414 { 3415 $name = null; 3416 $uri = null; 3417 $email = null; 3418 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) 3419 { 3420 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3421 } 3422 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) 3423 { 3424 $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])); 3425 } 3426 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) 3427 { 3428 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3429 } 3430 if ($name !== null || $email !== null || $uri !== null) 3431 { 3432 $contributors[] = new $this->feed->author_class($name, $uri, $email); 3433 } 3434 } 3435 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) 3436 { 3437 $name = null; 3438 $url = null; 3439 $email = null; 3440 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) 3441 { 3442 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3443 } 3444 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) 3445 { 3446 $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])); 3447 } 3448 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) 3449 { 3450 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3451 } 3452 if ($name !== null || $email !== null || $url !== null) 3453 { 3454 $contributors[] = new $this->feed->author_class($name, $url, $email); 3455 } 3456 } 3457 3458 if (!empty($contributors)) 3459 { 3460 return SimplePie_Misc::array_unique($contributors); 3461 } 3462 else 3463 { 3464 return null; 3465 } 3466 } 3467 3468 function get_authors() 3469 { 3470 $authors = array(); 3471 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) 3472 { 3473 $name = null; 3474 $uri = null; 3475 $email = null; 3476 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) 3477 { 3478 $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3479 } 3480 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) 3481 { 3482 $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])); 3483 } 3484 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) 3485 { 3486 $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3487 } 3488 if ($name !== null || $email !== null || $uri !== null) 3489 { 3490 $authors[] = new $this->feed->author_class($name, $uri, $email); 3491 } 3492 } 3493 if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) 3494 { 3495 $name = null; 3496 $url = null; 3497 $email = null; 3498 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) 3499 { 3500 $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3501 } 3502 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) 3503 { 3504 $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])); 3505 } 3506 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) 3507 { 3508 $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3509 } 3510 if ($name !== null || $email !== null || $url !== null) 3511 { 3512 $authors[] = new $this->feed->author_class($name, $url, $email); 3513 } 3514 } 3515 if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author')) 3516 { 3517 $authors[] = new $this->feed->author_class(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 3518 } 3519 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) 3520 { 3521 $authors[] = new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 3522 } 3523 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) 3524 { 3525 $authors[] = new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 3526 } 3527 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) 3528 { 3529 $authors[] = new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 3530 } 3531 3532 if (!empty($authors)) 3533 { 3534 return SimplePie_Misc::array_unique($authors); 3535 } 3536 elseif (($source = $this->get_source()) && ($authors = $source->get_authors())) 3537 { 3538 return $authors; 3539 } 3540 elseif ($authors = $this->feed->get_authors()) 3541 { 3542 return $authors; 3543 } 3544 else 3545 { 3546 return null; 3547 } 3548 } 3549 3550 function get_copyright() 3551 { 3552 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) 3553 { 3554 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3555 } 3556 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) 3557 { 3558 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3559 } 3560 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) 3561 { 3562 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3563 } 3564 else 3565 { 3566 return null; 3567 } 3568 } 3569 3570 function get_date($date_format = 'j F Y, g:i a') 3571 { 3572 if (!isset($this->data['date'])) 3573 { 3574 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published')) 3575 { 3576 $this->data['date']['raw'] = $return[0]['data']; 3577 } 3578 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated')) 3579 { 3580 $this->data['date']['raw'] = $return[0]['data']; 3581 } 3582 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued')) 3583 { 3584 $this->data['date']['raw'] = $return[0]['data']; 3585 } 3586 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created')) 3587 { 3588 $this->data['date']['raw'] = $return[0]['data']; 3589 } 3590 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified')) 3591 { 3592 $this->data['date']['raw'] = $return[0]['data']; 3593 } 3594 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate')) 3595 { 3596 $this->data['date']['raw'] = $return[0]['data']; 3597 } 3598 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date')) 3599 { 3600 $this->data['date']['raw'] = $return[0]['data']; 3601 } 3602 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date')) 3603 { 3604 $this->data['date']['raw'] = $return[0]['data']; 3605 } 3606 3607 if (!empty($this->data['date']['raw'])) 3608 { 3609 $parser = SimplePie_Parse_Date::get(); 3610 $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']); 3611 } 3612 else 3613 { 3614 $this->data['date'] = null; 3615 } 3616 } 3617 if ($this->data['date']) 3618 { 3619 $date_format = (string) $date_format; 3620 switch ($date_format) 3621 { 3622 case '': 3623 return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT); 3624 3625 case 'U': 3626 return $this->data['date']['parsed']; 3627 3628 default: 3629 return date($date_format, $this->data['date']['parsed']); 3630 } 3631 } 3632 else 3633 { 3634 return null; 3635 } 3636 } 3637 3638 function get_local_date($date_format = '%c') 3639 { 3640 if (!$date_format) 3641 { 3642 return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT); 3643 } 3644 elseif (($date = $this->get_date('U')) !== null) 3645 { 3646 return strftime($date_format, $date); 3647 } 3648 else 3649 { 3650 return null; 3651 } 3652 } 3653 3654 function get_permalink() 3655 { 3656 $link = $this->get_link(); 3657 $enclosure = $this->get_enclosure(0); 3658 if ($link !== null) 3659 { 3660 return $link; 3661 } 3662 elseif ($enclosure !== null) 3663 { 3664 return $enclosure->get_link(); 3665 } 3666 else 3667 { 3668 return null; 3669 } 3670 } 3671 3672 function get_link($key = 0, $rel = 'alternate') 3673 { 3674 $links = $this->get_links($rel); 3675 if ($links[$key] !== null) 3676 { 3677 return $links[$key]; 3678 } 3679 else 3680 { 3681 return null; 3682 } 3683 } 3684 3685 function get_links($rel = 'alternate') 3686 { 3687 if (!isset($this->data['links'])) 3688 { 3689 $this->data['links'] = array(); 3690 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link) 3691 { 3692 if (isset($link['attribs']['']['href'])) 3693 { 3694 $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; 3695 $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 3696 3697 } 3698 } 3699 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link) 3700 { 3701 if (isset($link['attribs']['']['href'])) 3702 { 3703 $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; 3704 $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 3705 } 3706 } 3707 if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) 3708 { 3709 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 3710 } 3711 if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) 3712 { 3713 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 3714 } 3715 if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) 3716 { 3717 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 3718 } 3719 if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid')) 3720 { 3721 if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true') 3722 { 3723 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 3724 } 3725 } 3726 3727 $keys = array_keys($this->data['links']); 3728 foreach ($keys as $key) 3729 { 3730 if (SimplePie_Misc::is_isegment_nz_nc($key)) 3731 { 3732 if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) 3733 { 3734 $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); 3735 $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; 3736 } 3737 else 3738 { 3739 $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; 3740 } 3741 } 3742 elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) 3743 { 3744 $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; 3745 } 3746 $this->data['links'][$key] = array_unique($this->data['links'][$key]); 3747 } 3748 } 3749 if (isset($this->data['links'][$rel])) 3750 { 3751 return $this->data['links'][$rel]; 3752 } 3753 else 3754 { 3755 return null; 3756 } 3757 } 3758 3759 /** 3760 * @todo Add ability to prefer one type of content over another (in a media group). 3761 */ 3762 function get_enclosure($key = 0, $prefer = null) 3763 { 3764 $enclosures = $this->get_enclosures(); 3765 if (isset($enclosures[$key])) 3766 { 3767 return $enclosures[$key]; 3768 } 3769 else 3770 { 3771 return null; 3772 } 3773 } 3774 3775 /** 3776 * Grabs all available enclosures (podcasts, etc.) 3777 * 3778 * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS. 3779 * 3780 * At this point, we're pretty much assuming that all enclosures for an item are the same content. Anything else is too complicated to properly support. 3781 * 3782 * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4). 3783 * @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). 3784 */ 3785 function get_enclosures() 3786 { 3787 if (!isset($this->data['enclosures'])) 3788 { 3789 $this->data['enclosures'] = array(); 3790 3791 // Elements 3792 $captions_parent = null; 3793 $categories_parent = null; 3794 $copyrights_parent = null; 3795 $credits_parent = null; 3796 $description_parent = null; 3797 $duration_parent = null; 3798 $hashes_parent = null; 3799 $keywords_parent = null; 3800 $player_parent = null; 3801 $ratings_parent = null; 3802 $restrictions_parent = null; 3803 $thumbnails_parent = null; 3804 $title_parent = null; 3805 3806 // Let's do the channel and item-level ones first, and just re-use them if we need to. 3807 $parent = $this->get_feed(); 3808 3809 // CAPTIONS 3810 if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text')) 3811 { 3812 foreach ($captions as $caption) 3813 { 3814 $caption_type = null; 3815 $caption_lang = null; 3816 $caption_startTime = null; 3817 $caption_endTime = null; 3818 $caption_text = null; 3819 if (isset($caption['attribs']['']['type'])) 3820 { 3821 $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 3822 } 3823 if (isset($caption['attribs']['']['lang'])) 3824 { 3825 $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 3826 } 3827 if (isset($caption['attribs']['']['start'])) 3828 { 3829 $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); 3830 } 3831 if (isset($caption['attribs']['']['end'])) 3832 { 3833 $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); 3834 } 3835 if (isset($caption['data'])) 3836 { 3837 $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3838 } 3839 $captions_parent[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); 3840 } 3841 } 3842 elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text')) 3843 { 3844 foreach ($captions as $caption) 3845 { 3846 $caption_type = null; 3847 $caption_lang = null; 3848 $caption_startTime = null; 3849 $caption_endTime = null; 3850 $caption_text = null; 3851 if (isset($caption['attribs']['']['type'])) 3852 { 3853 $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 3854 } 3855 if (isset($caption['attribs']['']['lang'])) 3856 { 3857 $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 3858 } 3859 if (isset($caption['attribs']['']['start'])) 3860 { 3861 $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); 3862 } 3863 if (isset($caption['attribs']['']['end'])) 3864 { 3865 $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); 3866 } 3867 if (isset($caption['data'])) 3868 { 3869 $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3870 } 3871 $captions_parent[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); 3872 } 3873 } 3874 if (is_array($captions_parent)) 3875 { 3876 $captions_parent = array_values(SimplePie_Misc::array_unique($captions_parent)); 3877 } 3878 3879 // CATEGORIES 3880 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category) 3881 { 3882 $term = null; 3883 $scheme = null; 3884 $label = null; 3885 if (isset($category['data'])) 3886 { 3887 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3888 } 3889 if (isset($category['attribs']['']['scheme'])) 3890 { 3891 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 3892 } 3893 else 3894 { 3895 $scheme = 'http://search.yahoo.com/mrss/category_schema'; 3896 } 3897 if (isset($category['attribs']['']['label'])) 3898 { 3899 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 3900 } 3901 $categories_parent[] = new $this->feed->category_class($term, $scheme, $label); 3902 } 3903 foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category) 3904 { 3905 $term = null; 3906 $scheme = null; 3907 $label = null; 3908 if (isset($category['data'])) 3909 { 3910 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3911 } 3912 if (isset($category['attribs']['']['scheme'])) 3913 { 3914 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 3915 } 3916 else 3917 { 3918 $scheme = 'http://search.yahoo.com/mrss/category_schema'; 3919 } 3920 if (isset($category['attribs']['']['label'])) 3921 { 3922 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 3923 } 3924 $categories_parent[] = new $this->feed->category_class($term, $scheme, $label); 3925 } 3926 foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category) 3927 { 3928 $term = null; 3929 $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd'; 3930 $label = null; 3931 if (isset($category['attribs']['']['text'])) 3932 { 3933 $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT); 3934 } 3935 $categories_parent[] = new $this->feed->category_class($term, $scheme, $label); 3936 3937 if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'])) 3938 { 3939 foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory) 3940 { 3941 if (isset($subcategory['attribs']['']['text'])) 3942 { 3943 $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT); 3944 } 3945 $categories_parent[] = new $this->feed->category_class($term, $scheme, $label); 3946 } 3947 } 3948 } 3949 if (is_array($categories_parent)) 3950 { 3951 $categories_parent = array_values(SimplePie_Misc::array_unique($categories_parent)); 3952 } 3953 3954 // COPYRIGHT 3955 if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright')) 3956 { 3957 $copyright_url = null; 3958 $copyright_label = null; 3959 if (isset($copyright[0]['attribs']['']['url'])) 3960 { 3961 $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); 3962 } 3963 if (isset($copyright[0]['data'])) 3964 { 3965 $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3966 } 3967 $copyrights_parent = new $this->feed->copyright_class($copyright_url, $copyright_label); 3968 } 3969 elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright')) 3970 { 3971 $copyright_url = null; 3972 $copyright_label = null; 3973 if (isset($copyright[0]['attribs']['']['url'])) 3974 { 3975 $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); 3976 } 3977 if (isset($copyright[0]['data'])) 3978 { 3979 $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3980 } 3981 $copyrights_parent = new $this->feed->copyright_class($copyright_url, $copyright_label); 3982 } 3983 3984 // CREDITS 3985 if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit')) 3986 { 3987 foreach ($credits as $credit) 3988 { 3989 $credit_role = null; 3990 $credit_scheme = null; 3991 $credit_name = null; 3992 if (isset($credit['attribs']['']['role'])) 3993 { 3994 $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); 3995 } 3996 if (isset($credit['attribs']['']['scheme'])) 3997 { 3998 $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 3999 } 4000 else 4001 { 4002 $credit_scheme = 'urn:ebu'; 4003 } 4004 if (isset($credit['data'])) 4005 { 4006 $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4007 } 4008 $credits_parent[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); 4009 } 4010 } 4011 elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit')) 4012 { 4013 foreach ($credits as $credit) 4014 { 4015 $credit_role = null; 4016 $credit_scheme = null; 4017 $credit_name = null; 4018 if (isset($credit['attribs']['']['role'])) 4019 { 4020 $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); 4021 } 4022 if (isset($credit['attribs']['']['scheme'])) 4023 { 4024 $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4025 } 4026 else 4027 { 4028 $credit_scheme = 'urn:ebu'; 4029 } 4030 if (isset($credit['data'])) 4031 { 4032 $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4033 } 4034 $credits_parent[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); 4035 } 4036 } 4037 if (is_array($credits_parent)) 4038 { 4039 $credits_parent = array_values(SimplePie_Misc::array_unique($credits_parent)); 4040 } 4041 4042 // DESCRIPTION 4043 if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description')) 4044 { 4045 if (isset($description_parent[0]['data'])) 4046 { 4047 $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4048 } 4049 } 4050 elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description')) 4051 { 4052 if (isset($description_parent[0]['data'])) 4053 { 4054 $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4055 } 4056 } 4057 4058 // DURATION 4059 if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration')) 4060 { 4061 $seconds = null; 4062 $minutes = null; 4063 $hours = null; 4064 if (isset($duration_parent[0]['data'])) 4065 { 4066 $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4067 if (sizeof($temp) > 0) 4068 { 4069 (int) $seconds = array_pop($temp); 4070 } 4071 if (sizeof($temp) > 0) 4072 { 4073 (int) $minutes = array_pop($temp); 4074 $seconds += $minutes * 60; 4075 } 4076 if (sizeof($temp) > 0) 4077 { 4078 (int) $hours = array_pop($temp); 4079 $seconds += $hours * 3600; 4080 } 4081 unset($temp); 4082 $duration_parent = $seconds; 4083 } 4084 } 4085 4086 // HASHES 4087 if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash')) 4088 { 4089 foreach ($hashes_iterator as $hash) 4090 { 4091 $value = null; 4092 $algo = null; 4093 if (isset($hash['data'])) 4094 { 4095 $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4096 } 4097 if (isset($hash['attribs']['']['algo'])) 4098 { 4099 $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); 4100 } 4101 else 4102 { 4103 $algo = 'md5'; 4104 } 4105 $hashes_parent[] = $algo.':'.$value; 4106 } 4107 } 4108 elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash')) 4109 { 4110 foreach ($hashes_iterator as $hash) 4111 { 4112 $value = null; 4113 $algo = null; 4114 if (isset($hash['data'])) 4115 { 4116 $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4117 } 4118 if (isset($hash['attribs']['']['algo'])) 4119 { 4120 $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); 4121 } 4122 else 4123 { 4124 $algo = 'md5'; 4125 } 4126 $hashes_parent[] = $algo.':'.$value; 4127 } 4128 } 4129 if (is_array($hashes_parent)) 4130 { 4131 $hashes_parent = array_values(SimplePie_Misc::array_unique($hashes_parent)); 4132 } 4133 4134 // KEYWORDS 4135 if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords')) 4136 { 4137 if (isset($keywords[0]['data'])) 4138 { 4139 $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4140 foreach ($temp as $word) 4141 { 4142 $keywords_parent[] = trim($word); 4143 } 4144 } 4145 unset($temp); 4146 } 4147 elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords')) 4148 { 4149 if (isset($keywords[0]['data'])) 4150 { 4151 $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4152 foreach ($temp as $word) 4153 { 4154 $keywords_parent[] = trim($word); 4155 } 4156 } 4157 unset($temp); 4158 } 4159 elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords')) 4160 { 4161 if (isset($keywords[0]['data'])) 4162 { 4163 $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4164 foreach ($temp as $word) 4165 { 4166 $keywords_parent[] = trim($word); 4167 } 4168 } 4169 unset($temp); 4170 } 4171 elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords')) 4172 { 4173 if (isset($keywords[0]['data'])) 4174 { 4175 $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4176 foreach ($temp as $word) 4177 { 4178 $keywords_parent[] = trim($word); 4179 } 4180 } 4181 unset($temp); 4182 } 4183 if (is_array($keywords_parent)) 4184 { 4185 $keywords_parent = array_values(SimplePie_Misc::array_unique($keywords_parent)); 4186 } 4187 4188 // PLAYER 4189 if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player')) 4190 { 4191 if (isset($player_parent[0]['attribs']['']['url'])) 4192 { 4193 $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4194 } 4195 } 4196 elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player')) 4197 { 4198 if (isset($player_parent[0]['attribs']['']['url'])) 4199 { 4200 $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4201 } 4202 } 4203 4204 // RATINGS 4205 if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating')) 4206 { 4207 foreach ($ratings as $rating) 4208 { 4209 $rating_scheme = null; 4210 $rating_value = null; 4211 if (isset($rating['attribs']['']['scheme'])) 4212 { 4213 $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4214 } 4215 else 4216 { 4217 $rating_scheme = 'urn:simple'; 4218 } 4219 if (isset($rating['data'])) 4220 { 4221 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4222 } 4223 $ratings_parent[] = new $this->feed->rating_class($rating_scheme, $rating_value); 4224 } 4225 } 4226 elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit')) 4227 { 4228 foreach ($ratings as $rating) 4229 { 4230 $rating_scheme = 'urn:itunes'; 4231 $rating_value = null; 4232 if (isset($rating['data'])) 4233 { 4234 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4235 } 4236 $ratings_parent[] = new $this->feed->rating_class($rating_scheme, $rating_value); 4237 } 4238 } 4239 elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating')) 4240 { 4241 foreach ($ratings as $rating) 4242 { 4243 $rating_scheme = null; 4244 $rating_value = null; 4245 if (isset($rating['attribs']['']['scheme'])) 4246 { 4247 $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4248 } 4249 else 4250 { 4251 $rating_scheme = 'urn:simple'; 4252 } 4253 if (isset($rating['data'])) 4254 { 4255 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4256 } 4257 $ratings_parent[] = new $this->feed->rating_class($rating_scheme, $rating_value); 4258 } 4259 } 4260 elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit')) 4261 { 4262 foreach ($ratings as $rating) 4263 { 4264 $rating_scheme = 'urn:itunes'; 4265 $rating_value = null; 4266 if (isset($rating['data'])) 4267 { 4268 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4269 } 4270 $ratings_parent[] = new $this->feed->rating_class($rating_scheme, $rating_value); 4271 } 4272 } 4273 if (is_array($ratings_parent)) 4274 { 4275 $ratings_parent = array_values(SimplePie_Misc::array_unique($ratings_parent)); 4276 } 4277 4278 // RESTRICTIONS 4279 if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction')) 4280 { 4281 foreach ($restrictions as $restriction) 4282 { 4283 $restriction_relationship = null; 4284 $restriction_type = null; 4285 $restriction_value = null; 4286 if (isset($restriction['attribs']['']['relationship'])) 4287 { 4288 $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); 4289 } 4290 if (isset($restriction['attribs']['']['type'])) 4291 { 4292 $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4293 } 4294 if (isset($restriction['data'])) 4295 { 4296 $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4297 } 4298 $restrictions_parent[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 4299 } 4300 } 4301 elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block')) 4302 { 4303 foreach ($restrictions as $restriction) 4304 { 4305 $restriction_relationship = 'allow'; 4306 $restriction_type = null; 4307 $restriction_value = 'itunes'; 4308 if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') 4309 { 4310 $restriction_relationship = 'deny'; 4311 } 4312 $restrictions_parent[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 4313 } 4314 } 4315 elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction')) 4316 { 4317 foreach ($restrictions as $restriction) 4318 { 4319 $restriction_relationship = null; 4320 $restriction_type = null; 4321 $restriction_value = null; 4322 if (isset($restriction['attribs']['']['relationship'])) 4323 { 4324 $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); 4325 } 4326 if (isset($restriction['attribs']['']['type'])) 4327 { 4328 $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4329 } 4330 if (isset($restriction['data'])) 4331 { 4332 $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4333 } 4334 $restrictions_parent[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 4335 } 4336 } 4337 elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block')) 4338 { 4339 foreach ($restrictions as $restriction) 4340 { 4341 $restriction_relationship = 'allow'; 4342 $restriction_type = null; 4343 $restriction_value = 'itunes'; 4344 if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') 4345 { 4346 $restriction_relationship = 'deny'; 4347 } 4348 $restrictions_parent[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 4349 } 4350 } 4351 if (is_array($restrictions_parent)) 4352 { 4353 $restrictions_parent = array_values(SimplePie_Misc::array_unique($restrictions_parent)); 4354 } 4355 4356 // THUMBNAILS 4357 if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) 4358 { 4359 foreach ($thumbnails as $thumbnail) 4360 { 4361 if (isset($thumbnail['attribs']['']['url'])) 4362 { 4363 $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4364 } 4365 } 4366 } 4367 elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) 4368 { 4369 foreach ($thumbnails as $thumbnail) 4370 { 4371 if (isset($thumbnail['attribs']['']['url'])) 4372 { 4373 $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4374 } 4375 } 4376 } 4377 4378 // TITLES 4379 if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title')) 4380 { 4381 if (isset($title_parent[0]['data'])) 4382 { 4383 $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4384 } 4385 } 4386 elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title')) 4387 { 4388 if (isset($title_parent[0]['data'])) 4389 { 4390 $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4391 } 4392 } 4393 4394 // Clear the memory 4395 unset($parent); 4396 4397 // Attributes 4398 $bitrate = null; 4399 $channels = null; 4400 $duration = null; 4401 $expression = null; 4402 $framerate = null; 4403 $height = null; 4404 $javascript = null; 4405 $lang = null; 4406 $length = null; 4407 $medium = null; 4408 $samplingrate = null; 4409 $type = null; 4410 $url = null; 4411 $width = null; 4412 4413 // Elements 4414 $captions = null; 4415 $categories = null; 4416 $copyrights = null; 4417 $credits = null; 4418 $description = null; 4419 $hashes = null; 4420 $keywords = null; 4421 $player = null; 4422 $ratings = null; 4423 $restrictions = null; 4424 $thumbnails = null; 4425 $title = null; 4426 4427 // If we have media:group tags, loop through them. 4428 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group) 4429 { 4430 // If we have media:content tags, loop through them. 4431 foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) 4432 { 4433 if (isset($content['attribs']['']['url'])) 4434 { 4435 // Attributes 4436 $bitrate = null; 4437 $channels = null; 4438 $duration = null; 4439 $expression = null; 4440 $framerate = null; 4441 $height = null; 4442 $javascript = null; 4443 $lang = null; 4444 $length = null; 4445 $medium = null; 4446 $samplingrate = null; 4447 $type = null; 4448 $url = null; 4449 $width = null; 4450 4451 // Elements 4452 $captions = null; 4453 $categories = null; 4454 $copyrights = null; 4455 $credits = null; 4456 $description = null; 4457 $hashes = null; 4458 $keywords = null; 4459 $player = null; 4460 $ratings = null; 4461 $restrictions = null; 4462 $thumbnails = null; 4463 $title = null; 4464 4465 // Start checking the attributes of media:content 4466 if (isset($content['attribs']['']['bitrate'])) 4467 { 4468 $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT); 4469 } 4470 if (isset($content['attribs']['']['channels'])) 4471 { 4472 $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT); 4473 } 4474 if (isset($content['attribs']['']['duration'])) 4475 { 4476 $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT); 4477 } 4478 else 4479 { 4480 $duration = $duration_parent; 4481 } 4482 if (isset($content['attribs']['']['expression'])) 4483 { 4484 $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT); 4485 } 4486 if (isset($content['attribs']['']['framerate'])) 4487 { 4488 $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT); 4489 } 4490 if (isset($content['attribs']['']['height'])) 4491 { 4492 $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT); 4493 } 4494 if (isset($content['attribs']['']['lang'])) 4495 { 4496 $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 4497 } 4498 if (isset($content['attribs']['']['fileSize'])) 4499 { 4500 $length = ceil($content['attribs']['']['fileSize']); 4501 } 4502 if (isset($content['attribs']['']['medium'])) 4503 { 4504 $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT); 4505 } 4506 if (isset($content['attribs']['']['samplingrate'])) 4507 { 4508 $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT); 4509 } 4510 if (isset($content['attribs']['']['type'])) 4511 { 4512 $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4513 } 4514 if (isset($content['attribs']['']['width'])) 4515 { 4516 $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT); 4517 } 4518 $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4519 4520 // Checking the other optional media: elements. Priority: media:content, media:group, item, channel 4521 4522 // CAPTIONS 4523 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) 4524 { 4525 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) 4526 { 4527 $caption_type = null; 4528 $caption_lang = null; 4529 $caption_startTime = null; 4530 $caption_endTime = null; 4531 $caption_text = null; 4532 if (isset($caption['attribs']['']['type'])) 4533 { 4534 $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4535 } 4536 if (isset($caption['attribs']['']['lang'])) 4537 { 4538 $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 4539 } 4540 if (isset($caption['attribs']['']['start'])) 4541 { 4542 $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); 4543 } 4544 if (isset($caption['attribs']['']['end'])) 4545 { 4546 $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); 4547 } 4548 if (isset($caption['data'])) 4549 { 4550 $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4551 } 4552 $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); 4553 } 4554 if (is_array($captions)) 4555 { 4556 $captions = array_values(SimplePie_Misc::array_unique($captions)); 4557 } 4558 } 4559 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) 4560 { 4561 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) 4562 { 4563 $caption_type = null; 4564 $caption_lang = null; 4565 $caption_startTime = null; 4566 $caption_endTime = null; 4567 $caption_text = null; 4568 if (isset($caption['attribs']['']['type'])) 4569 { 4570 $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4571 } 4572 if (isset($caption['attribs']['']['lang'])) 4573 { 4574 $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 4575 } 4576 if (isset($caption['attribs']['']['start'])) 4577 { 4578 $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); 4579 } 4580 if (isset($caption['attribs']['']['end'])) 4581 { 4582 $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); 4583 } 4584 if (isset($caption['data'])) 4585 { 4586 $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4587 } 4588 $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); 4589 } 4590 if (is_array($captions)) 4591 { 4592 $captions = array_values(SimplePie_Misc::array_unique($captions)); 4593 } 4594 } 4595 else 4596 { 4597 $captions = $captions_parent; 4598 } 4599 4600 // CATEGORIES 4601 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) 4602 { 4603 foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) 4604 { 4605 $term = null; 4606 $scheme = null; 4607 $label = null; 4608 if (isset($category['data'])) 4609 { 4610 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4611 } 4612 if (isset($category['attribs']['']['scheme'])) 4613 { 4614 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4615 } 4616 else 4617 { 4618 $scheme = 'http://search.yahoo.com/mrss/category_schema'; 4619 } 4620 if (isset($category['attribs']['']['label'])) 4621 { 4622 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 4623 } 4624 $categories[] = new $this->feed->category_class($term, $scheme, $label); 4625 } 4626 } 4627 if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) 4628 { 4629 foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) 4630 { 4631 $term = null; 4632 $scheme = null; 4633 $label = null; 4634 if (isset($category['data'])) 4635 { 4636 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4637 } 4638 if (isset($category['attribs']['']['scheme'])) 4639 { 4640 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4641 } 4642 else 4643 { 4644 $scheme = 'http://search.yahoo.com/mrss/category_schema'; 4645 } 4646 if (isset($category['attribs']['']['label'])) 4647 { 4648 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 4649 } 4650 $categories[] = new $this->feed->category_class($term, $scheme, $label); 4651 } 4652 } 4653 if (is_array($categories) && is_array($categories_parent)) 4654 { 4655 $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent))); 4656 } 4657 elseif (is_array($categories)) 4658 { 4659 $categories = array_values(SimplePie_Misc::array_unique($categories)); 4660 } 4661 elseif (is_array($categories_parent)) 4662 { 4663 $categories = array_values(SimplePie_Misc::array_unique($categories_parent)); 4664 } 4665 4666 // COPYRIGHTS 4667 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) 4668 { 4669 $copyright_url = null; 4670 $copyright_label = null; 4671 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) 4672 { 4673 $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); 4674 } 4675 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) 4676 { 4677 $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4678 } 4679 $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label); 4680 } 4681 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) 4682 { 4683 $copyright_url = null; 4684 $copyright_label = null; 4685 if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) 4686 { 4687 $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); 4688 } 4689 if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) 4690 { 4691 $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4692 } 4693 $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label); 4694 } 4695 else 4696 { 4697 $copyrights = $copyrights_parent; 4698 } 4699 4700 // CREDITS 4701 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) 4702 { 4703 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) 4704 { 4705 $credit_role = null; 4706 $credit_scheme = null; 4707 $credit_name = null; 4708 if (isset($credit['attribs']['']['role'])) 4709 { 4710 $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); 4711 } 4712 if (isset($credit['attribs']['']['scheme'])) 4713 { 4714 $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4715 } 4716 else 4717 { 4718 $credit_scheme = 'urn:ebu'; 4719 } 4720 if (isset($credit['data'])) 4721 { 4722 $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4723 } 4724 $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); 4725 } 4726 if (is_array($credits)) 4727 { 4728 $credits = array_values(SimplePie_Misc::array_unique($credits)); 4729 } 4730 } 4731 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) 4732 { 4733 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) 4734 { 4735 $credit_role = null; 4736 $credit_scheme = null; 4737 $credit_name = null; 4738 if (isset($credit['attribs']['']['role'])) 4739 { 4740 $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); 4741 } 4742 if (isset($credit['attribs']['']['scheme'])) 4743 { 4744 $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4745 } 4746 else 4747 { 4748 $credit_scheme = 'urn:ebu'; 4749 } 4750 if (isset($credit['data'])) 4751 { 4752 $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4753 } 4754 $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); 4755 } 4756 if (is_array($credits)) 4757 { 4758 $credits = array_values(SimplePie_Misc::array_unique($credits)); 4759 } 4760 } 4761 else 4762 { 4763 $credits = $credits_parent; 4764 } 4765 4766 // DESCRIPTION 4767 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) 4768 { 4769 $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4770 } 4771 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) 4772 { 4773 $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4774 } 4775 else 4776 { 4777 $description = $description_parent; 4778 } 4779 4780 // HASHES 4781 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) 4782 { 4783 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) 4784 { 4785 $value = null; 4786 $algo = null; 4787 if (isset($hash['data'])) 4788 { 4789 $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4790 } 4791 if (isset($hash['attribs']['']['algo'])) 4792 { 4793 $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); 4794 } 4795 else 4796 { 4797 $algo = 'md5'; 4798 } 4799 $hashes[] = $algo.':'.$value; 4800 } 4801 if (is_array($hashes)) 4802 { 4803 $hashes = array_values(SimplePie_Misc::array_unique($hashes)); 4804 } 4805 } 4806 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) 4807 { 4808 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) 4809 { 4810 $value = null; 4811 $algo = null; 4812 if (isset($hash['data'])) 4813 { 4814 $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4815 } 4816 if (isset($hash['attribs']['']['algo'])) 4817 { 4818 $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); 4819 } 4820 else 4821 { 4822 $algo = 'md5'; 4823 } 4824 $hashes[] = $algo.':'.$value; 4825 } 4826 if (is_array($hashes)) 4827 { 4828 $hashes = array_values(SimplePie_Misc::array_unique($hashes)); 4829 } 4830 } 4831 else 4832 { 4833 $hashes = $hashes_parent; 4834 } 4835 4836 // KEYWORDS 4837 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) 4838 { 4839 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) 4840 { 4841 $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4842 foreach ($temp as $word) 4843 { 4844 $keywords[] = trim($word); 4845 } 4846 unset($temp); 4847 } 4848 if (is_array($keywords)) 4849 { 4850 $keywords = array_values(SimplePie_Misc::array_unique($keywords)); 4851 } 4852 } 4853 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) 4854 { 4855 if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) 4856 { 4857 $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4858 foreach ($temp as $word) 4859 { 4860 $keywords[] = trim($word); 4861 } 4862 unset($temp); 4863 } 4864 if (is_array($keywords)) 4865 { 4866 $keywords = array_values(SimplePie_Misc::array_unique($keywords)); 4867 } 4868 } 4869 else 4870 { 4871 $keywords = $keywords_parent; 4872 } 4873 4874 // PLAYER 4875 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) 4876 { 4877 $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4878 } 4879 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) 4880 { 4881 $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4882 } 4883 else 4884 { 4885 $player = $player_parent; 4886 } 4887 4888 // RATINGS 4889 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) 4890 { 4891 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) 4892 { 4893 $rating_scheme = null; 4894 $rating_value = null; 4895 if (isset($rating['attribs']['']['scheme'])) 4896 { 4897 $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4898 } 4899 else 4900 { 4901 $rating_scheme = 'urn:simple'; 4902 } 4903 if (isset($rating['data'])) 4904 { 4905 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4906 } 4907 $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value); 4908 } 4909 if (is_array($ratings)) 4910 { 4911 $ratings = array_values(SimplePie_Misc::array_unique($ratings)); 4912 } 4913 } 4914 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) 4915 { 4916 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) 4917 { 4918 $rating_scheme = null; 4919 $rating_value = null; 4920 if (isset($rating['attribs']['']['scheme'])) 4921 { 4922 $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4923 } 4924 else 4925 { 4926 $rating_scheme = 'urn:simple'; 4927 } 4928 if (isset($rating['data'])) 4929 { 4930 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4931 } 4932 $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value); 4933 } 4934 if (is_array($ratings)) 4935 { 4936 $ratings = array_values(SimplePie_Misc::array_unique($ratings)); 4937 } 4938 } 4939 else 4940 { 4941 $ratings = $ratings_parent; 4942 } 4943 4944 // RESTRICTIONS 4945 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) 4946 { 4947 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) 4948 { 4949 $restriction_relationship = null; 4950 $restriction_type = null; 4951 $restriction_value = null; 4952 if (isset($restriction['attribs']['']['relationship'])) 4953 { 4954 $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); 4955 } 4956 if (isset($restriction['attribs']['']['type'])) 4957 { 4958 $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4959 } 4960 if (isset($restriction['data'])) 4961 { 4962 $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4963 } 4964 $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 4965 } 4966 if (is_array($restrictions)) 4967 { 4968 $restrictions = array_values(SimplePie_Misc::array_unique($restrictions)); 4969 } 4970 } 4971 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) 4972 { 4973 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) 4974 { 4975 $restriction_relationship = null; 4976 $restriction_type = null; 4977 $restriction_value = null; 4978 if (isset($restriction['attribs']['']['relationship'])) 4979 { 4980 $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); 4981 } 4982 if (isset($restriction['attribs']['']['type'])) 4983 { 4984 $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4985 } 4986 if (isset($restriction['data'])) 4987 { 4988 $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4989 } 4990 $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 4991 } 4992 if (is_array($restrictions)) 4993 { 4994 $restrictions = array_values(SimplePie_Misc::array_unique($restrictions)); 4995 } 4996 } 4997 else 4998 { 4999 $restrictions = $restrictions_parent; 5000 } 5001 5002 // THUMBNAILS 5003 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) 5004 { 5005 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) 5006 { 5007 $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 5008 } 5009 if (is_array($thumbnails)) 5010 { 5011 $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails)); 5012 } 5013 } 5014 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) 5015 { 5016 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) 5017 { 5018 $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 5019 } 5020 if (is_array($thumbnails)) 5021 { 5022 $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails)); 5023 } 5024 } 5025 else 5026 { 5027 $thumbnails = $thumbnails_parent; 5028 } 5029 5030 // TITLES 5031 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) 5032 { 5033 $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5034 } 5035 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) 5036 { 5037 $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5038 } 5039 else 5040 { 5041 $title = $title_parent; 5042 } 5043 5044 $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width); 5045 } 5046 } 5047 } 5048 5049 // If we have standalone media:content tags, loop through them. 5050 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'])) 5051 { 5052 foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) 5053 { 5054 if (isset($content['attribs']['']['url'])) 5055 { 5056 // Attributes 5057 $bitrate = null; 5058 $channels = null; 5059 $duration = null; 5060 $expression = null; 5061 $framerate = null; 5062 $height = null; 5063 $javascript = null; 5064 $lang = null; 5065 $length = null; 5066 $medium = null; 5067 $samplingrate = null; 5068 $type = null; 5069 $url = null; 5070 $width = null; 5071 5072 // Elements 5073 $captions = null; 5074 $categories = null; 5075 $copyrights = null; 5076 $credits = null; 5077 $description = null; 5078 $hashes = null; 5079 $keywords = null; 5080 $player = null; 5081 $ratings = null; 5082 $restrictions = null; 5083 $thumbnails = null; 5084 $title = null; 5085 5086 // Start checking the attributes of media:content 5087 if (isset($content['attribs']['']['bitrate'])) 5088 { 5089 $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT); 5090 } 5091 if (isset($content['attribs']['']['channels'])) 5092 { 5093 $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT); 5094 } 5095 if (isset($content['attribs']['']['duration'])) 5096 { 5097 $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT); 5098 } 5099 else 5100 { 5101 $duration = $duration_parent; 5102 } 5103 if (isset($content['attribs']['']['expression'])) 5104 { 5105 $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT); 5106 } 5107 if (isset($content['attribs']['']['framerate'])) 5108 { 5109 $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT); 5110 } 5111 if (isset($content['attribs']['']['height'])) 5112 { 5113 $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT); 5114 } 5115 if (isset($content['attribs']['']['lang'])) 5116 { 5117 $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 5118 } 5119 if (isset($content['attribs']['']['fileSize'])) 5120 { 5121 $length = ceil($content['attribs']['']['fileSize']); 5122 } 5123 if (isset($content['attribs']['']['medium'])) 5124 { 5125 $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT); 5126 } 5127 if (isset($content['attribs']['']['samplingrate'])) 5128 { 5129 $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT); 5130 } 5131 if (isset($content['attribs']['']['type'])) 5132 { 5133 $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 5134 } 5135 if (isset($content['attribs']['']['width'])) 5136 { 5137 $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT); 5138 } 5139 $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 5140 5141 // Checking the other optional media: elements. Priority: media:content, media:group, item, channel 5142 5143 // CAPTIONS 5144 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) 5145 { 5146 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) 5147 { 5148 $caption_type = null; 5149 $caption_lang = null; 5150 $caption_startTime = null; 5151 $caption_endTime = null; 5152 $caption_text = null; 5153 if (isset($caption['attribs']['']['type'])) 5154 { 5155 $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 5156 } 5157 if (isset($caption['attribs']['']['lang'])) 5158 { 5159 $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 5160 } 5161 if (isset($caption['attribs']['']['start'])) 5162 { 5163 $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); 5164 } 5165 if (isset($caption['attribs']['']['end'])) 5166 { 5167 $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); 5168 } 5169 if (isset($caption['data'])) 5170 { 5171 $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5172 } 5173 $captions[] = new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); 5174 } 5175 if (is_array($captions)) 5176 { 5177 $captions = array_values(SimplePie_Misc::array_unique($captions)); 5178 } 5179 } 5180 else 5181 { 5182 $captions = $captions_parent; 5183 } 5184 5185 // CATEGORIES 5186 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) 5187 { 5188 foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) 5189 { 5190 $term = null; 5191 $scheme = null; 5192 $label = null; 5193 if (isset($category['data'])) 5194 { 5195 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5196 } 5197 if (isset($category['attribs']['']['scheme'])) 5198 { 5199 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 5200 } 5201 else 5202 { 5203 $scheme = 'http://search.yahoo.com/mrss/category_schema'; 5204 } 5205 if (isset($category['attribs']['']['label'])) 5206 { 5207 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 5208 } 5209 $categories[] = new $this->feed->category_class($term, $scheme, $label); 5210 } 5211 } 5212 if (is_array($categories) && is_array($categories_parent)) 5213 { 5214 $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent))); 5215 } 5216 elseif (is_array($categories)) 5217 { 5218 $categories = array_values(SimplePie_Misc::array_unique($categories)); 5219 } 5220 elseif (is_array($categories_parent)) 5221 { 5222 $categories = array_values(SimplePie_Misc::array_unique($categories_parent)); 5223 } 5224 else 5225 { 5226 $categories = null; 5227 } 5228 5229 // COPYRIGHTS 5230 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) 5231 { 5232 $copyright_url = null; 5233 $copyright_label = null; 5234 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) 5235 { 5236 $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); 5237 } 5238 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) 5239 { 5240 $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5241 } 5242 $copyrights = new $this->feed->copyright_class($copyright_url, $copyright_label); 5243 } 5244 else 5245 { 5246 $copyrights = $copyrights_parent; 5247 } 5248 5249 // CREDITS 5250 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) 5251 { 5252 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) 5253 { 5254 $credit_role = null; 5255 $credit_scheme = null; 5256 $credit_name = null; 5257 if (isset($credit['attribs']['']['role'])) 5258 { 5259 $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); 5260 } 5261 if (isset($credit['attribs']['']['scheme'])) 5262 { 5263 $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 5264 } 5265 else 5266 { 5267 $credit_scheme = 'urn:ebu'; 5268 } 5269 if (isset($credit['data'])) 5270 { 5271 $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5272 } 5273 $credits[] = new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); 5274 } 5275 if (is_array($credits)) 5276 { 5277 $credits = array_values(SimplePie_Misc::array_unique($credits)); 5278 } 5279 } 5280 else 5281 { 5282 $credits = $credits_parent; 5283 } 5284 5285 // DESCRIPTION 5286 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) 5287 { 5288 $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5289 } 5290 else 5291 { 5292 $description = $description_parent; 5293 } 5294 5295 // HASHES 5296 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) 5297 { 5298 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) 5299 { 5300 $value = null; 5301 $algo = null; 5302 if (isset($hash['data'])) 5303 { 5304 $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5305 } 5306 if (isset($hash['attribs']['']['algo'])) 5307 { 5308 $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); 5309 } 5310 else 5311 { 5312 $algo = 'md5'; 5313 } 5314 $hashes[] = $algo.':'.$value; 5315 } 5316 if (is_array($hashes)) 5317 { 5318 $hashes = array_values(SimplePie_Misc::array_unique($hashes)); 5319 } 5320 } 5321 else 5322 { 5323 $hashes = $hashes_parent; 5324 } 5325 5326 // KEYWORDS 5327 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) 5328 { 5329 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) 5330 { 5331 $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 5332 foreach ($temp as $word) 5333 { 5334 $keywords[] = trim($word); 5335 } 5336 unset($temp); 5337 } 5338 if (is_array($keywords)) 5339 { 5340 $keywords = array_values(SimplePie_Misc::array_unique($keywords)); 5341 } 5342 } 5343 else 5344 { 5345 $keywords = $keywords_parent; 5346 } 5347 5348 // PLAYER 5349 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) 5350 { 5351 $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 5352 } 5353 else 5354 { 5355 $player = $player_parent; 5356 } 5357 5358 // RATINGS 5359 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) 5360 { 5361 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) 5362 { 5363 $rating_scheme = null; 5364 $rating_value = null; 5365 if (isset($rating['attribs']['']['scheme'])) 5366 { 5367 $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 5368 } 5369 else 5370 { 5371 $rating_scheme = 'urn:simple'; 5372 } 5373 if (isset($rating['data'])) 5374 { 5375 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5376 } 5377 $ratings[] = new $this->feed->rating_class($rating_scheme, $rating_value); 5378 } 5379 if (is_array($ratings)) 5380 { 5381 $ratings = array_values(SimplePie_Misc::array_unique($ratings)); 5382 } 5383 } 5384 else 5385 { 5386 $ratings = $ratings_parent; 5387 } 5388 5389 // RESTRICTIONS 5390 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) 5391 { 5392 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) 5393 { 5394 $restriction_relationship = null; 5395 $restriction_type = null; 5396 $restriction_value = null; 5397 if (isset($restriction['attribs']['']['relationship'])) 5398 { 5399 $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); 5400 } 5401 if (isset($restriction['attribs']['']['type'])) 5402 { 5403 $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 5404 } 5405 if (isset($restriction['data'])) 5406 { 5407 $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5408 } 5409 $restrictions[] = new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 5410 } 5411 if (is_array($restrictions)) 5412 { 5413 $restrictions = array_values(SimplePie_Misc::array_unique($restrictions)); 5414 } 5415 } 5416 else 5417 { 5418 $restrictions = $restrictions_parent; 5419 } 5420 5421 // THUMBNAILS 5422 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) 5423 { 5424 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) 5425 { 5426 $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 5427 } 5428 if (is_array($thumbnails)) 5429 { 5430 $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails)); 5431 } 5432 } 5433 else 5434 { 5435 $thumbnails = $thumbnails_parent; 5436 } 5437 5438 // TITLES 5439 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) 5440 { 5441 $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5442 } 5443 else 5444 { 5445 $title = $title_parent; 5446 } 5447 5448 $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width); 5449 } 5450 } 5451 } 5452 5453 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link) 5454 { 5455 if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') 5456 { 5457 // Attributes 5458 $bitrate = null; 5459 $channels = null; 5460 $duration = null; 5461 $expression = null; 5462 $framerate = null; 5463 $height = null; 5464 $javascript = null; 5465 $lang = null; 5466 $length = null; 5467 $medium = null; 5468 $samplingrate = null; 5469 $type = null; 5470 $url = null; 5471 $width = null; 5472 5473 $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 5474 if (isset($link['attribs']['']['type'])) 5475 { 5476 $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 5477 } 5478 if (isset($link['attribs']['']['length'])) 5479 { 5480 $length = ceil($link['attribs']['']['length']); 5481 } 5482 5483 // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor 5484 $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $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); 5485 } 5486 } 5487 5488 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link) 5489 { 5490 if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') 5491 { 5492 // Attributes 5493 $bitrate = null; 5494 $channels = null; 5495 $duration = null; 5496 $expression = null; 5497 $framerate = null; 5498 $height = null; 5499 $javascript = null; 5500 $lang = null; 5501 $length = null; 5502 $medium = null; 5503 $samplingrate = null; 5504 $type = null; 5505 $url = null; 5506 $width = null; 5507 5508 $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 5509 if (isset($link['attribs']['']['type'])) 5510 { 5511 $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 5512 } 5513 if (isset($link['attribs']['']['length'])) 5514 { 5515 $length = ceil($link['attribs']['']['length']); 5516 } 5517 5518 // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor 5519 $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $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); 5520 } 5521 } 5522 5523 if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure')) 5524 { 5525 if (isset($enclosure[0]['attribs']['']['url'])) 5526 { 5527 // Attributes 5528 $bitrate = null; 5529 $channels = null; 5530 $duration = null; 5531 $expression = null; 5532 $framerate = null; 5533 $height = null; 5534 $javascript = null; 5535 $lang = null; 5536 $length = null; 5537 $medium = null; 5538 $samplingrate = null; 5539 $type = null; 5540 $url = null; 5541 $width = null; 5542 5543 $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0])); 5544 if (isset($enclosure[0]['attribs']['']['type'])) 5545 { 5546 $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 5547 } 5548 if (isset($enclosure[0]['attribs']['']['length'])) 5549 { 5550 $length = ceil($enclosure[0]['attribs']['']['length']); 5551 } 5552 5553 // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor 5554 $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $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); 5555 } 5556 } 5557 5558 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)) 5559 { 5560 // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor 5561 $this->data['enclosures'][] = new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $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); 5562 } 5563 5564 $this->data['enclosures'] = array_values(SimplePie_Misc::array_unique($this->data['enclosures'])); 5565 } 5566 if (!empty($this->data['enclosures'])) 5567 { 5568 return $this->data['enclosures']; 5569 } 5570 else 5571 { 5572 return null; 5573 } 5574 } 5575 5576 function get_latitude() 5577 { 5578 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) 5579 { 5580 return (float) $return[0]['data']; 5581 } 5582 elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) 5583 { 5584 return (float) $match[1]; 5585 } 5586 else 5587 { 5588 return null; 5589 } 5590 } 5591 5592 function get_longitude() 5593 { 5594 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) 5595 { 5596 return (float) $return[0]['data']; 5597 } 5598 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) 5599 { 5600 return (float) $return[0]['data']; 5601 } 5602 elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) 5603 { 5604 return (float) $match[2]; 5605 } 5606 else 5607 { 5608 return null; 5609 } 5610 } 5611 5612 function get_source() 5613 { 5614 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source')) 5615 { 5616 return new $this->feed->source_class($this, $return[0]); 5617 } 5618 else 5619 { 5620 return null; 5621 } 5622 } 5623 5624 /** 5625 * Creates the add_to_* methods' return data 5626 * 5627 * @access private 5628 * @param string $item_url String to prefix to the item permalink 5629 * @param string $title_url String to prefix to the item title 5630 * (and suffix to the item permalink) 5631 * @return mixed URL if feed exists, false otherwise 5632 */ 5633 function add_to_service($item_url, $title_url = null, $summary_url = null) 5634 { 5635 if ($this->get_permalink() !== null) 5636 { 5637 $return = $item_url . rawurlencode($this->get_permalink()); 5638 if ($title_url !== null && $this->get_title() !== null) 5639 { 5640 $return .= $title_url . rawurlencode($this->get_title()); 5641 } 5642 if ($summary_url !== null && $this->get_description() !== null) 5643 { 5644 $return .= $summary_url . rawurlencode($this->get_description()); 5645 } 5646 return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI); 5647 } 5648 else 5649 { 5650 return null; 5651 } 5652 } 5653 5654 function add_to_blinklist() 5655 { 5656 return $this->add_to_service('http://www.blinklist.com/index.php?Action=Blink/addblink.php&Description=&Url=', '&Title='); 5657 } 5658 5659 function add_to_blogmarks() 5660 { 5661 return $this->add_to_service('http://blogmarks.net/my/new.php?mini=1&simple=1&url=', '&title='); 5662 } 5663 5664 function add_to_delicious() 5665 { 5666 return $this->add_to_service('http://del.icio.us/post/?v=4&url=', '&title='); 5667 } 5668 5669 function add_to_digg() 5670 { 5671 return $this->add_to_service('http://digg.com/submit?url=', '&title=', '&bodytext='); 5672 } 5673 5674 function add_to_furl() 5675 { 5676 return $this->add_to_service('http://www.furl.net/storeIt.jsp?u=', '&t='); 5677 } 5678 5679 function add_to_magnolia() 5680 { 5681 return $this->add_to_service('http://ma.gnolia.com/bookmarklet/add?url=', '&title='); 5682 } 5683 5684 function add_to_myweb20() 5685 { 5686 return $this->add_to_service('http://myweb2.search.yahoo.com/myresults/bookmarklet?u=', '&t='); 5687 } 5688 5689 function add_to_newsvine() 5690 { 5691 return $this->add_to_service('http://www.newsvine.com/_wine/save?u=', '&h='); 5692 } 5693 5694 function add_to_reddit() 5695 { 5696 return $this->add_to_service('http://reddit.com/submit?url=', '&title='); 5697 } 5698 5699 function add_to_segnalo() 5700 { 5701 return $this->add_to_service('http://segnalo.com/post.html.php?url=', '&title='); 5702 } 5703 5704 function add_to_simpy() 5705 { 5706 return $this->add_to_service('http://www.simpy.com/simpy/LinkAdd.do?href=', '&title='); 5707 } 5708 5709 function add_to_spurl() 5710 { 5711 return $this->add_to_service('http://www.spurl.net/spurl.php?v=3&url=', '&title='); 5712 } 5713 5714 function add_to_wists() 5715 { 5716 return $this->add_to_service('http://wists.com/r.php?c=&r=', '&title='); 5717 } 5718 5719 function search_technorati() 5720 { 5721 return $this->add_to_service('http://www.technorati.com/search/'); 5722 } 5723 } 5724 5725 class SimplePie_Source 5726 { 5727 var $item; 5728 var $data = array(); 5729 5730 function SimplePie_Source($item, $data) 5731 { 5732 $this->item = $item; 5733 $this->data = $data; 5734 } 5735 5736 function __toString() 5737 { 5738 return md5(serialize($this->data)); 5739 } 5740 5741 function get_source_tags($namespace, $tag) 5742 { 5743 if (isset($this->data['child'][$namespace][$tag])) 5744 { 5745 return $this->data['child'][$namespace][$tag]; 5746 } 5747 else 5748 { 5749 return null; 5750 } 5751 } 5752 5753 function get_base($element = array()) 5754 { 5755 return $this->item->get_base($element); 5756 } 5757 5758 function sanitize($data, $type, $base = '') 5759 { 5760 return $this->item->sanitize($data, $type, $base); 5761 } 5762 5763 function get_item() 5764 { 5765 return $this->item; 5766 } 5767 5768 function get_title() 5769 { 5770 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) 5771 { 5772 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 5773 } 5774 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) 5775 { 5776 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 5777 } 5778 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) 5779 { 5780 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 5781 } 5782 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) 5783 { 5784 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 5785 } 5786 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) 5787 { 5788 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 5789 } 5790 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) 5791 { 5792 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5793 } 5794 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) 5795 { 5796 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5797 } 5798 else 5799 { 5800 return null; 5801 } 5802 } 5803 5804 function get_category($key = 0) 5805 { 5806 $categories = $this->get_categories(); 5807 if (isset($categories[$key])) 5808 { 5809 return $categories[$key]; 5810 } 5811 else 5812 { 5813 return null; 5814 } 5815 } 5816 5817 function get_categories() 5818 { 5819 $categories = array(); 5820 5821 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) 5822 { 5823 $term = null; 5824 $scheme = null; 5825 $label = null; 5826 if (isset($category['attribs']['']['term'])) 5827 { 5828 $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); 5829 } 5830 if (isset($category['attribs']['']['scheme'])) 5831 { 5832 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 5833 } 5834 if (isset($category['attribs']['']['label'])) 5835 { 5836 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 5837 } 5838 $categories[] = new $this->item->feed->category_class($term, $scheme, $label); 5839 } 5840 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) 5841 { 5842 // This is really the label, but keep this as the term also for BC. 5843 // Label will also work on retrieving because that falls back to term. 5844 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5845 if (isset($category['attribs']['']['domain'])) 5846 { 5847 $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); 5848 } 5849 else 5850 { 5851 $scheme = null; 5852 } 5853 $categories[] = new $this->item->feed->category_class($term, $scheme, null); 5854 } 5855 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) 5856 { 5857 $categories[] = new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 5858 } 5859 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) 5860 { 5861 $categories[] = new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 5862 } 5863 5864 if (!empty($categories)) 5865 { 5866 return SimplePie_Misc::array_unique($categories); 5867 } 5868 else 5869 { 5870 return null; 5871 } 5872 } 5873 5874 function get_author($key = 0) 5875 { 5876 $authors = $this->get_authors(); 5877 if (isset($authors[$key])) 5878 { 5879 return $authors[$key]; 5880 } 5881 else 5882 { 5883 return null; 5884 } 5885 } 5886 5887 function get_authors() 5888 { 5889 $authors = array(); 5890 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) 5891 { 5892 $name = null; 5893 $uri = null; 5894 $email = null; 5895 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) 5896 { 5897 $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5898 } 5899 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) 5900 { 5901 $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])); 5902 } 5903 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) 5904 { 5905 $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5906 } 5907 if ($name !== null || $email !== null || $uri !== null) 5908 { 5909 $authors[] = new $this->item->feed->author_class($name, $uri, $email); 5910 } 5911 } 5912 if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) 5913 { 5914 $name = null; 5915 $url = null; 5916 $email = null; 5917 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) 5918 { 5919 $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5920 } 5921 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) 5922 { 5923 $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])); 5924 } 5925 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) 5926 { 5927 $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5928 } 5929 if ($name !== null || $email !== null || $url !== null) 5930 { 5931 $authors[] = new $this->item->feed->author_class($name, $url, $email); 5932 } 5933 } 5934 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) 5935 { 5936 $authors[] = new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 5937 } 5938 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) 5939 { 5940 $authors[] = new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 5941 } 5942 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) 5943 { 5944 $authors[] = new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 5945 } 5946 5947 if (!empty($authors)) 5948 { 5949 return SimplePie_Misc::array_unique($authors); 5950 } 5951 else 5952 { 5953 return null; 5954 } 5955 } 5956 5957 function get_contributor($key = 0) 5958 { 5959 $contributors = $this->get_contributors(); 5960 if (isset($contributors[$key])) 5961 { 5962 return $contributors[$key]; 5963 } 5964 else 5965 { 5966 return null; 5967 } 5968 } 5969 5970 function get_contributors() 5971 { 5972 $contributors = array(); 5973 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) 5974 { 5975 $name = null; 5976 $uri = null; 5977 $email = null; 5978 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) 5979 { 5980 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5981 } 5982 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) 5983 { 5984 $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])); 5985 } 5986 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) 5987 { 5988 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5989 } 5990 if ($name !== null || $email !== null || $uri !== null) 5991 { 5992 $contributors[] = new $this->item->feed->author_class($name, $uri, $email); 5993 } 5994 } 5995 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) 5996 { 5997 $name = null; 5998 $url = null; 5999 $email = null; 6000 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) 6001 { 6002 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6003 } 6004 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) 6005 { 6006 $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])); 6007 } 6008 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) 6009 { 6010 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6011 } 6012 if ($name !== null || $email !== null || $url !== null) 6013 { 6014 $contributors[] = new $this->item->feed->author_class($name, $url, $email); 6015 } 6016 } 6017 6018 if (!empty($contributors)) 6019 { 6020 return SimplePie_Misc::array_unique($contributors); 6021 } 6022 else 6023 { 6024 return null; 6025 } 6026 } 6027 6028 function get_link($key = 0, $rel = 'alternate') 6029 { 6030 $links = $this->get_links($rel); 6031 if (isset($links[$key])) 6032 { 6033 return $links[$key]; 6034 } 6035 else 6036 { 6037 return null; 6038 } 6039 } 6040 6041 /** 6042 * Added for parity between the parent-level and the item/entry-level. 6043 */ 6044 function get_permalink() 6045 { 6046 return $this->get_link(0); 6047 } 6048 6049 function get_links($rel = 'alternate') 6050 { 6051 if (!isset($this->data['links'])) 6052 { 6053 $this->data['links'] = array(); 6054 if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link')) 6055 { 6056 foreach ($links as $link) 6057 { 6058 if (isset($link['attribs']['']['href'])) 6059 { 6060 $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; 6061 $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 6062 } 6063 } 6064 } 6065 if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link')) 6066 { 6067 foreach ($links as $link) 6068 { 6069 if (isset($link['attribs']['']['href'])) 6070 { 6071 $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; 6072 $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 6073 6074 } 6075 } 6076 } 6077 if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) 6078 { 6079 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 6080 } 6081 if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) 6082 { 6083 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 6084 } 6085 if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) 6086 { 6087 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 6088 } 6089 6090 $keys = array_keys($this->data['links']); 6091 foreach ($keys as $key) 6092 { 6093 if (SimplePie_Misc::is_isegment_nz_nc($key)) 6094 { 6095 if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) 6096 { 6097 $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); 6098 $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; 6099 } 6100 else 6101 { 6102 $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; 6103 } 6104 } 6105 elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) 6106 { 6107 $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; 6108 } 6109 $this->data['links'][$key] = array_unique($this->data['links'][$key]); 6110 } 6111 } 6112 6113 if (isset($this->data['links'][$rel])) 6114 { 6115 return $this->data['links'][$rel]; 6116 } 6117 else 6118 { 6119 return null; 6120 } 6121 } 6122 6123 function get_description() 6124 { 6125 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) 6126 { 6127 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 6128 } 6129 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline')) 6130 { 6131 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 6132 } 6133 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) 6134 { 6135 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 6136 } 6137 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) 6138 { 6139 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 6140 } 6141 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) 6142 { 6143 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 6144 } 6145 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) 6146 { 6147 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6148 } 6149 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) 6150 { 6151 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6152 } 6153 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) 6154 { 6155 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 6156 } 6157 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) 6158 { 6159 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 6160 } 6161 else 6162 { 6163 return null; 6164 } 6165 } 6166 6167 function get_copyright() 6168 { 6169 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) 6170 { 6171 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 6172 } 6173 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright')) 6174 { 6175 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 6176 } 6177 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright')) 6178 { 6179 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6180 } 6181 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) 6182 { 6183 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6184 } 6185 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) 6186 { 6187 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6188 } 6189 else 6190 { 6191 return null; 6192 } 6193 } 6194 6195 function get_language() 6196 { 6197 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language')) 6198 { 6199 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6200 } 6201 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language')) 6202 { 6203 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6204 } 6205 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language')) 6206 { 6207 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6208 } 6209 elseif (isset($this->data['xml_lang'])) 6210 { 6211 return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); 6212 } 6213 else 6214 { 6215 return null; 6216 } 6217 } 6218 6219 function get_latitude() 6220 { 6221 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) 6222 { 6223 return (float) $return[0]['data']; 6224 } 6225 elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) 6226 { 6227 return (float) $match[1]; 6228 } 6229 else 6230 { 6231 return null; 6232 } 6233 } 6234 6235 function get_longitude() 6236 { 6237 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) 6238 { 6239 return (float) $return[0]['data']; 6240 } 6241 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) 6242 { 6243 return (float) $return[0]['data']; 6244 } 6245 elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) 6246 { 6247 return (float) $match[2]; 6248 } 6249 else 6250 { 6251 return null; 6252 } 6253 } 6254 6255 function get_image_url() 6256 { 6257 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image')) 6258 { 6259 return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI); 6260 } 6261 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo')) 6262 { 6263 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 6264 } 6265 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) 6266 { 6267 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 6268 } 6269 else 6270 { 6271 return null; 6272 } 6273 } 6274 } 6275 6276 class SimplePie_Author 6277 { 6278 var $name; 6279 var $link; 6280 var $email; 6281 6282 // Constructor, used to input the data 6283 function SimplePie_Author($name = null, $link = null, $email = null) 6284 { 6285 $this->name = $name; 6286 $this->link = $link; 6287 $this->email = $email; 6288 } 6289 6290 function __toString() 6291 { 6292 // There is no $this->data here 6293 return md5(serialize($this)); 6294 } 6295 6296 function get_name() 6297 { 6298 if ($this->name !== null) 6299 { 6300 return $this->name; 6301 } 6302 else 6303 { 6304 return null; 6305 } 6306 } 6307 6308 function get_link() 6309 { 6310 if ($this->link !== null) 6311 { 6312 return $this->link; 6313 } 6314 else 6315 { 6316 return null; 6317 } 6318 } 6319 6320 function get_email() 6321 { 6322 if ($this->email !== null) 6323 { 6324 return $this->email; 6325 } 6326 else 6327 { 6328 return null; 6329 } 6330 } 6331 } 6332 6333 class SimplePie_Category 6334 { 6335 var $term; 6336 var $scheme; 6337 var $label; 6338 6339 // Constructor, used to input the data 6340 function SimplePie_Category($term = null, $scheme = null, $label = null) 6341 { 6342 $this->term = $term; 6343 $this->scheme = $scheme; 6344 $this->label = $label; 6345 } 6346 6347 function __toString() 6348 { 6349 // There is no $this->data here 6350 return md5(serialize($this)); 6351 } 6352 6353 function get_term() 6354 { 6355 if ($this->term !== null) 6356 { 6357 return $this->term; 6358 } 6359 else 6360 { 6361 return null; 6362 } 6363 } 6364 6365 function get_scheme() 6366 { 6367 if ($this->scheme !== null) 6368 { 6369 return $this->scheme; 6370 } 6371 else 6372 { 6373 return null; 6374 } 6375 } 6376 6377 function get_label() 6378 { 6379 if ($this->label !== null) 6380 { 6381 return $this->label; 6382 } 6383 else 6384 { 6385 return $this->get_term(); 6386 } 6387 } 6388 } 6389 6390 class SimplePie_Enclosure 6391 { 6392 var $bitrate; 6393 var $captions; 6394 var $categories; 6395 var $channels; 6396 var $copyright; 6397 var $credits; 6398 var $description; 6399 var $duration; 6400 var $expression; 6401 var $framerate; 6402 var $handler; 6403 var $hashes; 6404 var $height; 6405 var $javascript; 6406 var $keywords; 6407 var $lang; 6408 var $length; 6409 var $link; 6410 var $medium; 6411 var $player; 6412 var $ratings; 6413 var $restrictions; 6414 var $samplingrate; 6415 var $thumbnails; 6416 var $title; 6417 var $type; 6418 var $width; 6419 6420 // Constructor, used to input the data 6421 function SimplePie_Enclosure($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null) 6422 { 6423 $this->bitrate = $bitrate; 6424 $this->captions = $captions; 6425 $this->categories = $categories; 6426 $this->channels = $channels; 6427 $this->copyright = $copyright; 6428 $this->credits = $credits; 6429 $this->description = $description; 6430 $this->duration = $duration; 6431 $this->expression = $expression; 6432 $this->framerate = $framerate; 6433 $this->hashes = $hashes; 6434 $this->height = $height; 6435 $this->javascript = $javascript; 6436 $this->keywords = $keywords; 6437 $this->lang = $lang; 6438 $this->length = $length; 6439 $this->link = $link; 6440 $this->medium = $medium; 6441 $this->player = $player; 6442 $this->ratings = $ratings; 6443 $this->restrictions = $restrictions; 6444 $this->samplingrate = $samplingrate; 6445 $this->thumbnails = $thumbnails; 6446 $this->title = $title; 6447 $this->type = $type; 6448 $this->width = $width; 6449 if (class_exists('idna_convert')) 6450 { 6451 $idn = new idna_convert; 6452 $parsed = SimplePie_Misc::parse_url($link); 6453 $this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']); 6454 } 6455 $this->handler = $this->get_handler(); // Needs to load last 6456 } 6457 6458 function __toString() 6459 { 6460 // There is no $this->data here 6461 return md5(serialize($this)); 6462 } 6463 6464 function get_bitrate() 6465 { 6466 if ($this->bitrate !== null) 6467 { 6468 return $this->bitrate; 6469 } 6470 else 6471 { 6472 return null; 6473 } 6474 } 6475 6476 function get_caption($key = 0) 6477 { 6478 $captions = $this->get_captions(); 6479 if (isset($captions[$key])) 6480 { 6481 return $captions[$key]; 6482 } 6483 else 6484 { 6485 return null; 6486 } 6487 } 6488 6489 function get_captions() 6490 { 6491 if ($this->captions !== null) 6492 { 6493 return $this->captions; 6494 } 6495 else 6496 { 6497 return null; 6498 } 6499 } 6500 6501 function get_category($key = 0) 6502 { 6503 $categories = $this->get_categories(); 6504 if (isset($categories[$key])) 6505 { 6506 return $categories[$key]; 6507 } 6508 else 6509 { 6510 return null; 6511 } 6512 } 6513 6514 function get_categories() 6515 { 6516 if ($this->categories !== null) 6517 { 6518 return $this->categories; 6519 } 6520 else 6521 { 6522 return null; 6523 } 6524 } 6525 6526 function get_channels() 6527 { 6528 if ($this->channels !== null) 6529 { 6530 return $this->channels; 6531 } 6532 else 6533 { 6534 return null; 6535 } 6536 } 6537 6538 function get_copyright() 6539 { 6540 if ($this->copyright !== null) 6541 { 6542 return $this->copyright; 6543 } 6544 else 6545 { 6546 return null; 6547 } 6548 } 6549 6550 function get_credit($key = 0) 6551 { 6552 $credits = $this->get_credits(); 6553 if (isset($credits[$key])) 6554 { 6555 return $credits[$key]; 6556 } 6557 else 6558 { 6559 return null; 6560 } 6561 } 6562 6563 function get_credits() 6564 { 6565 if ($this->credits !== null) 6566 { 6567 return $this->credits; 6568 } 6569 else 6570 { 6571 return null; 6572 } 6573 } 6574 6575 function get_description() 6576 { 6577 if ($this->description !== null) 6578 { 6579 return $this->description; 6580 } 6581 else 6582 { 6583 return null; 6584 } 6585 } 6586 6587 function get_duration($convert = false) 6588 { 6589 if ($this->duration !== null) 6590 { 6591 if ($convert) 6592 { 6593 $time = SimplePie_Misc::time_hms($this->duration); 6594 return $time; 6595 } 6596 else 6597 { 6598 return $this->duration; 6599 } 6600 } 6601 else 6602 { 6603 return null; 6604 } 6605 } 6606 6607 function get_expression() 6608 { 6609 if ($this->expression !== null) 6610 { 6611 return $this->expression; 6612 } 6613 else 6614 { 6615 return 'full'; 6616 } 6617 } 6618 6619 function get_extension() 6620 { 6621 if ($this->link !== null) 6622 { 6623 $url = SimplePie_Misc::parse_url($this->link); 6624 if ($url['path'] !== '') 6625 { 6626 return pathinfo($url['path'], PATHINFO_EXTENSION); 6627 } 6628 } 6629 return null; 6630 } 6631 6632 function get_framerate() 6633 { 6634 if ($this->framerate !== null) 6635 { 6636 return $this->framerate; 6637 } 6638 else 6639 { 6640 return null; 6641 } 6642 } 6643 6644 function get_handler() 6645 { 6646 return $this->get_real_type(true); 6647 } 6648 6649 function get_hash($key = 0) 6650 { 6651 $hashes = $this->get_hashes(); 6652 if (isset($hashes[$key])) 6653 { 6654 return $hashes[$key]; 6655 } 6656 else 6657 { 6658 return null; 6659 } 6660 } 6661 6662 function get_hashes() 6663 { 6664 if ($this->hashes !== null) 6665 { 6666 return $this->hashes; 6667 } 6668 else 6669 { 6670 return null; 6671 } 6672 } 6673 6674 function get_height() 6675 { 6676 if ($this->height !== null) 6677 { 6678 return $this->height; 6679 } 6680 else 6681 { 6682 return null; 6683 } 6684 } 6685 6686 function get_language() 6687 { 6688 if ($this->lang !== null) 6689 { 6690 return $this->lang; 6691 } 6692 else 6693 { 6694 return null; 6695 } 6696 } 6697 6698 function get_keyword($key = 0) 6699 { 6700 $keywords = $this->get_keywords(); 6701 if (isset($keywords[$key])) 6702 { 6703 return $keywords[$key]; 6704 } 6705 else 6706 { 6707 return null; 6708 } 6709 } 6710 6711 function get_keywords() 6712 { 6713 if ($this->keywords !== null) 6714 { 6715 return $this->keywords; 6716 } 6717 else 6718 { 6719 return null; 6720 } 6721 } 6722 6723 function get_length() 6724 { 6725 if ($this->length !== null) 6726 { 6727 return $this->length; 6728 } 6729 else 6730 { 6731 return null; 6732 } 6733 } 6734 6735 function get_link() 6736 { 6737 if ($this->link !== null) 6738 { 6739 return urldecode($this->link); 6740 } 6741 else 6742 { 6743 return null; 6744 } 6745 } 6746 6747 function get_medium() 6748 { 6749 if ($this->medium !== null) 6750 { 6751 return $this->medium; 6752 } 6753 else 6754 { 6755 return null; 6756 } 6757 } 6758 6759 function get_player() 6760 { 6761 if ($this->player !== null) 6762 { 6763 return $this->player; 6764 } 6765 else 6766 { 6767 return null; 6768 } 6769 } 6770 6771 function get_rating($key = 0) 6772 { 6773 $ratings = $this->get_ratings(); 6774 if (isset($ratings[$key])) 6775 { 6776 return $ratings[$key]; 6777 } 6778 else 6779 { 6780 return null; 6781 } 6782 } 6783 6784 function get_ratings() 6785 { 6786 if ($this->ratings !== null) 6787 { 6788 return $this->ratings; 6789 } 6790 else 6791 { 6792 return null; 6793 } 6794 } 6795 6796 function get_restriction($key = 0) 6797 { 6798 $restrictions = $this->get_restrictions(); 6799 if (isset($restrictions[$key])) 6800 { 6801 return $restrictions[$key]; 6802 } 6803 else 6804 { 6805 return null; 6806 } 6807 } 6808 6809 function get_restrictions() 6810 { 6811 if ($this->restrictions !== null) 6812 { 6813 return $this->restrictions; 6814 } 6815 else 6816 { 6817 return null; 6818 } 6819 } 6820 6821 function get_sampling_rate() 6822 { 6823 if ($this->samplingrate !== null) 6824 { 6825 return $this->samplingrate; 6826 } 6827 else 6828 { 6829 return null; 6830 } 6831 } 6832 6833 function get_size() 6834 { 6835 $length = $this->get_length(); 6836 if ($length !== null) 6837 { 6838 return round($length/1048576, 2); 6839 } 6840 else 6841 { 6842 return null; 6843 } 6844 } 6845 6846 function get_thumbnail($key = 0) 6847 { 6848 $thumbnails = $this->get_thumbnails(); 6849 if (isset($thumbnails[$key])) 6850 { 6851 return $thumbnails[$key]; 6852 } 6853 else 6854 { 6855 return null; 6856 } 6857 } 6858 6859 function get_thumbnails() 6860 { 6861 if ($this->thumbnails !== null) 6862 { 6863 return $this->thumbnails; 6864 } 6865 else 6866 { 6867 return null; 6868 } 6869 } 6870 6871 function get_title() 6872 { 6873 if ($this->title !== null) 6874 { 6875 return $this->title; 6876 } 6877 else 6878 { 6879 return null; 6880 } 6881 } 6882 6883 function get_type() 6884 { 6885 if ($this->type !== null) 6886 { 6887 return $this->type; 6888 } 6889 else 6890 { 6891 return null; 6892 } 6893 } 6894 6895 function get_width() 6896 { 6897 if ($this->width !== null) 6898 { 6899 return $this->width; 6900 } 6901 else 6902 { 6903 return null; 6904 } 6905 } 6906 6907 function native_embed($options='') 6908 { 6909 return $this->embed($options, true); 6910 } 6911 6912 /** 6913 * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'. 6914 */ 6915 function embed($options = '', $native = false) 6916 { 6917 // Set up defaults 6918 $audio = ''; 6919 $video = ''; 6920 $alt = ''; 6921 $altclass = ''; 6922 $loop = 'false'; 6923 $width = 'auto'; 6924 $height = 'auto'; 6925 $bgcolor = '#ffffff'; 6926 $mediaplayer = ''; 6927 $widescreen = false; 6928 $handler = $this->get_handler(); 6929 $type = $this->get_real_type(); 6930 6931 // Process options and reassign values as necessary 6932 if (is_array($options)) 6933 { 6934 extract($options); 6935 } 6936 else 6937 { 6938 $options = explode(',', $options); 6939 foreach($options as $option) 6940 { 6941 $opt = explode(':', $option, 2); 6942 if (isset($opt[0], $opt[1])) 6943 { 6944 $opt[0] = trim($opt[0]); 6945 $opt[1] = trim($opt[1]); 6946 switch ($opt[0]) 6947 { 6948 case 'audio': 6949 $audio = $opt[1]; 6950 break; 6951 6952 case 'video': 6953 $video = $opt[1]; 6954 break; 6955 6956 case 'alt': 6957 $alt = $opt[1]; 6958 break; 6959 6960 case 'altclass': 6961 $altclass = $opt[1]; 6962 break; 6963 6964 case 'loop': 6965 $loop = $opt[1]; 6966 break; 6967 6968 case 'width': 6969 $width = $opt[1]; 6970 break; 6971 6972 case 'height': 6973 $height = $opt[1]; 6974 break; 6975 6976 case 'bgcolor': 6977 $bgcolor = $opt[1]; 6978 break; 6979 6980 case 'mediaplayer': 6981 $mediaplayer = $opt[1]; 6982 break; 6983 6984 case 'widescreen': 6985 $widescreen = $opt[1]; 6986 break; 6987 } 6988 } 6989 } 6990 } 6991 6992 $mime = explode('/', $type, 2); 6993 $mime = $mime[0]; 6994 6995 // Process values for 'auto' 6996 if ($width === 'auto') 6997 { 6998 if ($mime === 'video') 6999 { 7000 if ($height === 'auto') 7001 { 7002 $width = 480; 7003 } 7004 elseif ($widescreen) 7005 { 7006 $width = round((intval($height)/9)*16); 7007 } 7008 else 7009 { 7010 $width = round((intval($height)/3)*4); 7011 } 7012 } 7013 else 7014 { 7015 $width = '100%'; 7016 } 7017 } 7018 7019 if ($height === 'auto') 7020 { 7021 if ($mime === 'audio') 7022 { 7023 $height = 0; 7024 } 7025 elseif ($mime === 'video') 7026 { 7027 if ($width === 'auto') 7028 { 7029 if ($widescreen) 7030 { 7031 $height = 270; 7032 } 7033 else 7034 { 7035 $height = 360; 7036 } 7037 } 7038 elseif ($widescreen) 7039 { 7040 $height = round((intval($width)/16)*9); 7041 } 7042 else 7043 { 7044 $height = round((intval($width)/4)*3); 7045 } 7046 } 7047 else 7048 { 7049 $height = 376; 7050 } 7051 } 7052 elseif ($mime === 'audio') 7053 { 7054 $height = 0; 7055 } 7056 7057 // Set proper placeholder value 7058 if ($mime === 'audio') 7059 { 7060 $placeholder = $audio; 7061 } 7062 elseif ($mime === 'video') 7063 { 7064 $placeholder = $video; 7065 } 7066 7067 $embed = ''; 7068 7069 // Make sure the JS library is included 7070 if (!$native) 7071 { 7072 static $javascript_outputted = null; 7073 if (!$javascript_outputted && $this->javascript) 7074 { 7075 $embed .= '<script type="text/javascript" src="?' . htmlspecialchars($this->javascript) . '"></script>'; 7076 $javascript_outputted = true; 7077 } 7078 } 7079 7080 // Odeo Feed MP3's 7081 if ($handler === 'odeo') 7082 { 7083 if ($native) 7084 { 7085 $embed .= '<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://adobe.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="440" height="80" wmode="transparent" allowScriptAccess="any" flashvars="valid_sample_rate=true&external_url=' . $this->get_link() . '"></embed>'; 7086 } 7087 else 7088 { 7089 $embed .= '<script type="text/javascript">embed_odeo("' . $this->get_link() . '");</script>'; 7090 } 7091 } 7092 7093 // Flash 7094 elseif ($handler === 'flash') 7095 { 7096 if ($native) 7097 { 7098 $embed .= "<embed src=\"" . $this->get_link() . "\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\"></embed>"; 7099 } 7100 else 7101 { 7102 $embed .= "<script type='text/javascript'>embed_flash('$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$loop', '$type');</script>"; 7103 } 7104 } 7105 7106 // Flash Media Player file types. 7107 // Preferred handler for MP3 file types. 7108 elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== '')) 7109 { 7110 $height += 20; 7111 if ($native) 7112 { 7113 $embed .= "<embed src=\"$mediaplayer\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"application/x-shockwave-flash\" quality=\"high\" width=\"$width\" height=\"$height\" wmode=\"transparent\" flashvars=\"file=" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\"></embed>"; 7114 } 7115 else 7116 { 7117 $embed .= "<script type='text/javascript'>embed_flv('$width', '$height', '" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "', '$placeholder', '$loop', '$mediaplayer');</script>"; 7118 } 7119 } 7120 7121 // QuickTime 7 file types. Need to test with QuickTime 6. 7122 // Only handle MP3's if the Flash Media Player is not present. 7123 elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === '')) 7124 { 7125 $height += 16; 7126 if ($native) 7127 { 7128 if ($placeholder !== '') 7129 { 7130 $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" href=\"" . $this->get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>"; 7131 } 7132 else 7133 { 7134 $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" src=\"" . $this->get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>"; 7135 } 7136 } 7137 else 7138 { 7139 $embed .= "<script type='text/javascript'>embed_quicktime('$type', '$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$placeholder', '$loop');</script>"; 7140 } 7141 } 7142 7143 // Windows Media 7144 elseif ($handler === 'wmedia') 7145 { 7146 $height += 45; 7147 if ($native) 7148 { 7149 $embed .= "<embed type=\"application/x-mplayer2\" src=\"" . $this->get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\"></embed>"; 7150 } 7151 else 7152 { 7153 $embed .= "<script type='text/javascript'>embed_wmedia('$width', '$height', '" . $this->get_link() . "');</script>"; 7154 } 7155 } 7156 7157 // Everything else 7158 else $embed .= '<a href="' . $this->get_link() . '" class="' . $altclass . '">' . $alt . '</a>'; 7159 7160 return $embed; 7161 } 7162 7163 function get_real_type($find_handler = false) 7164 { 7165 // If it's Odeo, let's get it out of the way. 7166 if (substr(strtolower($this->get_link()), 0, 15) === 'http://odeo.com') 7167 { 7168 return 'odeo'; 7169 } 7170 7171 // Mime-types by handler. 7172 $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash 7173 $types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player 7174 $types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime 7175 $types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media 7176 $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3 7177 7178 if ($this->get_type() !== null) 7179 { 7180 $type = strtolower($this->type); 7181 } 7182 else 7183 { 7184 $type = null; 7185 } 7186 7187 // If we encounter an unsupported mime-type, check the file extension and guess intelligently. 7188 if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3))) 7189 { 7190 switch (strtolower($this->get_extension())) 7191 { 7192 // Audio mime-types 7193 case 'aac': 7194 case 'adts': 7195 $type = 'audio/acc'; 7196 break; 7197 7198 case 'aif': 7199 case 'aifc': 7200 case 'aiff': 7201 case 'cdda': 7202 $type = 'audio/aiff'; 7203 break; 7204 7205 case 'bwf': 7206 $type = 'audio/wav'; 7207 break; 7208 7209 case 'kar': 7210 case 'mid': 7211 case 'midi': 7212 case 'smf': 7213 $type = 'audio/midi'; 7214 break; 7215 7216 case 'm4a': 7217 $type = 'audio/x-m4a'; 7218 break; 7219 7220 case 'mp3': 7221 case 'swa': 7222 $type = 'audio/mp3'; 7223 break; 7224 7225 case 'wav': 7226 $type = 'audio/wav'; 7227 break; 7228 7229 case 'wax': 7230 $type = 'audio/x-ms-wax'; 7231 break; 7232 7233 case 'wma': 7234 $type = 'audio/x-ms-wma'; 7235 break; 7236 7237 // Video mime-types 7238 case '3gp': 7239 case '3gpp': 7240 $type = 'video/3gpp'; 7241 break; 7242 7243 case '3g2': 7244 case '3gp2': 7245 $type = 'video/3gpp2'; 7246 break; 7247 7248 case 'asf': 7249 $type = 'video/x-ms-asf'; 7250 break; 7251 7252 case 'flv': 7253 $type = 'video/x-flv'; 7254 break; 7255 7256 case 'm1a': 7257 case 'm1s': 7258 case 'm1v': 7259 case 'm15': 7260 case 'm75': 7261 case 'mp2': 7262 case 'mpa': 7263 case 'mpeg': 7264 case 'mpg': 7265 case 'mpm': 7266 case 'mpv': 7267 $type = 'video/mpeg'; 7268 break; 7269 7270 case 'm4v': 7271 $type = 'video/x-m4v'; 7272 break; 7273 7274 case 'mov': 7275 case 'qt': 7276 $type = 'video/quicktime'; 7277 break; 7278 7279 case 'mp4': 7280 case 'mpg4': 7281 $type = 'video/mp4'; 7282 break; 7283 7284 case 'sdv': 7285 $type = 'video/sd-video'; 7286 break; 7287 7288 case 'wm': 7289 $type = 'video/x-ms-wm'; 7290 break; 7291 7292 case 'wmv': 7293 $type = 'video/x-ms-wmv'; 7294 break; 7295 7296 case 'wvx': 7297 $type = 'video/x-ms-wvx'; 7298 break; 7299 7300 // Flash mime-types 7301 case 'spl': 7302 $type = 'application/futuresplash'; 7303 break; 7304 7305 case 'swf': 7306 $type = 'application/x-shockwave-flash'; 7307 break; 7308 } 7309 } 7310 7311 if ($find_handler) 7312 { 7313 if (in_array($type, $types_flash)) 7314 { 7315 return 'flash'; 7316 } 7317 elseif (in_array($type, $types_fmedia)) 7318 { 7319 return 'fmedia'; 7320 } 7321 elseif (in_array($type, $types_quicktime)) 7322 { 7323 return 'quicktime'; 7324 } 7325 elseif (in_array($type, $types_wmedia)) 7326 { 7327 return 'wmedia'; 7328 } 7329 elseif (in_array($type, $types_mp3)) 7330 { 7331 return 'mp3'; 7332 } 7333 else 7334 { 7335 return null; 7336 } 7337 } 7338 else 7339 { 7340 return $type; 7341 } 7342 } 7343 } 7344 7345 class SimplePie_Caption 7346 { 7347 var $type; 7348 var $lang; 7349 var $startTime; 7350 var $endTime; 7351 var $text; 7352 7353 // Constructor, used to input the data 7354 function SimplePie_Caption($type = null, $lang = null, $startTime = null, $endTime = null, $text = null) 7355 { 7356 $this->type = $type; 7357 $this->lang = $lang; 7358 $this->startTime = $startTime; 7359 $this->endTime = $endTime; 7360 $this->text = $text; 7361 } 7362 7363 function __toString() 7364 { 7365 // There is no $this->data here 7366 return md5(serialize($this)); 7367 } 7368 7369 function get_endtime() 7370 { 7371 if ($this->endTime !== null) 7372 { 7373 return $this->endTime; 7374 } 7375 else 7376 { 7377 return null; 7378 } 7379 } 7380 7381 function get_language() 7382 { 7383 if ($this->lang !== null) 7384 { 7385 return $this->lang; 7386 } 7387 else 7388 { 7389 return null; 7390 } 7391 } 7392 7393 function get_starttime() 7394 { 7395 if ($this->startTime !== null) 7396 { 7397 return $this->startTime; 7398 } 7399 else 7400 { 7401 return null; 7402 } 7403 } 7404 7405 function get_text() 7406 { 7407 if ($this->text !== null) 7408 { 7409 return $this->text; 7410 } 7411 else 7412 { 7413 return null; 7414 } 7415 } 7416 7417 function get_type() 7418 { 7419 if ($this->type !== null) 7420 { 7421 return $this->type; 7422 } 7423 else 7424 { 7425 return null; 7426 } 7427 } 7428 } 7429 7430 class SimplePie_Credit 7431 { 7432 var $role; 7433 var $scheme; 7434 var $name; 7435 7436 // Constructor, used to input the data 7437 function SimplePie_Credit($role = null, $scheme = null, $name = null) 7438 { 7439 $this->role = $role; 7440 $this->scheme = $scheme; 7441 $this->name = $name; 7442 } 7443 7444 function __toString() 7445 { 7446 // There is no $this->data here 7447 return md5(serialize($this)); 7448 } 7449 7450 function get_role() 7451 { 7452 if ($this->role !== null) 7453 { 7454 return $this->role; 7455 } 7456 else 7457 { 7458 return null; 7459 } 7460 } 7461 7462 function get_scheme() 7463 { 7464 if ($this->scheme !== null) 7465 { 7466 return $this->scheme; 7467 } 7468 else 7469 { 7470 return null; 7471 } 7472 } 7473 7474 function get_name() 7475 { 7476 if ($this->name !== null) 7477 { 7478 return $this->name; 7479 } 7480 else 7481 { 7482 return null; 7483 } 7484 } 7485 } 7486 7487 class SimplePie_Copyright 7488 { 7489 var $url; 7490 var $label; 7491 7492 // Constructor, used to input the data 7493 function SimplePie_Copyright($url = null, $label = null) 7494 { 7495 $this->url = $url; 7496 $this->label = $label; 7497 } 7498 7499 function __toString() 7500 { 7501 // There is no $this->data here 7502 return md5(serialize($this)); 7503 } 7504 7505 function get_url() 7506 { 7507 if ($this->url !== null) 7508 { 7509 return $this->url; 7510 } 7511 else 7512 { 7513 return null; 7514 } 7515 } 7516 7517 function get_attribution() 7518 { 7519 if ($this->label !== null) 7520 { 7521 return $this->label; 7522 } 7523 else 7524 { 7525 return null; 7526 } 7527 } 7528 } 7529 7530 class SimplePie_Rating 7531 { 7532 var $scheme; 7533 var $value; 7534 7535 // Constructor, used to input the data 7536 function SimplePie_Rating($scheme = null, $value = null) 7537 { 7538 $this->scheme = $scheme; 7539 $this->value = $value; 7540 } 7541 7542 function __toString() 7543 { 7544 // There is no $this->data here 7545 return md5(serialize($this)); 7546 } 7547 7548 function get_scheme() 7549 { 7550 if ($this->scheme !== null) 7551 { 7552 return $this->scheme; 7553 } 7554 else 7555 { 7556 return null; 7557 } 7558 } 7559 7560 function get_value() 7561 { 7562 if ($this->value !== null) 7563 { 7564 return $this->value; 7565 } 7566 else 7567 { 7568 return null; 7569 } 7570 } 7571 } 7572 7573 class SimplePie_Restriction 7574 { 7575 var $relationship; 7576 var $type; 7577 var $value; 7578 7579 // Constructor, used to input the data 7580 function SimplePie_Restriction($relationship = null, $type = null, $value = null) 7581 { 7582 $this->relationship = $relationship; 7583 $this->type = $type; 7584 $this->value = $value; 7585 } 7586 7587 function __toString() 7588 { 7589 // There is no $this->data here 7590 return md5(serialize($this)); 7591 } 7592 7593 function get_relationship() 7594 { 7595 if ($this->relationship !== null) 7596 { 7597 return $this->relationship; 7598 } 7599 else 7600 { 7601 return null; 7602 } 7603 } 7604 7605 function get_type() 7606 { 7607 if ($this->type !== null) 7608 { 7609 return $this->type; 7610 } 7611 else 7612 { 7613 return null; 7614 } 7615 } 7616 7617 function get_value() 7618 { 7619 if ($this->value !== null) 7620 { 7621 return $this->value; 7622 } 7623 else 7624 { 7625 return null; 7626 } 7627 } 7628 } 7629 7630 /** 7631 * @todo Move to properly supporting RFC2616 (HTTP/1.1) 7632 */ 7633 class SimplePie_File 7634 { 7635 var $url; 7636 var $useragent; 7637 var $success = true; 7638 var $headers = array(); 7639 var $body; 7640 var $status_code; 7641 var $redirects = 0; 7642 var $error; 7643 var $method = SIMPLEPIE_FILE_SOURCE_NONE; 7644 7645 function SimplePie_File($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false) 7646 { 7647 if (class_exists('idna_convert')) 7648 { 7649 $idn = new idna_convert; 7650 $parsed = SimplePie_Misc::parse_url($url); 7651 $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']); 7652 } 7653 $this->url = $url; 7654 $this->useragent = $useragent; 7655 if (preg_match('/^http(s)?:\/\//i', $url)) 7656 { 7657 if ($useragent === null) 7658 { 7659 $useragent = ini_get('user_agent'); 7660 $this->useragent = $useragent; 7661 } 7662 if (!is_array($headers)) 7663 { 7664 $headers = array(); 7665 } 7666 if (!$force_fsockopen && function_exists('curl_exec')) 7667 { 7668 $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL; 7669 $fp = curl_init(); 7670 $headers2 = array(); 7671 foreach ($headers as $key => $value) 7672 { 7673 $headers2[] = "$key: $value"; 7674 } 7675 if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>=')) 7676 { 7677 curl_setopt($fp, CURLOPT_ENCODING, ''); 7678 } 7679 curl_setopt($fp, CURLOPT_URL, $url); 7680 curl_setopt($fp, CURLOPT_HEADER, 1); 7681 curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1); 7682 curl_setopt($fp, CURLOPT_TIMEOUT, $timeout); 7683 curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout); 7684 curl_setopt($fp, CURLOPT_REFERER, $url); 7685 curl_setopt($fp, CURLOPT_USERAGENT, $useragent); 7686 curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2); 7687 if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>=')) 7688 { 7689 curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1); 7690 curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects); 7691 } 7692 7693 $this->headers = curl_exec($fp); 7694 if (curl_errno($fp) === 23 || curl_errno($fp) === 61) 7695 { 7696 curl_setopt($fp, CURLOPT_ENCODING, 'none'); 7697 $this->headers = curl_exec($fp); 7698 } 7699 if (curl_errno($fp)) 7700 { 7701 $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp); 7702 $this->success = false; 7703 } 7704 else 7705 { 7706 $info = curl_getinfo($fp); 7707 curl_close($fp); 7708 $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1); 7709 $this->headers = array_pop($this->headers); 7710 $parser = new SimplePie_HTTP_Parser($this->headers); 7711 if ($parser->parse()) 7712 { 7713 $this->headers = $parser->headers; 7714 $this->body = $parser->body; 7715 $this->status_code = $parser->status_code; 7716 if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) 7717 { 7718 $this->redirects++; 7719 $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); 7720 return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen); 7721 } 7722 } 7723 } 7724 } 7725 else 7726 { 7727 $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN; 7728 $url_parts = parse_url($url); 7729 if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') 7730 { 7731 $url_parts['host'] = "ssl://$url_parts[host]"; 7732 $url_parts['port'] = 443; 7733 } 7734 if (!isset($url_parts['port'])) 7735 { 7736 $url_parts['port'] = 80; 7737 } 7738 $fp = @fsockopen($url_parts['host'], $url_parts['port'], $errno, $errstr, $timeout); 7739 if (!$fp) 7740 { 7741 $this->error = 'fsockopen error: ' . $errstr; 7742 $this->success = false; 7743 } 7744 else 7745 { 7746 stream_set_timeout($fp, $timeout); 7747 if (isset($url_parts['path'])) 7748 { 7749 if (isset($url_parts['query'])) 7750 { 7751 $get = "$url_parts[path]?$url_parts[query]"; 7752 } 7753 else 7754 { 7755 $get = $url_parts['path']; 7756 } 7757 } 7758 else 7759 { 7760 $get = '/'; 7761 } 7762 $out = "GET $get HTTP/1.0\r\n"; 7763 $out .= "Host: $url_parts[host]\r\n"; 7764 $out .= "User-Agent: $useragent\r\n"; 7765 if (extension_loaded('zlib')) 7766 { 7767 $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n"; 7768 } 7769 7770 if (isset($url_parts['user']) && isset($url_parts['pass'])) 7771 { 7772 $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n"; 7773 } 7774 foreach ($headers as $key => $value) 7775 { 7776 $out .= "$key: $value\r\n"; 7777 } 7778 $out .= "Connection: Close\r\n\r\n"; 7779 fwrite($fp, $out); 7780 7781 $info = stream_get_meta_data($fp); 7782 7783 $this->headers = ''; 7784 while (!$info['eof'] && !$info['timed_out']) 7785 { 7786 $this->headers .= fread($fp, 1160); 7787 $info = stream_get_meta_data($fp); 7788 } 7789 if (!$info['timed_out']) 7790 { 7791 $parser = new SimplePie_HTTP_Parser($this->headers); 7792 if ($parser->parse()) 7793 { 7794 $this->headers = $parser->headers; 7795 $this->body = $parser->body; 7796 $this->status_code = $parser->status_code; 7797 if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) 7798 { 7799 $this->redirects++; 7800 $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); 7801 return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen); 7802 } 7803 if (isset($this->headers['content-encoding'])) 7804 { 7805 // Hey, we act dumb elsewhere, so let's do that here too 7806 switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20"))) 7807 { 7808 case 'gzip': 7809 case 'x-gzip': 7810 $decoder = new SimplePie_gzdecode($this->body); 7811 if (!$decoder->parse()) 7812 { 7813 $this->error = 'Unable to decode HTTP "gzip" stream'; 7814 $this->success = false; 7815 } 7816 else 7817 { 7818 $this->body = $decoder->data; 7819 } 7820 break; 7821 7822 case 'deflate': 7823 if (($body = gzuncompress($this->body)) === false) 7824 { 7825 if (($body = gzinflate($this->body)) === false) 7826 { 7827 $this->error = 'Unable to decode HTTP "deflate" stream'; 7828 $this->success = false; 7829 } 7830 } 7831 $this->body = $body; 7832 break; 7833 7834 default: 7835 $this->error = 'Unknown content coding'; 7836 $this->success = false; 7837 } 7838 } 7839 } 7840 } 7841 else 7842 { 7843 $this->error = 'fsocket timed out'; 7844 $this->success = false; 7845 } 7846 fclose($fp); 7847 } 7848 } 7849 } 7850 else 7851 { 7852 $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS; 7853 if (!$this->body = file_get_contents($url)) 7854 { 7855 $this->error = 'file_get_contents could not read the file'; 7856 $this->success = false; 7857 } 7858 } 7859 } 7860 } 7861 7862 /** 7863 * HTTP Response Parser 7864 * 7865 * @package SimplePie 7866 */ 7867 class SimplePie_HTTP_Parser 7868 { 7869 /** 7870 * HTTP Version 7871 * 7872 * @access public 7873 * @var float 7874 */ 7875 var $http_version = 0.0; 7876 7877 /** 7878 * Status code 7879 * 7880 * @access public 7881 * @var int 7882 */ 7883 var $status_code = 0; 7884 7885 /** 7886 * Reason phrase 7887 * 7888 * @access public 7889 * @var string 7890 */ 7891 var $reason = ''; 7892 7893 /** 7894 * Key/value pairs of the headers 7895 * 7896 * @access public 7897 * @var array 7898 */ 7899 var $headers = array(); 7900 7901 /** 7902 * Body of the response 7903 * 7904 * @access public 7905 * @var string 7906 */ 7907 var $body = ''; 7908 7909 /** 7910 * Current state of the state machine 7911 * 7912 * @access private 7913 * @var string 7914 */ 7915 var $state = 'http_version'; 7916 7917 /** 7918 * Input data 7919 * 7920 * @access private 7921 * @var string 7922 */ 7923 var $data = ''; 7924 7925 /** 7926 * Input data length (to avoid calling strlen() everytime this is needed) 7927 * 7928 * @access private 7929 * @var int 7930 */ 7931 var $data_length = 0; 7932 7933 /** 7934 * Current position of the pointer 7935 * 7936 * @var int 7937 * @access private 7938 */ 7939 var $position = 0; 7940 7941 /** 7942 * Name of the hedaer currently being parsed 7943 * 7944 * @access private 7945 * @var string 7946 */ 7947 var $name = ''; 7948 7949 /** 7950 * Value of the hedaer currently being parsed 7951 * 7952 * @access private 7953 * @var string 7954 */ 7955 var $value = ''; 7956 7957 /** 7958 * Create an instance of the class with the input data 7959 * 7960 * @access public 7961 * @param string $data Input data 7962 */ 7963 function SimplePie_HTTP_Parser($data) 7964 { 7965 $this->data = $data; 7966 $this->data_length = strlen($this->data); 7967 } 7968 7969 /** 7970 * Parse the input data 7971 * 7972 * @access public 7973 * @return bool true on success, false on failure 7974 */ 7975 function parse() 7976 { 7977 while ($this->state && $this->state !== 'emit' && $this->has_data()) 7978 { 7979 $state = $this->state; 7980 $this->$state(); 7981 } 7982 $this->data = ''; 7983 if ($this->state === 'emit' || $this->state === 'body') 7984 { 7985 return true; 7986 } 7987 else 7988 { 7989 $this->http_version = ''; 7990 $this->status_code = ''; 7991 $this->reason = ''; 7992 $this->headers = array(); 7993 $this->body = ''; 7994 return false; 7995 } 7996 } 7997 7998 /** 7999 * Check whether there is data beyond the pointer 8000 * 8001 * @access private 8002 * @return bool true if there is further data, false if not 8003 */ 8004 function has_data() 8005 { 8006 return (bool) ($this->position < $this->data_length); 8007 } 8008 8009 /** 8010 * See if the next character is LWS 8011 * 8012 * @access private 8013 * @return bool true if the next character is LWS, false if not 8014 */ 8015 function is_linear_whitespace() 8016 { 8017 return (bool) ($this->data[$this->position] === "\x09" 8018 || $this->data[$this->position] === "\x20" 8019 || ($this->data[$this->position] === "\x0A" 8020 && isset($this->data[$this->position + 1]) 8021 && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20"))); 8022 } 8023 8024 /** 8025 * Parse the HTTP version 8026 * 8027 * @access private 8028 */ 8029 function http_version() 8030 { 8031 if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/') 8032 { 8033 $len = strspn($this->data, '0123456789.', 5); 8034 $this->http_version = substr($this->data, 5, $len); 8035 $this->position += 5 + $len; 8036 if (substr_count($this->http_version, '.') <= 1) 8037 { 8038 $this->http_version = (float) $this->http_version; 8039 $this->position += strspn($this->data, "\x09\x20", $this->position); 8040 $this->state = 'status'; 8041 } 8042 else 8043 { 8044 $this->state = false; 8045 } 8046 } 8047 else 8048 { 8049 $this->state = false; 8050 } 8051 } 8052 8053 /** 8054 * Parse the status code 8055 * 8056 * @access private 8057 */ 8058 function status() 8059 { 8060 if ($len = strspn($this->data, '0123456789', $this->position)) 8061 { 8062 $this->status_code = (int) substr($this->data, $this->position, $len); 8063 $this->position += $len; 8064 $this->state = 'reason'; 8065 } 8066 else 8067 { 8068 $this->state = false; 8069 } 8070 } 8071 8072 /** 8073 * Parse the reason phrase 8074 * 8075 * @access private 8076 */ 8077 function reason() 8078 { 8079 $len = strcspn($this->data, "\x0A", $this->position); 8080 $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20"); 8081 $this->position += $len + 1; 8082 $this->state = 'new_line'; 8083 } 8084 8085 /** 8086 * Deal with a new line, shifting data around as needed 8087 * 8088 * @access private 8089 */ 8090 function new_line() 8091 { 8092 $this->value = trim($this->value, "\x0D\x20"); 8093 if ($this->name !== '' && $this->value !== '') 8094 { 8095 $this->name = strtolower($this->name); 8096 if (isset($this->headers[$this->name])) 8097 { 8098 $this->headers[$this->name] .= ', ' . $this->value; 8099 } 8100 else 8101 { 8102 $this->headers[$this->name] = $this->value; 8103 } 8104 } 8105 $this->name = ''; 8106 $this->value = ''; 8107 if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A") 8108 { 8109 $this->position += 2; 8110 $this->state = 'body'; 8111 } 8112 elseif ($this->data[$this->position] === "\x0A") 8113 { 8114 $this->position++; 8115 $this->state = 'body'; 8116 } 8117 else 8118 { 8119 $this->state = 'name'; 8120 } 8121 } 8122 8123 /** 8124 * Parse a header name 8125 * 8126 * @access private 8127 */ 8128 function name() 8129 { 8130 $len = strcspn($this->data, "\x0A:", $this->position); 8131 if (isset($this->data[$this->position + $len])) 8132 { 8133 if ($this->data[$this->position + $len] === "\x0A") 8134 { 8135 $this->position += $len; 8136 $this->state = 'new_line'; 8137 } 8138 else 8139 { 8140 $this->name = substr($this->data, $this->position, $len); 8141 $this->position += $len + 1; 8142 $this->state = 'value'; 8143 } 8144 } 8145 else 8146 { 8147 $this->state = false; 8148 } 8149 } 8150 8151 /** 8152 * Parse LWS, replacing consecutive LWS characters with a single space 8153 * 8154 * @access private 8155 */ 8156 function linear_whitespace() 8157 { 8158 do 8159 { 8160 if (substr($this->data, $this->position, 2) === "\x0D\x0A") 8161 { 8162 $this->position += 2; 8163 } 8164 elseif ($this->data[$this->position] === "\x0A") 8165 { 8166 $this->position++; 8167 } 8168 $this->position += strspn($this->data, "\x09\x20", $this->position); 8169 } while ($this->has_data() && $this->is_linear_whitespace()); 8170 $this->value .= "\x20"; 8171 } 8172 8173 /** 8174 * See what state to move to while within non-quoted header values 8175 * 8176 * @access private 8177 */ 8178 function value() 8179 { 8180 if ($this->is_linear_whitespace()) 8181 { 8182 $this->linear_whitespace(); 8183 } 8184 else 8185 { 8186 switch ($this->data[$this->position]) 8187 { 8188 case '"': 8189 $this->position++; 8190 $this->state = 'quote'; 8191 break; 8192 8193 case "\x0A": 8194 $this->position++; 8195 $this->state = 'new_line'; 8196 break; 8197 8198 default: 8199 $this->state = 'value_char'; 8200 break; 8201 } 8202 } 8203 } 8204 8205 /** 8206 * Parse a header value while outside quotes 8207 * 8208 * @access private 8209 */ 8210 function value_char() 8211 { 8212 $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position); 8213 $this->value .= substr($this->data, $this->position, $len); 8214 $this->position += $len; 8215 $this->state = 'value'; 8216 } 8217 8218 /** 8219 * See what state to move to while within quoted header values 8220 * 8221 * @access private 8222 */ 8223 function quote() 8224 { 8225 if ($this->is_linear_whitespace()) 8226 { 8227 $this->linear_whitespace(); 8228 } 8229 else 8230 { 8231 switch ($this->data