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