[ Index ] |
PHP Cross Reference of phpwcms V1.4.3 _r380 (23.11.09) |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * SimplePie 4 * 5 * A PHP-Based RSS and Atom Feed Framework. 6 * Takes the hard work out of managing a complete RSS/Atom solution. 7 * 8 * Copyright (c) 2004-2009, Ryan Parman and Geoffrey Sneddon 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without modification, are 12 * permitted provided that the following conditions are met: 13 * 14 * * Redistributions of source code must retain the above copyright notice, this list of 15 * conditions and the following disclaimer. 16 * 17 * * Redistributions in binary form must reproduce the above copyright notice, this list 18 * of conditions and the following disclaimer in the documentation and/or other materials 19 * provided with the distribution. 20 * 21 * * Neither the name of the SimplePie Team nor the names of its contributors may be used 22 * to endorse or promote products derived from this software without specific prior 23 * written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS 26 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 27 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS 28 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 32 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33 * POSSIBILITY OF SUCH DAMAGE. 34 * 35 * @package SimplePie 36 * @version 1.2 37 * @copyright 2004-2009 Ryan Parman, Geoffrey Sneddon 38 * @author Ryan Parman 39 * @author Geoffrey Sneddon 40 * @link http://simplepie.org/ SimplePie 41 * @link http://simplepie.org/support/ Please submit all bug reports and feature requests to the SimplePie forums 42 * @license http://www.opensource.org/licenses/bsd-license.php BSD License 43 * @todo phpDoc comments 44 */ 45 46 /** 47 * SimplePie Name 48 */ 49 define('SIMPLEPIE_NAME', 'SimplePie'); 50 51 /** 52 * SimplePie Version 53 */ 54 define('SIMPLEPIE_VERSION', '1.2'); 55 56 /** 57 * SimplePie Build 58 */ 59 define('SIMPLEPIE_BUILD', '20090627192103'); 60 61 /** 62 * SimplePie Website URL 63 */ 64 define('SIMPLEPIE_URL', 'http://simplepie.org'); 65 66 /** 67 * SimplePie Useragent 68 * @see SimplePie::set_useragent() 69 */ 70 define('SIMPLEPIE_USERAGENT', SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION . ' (Feed Parser; ' . SIMPLEPIE_URL . '; Allow like Gecko) Build/' . SIMPLEPIE_BUILD); 71 72 /** 73 * SimplePie Linkback 74 */ 75 define('SIMPLEPIE_LINKBACK', '<a href="' . SIMPLEPIE_URL . '" title="' . SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . '">' . SIMPLEPIE_NAME . '</a>'); 76 77 /** 78 * No Autodiscovery 79 * @see SimplePie::set_autodiscovery_level() 80 */ 81 define('SIMPLEPIE_LOCATOR_NONE', 0); 82 83 /** 84 * Feed Link Element Autodiscovery 85 * @see SimplePie::set_autodiscovery_level() 86 */ 87 define('SIMPLEPIE_LOCATOR_AUTODISCOVERY', 1); 88 89 /** 90 * Local Feed Extension Autodiscovery 91 * @see SimplePie::set_autodiscovery_level() 92 */ 93 define('SIMPLEPIE_LOCATOR_LOCAL_EXTENSION', 2); 94 95 /** 96 * Local Feed Body Autodiscovery 97 * @see SimplePie::set_autodiscovery_level() 98 */ 99 define('SIMPLEPIE_LOCATOR_LOCAL_BODY', 4); 100 101 /** 102 * Remote Feed Extension Autodiscovery 103 * @see SimplePie::set_autodiscovery_level() 104 */ 105 define('SIMPLEPIE_LOCATOR_REMOTE_EXTENSION', 8); 106 107 /** 108 * Remote Feed Body Autodiscovery 109 * @see SimplePie::set_autodiscovery_level() 110 */ 111 define('SIMPLEPIE_LOCATOR_REMOTE_BODY', 16); 112 113 /** 114 * All Feed Autodiscovery 115 * @see SimplePie::set_autodiscovery_level() 116 */ 117 define('SIMPLEPIE_LOCATOR_ALL', 31); 118 119 /** 120 * No known feed type 121 */ 122 define('SIMPLEPIE_TYPE_NONE', 0); 123 124 /** 125 * RSS 0.90 126 */ 127 define('SIMPLEPIE_TYPE_RSS_090', 1); 128 129 /** 130 * RSS 0.91 (Netscape) 131 */ 132 define('SIMPLEPIE_TYPE_RSS_091_NETSCAPE', 2); 133 134 /** 135 * RSS 0.91 (Userland) 136 */ 137 define('SIMPLEPIE_TYPE_RSS_091_USERLAND', 4); 138 139 /** 140 * RSS 0.91 (both Netscape and Userland) 141 */ 142 define('SIMPLEPIE_TYPE_RSS_091', 6); 143 144 /** 145 * RSS 0.92 146 */ 147 define('SIMPLEPIE_TYPE_RSS_092', 8); 148 149 /** 150 * RSS 0.93 151 */ 152 define('SIMPLEPIE_TYPE_RSS_093', 16); 153 154 /** 155 * RSS 0.94 156 */ 157 define('SIMPLEPIE_TYPE_RSS_094', 32); 158 159 /** 160 * RSS 1.0 161 */ 162 define('SIMPLEPIE_TYPE_RSS_10', 64); 163 164 /** 165 * RSS 2.0 166 */ 167 define('SIMPLEPIE_TYPE_RSS_20', 128); 168 169 /** 170 * RDF-based RSS 171 */ 172 define('SIMPLEPIE_TYPE_RSS_RDF', 65); 173 174 /** 175 * Non-RDF-based RSS (truly intended as syndication format) 176 */ 177 define('SIMPLEPIE_TYPE_RSS_SYNDICATION', 190); 178 179 /** 180 * All RSS 181 */ 182 define('SIMPLEPIE_TYPE_RSS_ALL', 255); 183 184 /** 185 * Atom 0.3 186 */ 187 define('SIMPLEPIE_TYPE_ATOM_03', 256); 188 189 /** 190 * Atom 1.0 191 */ 192 define('SIMPLEPIE_TYPE_ATOM_10', 512); 193 194 /** 195 * All Atom 196 */ 197 define('SIMPLEPIE_TYPE_ATOM_ALL', 768); 198 199 /** 200 * All feed types 201 */ 202 define('SIMPLEPIE_TYPE_ALL', 1023); 203 204 /** 205 * No construct 206 */ 207 define('SIMPLEPIE_CONSTRUCT_NONE', 0); 208 209 /** 210 * Text construct 211 */ 212 define('SIMPLEPIE_CONSTRUCT_TEXT', 1); 213 214 /** 215 * HTML construct 216 */ 217 define('SIMPLEPIE_CONSTRUCT_HTML', 2); 218 219 /** 220 * XHTML construct 221 */ 222 define('SIMPLEPIE_CONSTRUCT_XHTML', 4); 223 224 /** 225 * base64-encoded construct 226 */ 227 define('SIMPLEPIE_CONSTRUCT_BASE64', 8); 228 229 /** 230 * IRI construct 231 */ 232 define('SIMPLEPIE_CONSTRUCT_IRI', 16); 233 234 /** 235 * A construct that might be HTML 236 */ 237 define('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32); 238 239 /** 240 * All constructs 241 */ 242 define('SIMPLEPIE_CONSTRUCT_ALL', 63); 243 244 /** 245 * Don't change case 246 */ 247 define('SIMPLEPIE_SAME_CASE', 1); 248 249 /** 250 * Change to lowercase 251 */ 252 define('SIMPLEPIE_LOWERCASE', 2); 253 254 /** 255 * Change to uppercase 256 */ 257 define('SIMPLEPIE_UPPERCASE', 4); 258 259 /** 260 * PCRE for HTML attributes 261 */ 262 define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*'); 263 264 /** 265 * PCRE for XML attributes 266 */ 267 define('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*'); 268 269 /** 270 * XML Namespace 271 */ 272 define('SIMPLEPIE_NAMESPACE_XML', 'http://www.w3.org/XML/1998/namespace'); 273 274 /** 275 * Atom 1.0 Namespace 276 */ 277 define('SIMPLEPIE_NAMESPACE_ATOM_10', 'http://www.w3.org/2005/Atom'); 278 279 /** 280 * Atom 0.3 Namespace 281 */ 282 define('SIMPLEPIE_NAMESPACE_ATOM_03', 'http://purl.org/atom/ns#'); 283 284 /** 285 * RDF Namespace 286 */ 287 define('SIMPLEPIE_NAMESPACE_RDF', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); 288 289 /** 290 * RSS 0.90 Namespace 291 */ 292 define('SIMPLEPIE_NAMESPACE_RSS_090', 'http://my.netscape.com/rdf/simple/0.9/'); 293 294 /** 295 * RSS 1.0 Namespace 296 */ 297 define('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/'); 298 299 /** 300 * RSS 1.0 Content Module Namespace 301 */ 302 define('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/'); 303 304 /** 305 * RSS 2.0 Namespace 306 * (Stupid, I know, but I'm certain it will confuse people less with support.) 307 */ 308 define('SIMPLEPIE_NAMESPACE_RSS_20', ''); 309 310 /** 311 * DC 1.0 Namespace 312 */ 313 define('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/'); 314 315 /** 316 * DC 1.1 Namespace 317 */ 318 define('SIMPLEPIE_NAMESPACE_DC_11', 'http://purl.org/dc/elements/1.1/'); 319 320 /** 321 * W3C Basic Geo (WGS84 lat/long) Vocabulary Namespace 322 */ 323 define('SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO', 'http://www.w3.org/2003/01/geo/wgs84_pos#'); 324 325 /** 326 * GeoRSS Namespace 327 */ 328 define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss'); 329 330 /** 331 * Media RSS Namespace 332 */ 333 define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/'); 334 335 /** 336 * Wrong Media RSS Namespace 337 */ 338 define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss'); 339 340 /** 341 * iTunes RSS Namespace 342 */ 343 define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); 344 345 /** 346 * XHTML Namespace 347 */ 348 define('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml'); 349 350 /** 351 * IANA Link Relations Registry 352 */ 353 define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/'); 354 355 /** 356 * Whether we're running on PHP5 357 */ 358 define('SIMPLEPIE_PHP5', version_compare(PHP_VERSION, '5.0.0', '>=')); 359 360 /** 361 * No file source 362 */ 363 define('SIMPLEPIE_FILE_SOURCE_NONE', 0); 364 365 /** 366 * Remote file source 367 */ 368 define('SIMPLEPIE_FILE_SOURCE_REMOTE', 1); 369 370 /** 371 * Local file source 372 */ 373 define('SIMPLEPIE_FILE_SOURCE_LOCAL', 2); 374 375 /** 376 * fsockopen() file source 377 */ 378 define('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4); 379 380 /** 381 * cURL file source 382 */ 383 define('SIMPLEPIE_FILE_SOURCE_CURL', 8); 384 385 /** 386 * file_get_contents() file source 387 */ 388 define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16); 389 390 /** 391 * SimplePie 392 * 393 * @package SimplePie 394 */ 395 class SimplePie 396 { 397 /** 398 * @var array Raw data 399 * @access private 400 */ 401 var $data = array(); 402 403 /** 404 * @var mixed Error string 405 * @access private 406 */ 407 var $error; 408 409 /** 410 * @var object Instance of SimplePie_Sanitize (or other class) 411 * @see SimplePie::set_sanitize_class() 412 * @access private 413 */ 414 var $sanitize; 415 416 /** 417 * @var string SimplePie Useragent 418 * @see SimplePie::set_useragent() 419 * @access private 420 */ 421 var $useragent = SIMPLEPIE_USERAGENT; 422 423 /** 424 * @var string Feed URL 425 * @see SimplePie::set_feed_url() 426 * @access private 427 */ 428 var $feed_url; 429 430 /** 431 * @var object Instance of SimplePie_File to use as a feed 432 * @see SimplePie::set_file() 433 * @access private 434 */ 435 var $file; 436 437 /** 438 * @var string Raw feed data 439 * @see SimplePie::set_raw_data() 440 * @access private 441 */ 442 var $raw_data; 443 444 /** 445 * @var int Timeout for fetching remote files 446 * @see SimplePie::set_timeout() 447 * @access private 448 */ 449 var $timeout = 10; 450 451 /** 452 * @var bool Forces fsockopen() to be used for remote files instead 453 * of cURL, even if a new enough version is installed 454 * @see SimplePie::force_fsockopen() 455 * @access private 456 */ 457 var $force_fsockopen = false; 458 459 /** 460 * @var bool Force the given data/URL to be treated as a feed no matter what 461 * it appears like 462 * @see SimplePie::force_feed() 463 * @access private 464 */ 465 var $force_feed = false; 466 467 /** 468 * @var bool Enable/Disable XML dump 469 * @see SimplePie::enable_xml_dump() 470 * @access private 471 */ 472 var $xml_dump = false; 473 474 /** 475 * @var bool Enable/Disable Caching 476 * @see SimplePie::enable_cache() 477 * @access private 478 */ 479 var $cache = true; 480 481 /** 482 * @var int Cache duration (in seconds) 483 * @see SimplePie::set_cache_duration() 484 * @access private 485 */ 486 var $cache_duration = 3600; 487 488 /** 489 * @var int Auto-discovery cache duration (in seconds) 490 * @see SimplePie::set_autodiscovery_cache_duration() 491 * @access private 492 */ 493 var $autodiscovery_cache_duration = 604800; // 7 Days. 494 495 /** 496 * @var string Cache location (relative to executing script) 497 * @see SimplePie::set_cache_location() 498 * @access private 499 */ 500 var $cache_location = './cache'; 501 502 /** 503 * @var string Function that creates the cache filename 504 * @see SimplePie::set_cache_name_function() 505 * @access private 506 */ 507 var $cache_name_function = 'md5'; 508 509 /** 510 * @var bool Reorder feed by date descending 511 * @see SimplePie::enable_order_by_date() 512 * @access private 513 */ 514 var $order_by_date = true; 515 516 /** 517 * @var mixed Force input encoding to be set to the follow value 518 * (false, or anything type-cast to false, disables this feature) 519 * @see SimplePie::set_input_encoding() 520 * @access private 521 */ 522 var $input_encoding = false; 523 524 /** 525 * @var int Feed Autodiscovery Level 526 * @see SimplePie::set_autodiscovery_level() 527 * @access private 528 */ 529 var $autodiscovery = SIMPLEPIE_LOCATOR_ALL; 530 531 /** 532 * @var string Class used for caching feeds 533 * @see SimplePie::set_cache_class() 534 * @access private 535 */ 536 var $cache_class = 'SimplePie_Cache'; 537 538 /** 539 * @var string Class used for locating feeds 540 * @see SimplePie::set_locator_class() 541 * @access private 542 */ 543 var $locator_class = 'SimplePie_Locator'; 544 545 /** 546 * @var string Class used for parsing feeds 547 * @see SimplePie::set_parser_class() 548 * @access private 549 */ 550 var $parser_class = 'SimplePie_Parser'; 551 552 /** 553 * @var string Class used for fetching feeds 554 * @see SimplePie::set_file_class() 555 * @access private 556 */ 557 var $file_class = 'SimplePie_File'; 558 559 /** 560 * @var string Class used for items 561 * @see SimplePie::set_item_class() 562 * @access private 563 */ 564 var $item_class = 'SimplePie_Item'; 565 566 /** 567 * @var string Class used for authors 568 * @see SimplePie::set_author_class() 569 * @access private 570 */ 571 var $author_class = 'SimplePie_Author'; 572 573 /** 574 * @var string Class used for categories 575 * @see SimplePie::set_category_class() 576 * @access private 577 */ 578 var $category_class = 'SimplePie_Category'; 579 580 /** 581 * @var string Class used for enclosures 582 * @see SimplePie::set_enclosures_class() 583 * @access private 584 */ 585 var $enclosure_class = 'SimplePie_Enclosure'; 586 587 /** 588 * @var string Class used for Media RSS <media:text> captions 589 * @see SimplePie::set_caption_class() 590 * @access private 591 */ 592 var $caption_class = 'SimplePie_Caption'; 593 594 /** 595 * @var string Class used for Media RSS <media:copyright> 596 * @see SimplePie::set_copyright_class() 597 * @access private 598 */ 599 var $copyright_class = 'SimplePie_Copyright'; 600 601 /** 602 * @var string Class used for Media RSS <media:credit> 603 * @see SimplePie::set_credit_class() 604 * @access private 605 */ 606 var $credit_class = 'SimplePie_Credit'; 607 608 /** 609 * @var string Class used for Media RSS <media:rating> 610 * @see SimplePie::set_rating_class() 611 * @access private 612 */ 613 var $rating_class = 'SimplePie_Rating'; 614 615 /** 616 * @var string Class used for Media RSS <media:restriction> 617 * @see SimplePie::set_restriction_class() 618 * @access private 619 */ 620 var $restriction_class = 'SimplePie_Restriction'; 621 622 /** 623 * @var string Class used for content-type sniffing 624 * @see SimplePie::set_content_type_sniffer_class() 625 * @access private 626 */ 627 var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer'; 628 629 /** 630 * @var string Class used for item sources. 631 * @see SimplePie::set_source_class() 632 * @access private 633 */ 634 var $source_class = 'SimplePie_Source'; 635 636 /** 637 * @var mixed Set javascript query string parameter (false, or 638 * anything type-cast to false, disables this feature) 639 * @see SimplePie::set_javascript() 640 * @access private 641 */ 642 var $javascript = 'js'; 643 644 /** 645 * @var int Maximum number of feeds to check with autodiscovery 646 * @see SimplePie::set_max_checked_feeds() 647 * @access private 648 */ 649 var $max_checked_feeds = 10; 650 651 /** 652 * @var array All the feeds found during the autodiscovery process 653 * @see SimplePie::get_all_discovered_feeds() 654 * @access private 655 */ 656 var $all_discovered_feeds = array(); 657 658 /** 659 * @var string Web-accessible path to the handler_favicon.php file. 660 * @see SimplePie::set_favicon_handler() 661 * @access private 662 */ 663 var $favicon_handler = ''; 664 665 /** 666 * @var string Web-accessible path to the handler_image.php file. 667 * @see SimplePie::set_image_handler() 668 * @access private 669 */ 670 var $image_handler = ''; 671 672 /** 673 * @var array Stores the URLs when multiple feeds are being initialized. 674 * @see SimplePie::set_feed_url() 675 * @access private 676 */ 677 var $multifeed_url = array(); 678 679 /** 680 * @var array Stores SimplePie objects when multiple feeds initialized. 681 * @access private 682 */ 683 var $multifeed_objects = array(); 684 685 /** 686 * @var array Stores the get_object_vars() array for use with multifeeds. 687 * @see SimplePie::set_feed_url() 688 * @access private 689 */ 690 var $config_settings = null; 691 692 /** 693 * @var integer Stores the number of items to return per-feed with multifeeds. 694 * @see SimplePie::set_item_limit() 695 * @access private 696 */ 697 var $item_limit = 0; 698 699 /** 700 * @var array Stores the default attributes to be stripped by strip_attributes(). 701 * @see SimplePie::strip_attributes() 702 * @access private 703 */ 704 var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'); 705 706 /** 707 * @var array Stores the default tags to be stripped by strip_htmltags(). 708 * @see SimplePie::strip_htmltags() 709 * @access private 710 */ 711 var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'); 712 713 /** 714 * The SimplePie class contains feed level data and options 715 * 716 * There are two ways that you can create a new SimplePie object. The first 717 * is by passing a feed URL as a parameter to the SimplePie constructor 718 * (as well as optionally setting the cache location and cache expiry). This 719 * will initialise the whole feed with all of the default settings, and you 720 * can begin accessing methods and properties immediately. 721 * 722 * The second way is to create the SimplePie object with no parameters 723 * at all. This will enable you to set configuration options. After setting 724 * them, you must initialise the feed using $feed->init(). At that point the 725 * object's methods and properties will be available to you. This format is 726 * what is used throughout this documentation. 727 * 728 * @access public 729 * @since 1.0 Preview Release 730 * @param string $feed_url This is the URL you want to parse. 731 * @param string $cache_location This is where you want the cache to be stored. 732 * @param int $cache_duration This is the number of seconds that you want to store the cache file for. 733 */ 734 function SimplePie($feed_url = null, $cache_location = null, $cache_duration = null) 735 { 736 // Other objects, instances created here so we can set options on them 737 $this->sanitize =& new SimplePie_Sanitize; 738 739 // Set options if they're passed to the constructor 740 if ($cache_location !== null) 741 { 742 $this->set_cache_location($cache_location); 743 } 744 745 if ($cache_duration !== null) 746 { 747 $this->set_cache_duration($cache_duration); 748 } 749 750 // Only init the script if we're passed a feed URL 751 if ($feed_url !== null) 752 { 753 $this->set_feed_url($feed_url); 754 $this->init(); 755 } 756 } 757 758 /** 759 * Used for converting object to a string 760 */ 761 function __toString() 762 { 763 return md5(serialize($this->data)); 764 } 765 766 /** 767 * Remove items that link back to this before destroying this object 768 */ 769 function __destruct() 770 { 771 if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode')) 772 { 773 if (!empty($this->data['items'])) 774 { 775 foreach ($this->data['items'] as $item) 776 { 777 $item->__destruct(); 778 } 779 unset($item, $this->data['items']); 780 } 781 if (!empty($this->data['ordered_items'])) 782 { 783 foreach ($this->data['ordered_items'] as $item) 784 { 785 $item->__destruct(); 786 } 787 unset($item, $this->data['ordered_items']); 788 } 789 } 790 } 791 792 /** 793 * Force the given data/URL to be treated as a feed no matter what it 794 * appears like 795 * 796 * @access public 797 * @since 1.1 798 * @param bool $enable Force the given data/URL to be treated as a feed 799 */ 800 function force_feed($enable = false) 801 { 802 $this->force_feed = (bool) $enable; 803 } 804 805 /** 806 * This is the URL of the feed you want to parse. 807 * 808 * This allows you to enter the URL of the feed you want to parse, or the 809 * website you want to try to use auto-discovery on. This takes priority 810 * over any set raw data. 811 * 812 * You can set multiple feeds to mash together by passing an array instead 813 * of a string for the $url. Remember that with each additional feed comes 814 * additional processing and resources. 815 * 816 * @access public 817 * @since 1.0 Preview Release 818 * @param mixed $url This is the URL (or array of URLs) that you want to parse. 819 * @see SimplePie::set_raw_data() 820 */ 821 function set_feed_url($url) 822 { 823 if (is_array($url)) 824 { 825 $this->multifeed_url = array(); 826 foreach ($url as $value) 827 { 828 $this->multifeed_url[] = SimplePie_Misc::fix_protocol($value, 1); 829 } 830 } 831 else 832 { 833 $this->feed_url = SimplePie_Misc::fix_protocol($url, 1); 834 } 835 } 836 837 /** 838 * Provides an instance of SimplePie_File to use as a feed 839 * 840 * @access public 841 * @param object &$file Instance of SimplePie_File (or subclass) 842 * @return bool True on success, false on failure 843 */ 844 function set_file(&$file) 845 { 846 if (is_a($file, 'SimplePie_File')) 847 { 848 $this->feed_url = $file->url; 849 $this->file =& $file; 850 return true; 851 } 852 return false; 853 } 854 855 /** 856 * Allows you to use a string of RSS/Atom data instead of a remote feed. 857 * 858 * If you have a feed available as a string in PHP, you can tell SimplePie 859 * to parse that data string instead of a remote feed. Any set feed URL 860 * takes precedence. 861 * 862 * @access public 863 * @since 1.0 Beta 3 864 * @param string $data RSS or Atom data as a string. 865 * @see SimplePie::set_feed_url() 866 */ 867 function set_raw_data($data) 868 { 869 $this->raw_data = $data; 870 } 871 872 /** 873 * Allows you to override the default timeout for fetching remote feeds. 874 * 875 * This allows you to change the maximum time the feed's server to respond 876 * and send the feed back. 877 * 878 * @access public 879 * @since 1.0 Beta 3 880 * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed. 881 */ 882 function set_timeout($timeout = 10) 883 { 884 $this->timeout = (int) $timeout; 885 } 886 887 /** 888 * Forces SimplePie to use fsockopen() instead of the preferred cURL 889 * functions. 890 * 891 * @access public 892 * @since 1.0 Beta 3 893 * @param bool $enable Force fsockopen() to be used 894 */ 895 function force_fsockopen($enable = false) 896 { 897 $this->force_fsockopen = (bool) $enable; 898 } 899 900 /** 901 * Outputs the raw XML content of the feed, after it has gone through 902 * SimplePie's filters. 903 * 904 * Used only for debugging, this function will output the XML content as 905 * text/xml. When SimplePie reads in a feed, it does a bit of cleaning up 906 * before trying to parse it. Many parts of the feed are re-written in 907 * memory, and in the end, you have a parsable feed. XML dump shows you the 908 * actual XML that SimplePie tries to parse, which may or may not be very 909 * different from the original feed. 910 * 911 * @access public 912 * @since 1.0 Preview Release 913 * @param bool $enable Enable XML dump 914 */ 915 function enable_xml_dump($enable = false) 916 { 917 $this->xml_dump = (bool) $enable; 918 } 919 920 /** 921 * Enables/disables caching in SimplePie. 922 * 923 * This option allows you to disable caching all-together in SimplePie. 924 * However, disabling the cache can lead to longer load times. 925 * 926 * @access public 927 * @since 1.0 Preview Release 928 * @param bool $enable Enable caching 929 */ 930 function enable_cache($enable = true) 931 { 932 $this->cache = (bool) $enable; 933 } 934 935 /** 936 * Set the length of time (in seconds) that the contents of a feed 937 * will be cached. 938 * 939 * @access public 940 * @param int $seconds The feed content cache duration. 941 */ 942 function set_cache_duration($seconds = 3600) 943 { 944 $this->cache_duration = (int) $seconds; 945 } 946 947 /** 948 * Set the length of time (in seconds) that the autodiscovered feed 949 * URL will be cached. 950 * 951 * @access public 952 * @param int $seconds The autodiscovered feed URL cache duration. 953 */ 954 function set_autodiscovery_cache_duration($seconds = 604800) 955 { 956 $this->autodiscovery_cache_duration = (int) $seconds; 957 } 958 959 /** 960 * Set the file system location where the cached files should be stored. 961 * 962 * @access public 963 * @param string $location The file system location. 964 */ 965 function set_cache_location($location = './cache') 966 { 967 $this->cache_location = (string) $location; 968 } 969 970 /** 971 * Determines whether feed items should be sorted into reverse chronological order. 972 * 973 * @access public 974 * @param bool $enable Sort as reverse chronological order. 975 */ 976 function enable_order_by_date($enable = true) 977 { 978 $this->order_by_date = (bool) $enable; 979 } 980 981 /** 982 * Allows you to override the character encoding reported by the feed. 983 * 984 * @access public 985 * @param string $encoding Character encoding. 986 */ 987 function set_input_encoding($encoding = false) 988 { 989 if ($encoding) 990 { 991 $this->input_encoding = (string) $encoding; 992 } 993 else 994 { 995 $this->input_encoding = false; 996 } 997 } 998 999 /** 1000 * Set how much feed autodiscovery to do 1001 * 1002 * @access public 1003 * @see SIMPLEPIE_LOCATOR_NONE 1004 * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY 1005 * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION 1006 * @see SIMPLEPIE_LOCATOR_LOCAL_BODY 1007 * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION 1008 * @see SIMPLEPIE_LOCATOR_REMOTE_BODY 1009 * @see SIMPLEPIE_LOCATOR_ALL 1010 * @param int $level Feed Autodiscovery Level (level can be a 1011 * combination of the above constants, see bitwise OR operator) 1012 */ 1013 function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL) 1014 { 1015 $this->autodiscovery = (int) $level; 1016 } 1017 1018 /** 1019 * Allows you to change which class SimplePie uses for caching. 1020 * Useful when you are overloading or extending SimplePie's default classes. 1021 * 1022 * @access public 1023 * @param string $class Name of custom class. 1024 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1025 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1026 */ 1027 function set_cache_class($class = 'SimplePie_Cache') 1028 { 1029 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Cache')) 1030 { 1031 $this->cache_class = $class; 1032 return true; 1033 } 1034 return false; 1035 } 1036 1037 /** 1038 * Allows you to change which class SimplePie uses for auto-discovery. 1039 * Useful when you are overloading or extending SimplePie's default classes. 1040 * 1041 * @access public 1042 * @param string $class Name of custom class. 1043 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1044 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1045 */ 1046 function set_locator_class($class = 'SimplePie_Locator') 1047 { 1048 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Locator')) 1049 { 1050 $this->locator_class = $class; 1051 return true; 1052 } 1053 return false; 1054 } 1055 1056 /** 1057 * Allows you to change which class SimplePie uses for XML parsing. 1058 * Useful when you are overloading or extending SimplePie's default classes. 1059 * 1060 * @access public 1061 * @param string $class Name of custom class. 1062 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1063 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1064 */ 1065 function set_parser_class($class = 'SimplePie_Parser') 1066 { 1067 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Parser')) 1068 { 1069 $this->parser_class = $class; 1070 return true; 1071 } 1072 return false; 1073 } 1074 1075 /** 1076 * Allows you to change which class SimplePie uses for remote file fetching. 1077 * Useful when you are overloading or extending SimplePie's default classes. 1078 * 1079 * @access public 1080 * @param string $class Name of custom class. 1081 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1082 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1083 */ 1084 function set_file_class($class = 'SimplePie_File') 1085 { 1086 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_File')) 1087 { 1088 $this->file_class = $class; 1089 return true; 1090 } 1091 return false; 1092 } 1093 1094 /** 1095 * Allows you to change which class SimplePie uses for data sanitization. 1096 * Useful when you are overloading or extending SimplePie's default classes. 1097 * 1098 * @access public 1099 * @param string $class Name of custom class. 1100 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1101 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1102 */ 1103 function set_sanitize_class($class = 'SimplePie_Sanitize') 1104 { 1105 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Sanitize')) 1106 { 1107 $this->sanitize =& new $class; 1108 return true; 1109 } 1110 return false; 1111 } 1112 1113 /** 1114 * Allows you to change which class SimplePie uses for handling feed items. 1115 * Useful when you are overloading or extending SimplePie's default classes. 1116 * 1117 * @access public 1118 * @param string $class Name of custom class. 1119 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1120 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1121 */ 1122 function set_item_class($class = 'SimplePie_Item') 1123 { 1124 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Item')) 1125 { 1126 $this->item_class = $class; 1127 return true; 1128 } 1129 return false; 1130 } 1131 1132 /** 1133 * Allows you to change which class SimplePie uses for handling author data. 1134 * Useful when you are overloading or extending SimplePie's default classes. 1135 * 1136 * @access public 1137 * @param string $class Name of custom class. 1138 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1139 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1140 */ 1141 function set_author_class($class = 'SimplePie_Author') 1142 { 1143 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Author')) 1144 { 1145 $this->author_class = $class; 1146 return true; 1147 } 1148 return false; 1149 } 1150 1151 /** 1152 * Allows you to change which class SimplePie uses for handling category data. 1153 * Useful when you are overloading or extending SimplePie's default classes. 1154 * 1155 * @access public 1156 * @param string $class Name of custom class. 1157 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1158 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1159 */ 1160 function set_category_class($class = 'SimplePie_Category') 1161 { 1162 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Category')) 1163 { 1164 $this->category_class = $class; 1165 return true; 1166 } 1167 return false; 1168 } 1169 1170 /** 1171 * Allows you to change which class SimplePie uses for feed enclosures. 1172 * Useful when you are overloading or extending SimplePie's default classes. 1173 * 1174 * @access public 1175 * @param string $class Name of custom class. 1176 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1177 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1178 */ 1179 function set_enclosure_class($class = 'SimplePie_Enclosure') 1180 { 1181 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Enclosure')) 1182 { 1183 $this->enclosure_class = $class; 1184 return true; 1185 } 1186 return false; 1187 } 1188 1189 /** 1190 * Allows you to change which class SimplePie uses for <media:text> captions 1191 * Useful when you are overloading or extending SimplePie's default classes. 1192 * 1193 * @access public 1194 * @param string $class Name of custom class. 1195 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1196 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1197 */ 1198 function set_caption_class($class = 'SimplePie_Caption') 1199 { 1200 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Caption')) 1201 { 1202 $this->caption_class = $class; 1203 return true; 1204 } 1205 return false; 1206 } 1207 1208 /** 1209 * Allows you to change which class SimplePie uses for <media:copyright> 1210 * Useful when you are overloading or extending SimplePie's default classes. 1211 * 1212 * @access public 1213 * @param string $class Name of custom class. 1214 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1215 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1216 */ 1217 function set_copyright_class($class = 'SimplePie_Copyright') 1218 { 1219 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Copyright')) 1220 { 1221 $this->copyright_class = $class; 1222 return true; 1223 } 1224 return false; 1225 } 1226 1227 /** 1228 * Allows you to change which class SimplePie uses for <media:credit> 1229 * Useful when you are overloading or extending SimplePie's default classes. 1230 * 1231 * @access public 1232 * @param string $class Name of custom class. 1233 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1234 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1235 */ 1236 function set_credit_class($class = 'SimplePie_Credit') 1237 { 1238 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Credit')) 1239 { 1240 $this->credit_class = $class; 1241 return true; 1242 } 1243 return false; 1244 } 1245 1246 /** 1247 * Allows you to change which class SimplePie uses for <media:rating> 1248 * Useful when you are overloading or extending SimplePie's default classes. 1249 * 1250 * @access public 1251 * @param string $class Name of custom class. 1252 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1253 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1254 */ 1255 function set_rating_class($class = 'SimplePie_Rating') 1256 { 1257 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Rating')) 1258 { 1259 $this->rating_class = $class; 1260 return true; 1261 } 1262 return false; 1263 } 1264 1265 /** 1266 * Allows you to change which class SimplePie uses for <media:restriction> 1267 * Useful when you are overloading or extending SimplePie's default classes. 1268 * 1269 * @access public 1270 * @param string $class Name of custom class. 1271 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1272 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1273 */ 1274 function set_restriction_class($class = 'SimplePie_Restriction') 1275 { 1276 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Restriction')) 1277 { 1278 $this->restriction_class = $class; 1279 return true; 1280 } 1281 return false; 1282 } 1283 1284 /** 1285 * Allows you to change which class SimplePie uses for content-type sniffing. 1286 * Useful when you are overloading or extending SimplePie's default classes. 1287 * 1288 * @access public 1289 * @param string $class Name of custom class. 1290 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1291 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1292 */ 1293 function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer') 1294 { 1295 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Content_Type_Sniffer')) 1296 { 1297 $this->content_type_sniffer_class = $class; 1298 return true; 1299 } 1300 return false; 1301 } 1302 1303 /** 1304 * Allows you to change which class SimplePie uses item sources. 1305 * Useful when you are overloading or extending SimplePie's default classes. 1306 * 1307 * @access public 1308 * @param string $class Name of custom class. 1309 * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation 1310 * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation 1311 */ 1312 function set_source_class($class = 'SimplePie_Source') 1313 { 1314 if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Source')) 1315 { 1316 $this->source_class = $class; 1317 return true; 1318 } 1319 return false; 1320 } 1321 1322 /** 1323 * Allows you to override the default user agent string. 1324 * 1325 * @access public 1326 * @param string $ua New user agent string. 1327 */ 1328 function set_useragent($ua = SIMPLEPIE_USERAGENT) 1329 { 1330 $this->useragent = (string) $ua; 1331 } 1332 1333 /** 1334 * Set callback function to create cache filename with 1335 * 1336 * @access public 1337 * @param mixed $function Callback function 1338 */ 1339 function set_cache_name_function($function = 'md5') 1340 { 1341 if (is_callable($function)) 1342 { 1343 $this->cache_name_function = $function; 1344 } 1345 } 1346 1347 /** 1348 * Set javascript query string parameter 1349 * 1350 * @access public 1351 * @param mixed $get Javascript query string parameter 1352 */ 1353 function set_javascript($get = 'js') 1354 { 1355 if ($get) 1356 { 1357 $this->javascript = (string) $get; 1358 } 1359 else 1360 { 1361 $this->javascript = false; 1362 } 1363 } 1364 1365 /** 1366 * Set options to make SP as fast as possible. Forgoes a 1367 * substantial amount of data sanitization in favor of speed. 1368 * 1369 * @access public 1370 * @param bool $set Whether to set them or not 1371 */ 1372 function set_stupidly_fast($set = false) 1373 { 1374 if ($set) 1375 { 1376 $this->enable_order_by_date(false); 1377 $this->remove_div(false); 1378 $this->strip_comments(false); 1379 $this->strip_htmltags(false); 1380 $this->strip_attributes(false); 1381 $this->set_image_handler(false); 1382 } 1383 } 1384 1385 /** 1386 * Set maximum number of feeds to check with autodiscovery 1387 * 1388 * @access public 1389 * @param int $max Maximum number of feeds to check 1390 */ 1391 function set_max_checked_feeds($max = 10) 1392 { 1393 $this->max_checked_feeds = (int) $max; 1394 } 1395 1396 function remove_div($enable = true) 1397 { 1398 $this->sanitize->remove_div($enable); 1399 } 1400 1401 function strip_htmltags($tags = '', $encode = null) 1402 { 1403 if ($tags === '') 1404 { 1405 $tags = $this->strip_htmltags; 1406 } 1407 $this->sanitize->strip_htmltags($tags); 1408 if ($encode !== null) 1409 { 1410 $this->sanitize->encode_instead_of_strip($tags); 1411 } 1412 } 1413 1414 function encode_instead_of_strip($enable = true) 1415 { 1416 $this->sanitize->encode_instead_of_strip($enable); 1417 } 1418 1419 function strip_attributes($attribs = '') 1420 { 1421 if ($attribs === '') 1422 { 1423 $attribs = $this->strip_attributes; 1424 } 1425 $this->sanitize->strip_attributes($attribs); 1426 } 1427 1428 function set_output_encoding($encoding = 'UTF-8') 1429 { 1430 $this->sanitize->set_output_encoding($encoding); 1431 } 1432 1433 function strip_comments($strip = false) 1434 { 1435 $this->sanitize->strip_comments($strip); 1436 } 1437 1438 /** 1439 * Set element/attribute key/value pairs of HTML attributes 1440 * containing URLs that need to be resolved relative to the feed 1441 * 1442 * @access public 1443 * @since 1.0 1444 * @param array $element_attribute Element/attribute key/value pairs 1445 */ 1446 function set_url_replacements($element_attribute = array('a' => 'href', 'area' => 'href', 'blockquote' => 'cite', 'del' => 'cite', 'form' => 'action', 'img' => array('longdesc', 'src'), 'input' => 'src', 'ins' => 'cite', 'q' => 'cite')) 1447 { 1448 $this->sanitize->set_url_replacements($element_attribute); 1449 } 1450 1451 /** 1452 * Set the handler to enable the display of cached favicons. 1453 * 1454 * @access public 1455 * @param str $page Web-accessible path to the handler_favicon.php file. 1456 * @param str $qs The query string that the value should be passed to. 1457 */ 1458 function set_favicon_handler($page = false, $qs = 'i') 1459 { 1460 if ($page !== false) 1461 { 1462 $this->favicon_handler = $page . '?' . $qs . '='; 1463 } 1464 else 1465 { 1466 $this->favicon_handler = ''; 1467 } 1468 } 1469 1470 /** 1471 * Set the handler to enable the display of cached images. 1472 * 1473 * @access public 1474 * @param str $page Web-accessible path to the handler_image.php file. 1475 * @param str $qs The query string that the value should be passed to. 1476 */ 1477 function set_image_handler($page = false, $qs = 'i') 1478 { 1479 if ($page !== false) 1480 { 1481 $this->sanitize->set_image_handler($page . '?' . $qs . '='); 1482 } 1483 else 1484 { 1485 $this->image_handler = ''; 1486 } 1487 } 1488 1489 /** 1490 * Set the limit for items returned per-feed with multifeeds. 1491 * 1492 * @access public 1493 * @param integer $limit The maximum number of items to return. 1494 */ 1495 function set_item_limit($limit = 0) 1496 { 1497 $this->item_limit = (int) $limit; 1498 } 1499 1500 function init() 1501 { 1502 // Check absolute bare minimum requirements. 1503 if ((function_exists('version_compare') && version_compare(PHP_VERSION, '4.3.0', '<')) || !extension_loaded('xml') || !extension_loaded('pcre')) 1504 { 1505 return false; 1506 } 1507 // Then check the xml extension is sane (i.e., libxml 2.7.x issue on PHP < 5.2.9 and libxml 2.7.0 to 2.7.2 on any version) if we don't have xmlreader. 1508 elseif (!extension_loaded('xmlreader')) 1509 { 1510 static $xml_is_sane = null; 1511 if ($xml_is_sane === null) 1512 { 1513 $parser_check = xml_parser_create(); 1514 xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); 1515 xml_parser_free($parser_check); 1516 $xml_is_sane = isset($values[0]['value']); 1517 } 1518 if (!$xml_is_sane) 1519 { 1520 return false; 1521 } 1522 } 1523 1524 if (isset($_GET[$this->javascript])) 1525 { 1526 SimplePie_Misc::output_javascript(); 1527 exit; 1528 } 1529 1530 // Pass whatever was set with config options over to the sanitizer. 1531 $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->cache_class); 1532 $this->sanitize->pass_file_data($this->file_class, $this->timeout, $this->useragent, $this->force_fsockopen); 1533 1534 if ($this->feed_url !== null || $this->raw_data !== null) 1535 { 1536 $this->data = array(); 1537 $this->multifeed_objects = array(); 1538 $cache = false; 1539 1540 if ($this->feed_url !== null) 1541 { 1542 $parsed_feed_url = SimplePie_Misc::parse_url($this->feed_url); 1543 // Decide whether to enable caching 1544 if ($this->cache && $parsed_feed_url['scheme'] !== '') 1545 { 1546 $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'); 1547 } 1548 // If it's enabled and we don't want an XML dump, use the cache 1549 if ($cache && !$this->xml_dump) 1550 { 1551 // Load the Cache 1552 $this->data = $cache->load(); 1553 if (!empty($this->data)) 1554 { 1555 // If the cache is for an outdated build of SimplePie 1556 if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD) 1557 { 1558 $cache->unlink(); 1559 $this->data = array(); 1560 } 1561 // If we've hit a collision just rerun it with caching disabled 1562 elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url) 1563 { 1564 $cache = false; 1565 $this->data = array(); 1566 } 1567 // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL. 1568 elseif (isset($this->data['feed_url'])) 1569 { 1570 // If the autodiscovery cache is still valid use it. 1571 if ($cache->mtime() + $this->autodiscovery_cache_duration > time()) 1572 { 1573 // Do not need to do feed autodiscovery yet. 1574 if ($this->data['feed_url'] === $this->data['url']) 1575 { 1576 $cache->unlink(); 1577 $this->data = array(); 1578 } 1579 else 1580 { 1581 $this->set_feed_url($this->data['feed_url']); 1582 return $this->init(); 1583 } 1584 } 1585 } 1586 // Check if the cache has been updated 1587 elseif ($cache->mtime() + $this->cache_duration < time()) 1588 { 1589 // If we have last-modified and/or etag set 1590 if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag'])) 1591 { 1592 $headers = array(); 1593 if (isset($this->data['headers']['last-modified'])) 1594 { 1595 $headers['if-modified-since'] = $this->data['headers']['last-modified']; 1596 } 1597 if (isset($this->data['headers']['etag'])) 1598 { 1599 $headers['if-none-match'] = '"' . $this->data['headers']['etag'] . '"'; 1600 } 1601 $file =& new $this->file_class($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen); 1602 if ($file->success) 1603 { 1604 if ($file->status_code === 304) 1605 { 1606 $cache->touch(); 1607 return true; 1608 } 1609 else 1610 { 1611 $headers = $file->headers; 1612 } 1613 } 1614 else 1615 { 1616 unset($file); 1617 } 1618 } 1619 } 1620 // If the cache is still valid, just return true 1621 else 1622 { 1623 return true; 1624 } 1625 } 1626 // If the cache is empty, delete it 1627 else 1628 { 1629 $cache->unlink(); 1630 $this->data = array(); 1631 } 1632 } 1633 // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it. 1634 if (!isset($file)) 1635 { 1636 if (is_a($this->file, 'SimplePie_File') && $this->file->url === $this->feed_url) 1637 { 1638 $file =& $this->file; 1639 } 1640 else 1641 { 1642 $file =& new $this->file_class($this->feed_url, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen); 1643 } 1644 } 1645 // If the file connection has an error, set SimplePie::error to that and quit 1646 if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) 1647 { 1648 $this->error = $file->error; 1649 if (!empty($this->data)) 1650 { 1651 return true; 1652 } 1653 else 1654 { 1655 return false; 1656 } 1657 } 1658 1659 if (!$this->force_feed) 1660 { 1661 // Check if the supplied URL is a feed, if it isn't, look for it. 1662 $locate =& new $this->locator_class($file, $this->timeout, $this->useragent, $this->file_class, $this->max_checked_feeds, $this->content_type_sniffer_class); 1663 if (!$locate->is_feed($file)) 1664 { 1665 // We need to unset this so that if SimplePie::set_file() has been called that object is untouched 1666 unset($file); 1667 if ($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds)) 1668 { 1669 if ($cache) 1670 { 1671 $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD); 1672 if (!$cache->save($this)) 1673 { 1674 trigger_error("$this->cache_location is not writeable", E_USER_WARNING); 1675 } 1676 $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'); 1677 } 1678 $this->feed_url = $file->url; 1679 } 1680 else 1681 { 1682 $this->error = "A feed could not be found at $this->feed_url"; 1683 SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); 1684 return false; 1685 } 1686 } 1687 $locate = null; 1688 } 1689 1690 $headers = $file->headers; 1691 $data = $file->body; 1692 $sniffer =& new $this->content_type_sniffer_class($file); 1693 $sniffed = $sniffer->get_type(); 1694 } 1695 else 1696 { 1697 $data = $this->raw_data; 1698 } 1699 1700 // Set up array of possible encodings 1701 $encodings = array(); 1702 1703 // First check to see if input has been overridden. 1704 if ($this->input_encoding !== false) 1705 { 1706 $encodings[] = $this->input_encoding; 1707 } 1708 1709 $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity'); 1710 $text_types = array('text/xml', 'text/xml-external-parsed-entity'); 1711 1712 // RFC 3023 (only applies to sniffed content) 1713 if (isset($sniffed)) 1714 { 1715 if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml') 1716 { 1717 if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) 1718 { 1719 $encodings[] = strtoupper($charset[1]); 1720 } 1721 $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data)); 1722 $encodings[] = 'UTF-8'; 1723 } 1724 elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml') 1725 { 1726 if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) 1727 { 1728 $encodings[] = $charset[1]; 1729 } 1730 $encodings[] = 'US-ASCII'; 1731 } 1732 // Text MIME-type default 1733 elseif (substr($sniffed, 0, 5) === 'text/') 1734 { 1735 $encodings[] = 'US-ASCII'; 1736 } 1737 } 1738 1739 // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1 1740 $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data)); 1741 $encodings[] = 'UTF-8'; 1742 $encodings[] = 'ISO-8859-1'; 1743 1744 // There's no point in trying an encoding twice 1745 $encodings = array_unique($encodings); 1746 1747 // If we want the XML, just output that with the most likely encoding and quit 1748 if ($this->xml_dump) 1749 { 1750 header('Content-type: text/xml; charset=' . $encodings[0]); 1751 echo $data; 1752 exit; 1753 } 1754 1755 // Loop through each possible encoding, till we return something, or run out of possibilities 1756 foreach ($encodings as $encoding) 1757 { 1758 // Change the encoding to UTF-8 (as we always use UTF-8 internally) 1759 if ($utf8_data = SimplePie_Misc::change_encoding($data, $encoding, 'UTF-8')) 1760 { 1761 // Create new parser 1762 $parser =& new $this->parser_class(); 1763 1764 // If it's parsed fine 1765 if ($parser->parse($utf8_data, 'UTF-8')) 1766 { 1767 $this->data = $parser->get_data(); 1768 if ($this->get_type() & ~SIMPLEPIE_TYPE_NONE) 1769 { 1770 if (isset($headers)) 1771 { 1772 $this->data['headers'] = $headers; 1773 } 1774 $this->data['build'] = SIMPLEPIE_BUILD; 1775 1776 // Cache the file if caching is enabled 1777 if ($cache && !$cache->save($this)) 1778 { 1779 trigger_error("$cache->name is not writeable", E_USER_WARNING); 1780 } 1781 return true; 1782 } 1783 else 1784 { 1785 $this->error = "A feed could not be found at $this->feed_url"; 1786 SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); 1787 return false; 1788 } 1789 } 1790 } 1791 } 1792 if(isset($parser)) 1793 { 1794 // We have an error, just set SimplePie_Misc::error to it and quit 1795 $this->error = sprintf('XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column()); 1796 } 1797 else 1798 { 1799 $this->error = 'The data could not be converted to UTF-8'; 1800 } 1801 SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__); 1802 return false; 1803 } 1804 elseif (!empty($this->multifeed_url)) 1805 { 1806 $i = 0; 1807 $success = 0; 1808 $this->multifeed_objects = array(); 1809 foreach ($this->multifeed_url as $url) 1810 { 1811 if (SIMPLEPIE_PHP5) 1812 { 1813 // This keyword needs to defy coding standards for PHP4 compatibility 1814 $this->multifeed_objects[$i] = clone($this); 1815 } 1816 else 1817 { 1818 $this->multifeed_objects[$i] = $this; 1819 } 1820 $this->multifeed_objects[$i]->set_feed_url($url); 1821 $success |= $this->multifeed_objects[$i]->init(); 1822 $i++; 1823 } 1824 return (bool) $success; 1825 } 1826 else 1827 { 1828 return false; 1829 } 1830 } 1831 1832 /** 1833 * Return the error message for the occured error 1834 * 1835 * @access public 1836 * @return string Error message 1837 */ 1838 function error() 1839 { 1840 return $this->error; 1841 } 1842 1843 function get_encoding() 1844 { 1845 return $this->sanitize->output_encoding; 1846 } 1847 1848 function handle_content_type($mime = 'text/html') 1849 { 1850 if (!headers_sent()) 1851 { 1852 $header = "Content-type: $mime;"; 1853 if ($this->get_encoding()) 1854 { 1855 $header .= ' charset=' . $this->get_encoding(); 1856 } 1857 else 1858 { 1859 $header .= ' charset=UTF-8'; 1860 } 1861 header($header); 1862 } 1863 } 1864 1865 function get_type() 1866 { 1867 if (!isset($this->data['type'])) 1868 { 1869 $this->data['type'] = SIMPLEPIE_TYPE_ALL; 1870 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'])) 1871 { 1872 $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10; 1873 } 1874 elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'])) 1875 { 1876 $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03; 1877 } 1878 elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'])) 1879 { 1880 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel']) 1881 || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image']) 1882 || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']) 1883 || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput'])) 1884 { 1885 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_10; 1886 } 1887 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel']) 1888 || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image']) 1889 || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']) 1890 || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput'])) 1891 { 1892 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090; 1893 } 1894 } 1895 elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'])) 1896 { 1897 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL; 1898 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) 1899 { 1900 switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) 1901 { 1902 case '0.91': 1903 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091; 1904 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) 1905 { 1906 switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) 1907 { 1908 case '0': 1909 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE; 1910 break; 1911 1912 case '24': 1913 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND; 1914 break; 1915 } 1916 } 1917 break; 1918 1919 case '0.92': 1920 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_092; 1921 break; 1922 1923 case '0.93': 1924 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_093; 1925 break; 1926 1927 case '0.94': 1928 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_094; 1929 break; 1930 1931 case '2.0': 1932 $this->data['type'] &= SIMPLEPIE_TYPE_RSS_20; 1933 break; 1934 } 1935 } 1936 } 1937 else 1938 { 1939 $this->data['type'] = SIMPLEPIE_TYPE_NONE; 1940 } 1941 } 1942 return $this->data['type']; 1943 } 1944 1945 /** 1946 * Returns the URL for the favicon of the feed's website. 1947 * 1948 * @todo Cache atom:icon 1949 * @access public 1950 * @since 1.0 1951 */ 1952 function get_favicon() 1953 { 1954 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) 1955 { 1956 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 1957 } 1958 elseif (($url = $this->get_link()) !== null && preg_match('/^http(s)?:\/\//i', $url)) 1959 { 1960 $favicon = SimplePie_Misc::absolutize_url('/favicon.ico', $url); 1961 1962 if ($this->cache && $this->favicon_handler) 1963 { 1964 $favicon_filename = call_user_func($this->cache_name_function, $favicon); 1965 $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $favicon_filename, 'spi'); 1966 1967 if ($cache->load()) 1968 { 1969 return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI); 1970 } 1971 else 1972 { 1973 $file =& new $this->file_class($favicon, $this->timeout / 10, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen); 1974 1975 if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)) && strlen($file->body) > 0) 1976 { 1977 $sniffer =& new $this->content_type_sniffer_class($file); 1978 if (substr($sniffer->get_type(), 0, 6) === 'image/') 1979 { 1980 if ($cache->save(array('headers' => $file->headers, 'body' => $file->body))) 1981 { 1982 return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI); 1983 } 1984 else 1985 { 1986 trigger_error("$cache->name is not writeable", E_USER_WARNING); 1987 return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI); 1988 } 1989 } 1990 // not an image 1991 else 1992 { 1993 return false; 1994 } 1995 } 1996 } 1997 } 1998 else 1999 { 2000 return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI); 2001 } 2002 } 2003 return false; 2004 } 2005 2006 /** 2007 * @todo If we have a perm redirect we should return the new URL 2008 * @todo When we make the above change, let's support <itunes:new-feed-url> as well 2009 * @todo Also, |atom:link|@rel=self 2010 */ 2011 function subscribe_url() 2012 { 2013 if ($this->feed_url !== null) 2014 { 2015 return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI); 2016 } 2017 else 2018 { 2019 return null; 2020 } 2021 } 2022 2023 function subscribe_feed() 2024 { 2025 if ($this->feed_url !== null) 2026 { 2027 return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI); 2028 } 2029 else 2030 { 2031 return null; 2032 } 2033 } 2034 2035 function subscribe_outlook() 2036 { 2037 if ($this->feed_url !== null) 2038 { 2039 return $this->sanitize('outlook' . SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI); 2040 } 2041 else 2042 { 2043 return null; 2044 } 2045 } 2046 2047 function subscribe_podcast() 2048 { 2049 if ($this->feed_url !== null) 2050 { 2051 return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 3), SIMPLEPIE_CONSTRUCT_IRI); 2052 } 2053 else 2054 { 2055 return null; 2056 } 2057 } 2058 2059 function subscribe_itunes() 2060 { 2061 if ($this->feed_url !== null) 2062 { 2063 return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 4), SIMPLEPIE_CONSTRUCT_IRI); 2064 } 2065 else 2066 { 2067 return null; 2068 } 2069 } 2070 2071 /** 2072 * Creates the subscribe_* methods' return data 2073 * 2074 * @access private 2075 * @param string $feed_url String to prefix to the feed URL 2076 * @param string $site_url String to prefix to the site URL (and 2077 * suffix to the feed URL) 2078 * @return mixed URL if feed exists, false otherwise 2079 */ 2080 function subscribe_service($feed_url, $site_url = null) 2081 { 2082 if ($this->subscribe_url()) 2083 { 2084 $return = $feed_url . rawurlencode($this->feed_url); 2085 if ($site_url !== null && $this->get_link() !== null) 2086 { 2087 $return .= $site_url . rawurlencode($this->get_link()); 2088 } 2089 return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI); 2090 } 2091 else 2092 { 2093 return null; 2094 } 2095 } 2096 2097 function subscribe_aol() 2098 { 2099 return $this->subscribe_service('http://feeds.my.aol.com/add.jsp?url='); 2100 } 2101 2102 function subscribe_bloglines() 2103 { 2104 return $this->subscribe_service('http://www.bloglines.com/sub/'); 2105 } 2106 2107 function subscribe_eskobo() 2108 { 2109 return $this->subscribe_service('http://www.eskobo.com/?AddToMyPage='); 2110 } 2111 2112 function subscribe_feedfeeds() 2113 { 2114 return $this->subscribe_service('http://www.feedfeeds.com/add?feed='); 2115 } 2116 2117 function subscribe_feedster() 2118 { 2119 return $this->subscribe_service('http://www.feedster.com/myfeedster.php?action=addrss&confirm=no&rssurl='); 2120 } 2121 2122 function subscribe_google() 2123 { 2124 return $this->subscribe_service('http://fusion.google.com/add?feedurl='); 2125 } 2126 2127 function subscribe_gritwire() 2128 { 2129 return $this->subscribe_service('http://my.gritwire.com/feeds/addExternalFeed.aspx?FeedUrl='); 2130 } 2131 2132 function subscribe_msn() 2133 { 2134 return $this->subscribe_service('http://my.msn.com/addtomymsn.armx?id=rss&ut=', '&ru='); 2135 } 2136 2137 function subscribe_netvibes() 2138 { 2139 return $this->subscribe_service('http://www.netvibes.com/subscribe.php?url='); 2140 } 2141 2142 function subscribe_newsburst() 2143 { 2144 return $this->subscribe_service('http://www.newsburst.com/Source/?add='); 2145 } 2146 2147 function subscribe_newsgator() 2148 { 2149 return $this->subscribe_service('http://www.newsgator.com/ngs/subscriber/subext.aspx?url='); 2150 } 2151 2152 function subscribe_odeo() 2153 { 2154 return $this->subscribe_service('http://www.odeo.com/listen/subscribe?feed='); 2155 } 2156 2157 function subscribe_podnova() 2158 { 2159 return $this->subscribe_service('http://www.podnova.com/index_your_podcasts.srf?action=add&url='); 2160 } 2161 2162 function subscribe_rojo() 2163 { 2164 return $this->subscribe_service('http://www.rojo.com/add-subscription?resource='); 2165 } 2166 2167 function subscribe_yahoo() 2168 { 2169 return $this->subscribe_service('http://add.my.yahoo.com/rss?url='); 2170 } 2171 2172 function get_feed_tags($namespace, $tag) 2173 { 2174 $type = $this->get_type(); 2175 if ($type & SIMPLEPIE_TYPE_ATOM_10) 2176 { 2177 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag])) 2178 { 2179 return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]; 2180 } 2181 } 2182 if ($type & SIMPLEPIE_TYPE_ATOM_03) 2183 { 2184 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag])) 2185 { 2186 return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]; 2187 } 2188 } 2189 if ($type & SIMPLEPIE_TYPE_RSS_RDF) 2190 { 2191 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag])) 2192 { 2193 return $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]; 2194 } 2195 } 2196 if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) 2197 { 2198 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag])) 2199 { 2200 return $this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]; 2201 } 2202 } 2203 return null; 2204 } 2205 2206 function get_channel_tags($namespace, $tag) 2207 { 2208 $type = $this->get_type(); 2209 if ($type & SIMPLEPIE_TYPE_ATOM_ALL) 2210 { 2211 if ($return = $this->get_feed_tags($namespace, $tag)) 2212 { 2213 return $return; 2214 } 2215 } 2216 if ($type & SIMPLEPIE_TYPE_RSS_10) 2217 { 2218 if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel')) 2219 { 2220 if (isset($channel[0]['child'][$namespace][$tag])) 2221 { 2222 return $channel[0]['child'][$namespace][$tag]; 2223 } 2224 } 2225 } 2226 if ($type & SIMPLEPIE_TYPE_RSS_090) 2227 { 2228 if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel')) 2229 { 2230 if (isset($channel[0]['child'][$namespace][$tag])) 2231 { 2232 return $channel[0]['child'][$namespace][$tag]; 2233 } 2234 } 2235 } 2236 if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) 2237 { 2238 if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel')) 2239 { 2240 if (isset($channel[0]['child'][$namespace][$tag])) 2241 { 2242 return $channel[0]['child'][$namespace][$tag]; 2243 } 2244 } 2245 } 2246 return null; 2247 } 2248 2249 function get_image_tags($namespace, $tag) 2250 { 2251 $type = $this->get_type(); 2252 if ($type & SIMPLEPIE_TYPE_RSS_10) 2253 { 2254 if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image')) 2255 { 2256 if (isset($image[0]['child'][$namespace][$tag])) 2257 { 2258 return $image[0]['child'][$namespace][$tag]; 2259 } 2260 } 2261 } 2262 if ($type & SIMPLEPIE_TYPE_RSS_090) 2263 { 2264 if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image')) 2265 { 2266 if (isset($image[0]['child'][$namespace][$tag])) 2267 { 2268 return $image[0]['child'][$namespace][$tag]; 2269 } 2270 } 2271 } 2272 if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) 2273 { 2274 if ($image = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'image')) 2275 { 2276 if (isset($image[0]['child'][$namespace][$tag])) 2277 { 2278 return $image[0]['child'][$namespace][$tag]; 2279 } 2280 } 2281 } 2282 return null; 2283 } 2284 2285 function get_base($element = array()) 2286 { 2287 if (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base'])) 2288 { 2289 return $element['xml_base']; 2290 } 2291 elseif ($this->get_link() !== null) 2292 { 2293 return $this->get_link(); 2294 } 2295 else 2296 { 2297 return $this->subscribe_url(); 2298 } 2299 } 2300 2301 function sanitize($data, $type, $base = '') 2302 { 2303 return $this->sanitize->sanitize($data, $type, $base); 2304 } 2305 2306 function get_title() 2307 { 2308 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) 2309 { 2310 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 2311 } 2312 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) 2313 { 2314 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 2315 } 2316 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) 2317 { 2318 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 2319 } 2320 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) 2321 { 2322 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 2323 } 2324 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) 2325 { 2326 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 2327 } 2328 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) 2329 { 2330 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2331 } 2332 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) 2333 { 2334 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2335 } 2336 else 2337 { 2338 return null; 2339 } 2340 } 2341 2342 function get_category($key = 0) 2343 { 2344 $categories = $this->get_categories(); 2345 if (isset($categories[$key])) 2346 { 2347 return $categories[$key]; 2348 } 2349 else 2350 { 2351 return null; 2352 } 2353 } 2354 2355 function get_categories() 2356 { 2357 $categories = array(); 2358 2359 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) 2360 { 2361 $term = null; 2362 $scheme = null; 2363 $label = null; 2364 if (isset($category['attribs']['']['term'])) 2365 { 2366 $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); 2367 } 2368 if (isset($category['attribs']['']['scheme'])) 2369 { 2370 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 2371 } 2372 if (isset($category['attribs']['']['label'])) 2373 { 2374 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 2375 } 2376 $categories[] =& new $this->category_class($term, $scheme, $label); 2377 } 2378 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) 2379 { 2380 // This is really the label, but keep this as the term also for BC. 2381 // Label will also work on retrieving because that falls back to term. 2382 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2383 if (isset($category['attribs']['']['domain'])) 2384 { 2385 $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); 2386 } 2387 else 2388 { 2389 $scheme = null; 2390 } 2391 $categories[] =& new $this->category_class($term, $scheme, null); 2392 } 2393 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) 2394 { 2395 $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 2396 } 2397 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) 2398 { 2399 $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 2400 } 2401 2402 if (!empty($categories)) 2403 { 2404 return SimplePie_Misc::array_unique($categories); 2405 } 2406 else 2407 { 2408 return null; 2409 } 2410 } 2411 2412 function get_author($key = 0) 2413 { 2414 $authors = $this->get_authors(); 2415 if (isset($authors[$key])) 2416 { 2417 return $authors[$key]; 2418 } 2419 else 2420 { 2421 return null; 2422 } 2423 } 2424 2425 function get_authors() 2426 { 2427 $authors = array(); 2428 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) 2429 { 2430 $name = null; 2431 $uri = null; 2432 $email = null; 2433 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) 2434 { 2435 $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2436 } 2437 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) 2438 { 2439 $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); 2440 } 2441 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) 2442 { 2443 $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2444 } 2445 if ($name !== null || $email !== null || $uri !== null) 2446 { 2447 $authors[] =& new $this->author_class($name, $uri, $email); 2448 } 2449 } 2450 if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) 2451 { 2452 $name = null; 2453 $url = null; 2454 $email = null; 2455 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) 2456 { 2457 $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2458 } 2459 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) 2460 { 2461 $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); 2462 } 2463 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) 2464 { 2465 $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2466 } 2467 if ($name !== null || $email !== null || $url !== null) 2468 { 2469 $authors[] =& new $this->author_class($name, $url, $email); 2470 } 2471 } 2472 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) 2473 { 2474 $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 2475 } 2476 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) 2477 { 2478 $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 2479 } 2480 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) 2481 { 2482 $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 2483 } 2484 2485 if (!empty($authors)) 2486 { 2487 return SimplePie_Misc::array_unique($authors); 2488 } 2489 else 2490 { 2491 return null; 2492 } 2493 } 2494 2495 function get_contributor($key = 0) 2496 { 2497 $contributors = $this->get_contributors(); 2498 if (isset($contributors[$key])) 2499 { 2500 return $contributors[$key]; 2501 } 2502 else 2503 { 2504 return null; 2505 } 2506 } 2507 2508 function get_contributors() 2509 { 2510 $contributors = array(); 2511 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) 2512 { 2513 $name = null; 2514 $uri = null; 2515 $email = null; 2516 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) 2517 { 2518 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2519 } 2520 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) 2521 { 2522 $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); 2523 } 2524 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) 2525 { 2526 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2527 } 2528 if ($name !== null || $email !== null || $uri !== null) 2529 { 2530 $contributors[] =& new $this->author_class($name, $uri, $email); 2531 } 2532 } 2533 foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) 2534 { 2535 $name = null; 2536 $url = null; 2537 $email = null; 2538 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) 2539 { 2540 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2541 } 2542 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) 2543 { 2544 $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); 2545 } 2546 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) 2547 { 2548 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2549 } 2550 if ($name !== null || $email !== null || $url !== null) 2551 { 2552 $contributors[] =& new $this->author_class($name, $url, $email); 2553 } 2554 } 2555 2556 if (!empty($contributors)) 2557 { 2558 return SimplePie_Misc::array_unique($contributors); 2559 } 2560 else 2561 { 2562 return null; 2563 } 2564 } 2565 2566 function get_link($key = 0, $rel = 'alternate') 2567 { 2568 $links = $this->get_links($rel); 2569 if (isset($links[$key])) 2570 { 2571 return $links[$key]; 2572 } 2573 else 2574 { 2575 return null; 2576 } 2577 } 2578 2579 /** 2580 * Added for parity between the parent-level and the item/entry-level. 2581 */ 2582 function get_permalink() 2583 { 2584 return $this->get_link(0); 2585 } 2586 2587 function get_links($rel = 'alternate') 2588 { 2589 if (!isset($this->data['links'])) 2590 { 2591 $this->data['links'] = array(); 2592 if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link')) 2593 { 2594 foreach ($links as $link) 2595 { 2596 if (isset($link['attribs']['']['href'])) 2597 { 2598 $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; 2599 $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 2600 } 2601 } 2602 } 2603 if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link')) 2604 { 2605 foreach ($links as $link) 2606 { 2607 if (isset($link['attribs']['']['href'])) 2608 { 2609 $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; 2610 $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 2611 2612 } 2613 } 2614 } 2615 if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) 2616 { 2617 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 2618 } 2619 if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) 2620 { 2621 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 2622 } 2623 if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) 2624 { 2625 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 2626 } 2627 2628 $keys = array_keys($this->data['links']); 2629 foreach ($keys as $key) 2630 { 2631 if (SimplePie_Misc::is_isegment_nz_nc($key)) 2632 { 2633 if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) 2634 { 2635 $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); 2636 $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; 2637 } 2638 else 2639 { 2640 $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; 2641 } 2642 } 2643 elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) 2644 { 2645 $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; 2646 } 2647 $this->data['links'][$key] = array_unique($this->data['links'][$key]); 2648 } 2649 } 2650 2651 if (isset($this->data['links'][$rel])) 2652 { 2653 return $this->data['links'][$rel]; 2654 } 2655 else 2656 { 2657 return null; 2658 } 2659 } 2660 2661 function get_all_discovered_feeds() 2662 { 2663 return $this->all_discovered_feeds; 2664 } 2665 2666 function get_description() 2667 { 2668 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) 2669 { 2670 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 2671 } 2672 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline')) 2673 { 2674 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 2675 } 2676 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) 2677 { 2678 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 2679 } 2680 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) 2681 { 2682 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 2683 } 2684 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) 2685 { 2686 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 2687 } 2688 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) 2689 { 2690 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2691 } 2692 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) 2693 { 2694 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2695 } 2696 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) 2697 { 2698 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 2699 } 2700 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) 2701 { 2702 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 2703 } 2704 else 2705 { 2706 return null; 2707 } 2708 } 2709 2710 function get_copyright() 2711 { 2712 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) 2713 { 2714 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 2715 } 2716 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright')) 2717 { 2718 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 2719 } 2720 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright')) 2721 { 2722 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2723 } 2724 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) 2725 { 2726 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2727 } 2728 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) 2729 { 2730 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2731 } 2732 else 2733 { 2734 return null; 2735 } 2736 } 2737 2738 function get_language() 2739 { 2740 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language')) 2741 { 2742 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2743 } 2744 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language')) 2745 { 2746 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2747 } 2748 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language')) 2749 { 2750 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2751 } 2752 elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'])) 2753 { 2754 return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); 2755 } 2756 elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'])) 2757 { 2758 return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); 2759 } 2760 elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'])) 2761 { 2762 return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); 2763 } 2764 elseif (isset($this->data['headers']['content-language'])) 2765 { 2766 return $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT); 2767 } 2768 else 2769 { 2770 return null; 2771 } 2772 } 2773 2774 function get_latitude() 2775 { 2776 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) 2777 { 2778 return (float) $return[0]['data']; 2779 } 2780 elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) 2781 { 2782 return (float) $match[1]; 2783 } 2784 else 2785 { 2786 return null; 2787 } 2788 } 2789 2790 function get_longitude() 2791 { 2792 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) 2793 { 2794 return (float) $return[0]['data']; 2795 } 2796 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) 2797 { 2798 return (float) $return[0]['data']; 2799 } 2800 elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) 2801 { 2802 return (float) $match[2]; 2803 } 2804 else 2805 { 2806 return null; 2807 } 2808 } 2809 2810 function get_image_title() 2811 { 2812 if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) 2813 { 2814 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2815 } 2816 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) 2817 { 2818 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2819 } 2820 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) 2821 { 2822 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2823 } 2824 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) 2825 { 2826 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2827 } 2828 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) 2829 { 2830 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 2831 } 2832 else 2833 { 2834 return null; 2835 } 2836 } 2837 2838 function get_image_url() 2839 { 2840 if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image')) 2841 { 2842 return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI); 2843 } 2844 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo')) 2845 { 2846 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2847 } 2848 elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) 2849 { 2850 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2851 } 2852 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'url')) 2853 { 2854 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2855 } 2856 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'url')) 2857 { 2858 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2859 } 2860 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) 2861 { 2862 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2863 } 2864 else 2865 { 2866 return null; 2867 } 2868 } 2869 2870 function get_image_link() 2871 { 2872 if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) 2873 { 2874 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2875 } 2876 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) 2877 { 2878 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2879 } 2880 elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) 2881 { 2882 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 2883 } 2884 else 2885 { 2886 return null; 2887 } 2888 } 2889 2890 function get_image_width() 2891 { 2892 if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'width')) 2893 { 2894 return round($return[0]['data']); 2895 } 2896 elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) 2897 { 2898 return 88.0; 2899 } 2900 else 2901 { 2902 return null; 2903 } 2904 } 2905 2906 function get_image_height() 2907 { 2908 if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'height')) 2909 { 2910 return round($return[0]['data']); 2911 } 2912 elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) 2913 { 2914 return 31.0; 2915 } 2916 else 2917 { 2918 return null; 2919 } 2920 } 2921 2922 function get_item_quantity($max = 0) 2923 { 2924 $max = (int) $max; 2925 $qty = count($this->get_items()); 2926 if ($max === 0) 2927 { 2928 return $qty; 2929 } 2930 else 2931 { 2932 return ($qty > $max) ? $max : $qty; 2933 } 2934 } 2935 2936 function get_item($key = 0) 2937 { 2938 $items = $this->get_items(); 2939 if (isset($items[$key])) 2940 { 2941 return $items[$key]; 2942 } 2943 else 2944 { 2945 return null; 2946 } 2947 } 2948 2949 function get_items($start = 0, $end = 0) 2950 { 2951 if (!isset($this->data['items'])) 2952 { 2953 if (!empty($this->multifeed_objects)) 2954 { 2955 $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit); 2956 } 2957 else 2958 { 2959 $this->data['items'] = array(); 2960 if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry')) 2961 { 2962 $keys = array_keys($items); 2963 foreach ($keys as $key) 2964 { 2965 $this->data['items'][] =& new $this->item_class($this, $items[$key]); 2966 } 2967 } 2968 if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry')) 2969 { 2970 $keys = array_keys($items); 2971 foreach ($keys as $key) 2972 { 2973 $this->data['items'][] =& new $this->item_class($this, $items[$key]); 2974 } 2975 } 2976 if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item')) 2977 { 2978 $keys = array_keys($items); 2979 foreach ($keys as $key) 2980 { 2981 $this->data['items'][] =& new $this->item_class($this, $items[$key]); 2982 } 2983 } 2984 if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item')) 2985 { 2986 $keys = array_keys($items); 2987 foreach ($keys as $key) 2988 { 2989 $this->data['items'][] =& new $this->item_class($this, $items[$key]); 2990 } 2991 } 2992 if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item')) 2993 { 2994 $keys = array_keys($items); 2995 foreach ($keys as $key) 2996 { 2997 $this->data['items'][] =& new $this->item_class($this, $items[$key]); 2998 } 2999 } 3000 } 3001 } 3002 3003 if (!empty($this->data['items'])) 3004 { 3005 // If we want to order it by date, check if all items have a date, and then sort it 3006 if ($this->order_by_date && empty($this->multifeed_objects)) 3007 { 3008 if (!isset($this->data['ordered_items'])) 3009 { 3010 $do_sort = true; 3011 foreach ($this->data['items'] as $item) 3012 { 3013 if (!$item->get_date('U')) 3014 { 3015 $do_sort = false; 3016 break; 3017 } 3018 } 3019 $item = null; 3020 $this->data['ordered_items'] = $this->data['items']; 3021 if ($do_sort) 3022 { 3023 usort($this->data['ordered_items'], array(&$this, 'sort_items')); 3024 } 3025 } 3026 $items = $this->data['ordered_items']; 3027 } 3028 else 3029 { 3030 $items = $this->data['items']; 3031 } 3032 3033 // Slice the data as desired 3034 if ($end === 0) 3035 { 3036 return array_slice($items, $start); 3037 } 3038 else 3039 { 3040 return array_slice($items, $start, $end); 3041 } 3042 } 3043 else 3044 { 3045 return array(); 3046 } 3047 } 3048 3049 /** 3050 * @static 3051 */ 3052 function sort_items($a, $b) 3053 { 3054 return $a->get_date('U') <= $b->get_date('U'); 3055 } 3056 3057 /** 3058 * @static 3059 */ 3060 function merge_items($urls, $start = 0, $end = 0, $limit = 0) 3061 { 3062 if (is_array($urls) && sizeof($urls) > 0) 3063 { 3064 $items = array(); 3065 foreach ($urls as $arg) 3066 { 3067 if (is_a($arg, 'SimplePie')) 3068 { 3069 $items = array_merge($items, $arg->get_items(0, $limit)); 3070 } 3071 else 3072 { 3073 trigger_error('Arguments must be SimplePie objects', E_USER_WARNING); 3074 } 3075 } 3076 3077 $do_sort = true; 3078 foreach ($items as $item) 3079 { 3080 if (!$item->get_date('U')) 3081 { 3082 $do_sort = false; 3083 break; 3084 } 3085 } 3086 $item = null; 3087 if ($do_sort) 3088 { 3089 usort($items, array('SimplePie', 'sort_items')); 3090 } 3091 3092 if ($end === 0) 3093 { 3094 return array_slice($items, $start); 3095 } 3096 else 3097 { 3098 return array_slice($items, $start, $end); 3099 } 3100 } 3101 else 3102 { 3103 trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING); 3104 return array(); 3105 } 3106 } 3107 } 3108 3109 class SimplePie_Item 3110 { 3111 var $feed; 3112 var $data = array(); 3113 3114 function SimplePie_Item($feed, $data) 3115 { 3116 $this->feed = $feed; 3117 $this->data = $data; 3118 } 3119 3120 function __toString() 3121 { 3122 return md5(serialize($this->data)); 3123 } 3124 3125 /** 3126 * Remove items that link back to this before destroying this object 3127 */ 3128 function __destruct() 3129 { 3130 if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode')) 3131 { 3132 unset($this->feed); 3133 } 3134 } 3135 3136 function get_item_tags($namespace, $tag) 3137 { 3138 if (isset($this->data['child'][$namespace][$tag])) 3139 { 3140 return $this->data['child'][$namespace][$tag]; 3141 } 3142 else 3143 { 3144 return null; 3145 } 3146 } 3147 3148 function get_base($element = array()) 3149 { 3150 return $this->feed->get_base($element); 3151 } 3152 3153 function sanitize($data, $type, $base = '') 3154 { 3155 return $this->feed->sanitize($data, $type, $base); 3156 } 3157 3158 function get_feed() 3159 { 3160 return $this->feed; 3161 } 3162 3163 function get_id($hash = false) 3164 { 3165 if (!$hash) 3166 { 3167 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id')) 3168 { 3169 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3170 } 3171 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id')) 3172 { 3173 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3174 } 3175 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid')) 3176 { 3177 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3178 } 3179 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier')) 3180 { 3181 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3182 } 3183 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier')) 3184 { 3185 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3186 } 3187 elseif (($return = $this->get_permalink()) !== null) 3188 { 3189 return $return; 3190 } 3191 elseif (($return = $this->get_title()) !== null) 3192 { 3193 return $return; 3194 } 3195 } 3196 if ($this->get_permalink() !== null || $this->get_title() !== null) 3197 { 3198 return md5($this->get_permalink() . $this->get_title()); 3199 } 3200 else 3201 { 3202 return md5(serialize($this->data)); 3203 } 3204 } 3205 3206 function get_title() 3207 { 3208 if (!isset($this->data['title'])) 3209 { 3210 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) 3211 { 3212 $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3213 } 3214 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) 3215 { 3216 $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3217 } 3218 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) 3219 { 3220 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 3221 } 3222 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) 3223 { 3224 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 3225 } 3226 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) 3227 { 3228 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 3229 } 3230 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) 3231 { 3232 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3233 } 3234 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) 3235 { 3236 $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3237 } 3238 else 3239 { 3240 $this->data['title'] = null; 3241 } 3242 } 3243 return $this->data['title']; 3244 } 3245 3246 function get_description($description_only = false) 3247 { 3248 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary')) 3249 { 3250 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3251 } 3252 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary')) 3253 { 3254 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3255 } 3256 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) 3257 { 3258 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 3259 } 3260 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) 3261 { 3262 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 3263 } 3264 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) 3265 { 3266 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3267 } 3268 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) 3269 { 3270 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3271 } 3272 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) 3273 { 3274 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 3275 } 3276 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) 3277 { 3278 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3279 } 3280 elseif (!$description_only) 3281 { 3282 return $this->get_content(true); 3283 } 3284 else 3285 { 3286 return null; 3287 } 3288 } 3289 3290 function get_content($content_only = false) 3291 { 3292 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content')) 3293 { 3294 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_content_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3295 } 3296 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content')) 3297 { 3298 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3299 } 3300 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded')) 3301 { 3302 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 3303 } 3304 elseif (!$content_only) 3305 { 3306 return $this->get_description(true); 3307 } 3308 else 3309 { 3310 return null; 3311 } 3312 } 3313 3314 function get_category($key = 0) 3315 { 3316 $categories = $this->get_categories(); 3317 if (isset($categories[$key])) 3318 { 3319 return $categories[$key]; 3320 } 3321 else 3322 { 3323 return null; 3324 } 3325 } 3326 3327 function get_categories() 3328 { 3329 $categories = array(); 3330 3331 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) 3332 { 3333 $term = null; 3334 $scheme = null; 3335 $label = null; 3336 if (isset($category['attribs']['']['term'])) 3337 { 3338 $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); 3339 } 3340 if (isset($category['attribs']['']['scheme'])) 3341 { 3342 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 3343 } 3344 if (isset($category['attribs']['']['label'])) 3345 { 3346 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 3347 } 3348 $categories[] =& new $this->feed->category_class($term, $scheme, $label); 3349 } 3350 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) 3351 { 3352 // This is really the label, but keep this as the term also for BC. 3353 // Label will also work on retrieving because that falls back to term. 3354 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3355 if (isset($category['attribs']['']['domain'])) 3356 { 3357 $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); 3358 } 3359 else 3360 { 3361 $scheme = null; 3362 } 3363 $categories[] =& new $this->feed->category_class($term, $scheme, null); 3364 } 3365 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) 3366 { 3367 $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 3368 } 3369 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) 3370 { 3371 $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 3372 } 3373 3374 if (!empty($categories)) 3375 { 3376 return SimplePie_Misc::array_unique($categories); 3377 } 3378 else 3379 { 3380 return null; 3381 } 3382 } 3383 3384 function get_author($key = 0) 3385 { 3386 $authors = $this->get_authors(); 3387 if (isset($authors[$key])) 3388 { 3389 return $authors[$key]; 3390 } 3391 else 3392 { 3393 return null; 3394 } 3395 } 3396 3397 function get_contributor($key = 0) 3398 { 3399 $contributors = $this->get_contributors(); 3400 if (isset($contributors[$key])) 3401 { 3402 return $contributors[$key]; 3403 } 3404 else 3405 { 3406 return null; 3407 } 3408 } 3409 3410 function get_contributors() 3411 { 3412 $contributors = array(); 3413 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) 3414 { 3415 $name = null; 3416 $uri = null; 3417 $email = null; 3418 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) 3419 { 3420 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3421 } 3422 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) 3423 { 3424 $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); 3425 } 3426 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) 3427 { 3428 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3429 } 3430 if ($name !== null || $email !== null || $uri !== null) 3431 { 3432 $contributors[] =& new $this->feed->author_class($name, $uri, $email); 3433 } 3434 } 3435 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) 3436 { 3437 $name = null; 3438 $url = null; 3439 $email = null; 3440 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) 3441 { 3442 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3443 } 3444 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) 3445 { 3446 $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); 3447 } 3448 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) 3449 { 3450 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3451 } 3452 if ($name !== null || $email !== null || $url !== null) 3453 { 3454 $contributors[] =& new $this->feed->author_class($name, $url, $email); 3455 } 3456 } 3457 3458 if (!empty($contributors)) 3459 { 3460 return SimplePie_Misc::array_unique($contributors); 3461 } 3462 else 3463 { 3464 return null; 3465 } 3466 } 3467 3468 function get_authors() 3469 { 3470 $authors = array(); 3471 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) 3472 { 3473 $name = null; 3474 $uri = null; 3475 $email = null; 3476 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) 3477 { 3478 $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3479 } 3480 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) 3481 { 3482 $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); 3483 } 3484 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) 3485 { 3486 $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3487 } 3488 if ($name !== null || $email !== null || $uri !== null) 3489 { 3490 $authors[] =& new $this->feed->author_class($name, $uri, $email); 3491 } 3492 } 3493 if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) 3494 { 3495 $name = null; 3496 $url = null; 3497 $email = null; 3498 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) 3499 { 3500 $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3501 } 3502 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) 3503 { 3504 $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); 3505 } 3506 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) 3507 { 3508 $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3509 } 3510 if ($name !== null || $email !== null || $url !== null) 3511 { 3512 $authors[] =& new $this->feed->author_class($name, $url, $email); 3513 } 3514 } 3515 if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author')) 3516 { 3517 $authors[] =& new $this->feed->author_class(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 3518 } 3519 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) 3520 { 3521 $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 3522 } 3523 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) 3524 { 3525 $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 3526 } 3527 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) 3528 { 3529 $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 3530 } 3531 3532 if (!empty($authors)) 3533 { 3534 return SimplePie_Misc::array_unique($authors); 3535 } 3536 elseif (($source = $this->get_source()) && ($authors = $source->get_authors())) 3537 { 3538 return $authors; 3539 } 3540 elseif ($authors = $this->feed->get_authors()) 3541 { 3542 return $authors; 3543 } 3544 else 3545 { 3546 return null; 3547 } 3548 } 3549 3550 function get_copyright() 3551 { 3552 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) 3553 { 3554 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 3555 } 3556 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) 3557 { 3558 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3559 } 3560 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) 3561 { 3562 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3563 } 3564 else 3565 { 3566 return null; 3567 } 3568 } 3569 3570 function get_date($date_format = 'j F Y, g:i a') 3571 { 3572 if (!isset($this->data['date'])) 3573 { 3574 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published')) 3575 { 3576 $this->data['date']['raw'] = $return[0]['data']; 3577 } 3578 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated')) 3579 { 3580 $this->data['date']['raw'] = $return[0]['data']; 3581 } 3582 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued')) 3583 { 3584 $this->data['date']['raw'] = $return[0]['data']; 3585 } 3586 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created')) 3587 { 3588 $this->data['date']['raw'] = $return[0]['data']; 3589 } 3590 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified')) 3591 { 3592 $this->data['date']['raw'] = $return[0]['data']; 3593 } 3594 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate')) 3595 { 3596 $this->data['date']['raw'] = $return[0]['data']; 3597 } 3598 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date')) 3599 { 3600 $this->data['date']['raw'] = $return[0]['data']; 3601 } 3602 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date')) 3603 { 3604 $this->data['date']['raw'] = $return[0]['data']; 3605 } 3606 3607 if (!empty($this->data['date']['raw'])) 3608 { 3609 $parser = SimplePie_Parse_Date::get(); 3610 $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']); 3611 } 3612 else 3613 { 3614 $this->data['date'] = null; 3615 } 3616 } 3617 if ($this->data['date']) 3618 { 3619 $date_format = (string) $date_format; 3620 switch ($date_format) 3621 { 3622 case '': 3623 return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT); 3624 3625 case 'U': 3626 return $this->data['date']['parsed']; 3627 3628 default: 3629 return date($date_format, $this->data['date']['parsed']); 3630 } 3631 } 3632 else 3633 { 3634 return null; 3635 } 3636 } 3637 3638 function get_local_date($date_format = '%c') 3639 { 3640 if (!$date_format) 3641 { 3642 return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT); 3643 } 3644 elseif (($date = $this->get_date('U')) !== null) 3645 { 3646 return strftime($date_format, $date); 3647 } 3648 else 3649 { 3650 return null; 3651 } 3652 } 3653 3654 function get_permalink() 3655 { 3656 $link = $this->get_link(); 3657 $enclosure = $this->get_enclosure(0); 3658 if ($link !== null) 3659 { 3660 return $link; 3661 } 3662 elseif ($enclosure !== null) 3663 { 3664 return $enclosure->get_link(); 3665 } 3666 else 3667 { 3668 return null; 3669 } 3670 } 3671 3672 function get_link($key = 0, $rel = 'alternate') 3673 { 3674 $links = $this->get_links($rel); 3675 if ($links[$key] !== null) 3676 { 3677 return $links[$key]; 3678 } 3679 else 3680 { 3681 return null; 3682 } 3683 } 3684 3685 function get_links($rel = 'alternate') 3686 { 3687 if (!isset($this->data['links'])) 3688 { 3689 $this->data['links'] = array(); 3690 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link) 3691 { 3692 if (isset($link['attribs']['']['href'])) 3693 { 3694 $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; 3695 $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 3696 3697 } 3698 } 3699 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link) 3700 { 3701 if (isset($link['attribs']['']['href'])) 3702 { 3703 $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; 3704 $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 3705 } 3706 } 3707 if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) 3708 { 3709 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 3710 } 3711 if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) 3712 { 3713 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 3714 } 3715 if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) 3716 { 3717 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 3718 } 3719 if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid')) 3720 { 3721 if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true') 3722 { 3723 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 3724 } 3725 } 3726 3727 $keys = array_keys($this->data['links']); 3728 foreach ($keys as $key) 3729 { 3730 if (SimplePie_Misc::is_isegment_nz_nc($key)) 3731 { 3732 if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) 3733 { 3734 $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); 3735 $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; 3736 } 3737 else 3738 { 3739 $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; 3740 } 3741 } 3742 elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) 3743 { 3744 $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; 3745 } 3746 $this->data['links'][$key] = array_unique($this->data['links'][$key]); 3747 } 3748 } 3749 if (isset($this->data['links'][$rel])) 3750 { 3751 return $this->data['links'][$rel]; 3752 } 3753 else 3754 { 3755 return null; 3756 } 3757 } 3758 3759 /** 3760 * @todo Add ability to prefer one type of content over another (in a media group). 3761 */ 3762 function get_enclosure($key = 0, $prefer = null) 3763 { 3764 $enclosures = $this->get_enclosures(); 3765 if (isset($enclosures[$key])) 3766 { 3767 return $enclosures[$key]; 3768 } 3769 else 3770 { 3771 return null; 3772 } 3773 } 3774 3775 /** 3776 * Grabs all available enclosures (podcasts, etc.) 3777 * 3778 * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS. 3779 * 3780 * At this point, we're pretty much assuming that all enclosures for an item are the same content. Anything else is too complicated to properly support. 3781 * 3782 * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4). 3783 * @todo If an element exists at a level, but it's value is empty, we should fall back to the value from the parent (if it exists). 3784 */ 3785 function get_enclosures() 3786 { 3787 if (!isset($this->data['enclosures'])) 3788 { 3789 $this->data['enclosures'] = array(); 3790 3791 // Elements 3792 $captions_parent = null; 3793 $categories_parent = null; 3794 $copyrights_parent = null; 3795 $credits_parent = null; 3796 $description_parent = null; 3797 $duration_parent = null; 3798 $hashes_parent = null; 3799 $keywords_parent = null; 3800 $player_parent = null; 3801 $ratings_parent = null; 3802 $restrictions_parent = null; 3803 $thumbnails_parent = null; 3804 $title_parent = null; 3805 3806 // Let's do the channel and item-level ones first, and just re-use them if we need to. 3807 $parent = $this->get_feed(); 3808 3809 // CAPTIONS 3810 if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text')) 3811 { 3812 foreach ($captions as $caption) 3813 { 3814 $caption_type = null; 3815 $caption_lang = null; 3816 $caption_startTime = null; 3817 $caption_endTime = null; 3818 $caption_text = null; 3819 if (isset($caption['attribs']['']['type'])) 3820 { 3821 $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 3822 } 3823 if (isset($caption['attribs']['']['lang'])) 3824 { 3825 $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 3826 } 3827 if (isset($caption['attribs']['']['start'])) 3828 { 3829 $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); 3830 } 3831 if (isset($caption['attribs']['']['end'])) 3832 { 3833 $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); 3834 } 3835 if (isset($caption['data'])) 3836 { 3837 $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3838 } 3839 $captions_parent[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); 3840 } 3841 } 3842 elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text')) 3843 { 3844 foreach ($captions as $caption) 3845 { 3846 $caption_type = null; 3847 $caption_lang = null; 3848 $caption_startTime = null; 3849 $caption_endTime = null; 3850 $caption_text = null; 3851 if (isset($caption['attribs']['']['type'])) 3852 { 3853 $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 3854 } 3855 if (isset($caption['attribs']['']['lang'])) 3856 { 3857 $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 3858 } 3859 if (isset($caption['attribs']['']['start'])) 3860 { 3861 $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); 3862 } 3863 if (isset($caption['attribs']['']['end'])) 3864 { 3865 $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); 3866 } 3867 if (isset($caption['data'])) 3868 { 3869 $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3870 } 3871 $captions_parent[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); 3872 } 3873 } 3874 if (is_array($captions_parent)) 3875 { 3876 $captions_parent = array_values(SimplePie_Misc::array_unique($captions_parent)); 3877 } 3878 3879 // CATEGORIES 3880 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category) 3881 { 3882 $term = null; 3883 $scheme = null; 3884 $label = null; 3885 if (isset($category['data'])) 3886 { 3887 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3888 } 3889 if (isset($category['attribs']['']['scheme'])) 3890 { 3891 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 3892 } 3893 else 3894 { 3895 $scheme = 'http://search.yahoo.com/mrss/category_schema'; 3896 } 3897 if (isset($category['attribs']['']['label'])) 3898 { 3899 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 3900 } 3901 $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label); 3902 } 3903 foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category) 3904 { 3905 $term = null; 3906 $scheme = null; 3907 $label = null; 3908 if (isset($category['data'])) 3909 { 3910 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3911 } 3912 if (isset($category['attribs']['']['scheme'])) 3913 { 3914 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 3915 } 3916 else 3917 { 3918 $scheme = 'http://search.yahoo.com/mrss/category_schema'; 3919 } 3920 if (isset($category['attribs']['']['label'])) 3921 { 3922 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 3923 } 3924 $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label); 3925 } 3926 foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category) 3927 { 3928 $term = null; 3929 $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd'; 3930 $label = null; 3931 if (isset($category['attribs']['']['text'])) 3932 { 3933 $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT); 3934 } 3935 $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label); 3936 3937 if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'])) 3938 { 3939 foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory) 3940 { 3941 if (isset($subcategory['attribs']['']['text'])) 3942 { 3943 $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT); 3944 } 3945 $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label); 3946 } 3947 } 3948 } 3949 if (is_array($categories_parent)) 3950 { 3951 $categories_parent = array_values(SimplePie_Misc::array_unique($categories_parent)); 3952 } 3953 3954 // COPYRIGHT 3955 if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright')) 3956 { 3957 $copyright_url = null; 3958 $copyright_label = null; 3959 if (isset($copyright[0]['attribs']['']['url'])) 3960 { 3961 $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); 3962 } 3963 if (isset($copyright[0]['data'])) 3964 { 3965 $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3966 } 3967 $copyrights_parent =& new $this->feed->copyright_class($copyright_url, $copyright_label); 3968 } 3969 elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright')) 3970 { 3971 $copyright_url = null; 3972 $copyright_label = null; 3973 if (isset($copyright[0]['attribs']['']['url'])) 3974 { 3975 $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); 3976 } 3977 if (isset($copyright[0]['data'])) 3978 { 3979 $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 3980 } 3981 $copyrights_parent =& new $this->feed->copyright_class($copyright_url, $copyright_label); 3982 } 3983 3984 // CREDITS 3985 if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit')) 3986 { 3987 foreach ($credits as $credit) 3988 { 3989 $credit_role = null; 3990 $credit_scheme = null; 3991 $credit_name = null; 3992 if (isset($credit['attribs']['']['role'])) 3993 { 3994 $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); 3995 } 3996 if (isset($credit['attribs']['']['scheme'])) 3997 { 3998 $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 3999 } 4000 else 4001 { 4002 $credit_scheme = 'urn:ebu'; 4003 } 4004 if (isset($credit['data'])) 4005 { 4006 $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4007 } 4008 $credits_parent[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); 4009 } 4010 } 4011 elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit')) 4012 { 4013 foreach ($credits as $credit) 4014 { 4015 $credit_role = null; 4016 $credit_scheme = null; 4017 $credit_name = null; 4018 if (isset($credit['attribs']['']['role'])) 4019 { 4020 $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); 4021 } 4022 if (isset($credit['attribs']['']['scheme'])) 4023 { 4024 $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4025 } 4026 else 4027 { 4028 $credit_scheme = 'urn:ebu'; 4029 } 4030 if (isset($credit['data'])) 4031 { 4032 $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4033 } 4034 $credits_parent[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); 4035 } 4036 } 4037 if (is_array($credits_parent)) 4038 { 4039 $credits_parent = array_values(SimplePie_Misc::array_unique($credits_parent)); 4040 } 4041 4042 // DESCRIPTION 4043 if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description')) 4044 { 4045 if (isset($description_parent[0]['data'])) 4046 { 4047 $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4048 } 4049 } 4050 elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description')) 4051 { 4052 if (isset($description_parent[0]['data'])) 4053 { 4054 $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4055 } 4056 } 4057 4058 // DURATION 4059 if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration')) 4060 { 4061 $seconds = null; 4062 $minutes = null; 4063 $hours = null; 4064 if (isset($duration_parent[0]['data'])) 4065 { 4066 $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4067 if (sizeof($temp) > 0) 4068 { 4069 (int) $seconds = array_pop($temp); 4070 } 4071 if (sizeof($temp) > 0) 4072 { 4073 (int) $minutes = array_pop($temp); 4074 $seconds += $minutes * 60; 4075 } 4076 if (sizeof($temp) > 0) 4077 { 4078 (int) $hours = array_pop($temp); 4079 $seconds += $hours * 3600; 4080 } 4081 unset($temp); 4082 $duration_parent = $seconds; 4083 } 4084 } 4085 4086 // HASHES 4087 if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash')) 4088 { 4089 foreach ($hashes_iterator as $hash) 4090 { 4091 $value = null; 4092 $algo = null; 4093 if (isset($hash['data'])) 4094 { 4095 $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4096 } 4097 if (isset($hash['attribs']['']['algo'])) 4098 { 4099 $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); 4100 } 4101 else 4102 { 4103 $algo = 'md5'; 4104 } 4105 $hashes_parent[] = $algo.':'.$value; 4106 } 4107 } 4108 elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash')) 4109 { 4110 foreach ($hashes_iterator as $hash) 4111 { 4112 $value = null; 4113 $algo = null; 4114 if (isset($hash['data'])) 4115 { 4116 $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4117 } 4118 if (isset($hash['attribs']['']['algo'])) 4119 { 4120 $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); 4121 } 4122 else 4123 { 4124 $algo = 'md5'; 4125 } 4126 $hashes_parent[] = $algo.':'.$value; 4127 } 4128 } 4129 if (is_array($hashes_parent)) 4130 { 4131 $hashes_parent = array_values(SimplePie_Misc::array_unique($hashes_parent)); 4132 } 4133 4134 // KEYWORDS 4135 if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords')) 4136 { 4137 if (isset($keywords[0]['data'])) 4138 { 4139 $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4140 foreach ($temp as $word) 4141 { 4142 $keywords_parent[] = trim($word); 4143 } 4144 } 4145 unset($temp); 4146 } 4147 elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords')) 4148 { 4149 if (isset($keywords[0]['data'])) 4150 { 4151 $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4152 foreach ($temp as $word) 4153 { 4154 $keywords_parent[] = trim($word); 4155 } 4156 } 4157 unset($temp); 4158 } 4159 elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords')) 4160 { 4161 if (isset($keywords[0]['data'])) 4162 { 4163 $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4164 foreach ($temp as $word) 4165 { 4166 $keywords_parent[] = trim($word); 4167 } 4168 } 4169 unset($temp); 4170 } 4171 elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords')) 4172 { 4173 if (isset($keywords[0]['data'])) 4174 { 4175 $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4176 foreach ($temp as $word) 4177 { 4178 $keywords_parent[] = trim($word); 4179 } 4180 } 4181 unset($temp); 4182 } 4183 if (is_array($keywords_parent)) 4184 { 4185 $keywords_parent = array_values(SimplePie_Misc::array_unique($keywords_parent)); 4186 } 4187 4188 // PLAYER 4189 if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player')) 4190 { 4191 if (isset($player_parent[0]['attribs']['']['url'])) 4192 { 4193 $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4194 } 4195 } 4196 elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player')) 4197 { 4198 if (isset($player_parent[0]['attribs']['']['url'])) 4199 { 4200 $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4201 } 4202 } 4203 4204 // RATINGS 4205 if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating')) 4206 { 4207 foreach ($ratings as $rating) 4208 { 4209 $rating_scheme = null; 4210 $rating_value = null; 4211 if (isset($rating['attribs']['']['scheme'])) 4212 { 4213 $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4214 } 4215 else 4216 { 4217 $rating_scheme = 'urn:simple'; 4218 } 4219 if (isset($rating['data'])) 4220 { 4221 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4222 } 4223 $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value); 4224 } 4225 } 4226 elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit')) 4227 { 4228 foreach ($ratings as $rating) 4229 { 4230 $rating_scheme = 'urn:itunes'; 4231 $rating_value = null; 4232 if (isset($rating['data'])) 4233 { 4234 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4235 } 4236 $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value); 4237 } 4238 } 4239 elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating')) 4240 { 4241 foreach ($ratings as $rating) 4242 { 4243 $rating_scheme = null; 4244 $rating_value = null; 4245 if (isset($rating['attribs']['']['scheme'])) 4246 { 4247 $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4248 } 4249 else 4250 { 4251 $rating_scheme = 'urn:simple'; 4252 } 4253 if (isset($rating['data'])) 4254 { 4255 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4256 } 4257 $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value); 4258 } 4259 } 4260 elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit')) 4261 { 4262 foreach ($ratings as $rating) 4263 { 4264 $rating_scheme = 'urn:itunes'; 4265 $rating_value = null; 4266 if (isset($rating['data'])) 4267 { 4268 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4269 } 4270 $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value); 4271 } 4272 } 4273 if (is_array($ratings_parent)) 4274 { 4275 $ratings_parent = array_values(SimplePie_Misc::array_unique($ratings_parent)); 4276 } 4277 4278 // RESTRICTIONS 4279 if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction')) 4280 { 4281 foreach ($restrictions as $restriction) 4282 { 4283 $restriction_relationship = null; 4284 $restriction_type = null; 4285 $restriction_value = null; 4286 if (isset($restriction['attribs']['']['relationship'])) 4287 { 4288 $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); 4289 } 4290 if (isset($restriction['attribs']['']['type'])) 4291 { 4292 $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4293 } 4294 if (isset($restriction['data'])) 4295 { 4296 $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4297 } 4298 $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 4299 } 4300 } 4301 elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block')) 4302 { 4303 foreach ($restrictions as $restriction) 4304 { 4305 $restriction_relationship = 'allow'; 4306 $restriction_type = null; 4307 $restriction_value = 'itunes'; 4308 if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') 4309 { 4310 $restriction_relationship = 'deny'; 4311 } 4312 $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 4313 } 4314 } 4315 elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction')) 4316 { 4317 foreach ($restrictions as $restriction) 4318 { 4319 $restriction_relationship = null; 4320 $restriction_type = null; 4321 $restriction_value = null; 4322 if (isset($restriction['attribs']['']['relationship'])) 4323 { 4324 $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); 4325 } 4326 if (isset($restriction['attribs']['']['type'])) 4327 { 4328 $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4329 } 4330 if (isset($restriction['data'])) 4331 { 4332 $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4333 } 4334 $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 4335 } 4336 } 4337 elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block')) 4338 { 4339 foreach ($restrictions as $restriction) 4340 { 4341 $restriction_relationship = 'allow'; 4342 $restriction_type = null; 4343 $restriction_value = 'itunes'; 4344 if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') 4345 { 4346 $restriction_relationship = 'deny'; 4347 } 4348 $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 4349 } 4350 } 4351 if (is_array($restrictions_parent)) 4352 { 4353 $restrictions_parent = array_values(SimplePie_Misc::array_unique($restrictions_parent)); 4354 } 4355 4356 // THUMBNAILS 4357 if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) 4358 { 4359 foreach ($thumbnails as $thumbnail) 4360 { 4361 if (isset($thumbnail['attribs']['']['url'])) 4362 { 4363 $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4364 } 4365 } 4366 } 4367 elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) 4368 { 4369 foreach ($thumbnails as $thumbnail) 4370 { 4371 if (isset($thumbnail['attribs']['']['url'])) 4372 { 4373 $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4374 } 4375 } 4376 } 4377 4378 // TITLES 4379 if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title')) 4380 { 4381 if (isset($title_parent[0]['data'])) 4382 { 4383 $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4384 } 4385 } 4386 elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title')) 4387 { 4388 if (isset($title_parent[0]['data'])) 4389 { 4390 $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4391 } 4392 } 4393 4394 // Clear the memory 4395 unset($parent); 4396 4397 // Attributes 4398 $bitrate = null; 4399 $channels = null; 4400 $duration = null; 4401 $expression = null; 4402 $framerate = null; 4403 $height = null; 4404 $javascript = null; 4405 $lang = null; 4406 $length = null; 4407 $medium = null; 4408 $samplingrate = null; 4409 $type = null; 4410 $url = null; 4411 $width = null; 4412 4413 // Elements 4414 $captions = null; 4415 $categories = null; 4416 $copyrights = null; 4417 $credits = null; 4418 $description = null; 4419 $hashes = null; 4420 $keywords = null; 4421 $player = null; 4422 $ratings = null; 4423 $restrictions = null; 4424 $thumbnails = null; 4425 $title = null; 4426 4427 // If we have media:group tags, loop through them. 4428 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group) 4429 { 4430 // If we have media:content tags, loop through them. 4431 foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) 4432 { 4433 if (isset($content['attribs']['']['url'])) 4434 { 4435 // Attributes 4436 $bitrate = null; 4437 $channels = null; 4438 $duration = null; 4439 $expression = null; 4440 $framerate = null; 4441 $height = null; 4442 $javascript = null; 4443 $lang = null; 4444 $length = null; 4445 $medium = null; 4446 $samplingrate = null; 4447 $type = null; 4448 $url = null; 4449 $width = null; 4450 4451 // Elements 4452 $captions = null; 4453 $categories = null; 4454 $copyrights = null; 4455 $credits = null; 4456 $description = null; 4457 $hashes = null; 4458 $keywords = null; 4459 $player = null; 4460 $ratings = null; 4461 $restrictions = null; 4462 $thumbnails = null; 4463 $title = null; 4464 4465 // Start checking the attributes of media:content 4466 if (isset($content['attribs']['']['bitrate'])) 4467 { 4468 $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT); 4469 } 4470 if (isset($content['attribs']['']['channels'])) 4471 { 4472 $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT); 4473 } 4474 if (isset($content['attribs']['']['duration'])) 4475 { 4476 $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT); 4477 } 4478 else 4479 { 4480 $duration = $duration_parent; 4481 } 4482 if (isset($content['attribs']['']['expression'])) 4483 { 4484 $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT); 4485 } 4486 if (isset($content['attribs']['']['framerate'])) 4487 { 4488 $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT); 4489 } 4490 if (isset($content['attribs']['']['height'])) 4491 { 4492 $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT); 4493 } 4494 if (isset($content['attribs']['']['lang'])) 4495 { 4496 $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 4497 } 4498 if (isset($content['attribs']['']['fileSize'])) 4499 { 4500 $length = ceil($content['attribs']['']['fileSize']); 4501 } 4502 if (isset($content['attribs']['']['medium'])) 4503 { 4504 $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT); 4505 } 4506 if (isset($content['attribs']['']['samplingrate'])) 4507 { 4508 $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT); 4509 } 4510 if (isset($content['attribs']['']['type'])) 4511 { 4512 $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4513 } 4514 if (isset($content['attribs']['']['width'])) 4515 { 4516 $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT); 4517 } 4518 $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4519 4520 // Checking the other optional media: elements. Priority: media:content, media:group, item, channel 4521 4522 // CAPTIONS 4523 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) 4524 { 4525 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) 4526 { 4527 $caption_type = null; 4528 $caption_lang = null; 4529 $caption_startTime = null; 4530 $caption_endTime = null; 4531 $caption_text = null; 4532 if (isset($caption['attribs']['']['type'])) 4533 { 4534 $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4535 } 4536 if (isset($caption['attribs']['']['lang'])) 4537 { 4538 $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 4539 } 4540 if (isset($caption['attribs']['']['start'])) 4541 { 4542 $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); 4543 } 4544 if (isset($caption['attribs']['']['end'])) 4545 { 4546 $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); 4547 } 4548 if (isset($caption['data'])) 4549 { 4550 $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4551 } 4552 $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); 4553 } 4554 if (is_array($captions)) 4555 { 4556 $captions = array_values(SimplePie_Misc::array_unique($captions)); 4557 } 4558 } 4559 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) 4560 { 4561 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) 4562 { 4563 $caption_type = null; 4564 $caption_lang = null; 4565 $caption_startTime = null; 4566 $caption_endTime = null; 4567 $caption_text = null; 4568 if (isset($caption['attribs']['']['type'])) 4569 { 4570 $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4571 } 4572 if (isset($caption['attribs']['']['lang'])) 4573 { 4574 $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 4575 } 4576 if (isset($caption['attribs']['']['start'])) 4577 { 4578 $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); 4579 } 4580 if (isset($caption['attribs']['']['end'])) 4581 { 4582 $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); 4583 } 4584 if (isset($caption['data'])) 4585 { 4586 $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4587 } 4588 $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); 4589 } 4590 if (is_array($captions)) 4591 { 4592 $captions = array_values(SimplePie_Misc::array_unique($captions)); 4593 } 4594 } 4595 else 4596 { 4597 $captions = $captions_parent; 4598 } 4599 4600 // CATEGORIES 4601 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) 4602 { 4603 foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) 4604 { 4605 $term = null; 4606 $scheme = null; 4607 $label = null; 4608 if (isset($category['data'])) 4609 { 4610 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4611 } 4612 if (isset($category['attribs']['']['scheme'])) 4613 { 4614 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4615 } 4616 else 4617 { 4618 $scheme = 'http://search.yahoo.com/mrss/category_schema'; 4619 } 4620 if (isset($category['attribs']['']['label'])) 4621 { 4622 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 4623 } 4624 $categories[] =& new $this->feed->category_class($term, $scheme, $label); 4625 } 4626 } 4627 if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) 4628 { 4629 foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) 4630 { 4631 $term = null; 4632 $scheme = null; 4633 $label = null; 4634 if (isset($category['data'])) 4635 { 4636 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4637 } 4638 if (isset($category['attribs']['']['scheme'])) 4639 { 4640 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4641 } 4642 else 4643 { 4644 $scheme = 'http://search.yahoo.com/mrss/category_schema'; 4645 } 4646 if (isset($category['attribs']['']['label'])) 4647 { 4648 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 4649 } 4650 $categories[] =& new $this->feed->category_class($term, $scheme, $label); 4651 } 4652 } 4653 if (is_array($categories) && is_array($categories_parent)) 4654 { 4655 $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent))); 4656 } 4657 elseif (is_array($categories)) 4658 { 4659 $categories = array_values(SimplePie_Misc::array_unique($categories)); 4660 } 4661 elseif (is_array($categories_parent)) 4662 { 4663 $categories = array_values(SimplePie_Misc::array_unique($categories_parent)); 4664 } 4665 4666 // COPYRIGHTS 4667 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) 4668 { 4669 $copyright_url = null; 4670 $copyright_label = null; 4671 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) 4672 { 4673 $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); 4674 } 4675 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) 4676 { 4677 $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4678 } 4679 $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label); 4680 } 4681 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) 4682 { 4683 $copyright_url = null; 4684 $copyright_label = null; 4685 if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) 4686 { 4687 $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); 4688 } 4689 if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) 4690 { 4691 $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4692 } 4693 $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label); 4694 } 4695 else 4696 { 4697 $copyrights = $copyrights_parent; 4698 } 4699 4700 // CREDITS 4701 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) 4702 { 4703 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) 4704 { 4705 $credit_role = null; 4706 $credit_scheme = null; 4707 $credit_name = null; 4708 if (isset($credit['attribs']['']['role'])) 4709 { 4710 $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); 4711 } 4712 if (isset($credit['attribs']['']['scheme'])) 4713 { 4714 $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4715 } 4716 else 4717 { 4718 $credit_scheme = 'urn:ebu'; 4719 } 4720 if (isset($credit['data'])) 4721 { 4722 $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4723 } 4724 $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); 4725 } 4726 if (is_array($credits)) 4727 { 4728 $credits = array_values(SimplePie_Misc::array_unique($credits)); 4729 } 4730 } 4731 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) 4732 { 4733 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) 4734 { 4735 $credit_role = null; 4736 $credit_scheme = null; 4737 $credit_name = null; 4738 if (isset($credit['attribs']['']['role'])) 4739 { 4740 $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); 4741 } 4742 if (isset($credit['attribs']['']['scheme'])) 4743 { 4744 $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4745 } 4746 else 4747 { 4748 $credit_scheme = 'urn:ebu'; 4749 } 4750 if (isset($credit['data'])) 4751 { 4752 $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4753 } 4754 $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); 4755 } 4756 if (is_array($credits)) 4757 { 4758 $credits = array_values(SimplePie_Misc::array_unique($credits)); 4759 } 4760 } 4761 else 4762 { 4763 $credits = $credits_parent; 4764 } 4765 4766 // DESCRIPTION 4767 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) 4768 { 4769 $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4770 } 4771 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) 4772 { 4773 $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4774 } 4775 else 4776 { 4777 $description = $description_parent; 4778 } 4779 4780 // HASHES 4781 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) 4782 { 4783 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) 4784 { 4785 $value = null; 4786 $algo = null; 4787 if (isset($hash['data'])) 4788 { 4789 $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4790 } 4791 if (isset($hash['attribs']['']['algo'])) 4792 { 4793 $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); 4794 } 4795 else 4796 { 4797 $algo = 'md5'; 4798 } 4799 $hashes[] = $algo.':'.$value; 4800 } 4801 if (is_array($hashes)) 4802 { 4803 $hashes = array_values(SimplePie_Misc::array_unique($hashes)); 4804 } 4805 } 4806 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) 4807 { 4808 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) 4809 { 4810 $value = null; 4811 $algo = null; 4812 if (isset($hash['data'])) 4813 { 4814 $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4815 } 4816 if (isset($hash['attribs']['']['algo'])) 4817 { 4818 $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); 4819 } 4820 else 4821 { 4822 $algo = 'md5'; 4823 } 4824 $hashes[] = $algo.':'.$value; 4825 } 4826 if (is_array($hashes)) 4827 { 4828 $hashes = array_values(SimplePie_Misc::array_unique($hashes)); 4829 } 4830 } 4831 else 4832 { 4833 $hashes = $hashes_parent; 4834 } 4835 4836 // KEYWORDS 4837 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) 4838 { 4839 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) 4840 { 4841 $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4842 foreach ($temp as $word) 4843 { 4844 $keywords[] = trim($word); 4845 } 4846 unset($temp); 4847 } 4848 if (is_array($keywords)) 4849 { 4850 $keywords = array_values(SimplePie_Misc::array_unique($keywords)); 4851 } 4852 } 4853 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) 4854 { 4855 if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) 4856 { 4857 $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 4858 foreach ($temp as $word) 4859 { 4860 $keywords[] = trim($word); 4861 } 4862 unset($temp); 4863 } 4864 if (is_array($keywords)) 4865 { 4866 $keywords = array_values(SimplePie_Misc::array_unique($keywords)); 4867 } 4868 } 4869 else 4870 { 4871 $keywords = $keywords_parent; 4872 } 4873 4874 // PLAYER 4875 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) 4876 { 4877 $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4878 } 4879 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) 4880 { 4881 $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 4882 } 4883 else 4884 { 4885 $player = $player_parent; 4886 } 4887 4888 // RATINGS 4889 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) 4890 { 4891 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) 4892 { 4893 $rating_scheme = null; 4894 $rating_value = null; 4895 if (isset($rating['attribs']['']['scheme'])) 4896 { 4897 $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4898 } 4899 else 4900 { 4901 $rating_scheme = 'urn:simple'; 4902 } 4903 if (isset($rating['data'])) 4904 { 4905 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4906 } 4907 $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value); 4908 } 4909 if (is_array($ratings)) 4910 { 4911 $ratings = array_values(SimplePie_Misc::array_unique($ratings)); 4912 } 4913 } 4914 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) 4915 { 4916 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) 4917 { 4918 $rating_scheme = null; 4919 $rating_value = null; 4920 if (isset($rating['attribs']['']['scheme'])) 4921 { 4922 $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 4923 } 4924 else 4925 { 4926 $rating_scheme = 'urn:simple'; 4927 } 4928 if (isset($rating['data'])) 4929 { 4930 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4931 } 4932 $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value); 4933 } 4934 if (is_array($ratings)) 4935 { 4936 $ratings = array_values(SimplePie_Misc::array_unique($ratings)); 4937 } 4938 } 4939 else 4940 { 4941 $ratings = $ratings_parent; 4942 } 4943 4944 // RESTRICTIONS 4945 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) 4946 { 4947 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) 4948 { 4949 $restriction_relationship = null; 4950 $restriction_type = null; 4951 $restriction_value = null; 4952 if (isset($restriction['attribs']['']['relationship'])) 4953 { 4954 $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); 4955 } 4956 if (isset($restriction['attribs']['']['type'])) 4957 { 4958 $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4959 } 4960 if (isset($restriction['data'])) 4961 { 4962 $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4963 } 4964 $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 4965 } 4966 if (is_array($restrictions)) 4967 { 4968 $restrictions = array_values(SimplePie_Misc::array_unique($restrictions)); 4969 } 4970 } 4971 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) 4972 { 4973 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) 4974 { 4975 $restriction_relationship = null; 4976 $restriction_type = null; 4977 $restriction_value = null; 4978 if (isset($restriction['attribs']['']['relationship'])) 4979 { 4980 $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); 4981 } 4982 if (isset($restriction['attribs']['']['type'])) 4983 { 4984 $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 4985 } 4986 if (isset($restriction['data'])) 4987 { 4988 $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); 4989 } 4990 $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 4991 } 4992 if (is_array($restrictions)) 4993 { 4994 $restrictions = array_values(SimplePie_Misc::array_unique($restrictions)); 4995 } 4996 } 4997 else 4998 { 4999 $restrictions = $restrictions_parent; 5000 } 5001 5002 // THUMBNAILS 5003 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) 5004 { 5005 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) 5006 { 5007 $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 5008 } 5009 if (is_array($thumbnails)) 5010 { 5011 $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails)); 5012 } 5013 } 5014 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) 5015 { 5016 foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) 5017 { 5018 $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 5019 } 5020 if (is_array($thumbnails)) 5021 { 5022 $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails)); 5023 } 5024 } 5025 else 5026 { 5027 $thumbnails = $thumbnails_parent; 5028 } 5029 5030 // TITLES 5031 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) 5032 { 5033 $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5034 } 5035 elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) 5036 { 5037 $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5038 } 5039 else 5040 { 5041 $title = $title_parent; 5042 } 5043 5044 $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width); 5045 } 5046 } 5047 } 5048 5049 // If we have standalone media:content tags, loop through them. 5050 if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'])) 5051 { 5052 foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) 5053 { 5054 if (isset($content['attribs']['']['url'])) 5055 { 5056 // Attributes 5057 $bitrate = null; 5058 $channels = null; 5059 $duration = null; 5060 $expression = null; 5061 $framerate = null; 5062 $height = null; 5063 $javascript = null; 5064 $lang = null; 5065 $length = null; 5066 $medium = null; 5067 $samplingrate = null; 5068 $type = null; 5069 $url = null; 5070 $width = null; 5071 5072 // Elements 5073 $captions = null; 5074 $categories = null; 5075 $copyrights = null; 5076 $credits = null; 5077 $description = null; 5078 $hashes = null; 5079 $keywords = null; 5080 $player = null; 5081 $ratings = null; 5082 $restrictions = null; 5083 $thumbnails = null; 5084 $title = null; 5085 5086 // Start checking the attributes of media:content 5087 if (isset($content['attribs']['']['bitrate'])) 5088 { 5089 $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT); 5090 } 5091 if (isset($content['attribs']['']['channels'])) 5092 { 5093 $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT); 5094 } 5095 if (isset($content['attribs']['']['duration'])) 5096 { 5097 $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT); 5098 } 5099 else 5100 { 5101 $duration = $duration_parent; 5102 } 5103 if (isset($content['attribs']['']['expression'])) 5104 { 5105 $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT); 5106 } 5107 if (isset($content['attribs']['']['framerate'])) 5108 { 5109 $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT); 5110 } 5111 if (isset($content['attribs']['']['height'])) 5112 { 5113 $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT); 5114 } 5115 if (isset($content['attribs']['']['lang'])) 5116 { 5117 $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 5118 } 5119 if (isset($content['attribs']['']['fileSize'])) 5120 { 5121 $length = ceil($content['attribs']['']['fileSize']); 5122 } 5123 if (isset($content['attribs']['']['medium'])) 5124 { 5125 $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT); 5126 } 5127 if (isset($content['attribs']['']['samplingrate'])) 5128 { 5129 $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT); 5130 } 5131 if (isset($content['attribs']['']['type'])) 5132 { 5133 $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 5134 } 5135 if (isset($content['attribs']['']['width'])) 5136 { 5137 $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT); 5138 } 5139 $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 5140 5141 // Checking the other optional media: elements. Priority: media:content, media:group, item, channel 5142 5143 // CAPTIONS 5144 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) 5145 { 5146 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) 5147 { 5148 $caption_type = null; 5149 $caption_lang = null; 5150 $caption_startTime = null; 5151 $caption_endTime = null; 5152 $caption_text = null; 5153 if (isset($caption['attribs']['']['type'])) 5154 { 5155 $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 5156 } 5157 if (isset($caption['attribs']['']['lang'])) 5158 { 5159 $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); 5160 } 5161 if (isset($caption['attribs']['']['start'])) 5162 { 5163 $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); 5164 } 5165 if (isset($caption['attribs']['']['end'])) 5166 { 5167 $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); 5168 } 5169 if (isset($caption['data'])) 5170 { 5171 $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5172 } 5173 $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text); 5174 } 5175 if (is_array($captions)) 5176 { 5177 $captions = array_values(SimplePie_Misc::array_unique($captions)); 5178 } 5179 } 5180 else 5181 { 5182 $captions = $captions_parent; 5183 } 5184 5185 // CATEGORIES 5186 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) 5187 { 5188 foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) 5189 { 5190 $term = null; 5191 $scheme = null; 5192 $label = null; 5193 if (isset($category['data'])) 5194 { 5195 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5196 } 5197 if (isset($category['attribs']['']['scheme'])) 5198 { 5199 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 5200 } 5201 else 5202 { 5203 $scheme = 'http://search.yahoo.com/mrss/category_schema'; 5204 } 5205 if (isset($category['attribs']['']['label'])) 5206 { 5207 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 5208 } 5209 $categories[] =& new $this->feed->category_class($term, $scheme, $label); 5210 } 5211 } 5212 if (is_array($categories) && is_array($categories_parent)) 5213 { 5214 $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent))); 5215 } 5216 elseif (is_array($categories)) 5217 { 5218 $categories = array_values(SimplePie_Misc::array_unique($categories)); 5219 } 5220 elseif (is_array($categories_parent)) 5221 { 5222 $categories = array_values(SimplePie_Misc::array_unique($categories_parent)); 5223 } 5224 else 5225 { 5226 $categories = null; 5227 } 5228 5229 // COPYRIGHTS 5230 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) 5231 { 5232 $copyright_url = null; 5233 $copyright_label = null; 5234 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) 5235 { 5236 $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); 5237 } 5238 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) 5239 { 5240 $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5241 } 5242 $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label); 5243 } 5244 else 5245 { 5246 $copyrights = $copyrights_parent; 5247 } 5248 5249 // CREDITS 5250 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) 5251 { 5252 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) 5253 { 5254 $credit_role = null; 5255 $credit_scheme = null; 5256 $credit_name = null; 5257 if (isset($credit['attribs']['']['role'])) 5258 { 5259 $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); 5260 } 5261 if (isset($credit['attribs']['']['scheme'])) 5262 { 5263 $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 5264 } 5265 else 5266 { 5267 $credit_scheme = 'urn:ebu'; 5268 } 5269 if (isset($credit['data'])) 5270 { 5271 $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5272 } 5273 $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name); 5274 } 5275 if (is_array($credits)) 5276 { 5277 $credits = array_values(SimplePie_Misc::array_unique($credits)); 5278 } 5279 } 5280 else 5281 { 5282 $credits = $credits_parent; 5283 } 5284 5285 // DESCRIPTION 5286 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) 5287 { 5288 $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5289 } 5290 else 5291 { 5292 $description = $description_parent; 5293 } 5294 5295 // HASHES 5296 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) 5297 { 5298 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) 5299 { 5300 $value = null; 5301 $algo = null; 5302 if (isset($hash['data'])) 5303 { 5304 $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5305 } 5306 if (isset($hash['attribs']['']['algo'])) 5307 { 5308 $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); 5309 } 5310 else 5311 { 5312 $algo = 'md5'; 5313 } 5314 $hashes[] = $algo.':'.$value; 5315 } 5316 if (is_array($hashes)) 5317 { 5318 $hashes = array_values(SimplePie_Misc::array_unique($hashes)); 5319 } 5320 } 5321 else 5322 { 5323 $hashes = $hashes_parent; 5324 } 5325 5326 // KEYWORDS 5327 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) 5328 { 5329 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) 5330 { 5331 $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); 5332 foreach ($temp as $word) 5333 { 5334 $keywords[] = trim($word); 5335 } 5336 unset($temp); 5337 } 5338 if (is_array($keywords)) 5339 { 5340 $keywords = array_values(SimplePie_Misc::array_unique($keywords)); 5341 } 5342 } 5343 else 5344 { 5345 $keywords = $keywords_parent; 5346 } 5347 5348 // PLAYER 5349 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) 5350 { 5351 $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 5352 } 5353 else 5354 { 5355 $player = $player_parent; 5356 } 5357 5358 // RATINGS 5359 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) 5360 { 5361 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) 5362 { 5363 $rating_scheme = null; 5364 $rating_value = null; 5365 if (isset($rating['attribs']['']['scheme'])) 5366 { 5367 $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 5368 } 5369 else 5370 { 5371 $rating_scheme = 'urn:simple'; 5372 } 5373 if (isset($rating['data'])) 5374 { 5375 $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5376 } 5377 $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value); 5378 } 5379 if (is_array($ratings)) 5380 { 5381 $ratings = array_values(SimplePie_Misc::array_unique($ratings)); 5382 } 5383 } 5384 else 5385 { 5386 $ratings = $ratings_parent; 5387 } 5388 5389 // RESTRICTIONS 5390 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) 5391 { 5392 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) 5393 { 5394 $restriction_relationship = null; 5395 $restriction_type = null; 5396 $restriction_value = null; 5397 if (isset($restriction['attribs']['']['relationship'])) 5398 { 5399 $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); 5400 } 5401 if (isset($restriction['attribs']['']['type'])) 5402 { 5403 $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 5404 } 5405 if (isset($restriction['data'])) 5406 { 5407 $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5408 } 5409 $restrictions[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value); 5410 } 5411 if (is_array($restrictions)) 5412 { 5413 $restrictions = array_values(SimplePie_Misc::array_unique($restrictions)); 5414 } 5415 } 5416 else 5417 { 5418 $restrictions = $restrictions_parent; 5419 } 5420 5421 // THUMBNAILS 5422 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) 5423 { 5424 foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) 5425 { 5426 $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); 5427 } 5428 if (is_array($thumbnails)) 5429 { 5430 $thumbnails = array_values(SimplePie_Misc::array_unique($thumbnails)); 5431 } 5432 } 5433 else 5434 { 5435 $thumbnails = $thumbnails_parent; 5436 } 5437 5438 // TITLES 5439 if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) 5440 { 5441 $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5442 } 5443 else 5444 { 5445 $title = $title_parent; 5446 } 5447 5448 $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width); 5449 } 5450 } 5451 } 5452 5453 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link) 5454 { 5455 if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') 5456 { 5457 // Attributes 5458 $bitrate = null; 5459 $channels = null; 5460 $duration = null; 5461 $expression = null; 5462 $framerate = null; 5463 $height = null; 5464 $javascript = null; 5465 $lang = null; 5466 $length = null; 5467 $medium = null; 5468 $samplingrate = null; 5469 $type = null; 5470 $url = null; 5471 $width = null; 5472 5473 $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 5474 if (isset($link['attribs']['']['type'])) 5475 { 5476 $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 5477 } 5478 if (isset($link['attribs']['']['length'])) 5479 { 5480 $length = ceil($link['attribs']['']['length']); 5481 } 5482 5483 // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor 5484 $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width); 5485 } 5486 } 5487 5488 foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link) 5489 { 5490 if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') 5491 { 5492 // Attributes 5493 $bitrate = null; 5494 $channels = null; 5495 $duration = null; 5496 $expression = null; 5497 $framerate = null; 5498 $height = null; 5499 $javascript = null; 5500 $lang = null; 5501 $length = null; 5502 $medium = null; 5503 $samplingrate = null; 5504 $type = null; 5505 $url = null; 5506 $width = null; 5507 5508 $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 5509 if (isset($link['attribs']['']['type'])) 5510 { 5511 $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 5512 } 5513 if (isset($link['attribs']['']['length'])) 5514 { 5515 $length = ceil($link['attribs']['']['length']); 5516 } 5517 5518 // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor 5519 $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width); 5520 } 5521 } 5522 5523 if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure')) 5524 { 5525 if (isset($enclosure[0]['attribs']['']['url'])) 5526 { 5527 // Attributes 5528 $bitrate = null; 5529 $channels = null; 5530 $duration = null; 5531 $expression = null; 5532 $framerate = null; 5533 $height = null; 5534 $javascript = null; 5535 $lang = null; 5536 $length = null; 5537 $medium = null; 5538 $samplingrate = null; 5539 $type = null; 5540 $url = null; 5541 $width = null; 5542 5543 $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0])); 5544 if (isset($enclosure[0]['attribs']['']['type'])) 5545 { 5546 $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); 5547 } 5548 if (isset($enclosure[0]['attribs']['']['length'])) 5549 { 5550 $length = ceil($enclosure[0]['attribs']['']['length']); 5551 } 5552 5553 // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor 5554 $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width); 5555 } 5556 } 5557 5558 if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width)) 5559 { 5560 // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor 5561 $this->data['enclosures'][] =& new $this->feed->enclosure_class($url, $type, $length, $this->feed->javascript, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width); 5562 } 5563 5564 $this->data['enclosures'] = array_values(SimplePie_Misc::array_unique($this->data['enclosures'])); 5565 } 5566 if (!empty($this->data['enclosures'])) 5567 { 5568 return $this->data['enclosures']; 5569 } 5570 else 5571 { 5572 return null; 5573 } 5574 } 5575 5576 function get_latitude() 5577 { 5578 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) 5579 { 5580 return (float) $return[0]['data']; 5581 } 5582 elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) 5583 { 5584 return (float) $match[1]; 5585 } 5586 else 5587 { 5588 return null; 5589 } 5590 } 5591 5592 function get_longitude() 5593 { 5594 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) 5595 { 5596 return (float) $return[0]['data']; 5597 } 5598 elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) 5599 { 5600 return (float) $return[0]['data']; 5601 } 5602 elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) 5603 { 5604 return (float) $match[2]; 5605 } 5606 else 5607 { 5608 return null; 5609 } 5610 } 5611 5612 function get_source() 5613 { 5614 if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source')) 5615 { 5616 return new $this->feed->source_class($this, $return[0]); 5617 } 5618 else 5619 { 5620 return null; 5621 } 5622 } 5623 5624 /** 5625 * Creates the add_to_* methods' return data 5626 * 5627 * @access private 5628 * @param string $item_url String to prefix to the item permalink 5629 * @param string $title_url String to prefix to the item title 5630 * (and suffix to the item permalink) 5631 * @return mixed URL if feed exists, false otherwise 5632 */ 5633 function add_to_service($item_url, $title_url = null, $summary_url = null) 5634 { 5635 if ($this->get_permalink() !== null) 5636 { 5637 $return = $item_url . rawurlencode($this->get_permalink()); 5638 if ($title_url !== null && $this->get_title() !== null) 5639 { 5640 $return .= $title_url . rawurlencode($this->get_title()); 5641 } 5642 if ($summary_url !== null && $this->get_description() !== null) 5643 { 5644 $return .= $summary_url . rawurlencode($this->get_description()); 5645 } 5646 return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI); 5647 } 5648 else 5649 { 5650 return null; 5651 } 5652 } 5653 5654 function add_to_blinklist() 5655 { 5656 return $this->add_to_service('http://www.blinklist.com/index.php?Action=Blink/addblink.php&Description=&Url=', '&Title='); 5657 } 5658 5659 function add_to_blogmarks() 5660 { 5661 return $this->add_to_service('http://blogmarks.net/my/new.php?mini=1&simple=1&url=', '&title='); 5662 } 5663 5664 function add_to_delicious() 5665 { 5666 return $this->add_to_service('http://del.icio.us/post/?v=4&url=', '&title='); 5667 } 5668 5669 function add_to_digg() 5670 { 5671 return $this->add_to_service('http://digg.com/submit?url=', '&title=', '&bodytext='); 5672 } 5673 5674 function add_to_furl() 5675 { 5676 return $this->add_to_service('http://www.furl.net/storeIt.jsp?u=', '&t='); 5677 } 5678 5679 function add_to_magnolia() 5680 { 5681 return $this->add_to_service('http://ma.gnolia.com/bookmarklet/add?url=', '&title='); 5682 } 5683 5684 function add_to_myweb20() 5685 { 5686 return $this->add_to_service('http://myweb2.search.yahoo.com/myresults/bookmarklet?u=', '&t='); 5687 } 5688 5689 function add_to_newsvine() 5690 { 5691 return $this->add_to_service('http://www.newsvine.com/_wine/save?u=', '&h='); 5692 } 5693 5694 function add_to_reddit() 5695 { 5696 return $this->add_to_service('http://reddit.com/submit?url=', '&title='); 5697 } 5698 5699 function add_to_segnalo() 5700 { 5701 return $this->add_to_service('http://segnalo.com/post.html.php?url=', '&title='); 5702 } 5703 5704 function add_to_simpy() 5705 { 5706 return $this->add_to_service('http://www.simpy.com/simpy/LinkAdd.do?href=', '&title='); 5707 } 5708 5709 function add_to_spurl() 5710 { 5711 return $this->add_to_service('http://www.spurl.net/spurl.php?v=3&url=', '&title='); 5712 } 5713 5714 function add_to_wists() 5715 { 5716 return $this->add_to_service('http://wists.com/r.php?c=&r=', '&title='); 5717 } 5718 5719 function search_technorati() 5720 { 5721 return $this->add_to_service('http://www.technorati.com/search/'); 5722 } 5723 } 5724 5725 class SimplePie_Source 5726 { 5727 var $item; 5728 var $data = array(); 5729 5730 function SimplePie_Source($item, $data) 5731 { 5732 $this->item = $item; 5733 $this->data = $data; 5734 } 5735 5736 function __toString() 5737 { 5738 return md5(serialize($this->data)); 5739 } 5740 5741 function get_source_tags($namespace, $tag) 5742 { 5743 if (isset($this->data['child'][$namespace][$tag])) 5744 { 5745 return $this->data['child'][$namespace][$tag]; 5746 } 5747 else 5748 { 5749 return null; 5750 } 5751 } 5752 5753 function get_base($element = array()) 5754 { 5755 return $this->item->get_base($element); 5756 } 5757 5758 function sanitize($data, $type, $base = '') 5759 { 5760 return $this->item->sanitize($data, $type, $base); 5761 } 5762 5763 function get_item() 5764 { 5765 return $this->item; 5766 } 5767 5768 function get_title() 5769 { 5770 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) 5771 { 5772 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 5773 } 5774 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) 5775 { 5776 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 5777 } 5778 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) 5779 { 5780 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 5781 } 5782 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) 5783 { 5784 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 5785 } 5786 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) 5787 { 5788 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 5789 } 5790 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) 5791 { 5792 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5793 } 5794 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) 5795 { 5796 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5797 } 5798 else 5799 { 5800 return null; 5801 } 5802 } 5803 5804 function get_category($key = 0) 5805 { 5806 $categories = $this->get_categories(); 5807 if (isset($categories[$key])) 5808 { 5809 return $categories[$key]; 5810 } 5811 else 5812 { 5813 return null; 5814 } 5815 } 5816 5817 function get_categories() 5818 { 5819 $categories = array(); 5820 5821 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) 5822 { 5823 $term = null; 5824 $scheme = null; 5825 $label = null; 5826 if (isset($category['attribs']['']['term'])) 5827 { 5828 $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); 5829 } 5830 if (isset($category['attribs']['']['scheme'])) 5831 { 5832 $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); 5833 } 5834 if (isset($category['attribs']['']['label'])) 5835 { 5836 $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); 5837 } 5838 $categories[] =& new $this->item->feed->category_class($term, $scheme, $label); 5839 } 5840 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) 5841 { 5842 // This is really the label, but keep this as the term also for BC. 5843 // Label will also work on retrieving because that falls back to term. 5844 $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5845 if (isset($category['attribs']['']['domain'])) 5846 { 5847 $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); 5848 } 5849 else 5850 { 5851 $scheme = null; 5852 } 5853 $categories[] =& new $this->item->feed->category_class($term, $scheme, null); 5854 } 5855 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) 5856 { 5857 $categories[] =& new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 5858 } 5859 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) 5860 { 5861 $categories[] =& new $this->item->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 5862 } 5863 5864 if (!empty($categories)) 5865 { 5866 return SimplePie_Misc::array_unique($categories); 5867 } 5868 else 5869 { 5870 return null; 5871 } 5872 } 5873 5874 function get_author($key = 0) 5875 { 5876 $authors = $this->get_authors(); 5877 if (isset($authors[$key])) 5878 { 5879 return $authors[$key]; 5880 } 5881 else 5882 { 5883 return null; 5884 } 5885 } 5886 5887 function get_authors() 5888 { 5889 $authors = array(); 5890 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) 5891 { 5892 $name = null; 5893 $uri = null; 5894 $email = null; 5895 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) 5896 { 5897 $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5898 } 5899 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) 5900 { 5901 $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); 5902 } 5903 if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) 5904 { 5905 $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5906 } 5907 if ($name !== null || $email !== null || $uri !== null) 5908 { 5909 $authors[] =& new $this->item->feed->author_class($name, $uri, $email); 5910 } 5911 } 5912 if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) 5913 { 5914 $name = null; 5915 $url = null; 5916 $email = null; 5917 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) 5918 { 5919 $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5920 } 5921 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) 5922 { 5923 $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); 5924 } 5925 if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) 5926 { 5927 $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5928 } 5929 if ($name !== null || $email !== null || $url !== null) 5930 { 5931 $authors[] =& new $this->item->feed->author_class($name, $url, $email); 5932 } 5933 } 5934 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) 5935 { 5936 $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 5937 } 5938 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) 5939 { 5940 $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 5941 } 5942 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) 5943 { 5944 $authors[] =& new $this->item->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null); 5945 } 5946 5947 if (!empty($authors)) 5948 { 5949 return SimplePie_Misc::array_unique($authors); 5950 } 5951 else 5952 { 5953 return null; 5954 } 5955 } 5956 5957 function get_contributor($key = 0) 5958 { 5959 $contributors = $this->get_contributors(); 5960 if (isset($contributors[$key])) 5961 { 5962 return $contributors[$key]; 5963 } 5964 else 5965 { 5966 return null; 5967 } 5968 } 5969 5970 function get_contributors() 5971 { 5972 $contributors = array(); 5973 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) 5974 { 5975 $name = null; 5976 $uri = null; 5977 $email = null; 5978 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) 5979 { 5980 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5981 } 5982 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) 5983 { 5984 $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); 5985 } 5986 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) 5987 { 5988 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 5989 } 5990 if ($name !== null || $email !== null || $uri !== null) 5991 { 5992 $contributors[] =& new $this->item->feed->author_class($name, $uri, $email); 5993 } 5994 } 5995 foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) 5996 { 5997 $name = null; 5998 $url = null; 5999 $email = null; 6000 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) 6001 { 6002 $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6003 } 6004 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) 6005 { 6006 $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); 6007 } 6008 if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) 6009 { 6010 $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6011 } 6012 if ($name !== null || $email !== null || $url !== null) 6013 { 6014 $contributors[] =& new $this->item->feed->author_class($name, $url, $email); 6015 } 6016 } 6017 6018 if (!empty($contributors)) 6019 { 6020 return SimplePie_Misc::array_unique($contributors); 6021 } 6022 else 6023 { 6024 return null; 6025 } 6026 } 6027 6028 function get_link($key = 0, $rel = 'alternate') 6029 { 6030 $links = $this->get_links($rel); 6031 if (isset($links[$key])) 6032 { 6033 return $links[$key]; 6034 } 6035 else 6036 { 6037 return null; 6038 } 6039 } 6040 6041 /** 6042 * Added for parity between the parent-level and the item/entry-level. 6043 */ 6044 function get_permalink() 6045 { 6046 return $this->get_link(0); 6047 } 6048 6049 function get_links($rel = 'alternate') 6050 { 6051 if (!isset($this->data['links'])) 6052 { 6053 $this->data['links'] = array(); 6054 if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link')) 6055 { 6056 foreach ($links as $link) 6057 { 6058 if (isset($link['attribs']['']['href'])) 6059 { 6060 $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; 6061 $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 6062 } 6063 } 6064 } 6065 if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link')) 6066 { 6067 foreach ($links as $link) 6068 { 6069 if (isset($link['attribs']['']['href'])) 6070 { 6071 $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; 6072 $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); 6073 6074 } 6075 } 6076 } 6077 if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) 6078 { 6079 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 6080 } 6081 if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) 6082 { 6083 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 6084 } 6085 if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) 6086 { 6087 $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); 6088 } 6089 6090 $keys = array_keys($this->data['links']); 6091 foreach ($keys as $key) 6092 { 6093 if (SimplePie_Misc::is_isegment_nz_nc($key)) 6094 { 6095 if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) 6096 { 6097 $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); 6098 $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; 6099 } 6100 else 6101 { 6102 $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; 6103 } 6104 } 6105 elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) 6106 { 6107 $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; 6108 } 6109 $this->data['links'][$key] = array_unique($this->data['links'][$key]); 6110 } 6111 } 6112 6113 if (isset($this->data['links'][$rel])) 6114 { 6115 return $this->data['links'][$rel]; 6116 } 6117 else 6118 { 6119 return null; 6120 } 6121 } 6122 6123 function get_description() 6124 { 6125 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) 6126 { 6127 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 6128 } 6129 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline')) 6130 { 6131 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 6132 } 6133 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) 6134 { 6135 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 6136 } 6137 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) 6138 { 6139 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 6140 } 6141 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) 6142 { 6143 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); 6144 } 6145 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) 6146 { 6147 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6148 } 6149 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) 6150 { 6151 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6152 } 6153 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) 6154 { 6155 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 6156 } 6157 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) 6158 { 6159 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); 6160 } 6161 else 6162 { 6163 return null; 6164 } 6165 } 6166 6167 function get_copyright() 6168 { 6169 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) 6170 { 6171 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0])); 6172 } 6173 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright')) 6174 { 6175 return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0])); 6176 } 6177 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright')) 6178 { 6179 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6180 } 6181 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) 6182 { 6183 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6184 } 6185 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) 6186 { 6187 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6188 } 6189 else 6190 { 6191 return null; 6192 } 6193 } 6194 6195 function get_language() 6196 { 6197 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language')) 6198 { 6199 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6200 } 6201 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language')) 6202 { 6203 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6204 } 6205 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language')) 6206 { 6207 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); 6208 } 6209 elseif (isset($this->data['xml_lang'])) 6210 { 6211 return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); 6212 } 6213 else 6214 { 6215 return null; 6216 } 6217 } 6218 6219 function get_latitude() 6220 { 6221 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) 6222 { 6223 return (float) $return[0]['data']; 6224 } 6225 elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) 6226 { 6227 return (float) $match[1]; 6228 } 6229 else 6230 { 6231 return null; 6232 } 6233 } 6234 6235 function get_longitude() 6236 { 6237 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) 6238 { 6239 return (float) $return[0]['data']; 6240 } 6241 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) 6242 { 6243 return (float) $return[0]['data']; 6244 } 6245 elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', $return[0]['data'], $match)) 6246 { 6247 return (float) $match[2]; 6248 } 6249 else 6250 { 6251 return null; 6252 } 6253 } 6254 6255 function get_image_url() 6256 { 6257 if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image')) 6258 { 6259 return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI); 6260 } 6261 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo')) 6262 { 6263 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 6264 } 6265 elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) 6266 { 6267 return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); 6268 } 6269 else 6270 { 6271 return null; 6272 } 6273 } 6274 } 6275 6276 class SimplePie_Author 6277 { 6278 var $name; 6279 var $link; 6280 var $email; 6281 6282 // Constructor, used to input the data 6283 function SimplePie_Author($name = null, $link = null, $email = null) 6284 { 6285 $this->name = $name; 6286 $this->link = $link; 6287 $this->email = $email; 6288 } 6289 6290 function __toString() 6291 { 6292 // There is no $this->data here 6293 return md5(serialize($this)); 6294 } 6295 6296 function get_name() 6297 { 6298 if ($this->name !== null) 6299 { 6300 return $this->name; 6301 } 6302 else 6303 { 6304 return null; 6305 } 6306 } 6307 6308 function get_link() 6309 { 6310 if ($this->link !== null) 6311 { 6312 return $this->link; 6313 } 6314 else 6315 { 6316 return null; 6317 } 6318 } 6319 6320 function get_email() 6321 { 6322 if ($this->email !== null) 6323 { 6324 return $this->email; 6325 } 6326 else 6327 { 6328 return null; 6329 } 6330 } 6331 } 6332 6333 class SimplePie_Category 6334 { 6335 var $term; 6336 var $scheme; 6337 var $label; 6338 6339 // Constructor, used to input the data 6340 function SimplePie_Category($term = null, $scheme = null, $label = null) 6341 { 6342 $this->term = $term; 6343 $this->scheme = $scheme; 6344 $this->label = $label; 6345 } 6346 6347 function __toString() 6348 { 6349 // There is no $this->data here 6350 return md5(serialize($this)); 6351 } 6352 6353 function get_term() 6354 { 6355 if ($this->term !== null) 6356 { 6357 return $this->term; 6358 } 6359 else 6360 { 6361 return null; 6362 } 6363 } 6364 6365 function get_scheme() 6366 { 6367 if ($this->scheme !== null) 6368 { 6369 return $this->scheme; 6370 } 6371 else 6372 { 6373 return null; 6374 } 6375 } 6376 6377 function get_label() 6378 { 6379 if ($this->label !== null) 6380 { 6381 return $this->label; 6382 } 6383 else 6384 { 6385 return $this->get_term(); 6386 } 6387 } 6388 } 6389 6390 class SimplePie_Enclosure 6391 { 6392 var $bitrate; 6393 var $captions; 6394 var $categories; 6395 var $channels; 6396 var $copyright; 6397 var $credits; 6398 var $description; 6399 var $duration; 6400 var $expression; 6401 var $framerate; 6402 var $handler; 6403 var $hashes; 6404 var $height; 6405 var $javascript; 6406 var $keywords; 6407 var $lang; 6408 var $length; 6409 var $link; 6410 var $medium; 6411 var $player; 6412 var $ratings; 6413 var $restrictions; 6414 var $samplingrate; 6415 var $thumbnails; 6416 var $title; 6417 var $type; 6418 var $width; 6419 6420 // Constructor, used to input the data 6421 function SimplePie_Enclosure($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null) 6422 { 6423 $this->bitrate = $bitrate; 6424 $this->captions = $captions; 6425 $this->categories = $categories; 6426 $this->channels = $channels; 6427 $this->copyright = $copyright; 6428 $this->credits = $credits; 6429 $this->description = $description; 6430 $this->duration = $duration; 6431 $this->expression = $expression; 6432 $this->framerate = $framerate; 6433 $this->hashes = $hashes; 6434 $this->height = $height; 6435 $this->javascript = $javascript; 6436 $this->keywords = $keywords; 6437 $this->lang = $lang; 6438 $this->length = $length; 6439 $this->link = $link; 6440 $this->medium = $medium; 6441 $this->player = $player; 6442 $this->ratings = $ratings; 6443 $this->restrictions = $restrictions; 6444 $this->samplingrate = $samplingrate; 6445 $this->thumbnails = $thumbnails; 6446 $this->title = $title; 6447 $this->type = $type; 6448 $this->width = $width; 6449 if (class_exists('idna_convert')) 6450 { 6451 $idn =& new idna_convert; 6452 $parsed = SimplePie_Misc::parse_url($link); 6453 $this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']); 6454 } 6455 $this->handler = $this->get_handler(); // Needs to load last 6456 } 6457 6458 function __toString() 6459 { 6460 // There is no $this->data here 6461 return md5(serialize($this)); 6462 } 6463 6464 function get_bitrate() 6465 { 6466 if ($this->bitrate !== null) 6467 { 6468 return $this->bitrate; 6469 } 6470 else 6471 { 6472 return null; 6473 } 6474 } 6475 6476 function get_caption($key = 0) 6477 { 6478 $captions = $this->get_captions(); 6479 if (isset($captions[$key])) 6480 { 6481 return $captions[$key]; 6482 } 6483 else 6484 { 6485 return null; 6486 } 6487 } 6488 6489 function get_captions() 6490 { 6491 if ($this->captions !== null) 6492 { 6493 return $this->captions; 6494 } 6495 else 6496 { 6497 return null; 6498 } 6499 } 6500 6501 function get_category($key = 0) 6502 { 6503 $categories = $this->get_categories(); 6504 if (isset($categories[$key])) 6505 { 6506 return $categories[$key]; 6507 } 6508 else 6509 { 6510 return null; 6511 } 6512 } 6513 6514 function get_categories() 6515 { 6516 if ($this->categories !== null) 6517 { 6518 return $this->categories; 6519 } 6520 else 6521 { 6522 return null; 6523 } 6524 } 6525 6526 function get_channels() 6527 { 6528 if ($this->channels !== null) 6529 { 6530 return $this->channels; 6531 } 6532 else 6533 { 6534 return null; 6535 } 6536 } 6537 6538 function get_copyright() 6539 { 6540 if ($this->copyright !== null) 6541 { 6542 return $this->copyright; 6543 } 6544 else 6545 { 6546 return null; 6547 } 6548 } 6549 6550 function get_credit($key = 0) 6551 { 6552 $credits = $this->get_credits(); 6553 if (isset($credits[$key])) 6554 { 6555 return $credits[$key]; 6556 } 6557 else 6558 { 6559 return null; 6560 } 6561 } 6562 6563 function get_credits() 6564 { 6565 if ($this->credits !== null) 6566 { 6567 return $this->credits; 6568 } 6569 else 6570 { 6571 return null; 6572 } 6573 } 6574 6575 function get_description() 6576 { 6577 if ($this->description !== null) 6578 { 6579 return $this->description; 6580 } 6581 else 6582 { 6583 return null; 6584 } 6585 } 6586 6587 function get_duration($convert = false) 6588 { 6589 if ($this->duration !== null) 6590 { 6591 if ($convert) 6592 { 6593 $time = SimplePie_Misc::time_hms($this->duration); 6594 return $time; 6595 } 6596 else 6597 { 6598 return $this->duration; 6599 } 6600 } 6601 else 6602 { 6603 return null; 6604 } 6605 } 6606 6607 function get_expression() 6608 { 6609 if ($this->expression !== null) 6610 { 6611 return $this->expression; 6612 } 6613 else 6614 { 6615 return 'full'; 6616 } 6617 } 6618 6619 function get_extension() 6620 { 6621 if ($this->link !== null) 6622 { 6623 $url = SimplePie_Misc::parse_url($this->link); 6624 if ($url['path'] !== '') 6625 { 6626 return pathinfo($url['path'], PATHINFO_EXTENSION); 6627 } 6628 } 6629 return null; 6630 } 6631 6632 function get_framerate() 6633 { 6634 if ($this->framerate !== null) 6635 { 6636 return $this->framerate; 6637 } 6638 else 6639 { 6640 return null; 6641 } 6642 } 6643 6644 function get_handler() 6645 { 6646 return $this->get_real_type(true); 6647 } 6648 6649 function get_hash($key = 0) 6650 { 6651 $hashes = $this->get_hashes(); 6652 if (isset($hashes[$key])) 6653 { 6654 return $hashes[$key]; 6655 } 6656 else 6657 { 6658 return null; 6659 } 6660 } 6661 6662 function get_hashes() 6663 { 6664 if ($this->hashes !== null) 6665 { 6666 return $this->hashes; 6667 } 6668 else 6669 { 6670 return null; 6671 } 6672 } 6673 6674 function get_height() 6675 { 6676 if ($this->height !== null) 6677 { 6678 return $this->height; 6679 } 6680 else 6681 { 6682 return null; 6683 } 6684 } 6685 6686 function get_language() 6687 { 6688 if ($this->lang !== null) 6689 { 6690 return $this->lang; 6691 } 6692 else 6693 { 6694 return null; 6695 } 6696 } 6697 6698 function get_keyword($key = 0) 6699 { 6700 $keywords = $this->get_keywords(); 6701 if (isset($keywords[$key])) 6702 { 6703 return $keywords[$key]; 6704 } 6705 else 6706 { 6707 return null; 6708 } 6709 } 6710 6711 function get_keywords() 6712 { 6713 if ($this->keywords !== null) 6714 { 6715 return $this->keywords; 6716 } 6717 else 6718 { 6719 return null; 6720 } 6721 } 6722 6723 function get_length() 6724 { 6725 if ($this->length !== null) 6726 { 6727 return $this->length; 6728 } 6729 else 6730 { 6731 return null; 6732 } 6733 } 6734 6735 function get_link() 6736 { 6737 if ($this->link !== null) 6738 { 6739 return urldecode($this->link); 6740 } 6741 else 6742 { 6743 return null; 6744 } 6745 } 6746 6747 function get_medium() 6748 { 6749 if ($this->medium !== null) 6750 { 6751 return $this->medium; 6752 } 6753 else 6754 { 6755 return null; 6756 } 6757 } 6758 6759 function get_player() 6760 { 6761 if ($this->player !== null) 6762 { 6763 return $this->player; 6764 } 6765 else 6766 { 6767 return null; 6768 } 6769 } 6770 6771 function get_rating($key = 0) 6772 { 6773 $ratings = $this->get_ratings(); 6774 if (isset($ratings[$key])) 6775 { 6776 return $ratings[$key]; 6777 } 6778 else 6779 { 6780 return null; 6781 } 6782 } 6783 6784 function get_ratings() 6785 { 6786 if ($this->ratings !== null) 6787 { 6788 return $this->ratings; 6789 } 6790 else 6791 { 6792 return null; 6793 } 6794 } 6795 6796 function get_restriction($key = 0) 6797 { 6798 $restrictions = $this->get_restrictions(); 6799 if (isset($restrictions[$key])) 6800 { 6801 return $restrictions[$key]; 6802 } 6803 else 6804 { 6805 return null; 6806 } 6807 } 6808 6809 function get_restrictions() 6810 { 6811 if ($this->restrictions !== null) 6812 { 6813 return $this->restrictions; 6814 } 6815 else 6816 { 6817 return null; 6818 } 6819 } 6820 6821 function get_sampling_rate() 6822 { 6823 if ($this->samplingrate !== null) 6824 { 6825 return $this->samplingrate; 6826 } 6827 else 6828 { 6829 return null; 6830 } 6831 } 6832 6833 function get_size() 6834 { 6835 $length = $this->get_length(); 6836 if ($length !== null) 6837 { 6838 return round($length/1048576, 2); 6839 } 6840 else 6841 { 6842 return null; 6843 } 6844 } 6845 6846 function get_thumbnail($key = 0) 6847 { 6848 $thumbnails = $this->get_thumbnails(); 6849 if (isset($thumbnails[$key])) 6850 { 6851 return $thumbnails[$key]; 6852 } 6853 else 6854 { 6855 return null; 6856 } 6857 } 6858 6859 function get_thumbnails() 6860 { 6861 if ($this->thumbnails !== null) 6862 { 6863 return $this->thumbnails; 6864 } 6865 else 6866 { 6867 return null; 6868 } 6869 } 6870 6871 function get_title() 6872 { 6873 if ($this->title !== null) 6874 { 6875 return $this->title; 6876 } 6877 else 6878 { 6879 return null; 6880 } 6881 } 6882 6883 function get_type() 6884 { 6885 if ($this->type !== null) 6886 { 6887 return $this->type; 6888 } 6889 else 6890 { 6891 return null; 6892 } 6893 } 6894 6895 function get_width() 6896 { 6897 if ($this->width !== null) 6898 { 6899 return $this->width; 6900 } 6901 else 6902 { 6903 return null; 6904 } 6905 } 6906 6907 function native_embed($options='') 6908 { 6909 return $this->embed($options, true); 6910 } 6911 6912 /** 6913 * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'. 6914 */ 6915 function embed($options = '', $native = false) 6916 { 6917 // Set up defaults 6918 $audio = ''; 6919 $video = ''; 6920 $alt = ''; 6921 $altclass = ''; 6922 $loop = 'false'; 6923 $width = 'auto'; 6924 $height = 'auto'; 6925 $bgcolor = '#ffffff'; 6926 $mediaplayer = ''; 6927 $widescreen = false; 6928 $handler = $this->get_handler(); 6929 $type = $this->get_real_type(); 6930 6931 // Process options and reassign values as necessary 6932 if (is_array($options)) 6933 { 6934 extract($options); 6935 } 6936 else 6937 { 6938 $options = explode(',', $options); 6939 foreach($options as $option) 6940 { 6941 $opt = explode(':', $option, 2); 6942 if (isset($opt[0], $opt[1])) 6943 { 6944 $opt[0] = trim($opt[0]); 6945 $opt[1] = trim($opt[1]); 6946 switch ($opt[0]) 6947 { 6948 case 'audio': 6949 $audio = $opt[1]; 6950 break; 6951 6952 case 'video': 6953 $video = $opt[1]; 6954 break; 6955 6956 case 'alt': 6957 $alt = $opt[1]; 6958 break; 6959 6960 case 'altclass': 6961 $altclass = $opt[1]; 6962 break; 6963 6964 case 'loop': 6965 $loop = $opt[1]; 6966 break; 6967 6968 case 'width': 6969 $width = $opt[1]; 6970 break; 6971 6972 case 'height': 6973 $height = $opt[1]; 6974 break; 6975 6976 case 'bgcolor': 6977 $bgcolor = $opt[1]; 6978 break; 6979 6980 case 'mediaplayer': 6981 $mediaplayer = $opt[1]; 6982 break; 6983 6984 case 'widescreen': 6985 $widescreen = $opt[1]; 6986 break; 6987 } 6988 } 6989 } 6990 } 6991 6992 $mime = explode('/', $type, 2); 6993 $mime = $mime[0]; 6994 6995 // Process values for 'auto' 6996 if ($width === 'auto') 6997 { 6998 if ($mime === 'video') 6999 { 7000 if ($height === 'auto') 7001 { 7002 $width = 480; 7003 } 7004 elseif ($widescreen) 7005 { 7006 $width = round((intval($height)/9)*16); 7007 } 7008 else 7009 { 7010 $width = round((intval($height)/3)*4); 7011 } 7012 } 7013 else 7014 { 7015 $width = '100%'; 7016 } 7017 } 7018 7019 if ($height === 'auto') 7020 { 7021 if ($mime === 'audio') 7022 { 7023 $height = 0; 7024 } 7025 elseif ($mime === 'video') 7026 { 7027 if ($width === 'auto') 7028 { 7029 if ($widescreen) 7030 { 7031 $height = 270; 7032 } 7033 else 7034 { 7035 $height = 360; 7036 } 7037 } 7038 elseif ($widescreen) 7039 { 7040 $height = round((intval($width)/16)*9); 7041 } 7042 else 7043 { 7044 $height = round((intval($width)/4)*3); 7045 } 7046 } 7047 else 7048 { 7049 $height = 376; 7050 } 7051 } 7052 elseif ($mime === 'audio') 7053 { 7054 $height = 0; 7055 } 7056 7057 // Set proper placeholder value 7058 if ($mime === 'audio') 7059 { 7060 $placeholder = $audio; 7061 } 7062 elseif ($mime === 'video') 7063 { 7064 $placeholder = $video; 7065 } 7066 7067 $embed = ''; 7068 7069 // Make sure the JS library is included 7070 if (!$native) 7071 { 7072 static $javascript_outputted = null; 7073 if (!$javascript_outputted && $this->javascript) 7074 { 7075 $embed .= '<script type="text/javascript" src="?' . htmlspecialchars($this->javascript) . '"></script>'; 7076 $javascript_outputted = true; 7077 } 7078 } 7079 7080 // Odeo Feed MP3's 7081 if ($handler === 'odeo') 7082 { 7083 if ($native) 7084 { 7085 $embed .= '<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://adobe.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="440" height="80" wmode="transparent" allowScriptAccess="any" flashvars="valid_sample_rate=true&external_url=' . $this->get_link() . '"></embed>'; 7086 } 7087 else 7088 { 7089 $embed .= '<script type="text/javascript">embed_odeo("' . $this->get_link() . '");</script>'; 7090 } 7091 } 7092 7093 // Flash 7094 elseif ($handler === 'flash') 7095 { 7096 if ($native) 7097 { 7098 $embed .= "<embed src=\"" . $this->get_link() . "\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\"></embed>"; 7099 } 7100 else 7101 { 7102 $embed .= "<script type='text/javascript'>embed_flash('$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$loop', '$type');</script>"; 7103 } 7104 } 7105 7106 // Flash Media Player file types. 7107 // Preferred handler for MP3 file types. 7108 elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== '')) 7109 { 7110 $height += 20; 7111 if ($native) 7112 { 7113 $embed .= "<embed src=\"$mediaplayer\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"application/x-shockwave-flash\" quality=\"high\" width=\"$width\" height=\"$height\" wmode=\"transparent\" flashvars=\"file=" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\"></embed>"; 7114 } 7115 else 7116 { 7117 $embed .= "<script type='text/javascript'>embed_flv('$width', '$height', '" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "', '$placeholder', '$loop', '$mediaplayer');</script>"; 7118 } 7119 } 7120 7121 // QuickTime 7 file types. Need to test with QuickTime 6. 7122 // Only handle MP3's if the Flash Media Player is not present. 7123 elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === '')) 7124 { 7125 $height += 16; 7126 if ($native) 7127 { 7128 if ($placeholder !== '') 7129 { 7130 $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" href=\"" . $this->get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>"; 7131 } 7132 else 7133 { 7134 $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" src=\"" . $this->get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>"; 7135 } 7136 } 7137 else 7138 { 7139 $embed .= "<script type='text/javascript'>embed_quicktime('$type', '$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$placeholder', '$loop');</script>"; 7140 } 7141 } 7142 7143 // Windows Media 7144 elseif ($handler === 'wmedia') 7145 { 7146 $height += 45; 7147 if ($native) 7148 { 7149 $embed .= "<embed type=\"application/x-mplayer2\" src=\"" . $this->get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\"></embed>"; 7150 } 7151 else 7152 { 7153 $embed .= "<script type='text/javascript'>embed_wmedia('$width', '$height', '" . $this->get_link() . "');</script>"; 7154 } 7155 } 7156 7157 // Everything else 7158 else $embed .= '<a href="' . $this->get_link() . '" class="' . $altclass . '">' . $alt . '</a>'; 7159 7160 return $embed; 7161 } 7162 7163 function get_real_type($find_handler = false) 7164 { 7165 // If it's Odeo, let's get it out of the way. 7166 if (substr(strtolower($this->get_link()), 0, 15) === 'http://odeo.com') 7167 { 7168 return 'odeo'; 7169 } 7170 7171 // Mime-types by handler. 7172 $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash 7173 $types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player 7174 $types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime 7175 $types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media 7176 $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3 7177 7178 if ($this->get_type() !== null) 7179 { 7180 $type = strtolower($this->type); 7181 } 7182 else 7183 { 7184 $type = null; 7185 } 7186 7187 // If we encounter an unsupported mime-type, check the file extension and guess intelligently. 7188 if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3))) 7189 { 7190 switch (strtolower($this->get_extension())) 7191 { 7192 // Audio mime-types 7193 case 'aac': 7194 case 'adts': 7195 $type = 'audio/acc'; 7196 break; 7197 7198 case 'aif': 7199 case 'aifc': 7200 case 'aiff': 7201 case 'cdda': 7202 $type = 'audio/aiff'; 7203 break; 7204 7205 case 'bwf': 7206 $type = 'audio/wav'; 7207 break; 7208 7209 case 'kar': 7210 case 'mid': 7211 case 'midi': 7212 case 'smf': 7213 $type = 'audio/midi'; 7214 break; 7215 7216 case 'm4a': 7217 $type = 'audio/x-m4a'; 7218 break; 7219 7220 case 'mp3': 7221 case 'swa': 7222 $type = 'audio/mp3'; 7223 break; 7224 7225 case 'wav': 7226 $type = 'audio/wav'; 7227 break; 7228 7229 case 'wax': 7230 $type = 'audio/x-ms-wax'; 7231 break; 7232 7233 case 'wma': 7234 $type = 'audio/x-ms-wma'; 7235 break; 7236 7237 // Video mime-types 7238 case '3gp': 7239 case '3gpp': 7240 $type = 'video/3gpp'; 7241 break; 7242 7243 case '3g2': 7244 case '3gp2': 7245 $type = 'video/3gpp2'; 7246 break; 7247 7248 case 'asf': 7249 $type = 'video/x-ms-asf'; 7250 break; 7251 7252 case 'flv': 7253 $type = 'video/x-flv'; 7254 break; 7255 7256 case 'm1a': 7257 case 'm1s': 7258 case 'm1v': 7259 case 'm15': 7260 case 'm75': 7261 case 'mp2': 7262 case 'mpa': 7263 case 'mpeg': 7264 case 'mpg': 7265 case 'mpm': 7266 case 'mpv': 7267 $type = 'video/mpeg'; 7268 break; 7269 7270 case 'm4v': 7271 $type = 'video/x-m4v'; 7272 break; 7273 7274 case 'mov': 7275 case 'qt': 7276 $type = 'video/quicktime'; 7277 break; 7278 7279 case 'mp4': 7280 case 'mpg4': 7281 $type = 'video/mp4'; 7282 break; 7283 7284 case 'sdv': 7285 $type = 'video/sd-video'; 7286 break; 7287 7288 case 'wm': 7289 $type = 'video/x-ms-wm'; 7290 break; 7291 7292 case 'wmv': 7293 $type = 'video/x-ms-wmv'; 7294 break; 7295 7296 case 'wvx': 7297 $type = 'video/x-ms-wvx'; 7298 break; 7299 7300 // Flash mime-types 7301 case 'spl': 7302 $type = 'application/futuresplash'; 7303 break; 7304 7305 case 'swf': 7306 $type = 'application/x-shockwave-flash'; 7307 break; 7308 } 7309 } 7310 7311 if ($find_handler) 7312 { 7313 if (in_array($type, $types_flash)) 7314 { 7315 return 'flash'; 7316 } 7317 elseif (in_array($type, $types_fmedia)) 7318 { 7319 return 'fmedia'; 7320 } 7321 elseif (in_array($type, $types_quicktime)) 7322 { 7323 return 'quicktime'; 7324 } 7325 elseif (in_array($type, $types_wmedia)) 7326 { 7327 return 'wmedia'; 7328 } 7329 elseif (in_array($type, $types_mp3)) 7330 { 7331 return 'mp3'; 7332 } 7333 else 7334 { 7335 return null; 7336 } 7337 } 7338 else 7339 { 7340 return $type; 7341 } 7342 } 7343 } 7344 7345 class SimplePie_Caption 7346 { 7347 var $type; 7348 var $lang; 7349 var $startTime; 7350 var $endTime; 7351 var $text; 7352 7353 // Constructor, used to input the data 7354 function SimplePie_Caption($type = null, $lang = null, $startTime = null, $endTime = null, $text = null) 7355 { 7356 $this->type = $type; 7357 $this->lang = $lang; 7358 $this->startTime = $startTime; 7359 $this->endTime = $endTime; 7360 $this->text = $text; 7361 } 7362 7363 function __toString() 7364 { 7365 // There is no $this->data here 7366 return md5(serialize($this)); 7367 } 7368 7369 function get_endtime() 7370 { 7371 if ($this->endTime !== null) 7372 { 7373 return $this->endTime; 7374 } 7375 else 7376 { 7377 return null; 7378 } 7379 } 7380 7381 function get_language() 7382 { 7383 if ($this->lang !== null) 7384 { 7385 return $this->lang; 7386 } 7387 else 7388 { 7389 return null; 7390 } 7391 } 7392 7393 function get_starttime() 7394 { 7395 if ($this->startTime !== null) 7396 { 7397 return $this->startTime; 7398 } 7399 else 7400 { 7401 return null; 7402 } 7403 } 7404 7405 function get_text() 7406 { 7407 if ($this->text !== null) 7408 { 7409 return $this->text; 7410 } 7411 else 7412 { 7413 return null; 7414 } 7415 } 7416 7417 function get_type() 7418 { 7419 if ($this->type !== null) 7420 { 7421 return $this->type; 7422 } 7423 else 7424 { 7425 return null; 7426 } 7427 } 7428 } 7429 7430 class SimplePie_Credit 7431 { 7432 var $role; 7433 var $scheme; 7434 var $name; 7435 7436 // Constructor, used to input the data 7437 function SimplePie_Credit($role = null, $scheme = null, $name = null) 7438 { 7439 $this->role = $role; 7440 $this->scheme = $scheme; 7441 $this->name = $name; 7442 } 7443 7444 function __toString() 7445 { 7446 // There is no $this->data here 7447 return md5(serialize($this)); 7448 } 7449 7450 function get_role() 7451 { 7452 if ($this->role !== null) 7453 { 7454 return $this->role; 7455 } 7456 else 7457 { 7458 return null; 7459 } 7460 } 7461 7462 function get_scheme() 7463 { 7464 if ($this->scheme !== null) 7465 { 7466 return $this->scheme; 7467 } 7468 else 7469 { 7470 return null; 7471 } 7472 } 7473 7474 function get_name() 7475 { 7476 if ($this->name !== null) 7477 { 7478 return $this->name; 7479 } 7480 else 7481 { 7482 return null; 7483 } 7484 } 7485 } 7486 7487 class SimplePie_Copyright 7488 { 7489 var $url; 7490 var $label; 7491 7492 // Constructor, used to input the data 7493 function SimplePie_Copyright($url = null, $label = null) 7494 { 7495 $this->url = $url; 7496 $this->label = $label; 7497 } 7498 7499 function __toString() 7500 { 7501 // There is no $this->data here 7502 return md5(serialize($this)); 7503 } 7504 7505 function get_url() 7506 { 7507 if ($this->url !== null) 7508 { 7509 return $this->url; 7510 } 7511 else 7512 { 7513 return null; 7514 } 7515 } 7516 7517 function get_attribution() 7518 { 7519 if ($this->label !== null) 7520 { 7521 return $this->label; 7522 } 7523 else 7524 { 7525 return null; 7526 } 7527 } 7528 } 7529 7530 class SimplePie_Rating 7531 { 7532 var $scheme; 7533 var $value; 7534 7535 // Constructor, used to input the data 7536 function SimplePie_Rating($scheme = null, $value = null) 7537 { 7538 $this->scheme = $scheme; 7539 $this->value = $value; 7540 } 7541 7542 function __toString() 7543 { 7544 // There is no $this->data here 7545 return md5(serialize($this)); 7546 } 7547 7548 function get_scheme() 7549 { 7550 if ($this->scheme !== null) 7551 { 7552 return $this->scheme; 7553 } 7554 else 7555 { 7556 return null; 7557 } 7558 } 7559 7560 function get_value() 7561 { 7562 if ($this->value !== null) 7563 { 7564 return $this->value; 7565 } 7566 else 7567 { 7568 return null; 7569 } 7570 } 7571 } 7572 7573 class SimplePie_Restriction 7574 { 7575 var $relationship; 7576 var $type; 7577 var $value; 7578 7579 // Constructor, used to input the data 7580 function SimplePie_Restriction($relationship = null, $type = null, $value = null) 7581 { 7582 $this->relationship = $relationship; 7583 $this->type = $type; 7584 $this->value = $value; 7585 } 7586 7587 function __toString() 7588 { 7589 // There is no $this->data here 7590 return md5(serialize($this)); 7591 } 7592 7593 function get_relationship() 7594 { 7595 if ($this->relationship !== null) 7596 { 7597 return $this->relationship; 7598 } 7599 else 7600 { 7601 return null; 7602 } 7603 } 7604 7605 function get_type() 7606 { 7607 if ($this->type !== null) 7608 { 7609 return $this->type; 7610 } 7611 else 7612 { 7613 return null; 7614 } 7615 } 7616 7617 function get_value() 7618 { 7619 if ($this->value !== null) 7620 { 7621 return $this->value; 7622 } 7623 else 7624 { 7625 return null; 7626 } 7627 } 7628 } 7629 7630 /** 7631 * @todo Move to properly supporting RFC2616 (HTTP/1.1) 7632 */ 7633 class SimplePie_File 7634 { 7635 var $url; 7636 var $useragent; 7637 var $success = true; 7638 var $headers = array(); 7639 var $body; 7640 var $status_code; 7641 var $redirects = 0; 7642 var $error; 7643 var $method = SIMPLEPIE_FILE_SOURCE_NONE; 7644 7645 function SimplePie_File($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false) 7646 { 7647 if (class_exists('idna_convert')) 7648 { 7649 $idn =& new idna_convert; 7650 $parsed = SimplePie_Misc::parse_url($url); 7651 $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']); 7652 } 7653 $this->url = $url; 7654 $this->useragent = $useragent; 7655 if (preg_match('/^http(s)?:\/\//i', $url)) 7656 { 7657 if ($useragent === null) 7658 { 7659 $useragent = ini_get('user_agent'); 7660 $this->useragent = $useragent; 7661 } 7662 if (!is_array($headers)) 7663 { 7664 $headers = array(); 7665 } 7666 if (!$force_fsockopen && function_exists('curl_exec')) 7667 { 7668 $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL; 7669 $fp = curl_init(); 7670 $headers2 = array(); 7671 foreach ($headers as $key => $value) 7672 { 7673 $headers2[] = "$key: $value"; 7674 } 7675 if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>=')) 7676 { 7677 curl_setopt($fp, CURLOPT_ENCODING, ''); 7678 } 7679 curl_setopt($fp, CURLOPT_URL, $url); 7680 curl_setopt($fp, CURLOPT_HEADER, 1); 7681 curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1); 7682 curl_setopt($fp, CURLOPT_TIMEOUT, $timeout); 7683 curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout); 7684 curl_setopt($fp, CURLOPT_REFERER, $url); 7685 curl_setopt($fp, CURLOPT_USERAGENT, $useragent); 7686 curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2); 7687 if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>=')) 7688 { 7689 curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1); 7690 curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects); 7691 } 7692 7693 $this->headers = curl_exec($fp); 7694 if (curl_errno($fp) === 23 || curl_errno($fp) === 61) 7695 { 7696 curl_setopt($fp, CURLOPT_ENCODING, 'none'); 7697 $this->headers = curl_exec($fp); 7698 } 7699 if (curl_errno($fp)) 7700 { 7701 $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp); 7702 $this->success = false; 7703 } 7704 else 7705 { 7706 $info = curl_getinfo($fp); 7707 curl_close($fp); 7708 $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1); 7709 $this->headers = array_pop($this->headers); 7710 $parser =& new SimplePie_HTTP_Parser($this->headers); 7711 if ($parser->parse()) 7712 { 7713 $this->headers = $parser->headers; 7714 $this->body = $parser->body; 7715 $this->status_code = $parser->status_code; 7716 if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) 7717 { 7718 $this->redirects++; 7719 $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); 7720 return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen); 7721 } 7722 } 7723 } 7724 } 7725 else 7726 { 7727 $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN; 7728 $url_parts = parse_url($url); 7729 if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') 7730 { 7731 $url_parts['host'] = "ssl://$url_parts[host]"; 7732 $url_parts['port'] = 443; 7733 } 7734 if (!isset($url_parts['port'])) 7735 { 7736 $url_parts['port'] = 80; 7737 } 7738 $fp = @fsockopen($url_parts['host'], $url_parts['port'], $errno, $errstr, $timeout); 7739 if (!$fp) 7740 { 7741 $this->error = 'fsockopen error: ' . $errstr; 7742 $this->success = false; 7743 } 7744 else 7745 { 7746 stream_set_timeout($fp, $timeout); 7747 if (isset($url_parts['path'])) 7748 { 7749 if (isset($url_parts['query'])) 7750 { 7751 $get = "$url_parts[path]?$url_parts[query]"; 7752 } 7753 else 7754 { 7755 $get = $url_parts['path']; 7756 } 7757 } 7758 else 7759 { 7760 $get = '/'; 7761 } 7762 $out = "GET $get HTTP/1.0\r\n"; 7763 $out .= "Host: $url_parts[host]\r\n"; 7764 $out .= "User-Agent: $useragent\r\n"; 7765 if (extension_loaded('zlib')) 7766 { 7767 $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n"; 7768 } 7769 7770 if (isset($url_parts['user']) && isset($url_parts['pass'])) 7771 { 7772 $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n"; 7773 } 7774 foreach ($headers as $key => $value) 7775 { 7776 $out .= "$key: $value\r\n"; 7777 } 7778 $out .= "Connection: Close\r\n\r\n"; 7779 fwrite($fp, $out); 7780 7781 $info = stream_get_meta_data($fp); 7782 7783 $this->headers = ''; 7784 while (!$info['eof'] && !$info['timed_out']) 7785 { 7786 $this->headers .= fread($fp, 1160); 7787 $info = stream_get_meta_data($fp); 7788 } 7789 if (!$info['timed_out']) 7790 { 7791 $parser =& new SimplePie_HTTP_Parser($this->headers); 7792 if ($parser->parse()) 7793 { 7794 $this->headers = $parser->headers; 7795 $this->body = $parser->body; 7796 $this->status_code = $parser->status_code; 7797 if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) 7798 { 7799 $this->redirects++; 7800 $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); 7801 return $this->SimplePie_File($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen); 7802 } 7803 if (isset($this->headers['content-encoding'])) 7804 { 7805 // Hey, we act dumb elsewhere, so let's do that here too 7806 switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20"))) 7807 { 7808 case 'gzip': 7809 case 'x-gzip': 7810 $decoder =& new SimplePie_gzdecode($this->body); 7811 if (!$decoder->parse()) 7812 { 7813 $this->error = 'Unable to decode HTTP "gzip" stream'; 7814 $this->success = false; 7815 } 7816 else 7817 { 7818 $this->body = $decoder->data; 7819 } 7820 break; 7821 7822 case 'deflate': 7823 if (($body = gzuncompress($this->body)) === false) 7824 { 7825 if (($body = gzinflate($this->body)) === false) 7826 { 7827 $this->error = 'Unable to decode HTTP "deflate" stream'; 7828 $this->success = false; 7829 } 7830 } 7831 $this->body = $body; 7832 break; 7833 7834 default: 7835 $this->error = 'Unknown content coding'; 7836 $this->success = false; 7837 } 7838 } 7839 } 7840 } 7841 else 7842 { 7843 $this->error = 'fsocket timed out'; 7844 $this->success = false; 7845 } 7846 fclose($fp); 7847 } 7848 } 7849 } 7850 else 7851 { 7852 $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS; 7853 if (!$this->body = file_get_contents($url)) 7854 { 7855 $this->error = 'file_get_contents could not read the file'; 7856 $this->success = false; 7857 } 7858 } 7859 } 7860 } 7861 7862 /** 7863 * HTTP Response Parser 7864 * 7865 * @package SimplePie 7866 */ 7867 class SimplePie_HTTP_Parser 7868 { 7869 /** 7870 * HTTP Version 7871 * 7872 * @access public 7873 * @var float 7874 */ 7875 var $http_version = 0.0; 7876 7877 /** 7878 * Status code 7879 * 7880 * @access public 7881 * @var int 7882 */ 7883 var $status_code = 0; 7884 7885 /** 7886 * Reason phrase 7887 * 7888 * @access public 7889 * @var string 7890 */ 7891 var $reason = ''; 7892 7893 /** 7894 * Key/value pairs of the headers 7895 * 7896 * @access public 7897 * @var array 7898 */ 7899 var $headers = array(); 7900 7901 /** 7902 * Body of the response 7903 * 7904 * @access public 7905 * @var string 7906 */ 7907 var $body = ''; 7908 7909 /** 7910 * Current state of the state machine 7911 * 7912 * @access private 7913 * @var string 7914 */ 7915 var $state = 'http_version'; 7916 7917 /** 7918 * Input data 7919 * 7920 * @access private 7921 * @var string 7922 */ 7923 var $data = ''; 7924 7925 /** 7926 * Input data length (to avoid calling strlen() everytime this is needed) 7927 * 7928 * @access private 7929 * @var int 7930 */ 7931 var $data_length = 0; 7932 7933 /** 7934 * Current position of the pointer 7935 * 7936 * @var int 7937 * @access private 7938 */ 7939 var $position = 0; 7940 7941 /** 7942 * Name of the hedaer currently being parsed 7943 * 7944 * @access private 7945 * @var string 7946 */ 7947 var $name = ''; 7948 7949 /** 7950 * Value of the hedaer currently being parsed 7951 * 7952 * @access private 7953 * @var string 7954 */ 7955 var $value = ''; 7956 7957 /** 7958 * Create an instance of the class with the input data 7959 * 7960 * @access public 7961 * @param string $data Input data 7962 */ 7963 function SimplePie_HTTP_Parser($data) 7964 { 7965 $this->data = $data; 7966 $this->data_length = strlen($this->data); 7967 } 7968 7969 /** 7970 * Parse the input data 7971 * 7972 * @access public 7973 * @return bool true on success, false on failure 7974 */ 7975 function parse() 7976 { 7977 while ($this->state && $this->state !== 'emit' && $this->has_data()) 7978 { 7979 $state = $this->state; 7980 $this->$state(); 7981 } 7982 $this->data = ''; 7983 if ($this->state === 'emit' || $this->state === 'body') 7984 { 7985 return true; 7986 } 7987 else 7988 { 7989 $this->http_version = ''; 7990 $this->status_code = ''; 7991 $this->reason = ''; 7992 $this->headers = array(); 7993 $this->body = ''; 7994 return false; 7995 } 7996 } 7997 7998 /** 7999 * Check whether there is data beyond the pointer 8000 * 8001 * @access private 8002 * @return bool true if there is further data, false if not 8003 */ 8004 function has_data() 8005 { 8006 return (bool) ($this->position < $this->data_length); 8007 } 8008 8009 /** 8010 * See if the next character is LWS 8011 * 8012 * @access private 8013 * @return bool true if the next character is LWS, false if not 8014 */ 8015 function is_linear_whitespace() 8016 { 8017 return (bool) ($this->data[$this->position] === "\x09" 8018 || $this->data[$this->position] === "\x20" 8019 || ($this->data[$this->position] === "\x0A" 8020 && isset($this->data[$this->position + 1]) 8021 && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20"))); 8022 } 8023 8024 /** 8025 * Parse the HTTP version 8026 * 8027 * @access private 8028 */ 8029 function http_version() 8030 { 8031 if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/') 8032 { 8033 $len = strspn($this->data, '0123456789.', 5); 8034 $this->http_version = substr($this->data, 5, $len); 8035 $this->position += 5 + $len; 8036 if (substr_count($this->http_version, '.') <= 1) 8037 { 8038 $this->http_version = (float) $this->http_version; 8039 $this->position += strspn($this->data, "\x09\x20", $this->position); 8040 $this->state = 'status'; 8041 } 8042 else 8043 { 8044 $this->state = false; 8045 } 8046 } 8047 else 8048 { 8049 $this->state = false; 8050 } 8051 } 8052 8053 /** 8054 * Parse the status code 8055 * 8056 * @access private 8057 */ 8058 function status() 8059 { 8060 if ($len = strspn($this->data, '0123456789', $this->position)) 8061 { 8062 $this->status_code = (int) substr($this->data, $this->position, $len); 8063 $this->position += $len; 8064 $this->state = 'reason'; 8065 } 8066 else 8067 { 8068 $this->state = false; 8069 } 8070 } 8071 8072 /** 8073 * Parse the reason phrase 8074 * 8075 * @access private 8076 */ 8077 function reason() 8078 { 8079 $len = strcspn($this->data, "\x0A", $this->position); 8080 $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20"); 8081 $this->position += $len + 1; 8082 $this->state = 'new_line'; 8083 } 8084 8085 /** 8086 * Deal with a new line, shifting data around as needed 8087 * 8088 * @access private 8089 */ 8090 function new_line() 8091 { 8092 $this->value = trim($this->value, "\x0D\x20"); 8093 if ($this->name !== '' && $this->value !== '') 8094 { 8095 $this->name = strtolower($this->name); 8096 if (isset($this->headers[$this->name])) 8097 { 8098 $this->headers[$this->name] .= ', ' . $this->value; 8099 } 8100 else 8101 { 8102 $this->headers[$this->name] = $this->value; 8103 } 8104 } 8105 $this->name = ''; 8106 $this->value = ''; 8107 if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A") 8108 { 8109 $this->position += 2; 8110 $this->state = 'body'; 8111 } 8112 elseif ($this->data[$this->position] === "\x0A") 8113 { 8114 $this->position++; 8115 $this->state = 'body'; 8116 } 8117 else 8118 { 8119 $this->state = 'name'; 8120 } 8121 } 8122 8123 /** 8124 * Parse a header name 8125 * 8126 * @access private 8127 */ 8128 function name() 8129 { 8130 $len = strcspn($this->data, "\x0A:", $this->position); 8131 if (isset($this->data[$this->position + $len])) 8132 { 8133 if ($this->data[$this->position + $len] === "\x0A") 8134 { 8135 $this->position += $len; 8136 $this->state = 'new_line'; 8137 } 8138 else 8139 { 8140 $this->name = substr($this->data, $this->position, $len); 8141 $this->position += $len + 1; 8142 $this->state = 'value'; 8143 } 8144 } 8145 else 8146 { 8147 $this->state = false; 8148 } 8149 } 8150 8151 /** 8152 * Parse LWS, replacing consecutive LWS characters with a single space 8153 * 8154 * @access private 8155 */ 8156 function linear_whitespace() 8157 { 8158 do 8159 { 8160 if (substr($this->data, $this->position, 2) === "\x0D\x0A") 8161 { 8162 $this->position += 2; 8163 } 8164 elseif ($this->data[$this->position] === "\x0A") 8165 { 8166 $this->position++; 8167 } 8168 $this->position += strspn($this->data, "\x09\x20", $this->position); 8169 } while ($this->has_data() && $this->is_linear_whitespace()); 8170 $this->value .= "\x20"; 8171 } 8172 8173 /** 8174 * See what state to move to while within non-quoted header values 8175 * 8176 * @access private 8177 */ 8178 function value() 8179 { 8180 if ($this->is_linear_whitespace()) 8181 { 8182 $this->linear_whitespace(); 8183 } 8184 else 8185 { 8186 switch ($this->data[$this->position]) 8187 { 8188 case '"': 8189 $this->position++; 8190 $this->state = 'quote'; 8191 break; 8192 8193 case "\x0A": 8194 $this->position++; 8195 $this->state = 'new_line'; 8196 break; 8197 8198 default: 8199 $this->state = 'value_char'; 8200 break; 8201 } 8202 } 8203 } 8204 8205 /** 8206 * Parse a header value while outside quotes 8207 * 8208 * @access private 8209 */ 8210 function value_char() 8211 { 8212 $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position); 8213 $this->value .= substr($this->data, $this->position, $len); 8214 $this->position += $len; 8215 $this->state = 'value'; 8216 } 8217 8218 /** 8219 * See what state to move to while within quoted header values 8220 * 8221 * @access private 8222 */ 8223 function quote() 8224 { 8225 if ($this->is_linear_whitespace()) 8226 { 8227 $this->linear_whitespace(); 8228 } 8229 else 8230 { 8231 switch ($this->data[$this->position]) 8232 { 8233 case '"': 8234 $this->position++; 8235 $this->state = 'value'; 8236 break; 8237 8238 case "\x0A": 8239 $this->position++; 8240 $this->state = 'new_line'; 8241 break; 8242 8243 case '\\': 8244 $this->position++; 8245 $this->state = 'quote_escaped'; 8246 break; 8247 8248 default: 8249 $this->state = 'quote_char'; 8250 break; 8251 } 8252 } 8253 } 8254 8255 /** 8256 * Parse a header value while within quotes 8257 * 8258 * @access private 8259 */ 8260 function quote_char() 8261 { 8262 $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position); 8263 $this->value .= substr($this->data, $this->position, $len); 8264 $this->position += $len; 8265 $this->state = 'value'; 8266 } 8267 8268 /** 8269 * Parse an escaped character within quotes 8270 * 8271 * @access private 8272 */ 8273 function quote_escaped() 8274 { 8275 $this->value .= $this->data[$this->position]; 8276 $this->position++; 8277 $this->state = 'quote'; 8278 } 8279 8280 /** 8281 * Parse the body 8282 * 8283 * @access private 8284 */ 8285 function body() 8286 { 8287 $this->body = substr($this->data, $this->position); 8288 $this->state = 'emit'; 8289 } 8290 } 8291 8292 /** 8293 * gzdecode 8294 * 8295 * @package SimplePie 8296 */ 8297 class SimplePie_gzdecode 8298 { 8299 /** 8300 * Compressed data 8301 * 8302 * @access private 8303 * @see gzdecode::$data 8304 */ 8305 var $compressed_data; 8306 8307 /** 8308 * Size of compressed data 8309 * 8310 * @access private 8311 */ 8312 var $compressed_size; 8313 8314 /** 8315 * Minimum size of a valid gzip string 8316 * 8317 * @access private 8318 */ 8319 var $min_compressed_size = 18; 8320 8321 /** 8322 * Current position of pointer 8323 * 8324 * @access private 8325 */ 8326 var $position = 0; 8327 8328 /** 8329 * Flags (FLG) 8330 * 8331 * @access private 8332 */ 8333 var $flags; 8334 8335 /** 8336 * Uncompressed data 8337 * 8338 * @access public 8339 * @see gzdecode::$compressed_data 8340 */ 8341 var $data; 8342 8343 /** 8344 * Modified time 8345 * 8346 * @access public 8347 */ 8348 var $MTIME; 8349 8350 /** 8351 * Extra Flags 8352 * 8353 * @access public 8354 */ 8355 var $XFL; 8356 8357 /** 8358 * Operating System 8359 * 8360 * @access public 8361 */ 8362 var $OS; 8363 8364 /** 8365 * Subfield ID 1 8366 * 8367 * @access public 8368 * @see gzdecode::$extra_field 8369 * @see gzdecode::$SI2 8370 */ 8371 var $SI1; 8372 8373 /** 8374 * Subfield ID 2 8375 * 8376 * @access public 8377 * @see gzdecode::$extra_field 8378 * @see gzdecode::$SI1 8379 */ 8380 var $SI2; 8381 8382 /** 8383 * Extra field content 8384 * 8385 * @access public 8386 * @see gzdecode::$SI1 8387 * @see gzdecode::$SI2 8388 */ 8389 var $extra_field; 8390 8391 /** 8392 * Original filename 8393 * 8394 * @access public 8395 */ 8396 var $filename; 8397 8398 /** 8399 * Human readable comment 8400 * 8401 * @access public 8402 */ 8403 var $comment; 8404 8405 /** 8406 * Don't allow anything to be set 8407 * 8408 * @access public 8409 */ 8410 function __set($name, $value) 8411 { 8412 trigger_error("Cannot write property $name", E_USER_ERROR); 8413 } 8414 8415 /** 8416 * Set the compressed string and related properties 8417 * 8418 * @access public 8419 */ 8420 function SimplePie_gzdecode($data) 8421 { 8422 $this->compressed_data = $data; 8423 $this->compressed_size = strlen($data); 8424 } 8425 8426 /** 8427 * Decode the GZIP stream 8428 * 8429 * @access public 8430 */ 8431 function parse() 8432 { 8433 if ($this->compressed_size >= $this->min_compressed_size) 8434 { 8435 // Check ID1, ID2, and CM 8436 if (substr($this->compressed_data, 0, 3) !== "\x1F\x8B\x08") 8437 { 8438 return false; 8439 } 8440 8441 // Get the FLG (FLaGs) 8442 $this->flags = ord($this->compressed_data[3]); 8443 8444 // FLG bits above (1 << 4) are reserved 8445 if ($this->flags > 0x1F) 8446 { 8447 return false; 8448 } 8449 8450 // Advance the pointer after the above 8451 $this->position += 4; 8452 8453 // MTIME 8454 $mtime = substr($this->compressed_data, $this->position, 4); 8455 // Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness 8456 if (current(unpack('S', "\x00\x01")) === 1) 8457 { 8458 $mtime = strrev($mtime); 8459 } 8460 $this->MTIME = current(unpack('l', $mtime)); 8461 $this->position += 4; 8462 8463 // Get the XFL (eXtra FLags) 8464 $this->XFL = ord($this->compressed_data[$this->position++]); 8465 8466 // Get the OS (Operating System) 8467 $this->OS = ord($this->compressed_data[$this->position++]); 8468 8469 // Parse the FEXTRA 8470 if ($this->flags & 4) 8471 { 8472 // Read subfield IDs 8473 $this->SI1 = $this->compressed_data[$this->position++]; 8474 $this->SI2 = $this->compressed_data[$this->position++]; 8475 8476 // SI2 set to zero is reserved for future use 8477 if ($this->SI2 === "\x00") 8478 { 8479 return false; 8480 } 8481 8482 // Get the length of the extra field 8483 $len = current(unpack('v', substr($this->compressed_data, $this->position, 2))); 8484 $position += 2; 8485 8486 // Check the length of the string is still valid 8487 $this->min_compressed_size += $len + 4; 8488 if ($this->compressed_size >= $this->min_compressed_size) 8489 { 8490 // Set the extra field to the given data 8491 $this->extra_field = substr($this->compressed_data, $this->position, $len); 8492 $this->position += $len; 8493 } 8494 else 8495 { 8496 return false; 8497 } 8498 } 8499 8500 // Parse the FNAME 8501 if ($this->flags & 8) 8502 { 8503 // Get the length of the filename 8504 $len = strcspn($this->compressed_data, "\x00", $this->position); 8505 8506 // Check the length of the string is still valid 8507 $this->min_compressed_size += $len + 1; 8508 if ($this->compressed_size >= $this->min_compressed_size) 8509 { 8510 // Set the original filename to the given string 8511 $this->filename = substr($this->compressed_data, $this->position, $len); 8512 $this->position += $len + 1; 8513 } 8514 else 8515 { 8516 return false; 8517 } 8518 } 8519 8520 // Parse the FCOMMENT 8521 if ($this->flags & 16) 8522 { 8523 // Get the length of the comment 8524 $len = strcspn($this->compressed_data, "\x00", $this->position); 8525 8526 // Check the length of the string is still valid 8527 $this->min_compressed_size += $len + 1; 8528 if ($this->compressed_size >= $this->min_compressed_size) 8529 { 8530 // Set the original comment to the given string 8531 $this->comment = substr($this->compressed_data, $this->position, $len); 8532 $this->position += $len + 1; 8533 } 8534 else 8535 { 8536 return false; 8537 } 8538 } 8539 8540 // Parse the FHCRC 8541 if ($this->flags & 2) 8542 { 8543 // Check the length of the string is still valid 8544 $this->min_compressed_size += $len + 2; 8545 if ($this->compressed_size >= $this->min_compressed_size) 8546 { 8547 // Read the CRC 8548 $crc = current(unpack('v', substr($this->compressed_data, $this->position, 2))); 8549 8550 // Check the CRC matches 8551 if ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc) 8552 { 8553 $this->position += 2; 8554 } 8555 else 8556 { 8557 return false; 8558 } 8559 } 8560 else 8561 { 8562 return false; 8563 } 8564 } 8565 8566 // Decompress the actual data 8567 if (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false) 8568 { 8569 return false; 8570 } 8571 else 8572 { 8573 $this->position = $this->compressed_size - 8; 8574 } 8575 8576 // Check CRC of data 8577 $crc = current(unpack('V', substr($this->compressed_data, $this->position, 4))); 8578 $this->position += 4; 8579 /*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc)) 8580 { 8581 return false; 8582 }*/ 8583 8584 // Check ISIZE of data 8585 $isize = current(unpack('V', substr($this->compressed_data, $this->position, 4))); 8586 $this->position += 4; 8587 if (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize)) 8588 { 8589 return false; 8590 } 8591 8592 // Wow, against all odds, we've actually got a valid gzip string 8593 return true; 8594 } 8595 else 8596 { 8597 return false; 8598 } 8599 } 8600 } 8601 8602 class SimplePie_Cache 8603 { 8604 /** 8605 * Don't call the constructor. Please. 8606 * 8607 * @access private 8608 */ 8609 function SimplePie_Cache() 8610 { 8611 trigger_error('Please call SimplePie_Cache::create() instead of the constructor', E_USER_ERROR); 8612 } 8613 8614 /** 8615 * Create a new SimplePie_Cache object 8616 * 8617 * @static 8618 * @access public 8619 */ 8620 function create($location, $filename, $extension) 8621 { 8622 $location_iri =& new SimplePie_IRI($location); 8623 switch ($location_iri->get_scheme()) 8624 { 8625 case 'mysql': 8626 if (extension_loaded('mysql')) 8627 { 8628 return new SimplePie_Cache_MySQL($location_iri, $filename, $extension); 8629 } 8630 break; 8631 8632 default: 8633 return new SimplePie_Cache_File($location, $filename, $extension); 8634 } 8635 } 8636 } 8637 8638 class SimplePie_Cache_File 8639 { 8640 var $location; 8641 var $filename; 8642 var $extension; 8643 var $name; 8644 8645 function SimplePie_Cache_File($location, $filename, $extension) 8646 { 8647 $this->location = $location; 8648 $this->filename = $filename; 8649 $this->extension = $extension; 8650 $this->name = "$this->location/$this->filename.$this->extension"; 8651 } 8652 8653 function save($data) 8654 { 8655 if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location)) 8656 { 8657 if (is_a($data, 'SimplePie')) 8658 { 8659 $data = $data->data; 8660 } 8661 8662 $data = serialize($data); 8663 8664 if (function_exists('file_put_contents')) 8665 { 8666 return (bool) file_put_contents($this->name, $data); 8667 } 8668 else 8669 { 8670 $fp = fopen($this->name, 'wb'); 8671 if ($fp) 8672 { 8673 fwrite($fp, $data); 8674 fclose($fp); 8675 return true; 8676 } 8677 } 8678 } 8679 return false; 8680 } 8681 8682 function load() 8683 { 8684 if (file_exists($this->name) && is_readable($this->name)) 8685 { 8686 return unserialize(file_get_contents($this->name)); 8687 } 8688 return false; 8689 } 8690 8691 function mtime() 8692 { 8693 if (file_exists($this->name)) 8694 { 8695 return filemtime($this->name); 8696 } 8697 return false; 8698 } 8699 8700 function touch() 8701 { 8702 if (file_exists($this->name)) 8703 { 8704 return touch($this->name); 8705 } 8706 return false; 8707 } 8708 8709 function unlink() 8710 { 8711 if (file_exists($this->name)) 8712 { 8713 return unlink($this->name); 8714 } 8715 return false; 8716 } 8717 } 8718 8719 class SimplePie_Cache_DB 8720 { 8721 function prepare_simplepie_object_for_cache($data) 8722 { 8723 $items = $data->get_items(); 8724 $items_by_id = array(); 8725 8726 if (!empty($items)) 8727 { 8728 foreach ($items as $item) 8729 { 8730 $items_by_id[$item->get_id()] = $item; 8731 } 8732 8733 if (count($items_by_id) !== count($items)) 8734 { 8735 $items_by_id = array(); 8736 foreach ($items as $item) 8737 { 8738 $items_by_id[$item->get_id(true)] = $item; 8739 } 8740 } 8741 8742 if (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0])) 8743 { 8744 $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]; 8745 } 8746 elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0])) 8747 { 8748 $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]; 8749 } 8750 elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0])) 8751 { 8752 $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]; 8753 } 8754 elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0])) 8755 { 8756 $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]; 8757 } 8758 else 8759 { 8760 $channel = null; 8761 } 8762 8763 if ($channel !== null) 8764 { 8765 if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'])) 8766 { 8767 unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']); 8768 } 8769 if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry'])) 8770 { 8771 unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']); 8772 } 8773 if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item'])) 8774 { 8775 unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']); 8776 } 8777 if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item'])) 8778 { 8779 unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']); 8780 } 8781 if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item'])) 8782 { 8783 unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']); 8784 } 8785 } 8786 if (isset($data->data['items'])) 8787 { 8788 unset($data->data['items']); 8789 } 8790 if (isset($data->data['ordered_items'])) 8791 { 8792 unset($data->data['ordered_items']); 8793 } 8794 } 8795 return array(serialize($data->data), $items_by_id); 8796 } 8797 } 8798 8799 class SimplePie_Cache_MySQL extends SimplePie_Cache_DB 8800 { 8801 var $mysql; 8802 var $options; 8803 var $id; 8804 8805 function SimplePie_Cache_MySQL($mysql_location, $name, $extension) 8806 { 8807 $host = $mysql_location->get_host(); 8808 if (SimplePie_Misc::stripos($host, 'unix(') === 0 && substr($host, -1) === ')') 8809 { 8810 $server = ':' . substr($host, 5, -1); 8811 } 8812 else 8813 { 8814 $server = $host; 8815 if ($mysql_location->get_port() !== null) 8816 { 8817 $server .= ':' . $mysql_location->get_port(); 8818 } 8819 } 8820 8821 if (strpos($mysql_location->get_userinfo(), ':') !== false) 8822 { 8823 list($username, $password) = explode(':', $mysql_location->get_userinfo(), 2); 8824 } 8825 else 8826 { 8827 $username = $mysql_location->get_userinfo(); 8828 $password = null; 8829 } 8830 8831 if ($this->mysql = mysql_connect($server, $username, $password)) 8832 { 8833 $this->id = $name . $extension; 8834 $this->options = SimplePie_Misc::parse_str($mysql_location->get_query()); 8835 if (!isset($this->options['prefix'][0])) 8836 { 8837 $this->options['prefix'][0] = ''; 8838 } 8839 8840 if (mysql_select_db(ltrim($mysql_location->get_path(), '/')) 8841 && mysql_query('SET NAMES utf8') 8842 && ($query = mysql_unbuffered_query('SHOW TABLES'))) 8843 { 8844 $db = array(); 8845 while ($row = mysql_fetch_row($query)) 8846 { 8847 $db[] = $row[0]; 8848 } 8849 8850 if (!in_array($this->options['prefix'][0] . 'cache_data', $db)) 8851 { 8852 if (!mysql_query('CREATE TABLE `' . $this->options['prefix'][0] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))')) 8853 { 8854 $this->mysql = null; 8855 } 8856 } 8857 8858 if (!in_array($this->options['prefix'][0] . 'items', $db)) 8859 { 8860 if (!mysql_query('CREATE TABLE `' . $this->options['prefix'][0] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` TEXT CHARACTER SET utf8 NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))')) 8861 { 8862 $this->mysql = null; 8863 } 8864 } 8865 } 8866 else 8867 { 8868 $this->mysql = null; 8869 } 8870 } 8871 } 8872 8873 function save($data) 8874 { 8875 if ($this->mysql) 8876 { 8877 $feed_id = "'" . mysql_real_escape_string($this->id) . "'"; 8878 8879 if (is_a($data, 'SimplePie')) 8880 { 8881 if (SIMPLEPIE_PHP5) 8882 { 8883 // This keyword needs to defy coding standards for PHP4 compatibility 8884 $data = clone($data); 8885 } 8886 8887 $prepared = $this->prepare_simplepie_object_for_cache($data); 8888 8889 if ($query = mysql_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = ' . $feed_id, $this->mysql)) 8890 { 8891 if (mysql_num_rows($query)) 8892 { 8893 $items = count($prepared[1]); 8894 if ($items) 8895 { 8896 $sql = 'UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `items` = ' . $items . ', `data` = \'' . mysql_real_escape_string($prepared[0]) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id; 8897 } 8898 else 8899 { 8900 $sql = 'UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `data` = \'' . mysql_real_escape_string($prepared[0]) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id; 8901 } 8902 8903 if (!mysql_query($sql, $this->mysql)) 8904 { 8905 return false; 8906 } 8907 } 8908 elseif (!mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(' . $feed_id . ', ' . count($prepared[1]) . ', \'' . mysql_real_escape_string($prepared[0]) . '\', ' . time() . ')', $this->mysql)) 8909 { 8910 return false; 8911 } 8912 8913 $ids = array_keys($prepared[1]); 8914 if (!empty($ids)) 8915 { 8916 foreach ($ids as $id) 8917 { 8918 $database_ids[] = mysql_real_escape_string($id); 8919 } 8920 8921 if ($query = mysql_unbuffered_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'items` WHERE `id` = \'' . implode('\' OR `id` = \'', $database_ids) . '\' AND `feed_id` = ' . $feed_id, $this->mysql)) 8922 { 8923 $existing_ids = array(); 8924 while ($row = mysql_fetch_row($query)) 8925 { 8926 $existing_ids[] = $row[0]; 8927 } 8928 8929 $new_ids = array_diff($ids, $existing_ids); 8930 8931 foreach ($new_ids as $new_id) 8932 { 8933 if (!($date = $prepared[1][$new_id]->get_date('U'))) 8934 { 8935 $date = time(); 8936 } 8937 8938 if (!mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(' . $feed_id . ', \'' . mysql_real_escape_string($new_id) . '\', \'' . mysql_real_escape_string(serialize($prepared[1][$new_id]->data)) . '\', ' . $date . ')', $this->mysql)) 8939 { 8940 return false; 8941 } 8942 } 8943 return true; 8944 } 8945 } 8946 else 8947 { 8948 return true; 8949 } 8950 } 8951 } 8952 elseif ($query = mysql_query('SELECT `id` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = ' . $feed_id, $this->mysql)) 8953 { 8954 if (mysql_num_rows($query)) 8955 { 8956 if (mysql_query('UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `items` = 0, `data` = \'' . mysql_real_escape_string(serialize($data)) . '\', `mtime` = ' . time() . ' WHERE `id` = ' . $feed_id, $this->mysql)) 8957 { 8958 return true; 8959 } 8960 } 8961 elseif (mysql_query('INSERT INTO `' . $this->options['prefix'][0] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(\'' . mysql_real_escape_string($this->id) . '\', 0, \'' . mysql_real_escape_string(serialize($data)) . '\', ' . time() . ')', $this->mysql)) 8962 { 8963 return true; 8964 } 8965 } 8966 } 8967 return false; 8968 } 8969 8970 function load() 8971 { 8972 if ($this->mysql && ($query = mysql_query('SELECT `items`, `data` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($row = mysql_fetch_row($query))) 8973 { 8974 $data = unserialize($row[1]); 8975 8976 if (isset($this->options['items'][0])) 8977 { 8978 $items = (int) $this->options['items'][0]; 8979 } 8980 else 8981 { 8982 $items = (int) $row[0]; 8983 } 8984 8985 if ($items !== 0) 8986 { 8987 if (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0])) 8988 { 8989 $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]; 8990 } 8991 elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0])) 8992 { 8993 $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]; 8994 } 8995 elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0])) 8996 { 8997 $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]; 8998 } 8999 elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0])) 9000 { 9001 $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]; 9002 } 9003 else 9004 { 9005 $feed = null; 9006 } 9007 9008 if ($feed !== null) 9009 { 9010 $sql = 'SELECT `data` FROM `' . $this->options['prefix'][0] . 'items` WHERE `feed_id` = \'' . mysql_real_escape_string($this->id) . '\' ORDER BY `posted` DESC'; 9011 if ($items > 0) 9012 { 9013 $sql .= ' LIMIT ' . $items; 9014 } 9015 9016 if ($query = mysql_unbuffered_query($sql, $this->mysql)) 9017 { 9018 while ($row = mysql_fetch_row($query)) 9019 { 9020 $feed['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'][] = unserialize($row[0]); 9021 } 9022 } 9023 else 9024 { 9025 return false; 9026 } 9027 } 9028 } 9029 return $data; 9030 } 9031 return false; 9032 } 9033 9034 function mtime() 9035 { 9036 if ($this->mysql && ($query = mysql_query('SELECT `mtime` FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($row = mysql_fetch_row($query))) 9037 { 9038 return $row[0]; 9039 } 9040 else 9041 { 9042 return false; 9043 } 9044 } 9045 9046 function touch() 9047 { 9048 if ($this->mysql && ($query = mysql_query('UPDATE `' . $this->options['prefix'][0] . 'cache_data` SET `mtime` = ' . time() . ' WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && mysql_affected_rows($this->mysql)) 9049 { 9050 return true; 9051 } 9052 else 9053 { 9054 return false; 9055 } 9056 } 9057 9058 function unlink() 9059 { 9060 if ($this->mysql && ($query = mysql_query('DELETE FROM `' . $this->options['prefix'][0] . 'cache_data` WHERE `id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql)) && ($query2 = mysql_query('DELETE FROM `' . $this->options['prefix'][0] . 'items` WHERE `feed_id` = \'' . mysql_real_escape_string($this->id) . "'", $this->mysql))) 9061 { 9062 return true; 9063 } 9064 else 9065 { 9066 return false; 9067 } 9068 } 9069 } 9070 9071 class SimplePie_Misc 9072 { 9073 function time_hms($seconds) 9074 { 9075 $time = ''; 9076 9077 $hours = floor($seconds / 3600); 9078 $remainder = $seconds % 3600; 9079 if ($hours > 0) 9080 { 9081 $time .= $hours.':'; 9082 } 9083 9084 $minutes = floor($remainder / 60); 9085 $seconds = $remainder % 60; 9086 if ($minutes < 10 && $hours > 0) 9087 { 9088 $minutes = '0' . $minutes; 9089 } 9090 if ($seconds < 10) 9091 { 9092 $seconds = '0' . $seconds; 9093 } 9094 9095 $time .= $minutes.':'; 9096 $time .= $seconds; 9097 9098 return $time; 9099 } 9100 9101 function absolutize_url($relative, $base) 9102 { 9103 $iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative); 9104 return $iri->get_iri(); 9105 } 9106 9107 function remove_dot_segments($input) 9108 { 9109 $output = ''; 9110 while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') 9111 { 9112 // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise, 9113 if (strpos($input, '../') === 0) 9114 { 9115 $input = substr($input, 3); 9116 } 9117 elseif (strpos($input, './') === 0) 9118 { 9119 $input = substr($input, 2); 9120 } 9121 // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise, 9122 elseif (strpos($input, '/./') === 0) 9123 { 9124 $input = substr_replace($input, '/', 0, 3); 9125 } 9126 elseif ($input === '/.') 9127 { 9128 $input = '/'; 9129 } 9130 // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise, 9131 elseif (strpos($input, '/../') === 0) 9132 { 9133 $input = substr_replace($input, '/', 0, 4); 9134 $output = substr_replace($output, '', strrpos($output, '/')); 9135 } 9136 elseif ($input === '/..') 9137 { 9138 $input = '/'; 9139 $output = substr_replace($output, '', strrpos($output, '/')); 9140 } 9141 // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise, 9142 elseif ($input === '.' || $input === '..') 9143 { 9144 $input = ''; 9145 } 9146 // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer 9147 elseif (($pos = strpos($input, '/', 1)) !== false) 9148 { 9149 $output .= substr($input, 0, $pos); 9150 $input = substr_replace($input, '', 0, $pos); 9151 } 9152 else 9153 { 9154 $output .= $input; 9155 $input = ''; 9156 } 9157 } 9158 return $output . $input; 9159 } 9160 9161 function get_element($realname, $string) 9162 { 9163 $return = array(); 9164 $name = preg_quote($realname, '/'); 9165 if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) 9166 { 9167 for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++) 9168 { 9169 $return[$i]['tag'] = $realname; 9170 $return[$i]['full'] = $matches[$i][0][0]; 9171 $return[$i]['offset'] = $matches[$i][0][1]; 9172 if (strlen($matches[$i][3][0]) <= 2) 9173 { 9174 $return[$i]['self_closing'] = true; 9175 } 9176 else 9177 { 9178 $return[$i]['self_closing'] = false; 9179 $return[$i]['content'] = $matches[$i][4][0]; 9180 } 9181 $return[$i]['attribs'] = array(); 9182 if (isset($matches[$i][2][0]) && preg_match_all('/[\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]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER)) 9183 { 9184 for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++) 9185 { 9186 if (count($attribs[$j]) === 2) 9187 { 9188 $attribs[$j][2] = $attribs[$j][1]; 9189 } 9190 $return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j]), 'UTF-8'); 9191 } 9192 } 9193 } 9194 } 9195 return $return; 9196 } 9197 9198 function element_implode($element) 9199 { 9200 $full = "<$element[tag]"; 9201 foreach ($element['attribs'] as $key => $value) 9202 { 9203 $key = strtolower($key); 9204 $full .= " $key=\"" . htmlspecialchars($value['data']) . '"'; 9205 } 9206 if ($element['self_closing']) 9207 { 9208 $full .= ' />'; 9209 } 9210 else 9211 { 9212 $full .= ">$element[content]</$element[tag]>"; 9213 } 9214 return $full; 9215 } 9216 9217 function error($message, $level, $file, $line) 9218 { 9219 if ((ini_get('error_reporting') & $level) > 0) 9220 { 9221 switch ($level) 9222 { 9223 case E_USER_ERROR: 9224 $note = 'PHP Error'; 9225 break; 9226 case E_USER_WARNING: 9227 $note = 'PHP Warning'; 9228 break; 9229 case E_USER_NOTICE: 9230 $note = 'PHP Notice'; 9231 break; 9232 default: 9233 $note = 'Unknown Error'; 9234 break; 9235 } 9236 error_log("$note: $message in $file on line $line", 0); 9237 } 9238 return $message; 9239 } 9240 9241 /** 9242 * If a file has been cached, retrieve and display it. 9243 * 9244 * This is most useful for caching images (get_favicon(), etc.), 9245 * however it works for all cached files. This WILL NOT display ANY 9246 * file/image/page/whatever, but rather only display what has already 9247 * been cached by SimplePie. 9248 * 9249 * @access public 9250 * @see SimplePie::get_favicon() 9251 * @param str $identifier_url URL that is used to identify the content. 9252 * This may or may not be the actual URL of the live content. 9253 * @param str $cache_location Location of SimplePie's cache. Defaults 9254 * to './cache'. 9255 * @param str $cache_extension The file extension that the file was 9256 * cached with. Defaults to 'spc'. 9257 * @param str $cache_class Name of the cache-handling class being used 9258 * in SimplePie. Defaults to 'SimplePie_Cache', and should be left 9259 * as-is unless you've overloaded the class. 9260 * @param str $cache_name_function Obsolete. Exists for backwards 9261 * compatibility reasons only. 9262 */ 9263 function display_cached_file($identifier_url, $cache_location = './cache', $cache_extension = 'spc', $cache_class = 'SimplePie_Cache', $cache_name_function = 'md5') 9264 { 9265 $cache = call_user_func(array($cache_class, 'create'), $cache_location, $identifier_url, $cache_extension); 9266 9267 if ($file = $cache->load()) 9268 { 9269 if (isset($file['headers']['content-type'])) 9270 { 9271 header('Content-type:' . $file['headers']['content-type']); 9272 } 9273 else 9274 { 9275 header('Content-type: application/octet-stream'); 9276 } 9277 header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days 9278 echo $file['body']; 9279 exit; 9280 } 9281 9282 die('Cached file for ' . $identifier_url . ' cannot be found.'); 9283 } 9284 9285 function fix_protocol($url, $http = 1) 9286 { 9287 $url = SimplePie_Misc::normalize_url($url); 9288 $parsed = SimplePie_Misc::parse_url($url); 9289 if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https') 9290 { 9291 return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http); 9292 } 9293 9294 if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url)) 9295 { 9296 return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http); 9297 } 9298 9299 if ($http === 2 && $parsed['scheme'] !== '') 9300 { 9301 return "feed:$url"; 9302 } 9303 elseif ($http === 3 && strtolower($parsed['scheme']) === 'http') 9304 { 9305 return substr_replace($url, 'podcast', 0, 4); 9306 } 9307 elseif ($http === 4 && strtolower($parsed['scheme']) === 'http') 9308 { 9309 return substr_replace($url, 'itpc', 0, 4); 9310 } 9311 else 9312 { 9313 return $url; 9314 } 9315 } 9316 9317 function parse_url($url) 9318 { 9319 $iri =& new SimplePie_IRI($url); 9320 return array( 9321 'scheme' => (string) $iri->get_scheme(), 9322 'authority' => (string) $iri->get_authority(), 9323 'path' => (string) $iri->get_path(), 9324 'query' => (string) $iri->get_query(), 9325 'fragment' => (string) $iri->get_fragment() 9326 ); 9327 } 9328 9329 function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '') 9330 { 9331 $iri =& new SimplePie_IRI(''); 9332 $iri->set_scheme($scheme); 9333 $iri->set_authority($authority); 9334 $iri->set_path($path); 9335 $iri->set_query($query); 9336 $iri->set_fragment($fragment); 9337 return $iri->get_iri(); 9338 } 9339 9340 function normalize_url($url) 9341 { 9342 $iri =& new SimplePie_IRI($url); 9343 return $iri->get_iri(); 9344 } 9345 9346 function percent_encoding_normalization($match) 9347 { 9348 $integer = hexdec($match[1]); 9349 if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E) 9350 { 9351 return chr($integer); 9352 } 9353 else 9354 { 9355 return strtoupper($match[0]); 9356 } 9357 } 9358 9359 /** 9360 * Remove bad UTF-8 bytes 9361 * 9362 * PCRE Pattern to locate bad bytes in a UTF-8 string comes from W3C 9363 * FAQ: Multilingual Forms (modified to include full ASCII range) 9364 * 9365 * @author Geoffrey Sneddon 9366 * @see http://www.w3.org/International/questions/qa-forms-utf-8 9367 * @param string $str String to remove bad UTF-8 bytes from 9368 * @return string UTF-8 string 9369 */ 9370 function utf8_bad_replace($str) 9371 { 9372 if (function_exists('iconv') && ($return = @iconv('UTF-8', 'UTF-8//IGNORE', $str))) 9373 { 9374 return $return; 9375 } 9376 elseif (function_exists('mb_convert_encoding') && ($return = @mb_convert_encoding($str, 'UTF-8', 'UTF-8'))) 9377 { 9378 return $return; 9379 } 9380 elseif (preg_match_all('/(?:[\x00-\x7F]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})+/', $str, $matches)) 9381 { 9382 return implode("\xEF\xBF\xBD", $matches[0]); 9383 } 9384 elseif ($str !== '') 9385 { 9386 return "\xEF\xBF\xBD"; 9387 } 9388 else 9389 { 9390 return ''; 9391 } 9392 } 9393 9394 /** 9395 * Converts a Windows-1252 encoded string to a UTF-8 encoded string 9396 * 9397 * @static 9398 * @access public 9399 * @param string $string Windows-1252 encoded string 9400 * @return string UTF-8 encoded string 9401 */ 9402 function windows_1252_to_utf8($string) 9403 { 9404 static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF"); 9405 9406 return strtr($string, $convert_table); 9407 } 9408 9409 function change_encoding($data, $input, $output) 9410 { 9411 $input = SimplePie_Misc::encoding($input); 9412 $output = SimplePie_Misc::encoding($output); 9413 9414 // We fail to fail on non US-ASCII bytes 9415 if ($input === 'US-ASCII') 9416 { 9417 static $non_ascii_octects = ''; 9418 if (!$non_ascii_octects) 9419 { 9420 for ($i = 0x80; $i <= 0xFF; $i++) 9421 { 9422 $non_ascii_octects .= chr($i); 9423 } 9424 } 9425 $data = substr($data, 0, strcspn($data, $non_ascii_octects)); 9426 } 9427 9428 // This is first, as behaviour of this is completely predictable 9429 if ($input === 'Windows-1252' && $output === 'UTF-8') 9430 { 9431 return SimplePie_Misc::windows_1252_to_utf8($data); 9432 } 9433 // This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported). 9434 elseif (function_exists('mb_convert_encoding') && @mb_convert_encoding("\x80", 'UTF-16BE', $input) !== "\x00\x80" && ($return = @mb_convert_encoding($data, $output, $input))) 9435 { 9436 return $return; 9437 } 9438 // This is last, as behaviour of this varies with OS userland and PHP version 9439 elseif (function_exists('iconv') && ($return = @iconv($input, $output, $data))) 9440 { 9441 return $return; 9442 } 9443 // If we can't do anything, just fail 9444 else 9445 { 9446 return false; 9447 } 9448 } 9449 9450 function encoding($charset) 9451 { 9452 // Normalization from UTS #22 9453 switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset))) 9454 { 9455 case 'adobestandardencoding': 9456 case 'csadobestandardencoding': 9457 return 'Adobe-Standard-Encoding'; 9458 9459 case 'adobesymbolencoding': 9460 case 'cshppsmath': 9461 return 'Adobe-Symbol-Encoding'; 9462 9463 case 'ami1251': 9464 case 'amiga1251': 9465 return 'Amiga-1251'; 9466 9467 case 'ansix31101983': 9468 case 'csat5001983': 9469 case 'csiso99naplps': 9470 case 'isoir99': 9471 case 'naplps': 9472 return 'ANSI_X3.110-1983'; 9473 9474 case 'arabic7': 9475 case 'asmo449': 9476 case 'csiso89asmo449': 9477 case 'iso9036': 9478 case 'isoir89': 9479 return 'ASMO_449'; 9480 9481 case 'big5': 9482 case 'csbig5': 9483 case 'xxbig5': 9484 return 'Big5'; 9485 9486 case 'big5hkscs': 9487 return 'Big5-HKSCS'; 9488 9489 case 'bocu1': 9490 case 'csbocu1': 9491 return 'BOCU-1'; 9492 9493 case 'brf': 9494 case 'csbrf': 9495 return 'BRF'; 9496 9497 case 'bs4730': 9498 case 'csiso4unitedkingdom': 9499 case 'gb': 9500 case 'iso646gb': 9501 case 'isoir4': 9502 case 'uk': 9503 return 'BS_4730'; 9504 9505 case 'bsviewdata': 9506 case 'csiso47bsviewdata': 9507 case 'isoir47': 9508 return 'BS_viewdata'; 9509 9510 case 'cesu8': 9511 case 'cscesu8': 9512 return 'CESU-8'; 9513 9514 case 'ca': 9515 case 'csa71': 9516 case 'csaz243419851': 9517 case 'csiso121canadian1': 9518 case 'iso646ca': 9519 case 'isoir121': 9520 return 'CSA_Z243.4-1985-1'; 9521 9522 case 'csa72': 9523 case 'csaz243419852': 9524 case 'csiso122canadian2': 9525 case 'iso646ca2': 9526 case 'isoir122': 9527 return 'CSA_Z243.4-1985-2'; 9528 9529 case 'csaz24341985gr': 9530 case 'csiso123csaz24341985gr': 9531 case 'isoir123': 9532 return 'CSA_Z243.4-1985-gr'; 9533 9534 case 'csiso139csn369103': 9535 case 'csn369103': 9536 case 'isoir139': 9537 return 'CSN_369103'; 9538 9539 case 'csdecmcs': 9540 case 'dec': 9541 case 'decmcs': 9542 return 'DEC-MCS'; 9543 9544 case 'csiso21german': 9545 case 'de': 9546 case 'din66003': 9547 case 'iso646de': 9548 case 'isoir21': 9549 return 'DIN_66003'; 9550 9551 case 'csdkus': 9552 case 'dkus': 9553 return 'dk-us'; 9554 9555 case 'csiso646danish': 9556 case 'dk': 9557 case 'ds2089': 9558 case 'iso646dk': 9559 return 'DS_2089'; 9560 9561 case 'csibmebcdicatde': 9562 case 'ebcdicatde': 9563 return 'EBCDIC-AT-DE'; 9564 9565 case 'csebcdicatdea': 9566 case 'ebcdicatdea': 9567 return 'EBCDIC-AT-DE-A'; 9568 9569 case 'csebcdiccafr': 9570 case 'ebcdiccafr': 9571 return 'EBCDIC-CA-FR'; 9572 9573 case 'csebcdicdkno': 9574 case 'ebcdicdkno': 9575 return 'EBCDIC-DK-NO'; 9576 9577 case 'csebcdicdknoa': 9578 case 'ebcdicdknoa': 9579 return 'EBCDIC-DK-NO-A'; 9580 9581 case 'csebcdices': 9582 case 'ebcdices': 9583 return 'EBCDIC-ES'; 9584 9585 case 'csebcdicesa': 9586 case 'ebcdicesa': 9587 return 'EBCDIC-ES-A'; 9588 9589 case 'csebcdicess': 9590 case 'ebcdicess': 9591 return 'EBCDIC-ES-S'; 9592 9593 case 'csebcdicfise': 9594 case 'ebcdicfise': 9595 return 'EBCDIC-FI-SE'; 9596 9597 case 'csebcdicfisea': 9598 case 'ebcdicfisea': 9599 return 'EBCDIC-FI-SE-A'; 9600 9601 case 'csebcdicfr': 9602 case 'ebcdicfr': 9603 return 'EBCDIC-FR'; 9604 9605 case 'csebcdicit': 9606 case 'ebcdicit': 9607 return 'EBCDIC-IT'; 9608 9609 case 'csebcdicpt': 9610 case 'ebcdicpt': 9611 return 'EBCDIC-PT'; 9612 9613 case 'csebcdicuk': 9614 case 'ebcdicuk': 9615 return 'EBCDIC-UK'; 9616 9617 case 'csebcdicus': 9618 case 'ebcdicus': 9619 return 'EBCDIC-US'; 9620 9621 case 'csiso111ecmacyrillic': 9622 case 'ecmacyrillic': 9623 case 'isoir111': 9624 case 'koi8e': 9625 return 'ECMA-cyrillic'; 9626 9627 case 'csiso17spanish': 9628 case 'es': 9629 case 'iso646es': 9630 case 'isoir17': 9631 return 'ES'; 9632 9633 case 'csiso85spanish2': 9634 case 'es2': 9635 case 'iso646es2': 9636 case 'isoir85': 9637 return 'ES2'; 9638 9639 case 'cseucfixwidjapanese': 9640 case 'extendedunixcodefixedwidthforjapanese': 9641 return 'Extended_UNIX_Code_Fixed_Width_for_Japanese'; 9642 9643 case 'cseucpkdfmtjapanese': 9644 case 'eucjp': 9645 case 'extendedunixcodepackedformatforjapanese': 9646 return 'Extended_UNIX_Code_Packed_Format_for_Japanese'; 9647 9648 case 'gb18030': 9649 return 'GB18030'; 9650 9651 case 'chinese': 9652 case 'cp936': 9653 case 'csgb2312': 9654 case 'csiso58gb231280': 9655 case 'gb2312': 9656 case 'gb231280': 9657 case 'gbk': 9658 case 'isoir58': 9659 case 'ms936': 9660 case 'windows936': 9661 return 'GBK'; 9662 9663 case 'cn': 9664 case 'csiso57gb1988': 9665 case 'gb198880': 9666 case 'iso646cn': 9667 case 'isoir57': 9668 return 'GB_1988-80'; 9669 9670 case 'csiso153gost1976874': 9671 case 'gost1976874': 9672 case 'isoir153': 9673 case 'stsev35888': 9674 return 'GOST_19768-74'; 9675 9676 case 'csiso150': 9677 case 'csiso150greekccitt': 9678 case 'greekccitt': 9679 case 'isoir150': 9680 return 'greek-ccitt'; 9681 9682 case 'csiso88greek7': 9683 case 'greek7': 9684 case 'isoir88': 9685 return 'greek7'; 9686 9687 case 'csiso18greek7old': 9688 case 'greek7old': 9689 case 'isoir18': 9690 return 'greek7-old'; 9691 9692 case 'cshpdesktop': 9693 case 'hpdesktop': 9694 return 'HP-DeskTop'; 9695 9696 case 'cshplegal': 9697 case 'hplegal': 9698 return 'HP-Legal'; 9699 9700 case 'cshpmath8': 9701 case 'hpmath8': 9702 return 'HP-Math8'; 9703 9704 case 'cshppifont': 9705 case 'hppifont': 9706 return 'HP-Pi-font'; 9707 9708 case 'cshproman8': 9709 case 'hproman8': 9710 case 'r8': 9711 case 'roman8': 9712 return 'hp-roman8'; 9713 9714 case 'hzgb2312': 9715 return 'HZ-GB-2312'; 9716 9717 case 'csibmsymbols': 9718 case 'ibmsymbols': 9719 return 'IBM-Symbols'; 9720 9721 case 'csibmthai': 9722 case 'ibmthai': 9723 return 'IBM-Thai'; 9724 9725 case 'ccsid858': 9726 case 'cp858': 9727 case 'ibm858': 9728 case 'pcmultilingual850euro': 9729 return 'IBM00858'; 9730 9731 case 'ccsid924': 9732 case 'cp924': 9733 case 'ebcdiclatin9euro': 9734 case 'ibm924': 9735 return 'IBM00924'; 9736 9737 case 'ccsid1140': 9738 case 'cp1140': 9739 case 'ebcdicus37euro': 9740 case 'ibm1140': 9741 return 'IBM01140'; 9742 9743 case 'ccsid1141': 9744 case 'cp1141': 9745 case 'ebcdicde273euro': 9746 case 'ibm1141': 9747 return 'IBM01141'; 9748 9749 case 'ccsid1142': 9750 case 'cp1142': 9751 case 'ebcdicdk277euro': 9752 case 'ebcdicno277euro': 9753 case 'ibm1142': 9754 return 'IBM01142'; 9755 9756 case 'ccsid1143': 9757 case 'cp1143': 9758 case 'ebcdicfi278euro': 9759 case 'ebcdicse278euro': 9760 case 'ibm1143': 9761 return 'IBM01143'; 9762 9763 case 'ccsid1144': 9764 case 'cp1144': 9765 case 'ebcdicit280euro': 9766 case 'ibm1144': 9767 return 'IBM01144'; 9768 9769 case 'ccsid1145': 9770 case 'cp1145': 9771 case 'ebcdices284euro': 9772 case 'ibm1145': 9773 return 'IBM01145'; 9774 9775 case 'ccsid1146': 9776 case 'cp1146': 9777 case 'ebcdicgb285euro': 9778 case 'ibm1146': 9779 return 'IBM01146'; 9780 9781 case 'ccsid1147': 9782 case 'cp1147': 9783 case 'ebcdicfr297euro': 9784 case 'ibm1147': 9785 return 'IBM01147'; 9786 9787 case 'ccsid1148': 9788 case 'cp1148': 9789 case 'ebcdicinternational500euro': 9790 case 'ibm1148': 9791 return 'IBM01148'; 9792 9793 case 'ccsid1149': 9794 case 'cp1149': 9795 case 'ebcdicis871euro': 9796 case 'ibm1149': 9797 return 'IBM01149'; 9798 9799 case 'cp37': 9800 case 'csibm37': 9801 case 'ebcdiccpca': 9802 case 'ebcdiccpnl': 9803 case 'ebcdiccpus': 9804 case 'ebcdiccpwt': 9805 case 'ibm37': 9806 return 'IBM037'; 9807 9808 case 'cp38': 9809 case 'csibm38': 9810 case 'ebcdicint': 9811 case 'ibm38': 9812 return 'IBM038'; 9813 9814 case 'cp273': 9815 case 'csibm273': 9816 case 'ibm273': 9817 return 'IBM273'; 9818 9819 case 'cp274': 9820 case 'csibm274': 9821 case 'ebcdicbe': 9822 case 'ibm274': 9823 return 'IBM274'; 9824 9825 case 'cp275': 9826 case 'csibm275': 9827 case 'ebcdicbr': 9828 case 'ibm275': 9829 return 'IBM275'; 9830 9831 case 'csibm277': 9832 case 'ebcdiccpdk': 9833 case 'ebcdiccpno': 9834 case 'ibm277': 9835 return 'IBM277'; 9836 9837 case 'cp278': 9838 case 'csibm278': 9839 case 'ebcdiccpfi': 9840 case 'ebcdiccpse': 9841 case 'ibm278': 9842 return 'IBM278'; 9843 9844 case 'cp280': 9845 case 'csibm280': 9846 case 'ebcdiccpit': 9847 case 'ibm280': 9848 return 'IBM280'; 9849 9850 case 'cp281': 9851 case 'csibm281': 9852 case 'ebcdicjpe': 9853 case 'ibm281': 9854 return 'IBM281'; 9855 9856 case 'cp284': 9857 case 'csibm284': 9858 case 'ebcdiccpes': 9859 case 'ibm284': 9860 return 'IBM284'; 9861 9862 case 'cp285': 9863 case 'csibm285': 9864 case 'ebcdiccpgb': 9865 case 'ibm285': 9866 return 'IBM285'; 9867 9868 case 'cp290': 9869 case 'csibm290': 9870 case 'ebcdicjpkana': 9871 case 'ibm290': 9872 return 'IBM290'; 9873 9874 case 'cp297': 9875 case 'csibm297': 9876 case 'ebcdiccpfr': 9877 case 'ibm297': 9878 return 'IBM297'; 9879 9880 case 'cp420': 9881 case 'csibm420': 9882 case 'ebcdiccpar1': 9883 case 'ibm420': 9884 return 'IBM420'; 9885 9886 case 'cp423': 9887 case 'csibm423': 9888 case 'ebcdiccpgr': 9889 case 'ibm423': 9890 return 'IBM423'; 9891 9892 case 'cp424': 9893 case 'csibm424': 9894 case 'ebcdiccphe': 9895 case 'ibm424': 9896 return 'IBM424'; 9897 9898 case '437': 9899 case 'cp437': 9900 case 'cspc8codepage437': 9901 case 'ibm437': 9902 return 'IBM437'; 9903 9904 case 'cp500': 9905 case 'csibm500': 9906 case 'ebcdiccpbe': 9907 case 'ebcdiccpch': 9908 case 'ibm500': 9909 return 'IBM500'; 9910 9911 case 'cp775': 9912 case 'cspc775baltic': 9913 case 'ibm775': 9914 return 'IBM775'; 9915 9916 case '850': 9917 case 'cp850': 9918 case 'cspc850multilingual': 9919 case 'ibm850': 9920 return 'IBM850'; 9921 9922 case '851': 9923 case 'cp851': 9924 case 'csibm851': 9925 case 'ibm851': 9926 return 'IBM851'; 9927 9928 case '852': 9929 case 'cp852': 9930 case 'cspcp852': 9931 case 'ibm852': 9932 return 'IBM852'; 9933 9934 case '855': 9935 case 'cp855': 9936 case 'csibm855': 9937 case 'ibm855': 9938 return 'IBM855'; 9939 9940 case '857': 9941 case 'cp857': 9942 case 'csibm857': 9943 case 'ibm857': 9944 return 'IBM857'; 9945 9946 case '860': 9947 case 'cp860': 9948 case 'csibm860': 9949 case 'ibm860': 9950 return 'IBM860'; 9951 9952 case '861': 9953 case 'cp861': 9954 case 'cpis': 9955 case 'csibm861': 9956 case 'ibm861': 9957 return 'IBM861'; 9958 9959 case '862': 9960 case 'cp862': 9961 case 'cspc862latinhebrew': 9962 case 'ibm862': 9963 return 'IBM862'; 9964 9965 case '863': 9966 case 'cp863': 9967 case 'csibm863': 9968 case 'ibm863': 9969 return 'IBM863'; 9970 9971 case 'cp864': 9972 case 'csibm864': 9973 case 'ibm864': 9974 return 'IBM864'; 9975 9976 case '865': 9977 case 'cp865': 9978 case 'csibm865': 9979 case 'ibm865': 9980 return 'IBM865'; 9981 9982 case '866': 9983 case 'cp866': 9984 case 'csibm866': 9985 case 'ibm866': 9986 return 'IBM866'; 9987 9988 case 'cp868': 9989 case 'cpar': 9990 case 'csibm868': 9991 case 'ibm868': 9992 return 'IBM868'; 9993 9994 case '869': 9995 case 'cp869': 9996 case 'cpgr': 9997 case 'csibm869': 9998 case 'ibm869': 9999 return 'IBM869'; 10000 10001 case 'cp870': 10002 case 'csibm870': 10003 case 'ebcdiccproece': 10004 case 'ebcdiccpyu': 10005 case 'ibm870': 10006 return 'IBM870'; 10007 10008 case 'cp871': 10009 case 'csibm871': 10010 case 'ebcdiccpis': 10011 case 'ibm871': 10012 return 'IBM871'; 10013 10014 case 'cp880': 10015 case 'csibm880': 10016 case 'ebcdiccyrillic': 10017 case 'ibm880': 10018 return 'IBM880'; 10019 10020 case 'cp891': 10021 case 'csibm891': 10022 case 'ibm891': 10023 return 'IBM891'; 10024 10025 case 'cp903': 10026 case 'csibm903': 10027 case 'ibm903': 10028 return 'IBM903'; 10029 10030 case '904': 10031 case 'cp904': 10032 case 'csibbm904': 10033 case 'ibm904': 10034 return 'IBM904'; 10035 10036 case 'cp905': 10037 case 'csibm905': 10038 case 'ebcdiccptr': 10039 case 'ibm905': 10040 return 'IBM905'; 10041 10042 case 'cp918': 10043 case 'csibm918': 10044 case 'ebcdiccpar2': 10045 case 'ibm918': 10046 return 'IBM918'; 10047 10048 case 'cp1026': 10049 case 'csibm1026': 10050 case 'ibm1026': 10051 return 'IBM1026'; 10052 10053 case 'ibm1047': 10054 return 'IBM1047'; 10055 10056 case 'csiso143iecp271': 10057 case 'iecp271': 10058 case 'isoir143': 10059 return 'IEC_P27-1'; 10060 10061 case 'csiso49inis': 10062 case 'inis': 10063 case 'isoir49': 10064 return 'INIS'; 10065 10066 case 'csiso50inis8': 10067 case 'inis8': 10068 case 'isoir50': 10069 return 'INIS-8'; 10070 10071 case 'csiso51iniscyrillic': 10072 case 'iniscyrillic': 10073 case 'isoir51': 10074 return 'INIS-cyrillic'; 10075 10076 case 'csinvariant': 10077 case 'invariant': 10078 return 'INVARIANT'; 10079 10080 case 'iso2022cn': 10081 return 'ISO-2022-CN'; 10082 10083 case 'iso2022cnext': 10084 return 'ISO-2022-CN-EXT'; 10085 10086 case 'csiso2022jp': 10087 case 'iso2022jp': 10088 return 'ISO-2022-JP'; 10089 10090 case 'csiso2022jp2': 10091 case 'iso2022jp2': 10092 return 'ISO-2022-JP-2'; 10093 10094 case 'csiso2022kr': 10095 case 'iso2022kr': 10096 return 'ISO-2022-KR'; 10097 10098 case 'cswindows30latin1': 10099 case 'iso88591windows30latin1': 10100 return 'ISO-8859-1-Windows-3.0-Latin-1'; 10101 10102 case 'cswindows31latin1': 10103 case 'iso88591windows31latin1': 10104 return 'ISO-8859-1-Windows-3.1-Latin-1'; 10105 10106 case 'csisolatin2': 10107 case 'iso88592': 10108 case 'iso885921987': 10109 case 'isoir101': 10110 case 'l2': 10111 case 'latin2': 10112 return 'ISO-8859-2'; 10113 10114 case 'cswindows31latin2': 10115 case 'iso88592windowslatin2': 10116 return 'ISO-8859-2-Windows-Latin-2'; 10117 10118 case 'csisolatin3': 10119 case 'iso88593': 10120 case 'iso885931988': 10121 case 'isoir109': 10122 case 'l3': 10123 case 'latin3': 10124 return 'ISO-8859-3'; 10125 10126 case 'csisolatin4': 10127 case 'iso88594': 10128 case 'iso885941988': 10129 case 'isoir110': 10130 case 'l4': 10131 case 'latin4': 10132 return 'ISO-8859-4'; 10133 10134 case 'csisolatincyrillic': 10135 case 'cyrillic': 10136 case 'iso88595': 10137 case 'iso885951988': 10138 case 'isoir144': 10139 return 'ISO-8859-5'; 10140 10141 case 'arabic': 10142 case 'asmo708': 10143 case 'csisolatinarabic': 10144 case 'ecma114': 10145 case 'iso88596': 10146 case 'iso885961987': 10147 case 'isoir127': 10148 return 'ISO-8859-6'; 10149 10150 case 'csiso88596e': 10151 case 'iso88596e': 10152 return 'ISO-8859-6-E'; 10153 10154 case 'csiso88596i': 10155 case 'iso88596i': 10156 return 'ISO-8859-6-I'; 10157 10158 case 'csisolatingreek': 10159 case 'ecma118': 10160 case 'elot928': 10161 case 'greek': 10162 case 'greek8': 10163 case 'iso88597': 10164 case 'iso885971987': 10165 case 'isoir126': 10166 return 'ISO-8859-7'; 10167 10168 case 'csisolatinhebrew': 10169 case 'hebrew': 10170 case 'iso88598': 10171 case 'iso885981988': 10172 case 'isoir138': 10173 return 'ISO-8859-8'; 10174 10175 case 'csiso88598e': 10176 case 'iso88598e': 10177 return 'ISO-8859-8-E'; 10178 10179 case 'csiso88598i': 10180 case 'iso88598i': 10181 return 'ISO-8859-8-I'; 10182 10183 case 'cswindows31latin5': 10184 case 'iso88599windowslatin5': 10185 return 'ISO-8859-9-Windows-Latin-5'; 10186 10187 case 'csisolatin6': 10188 case 'iso885910': 10189 case 'iso8859101992': 10190 case 'isoir157': 10191 case 'l6': 10192 case 'latin6': 10193 return 'ISO-8859-10'; 10194 10195 case 'iso885913': 10196 return 'ISO-8859-13'; 10197 10198 case 'iso885914': 10199 case 'iso8859141998': 10200 case 'isoceltic': 10201 case 'isoir199': 10202 case 'l8': 10203 case 'latin8': 10204 return 'ISO-8859-14'; 10205 10206 case 'iso885915': 10207 case 'latin9': 10208 return 'ISO-8859-15'; 10209 10210 case 'iso885916': 10211 case 'iso8859162001': 10212 case 'isoir226': 10213 case 'l10': 10214 case 'latin10': 10215 return 'ISO-8859-16'; 10216 10217 case 'iso10646j1': 10218 return 'ISO-10646-J-1'; 10219 10220 case 'csunicode': 10221 case 'iso10646ucs2': 10222 return 'ISO-10646-UCS-2'; 10223 10224 case 'csucs4': 10225 case 'iso10646ucs4': 10226 return 'ISO-10646-UCS-4'; 10227 10228 case 'csunicodeascii': 10229 case 'iso10646ucsbasic': 10230 return 'ISO-10646-UCS-Basic'; 10231 10232 case 'csunicodelatin1': 10233 case 'iso10646': 10234 case 'iso10646unicodelatin1': 10235 return 'ISO-10646-Unicode-Latin1'; 10236 10237 case 'csiso10646utf1': 10238 case 'iso10646utf1': 10239 return 'ISO-10646-UTF-1'; 10240 10241 case 'csiso115481': 10242 case 'iso115481': 10243 case 'isotr115481': 10244 return 'ISO-11548-1'; 10245 10246 case 'csiso90': 10247 case 'isoir90': 10248 return 'iso-ir-90'; 10249 10250 case 'csunicodeibm1261': 10251 case 'isounicodeibm1261': 10252 return 'ISO-Unicode-IBM-1261'; 10253 10254 case 'csunicodeibm1264': 10255 case 'isounicodeibm1264': 10256 return 'ISO-Unicode-IBM-1264'; 10257 10258 case 'csunicodeibm1265': 10259 case 'isounicodeibm1265': 10260 return 'ISO-Unicode-IBM-1265'; 10261 10262 case 'csunicodeibm1268': 10263 case 'isounicodeibm1268': 10264 return 'ISO-Unicode-IBM-1268'; 10265 10266 case 'csunicodeibm1276': 10267 case 'isounicodeibm1276': 10268 return 'ISO-Unicode-IBM-1276'; 10269 10270 case 'csiso646basic1983': 10271 case 'iso646basic1983': 10272 case 'ref': 10273 return 'ISO_646.basic:1983'; 10274 10275 case 'csiso2intlrefversion': 10276 case 'irv': 10277 case 'iso646irv1983': 10278 case 'isoir2': 10279 return 'ISO_646.irv:1983'; 10280 10281 case 'csiso2033': 10282 case 'e13b': 10283 case 'iso20331983': 10284 case 'isoir98': 10285 return 'ISO_2033-1983'; 10286 10287 case 'csiso5427cyrillic': 10288 case 'iso5427': 10289 case 'isoir37': 10290 return 'ISO_5427'; 10291 10292 case 'iso5427cyrillic1981': 10293 case 'iso54271981': 10294 case 'isoir54': 10295 return 'ISO_5427:1981'; 10296 10297 case 'csiso5428greek': 10298 case 'iso54281980': 10299 case 'isoir55': 10300 return 'ISO_5428:1980'; 10301 10302 case 'csiso6937add': 10303 case 'iso6937225': 10304 case 'isoir152': 10305 return 'ISO_6937-2-25'; 10306 10307 case 'csisotextcomm': 10308 case 'iso69372add': 10309 case 'isoir142': 10310 return 'ISO_6937-2-add'; 10311 10312 case 'csiso8859supp': 10313 case 'iso8859supp': 10314 case 'isoir154': 10315 case 'latin125': 10316 return 'ISO_8859-supp'; 10317 10318 case 'csiso10367box': 10319 case 'iso10367box': 10320 case 'isoir155': 10321 return 'ISO_10367-box'; 10322 10323 case 'csiso15italian': 10324 case 'iso646it': 10325 case 'isoir15': 10326 case 'it': 10327 return 'IT'; 10328 10329 case 'csiso13jisc6220jp': 10330 case 'isoir13': 10331 case 'jisc62201969': 10332 case 'jisc62201969jp': 10333 case 'katakana': 10334 case 'x2017': 10335 return 'JIS_C6220-1969-jp'; 10336 10337 case 'csiso14jisc6220ro': 10338 case 'iso646jp': 10339 case 'isoir14': 10340 case 'jisc62201969ro': 10341 case 'jp': 10342 return 'JIS_C6220-1969-ro'; 10343 10344 case 'csiso42jisc62261978': 10345 case 'isoir42': 10346 case 'jisc62261978': 10347 return 'JIS_C6226-1978'; 10348 10349 case 'csiso87jisx208': 10350 case 'isoir87': 10351 case 'jisc62261983': 10352 case 'jisx2081983': 10353 case 'x208': 10354 return 'JIS_C6226-1983'; 10355 10356 case 'csiso91jisc62291984a': 10357 case 'isoir91': 10358 case 'jisc62291984a': 10359 case 'jpocra': 10360 return 'JIS_C6229-1984-a'; 10361 10362 case 'csiso92jisc62991984b': 10363 case 'iso646jpocrb': 10364 case 'isoir92': 10365 case 'jisc62291984b': 10366 case 'jpocrb': 10367 return 'JIS_C6229-1984-b'; 10368 10369 case 'csiso93jis62291984badd': 10370 case 'isoir93': 10371 case 'jisc62291984badd': 10372 case 'jpocrbadd': 10373 return 'JIS_C6229-1984-b-add'; 10374 10375 case 'csiso94jis62291984hand': 10376 case 'isoir94': 10377 case 'jisc62291984hand': 10378 case 'jpocrhand': 10379 return 'JIS_C6229-1984-hand'; 10380 10381 case 'csiso95jis62291984handadd': 10382 case 'isoir95': 10383 case 'jisc62291984handadd': 10384 case 'jpocrhandadd': 10385 return 'JIS_C6229-1984-hand-add'; 10386 10387 case 'csiso96jisc62291984kana': 10388 case 'isoir96': 10389 case 'jisc62291984kana': 10390 return 'JIS_C6229-1984-kana'; 10391 10392 case 'csjisencoding': 10393 case 'jisencoding': 10394 return 'JIS_Encoding'; 10395 10396 case 'cshalfwidthkatakana': 10397 case 'jisx201': 10398 case 'x201': 10399 return 'JIS_X0201'; 10400 10401 case 'csiso159jisx2121990': 10402 case 'isoir159': 10403 case 'jisx2121990': 10404 case 'x212': 10405 return 'JIS_X0212-1990'; 10406 10407 case 'csiso141jusib1002': 10408 case 'iso646yu': 10409 case 'isoir141': 10410 case 'js': 10411 case 'jusib1002': 10412 case 'yu': 10413 return 'JUS_I.B1.002'; 10414 10415 case 'csiso147macedonian': 10416 case 'isoir147': 10417 case 'jusib1003mac': 10418 case 'macedonian': 10419 return 'JUS_I.B1.003-mac'; 10420 10421 case 'csiso146serbian': 10422 case 'isoir146': 10423 case 'jusib1003serb': 10424 case 'serbian': 10425 return 'JUS_I.B1.003-serb'; 10426 10427 case 'koi7switched': 10428 return 'KOI7-switched'; 10429 10430 case 'cskoi8r': 10431 case 'koi8r': 10432 return 'KOI8-R'; 10433 10434 case 'koi8u': 10435 return 'KOI8-U'; 10436 10437 case 'csksc5636': 10438 case 'iso646kr': 10439 case 'ksc5636': 10440 return 'KSC5636'; 10441 10442 case 'cskz1048': 10443 case 'kz1048': 10444 case 'rk1048': 10445 case 'strk10482002': 10446 return 'KZ-1048'; 10447 10448 case 'csiso19latingreek': 10449 case 'isoir19': 10450 case 'latingreek': 10451 return 'latin-greek'; 10452 10453 case 'csiso27latingreek1': 10454 case 'isoir27': 10455 case 'latingreek1': 10456 return 'Latin-greek-1'; 10457 10458 case 'csiso158lap': 10459 case 'isoir158': 10460 case 'lap': 10461 case 'latinlap': 10462 return 'latin-lap'; 10463 10464 case 'csmacintosh': 10465 case 'mac': 10466 case 'macintosh': 10467 return 'macintosh'; 10468 10469 case 'csmicrosoftpublishing': 10470 case 'microsoftpublishing': 10471 return 'Microsoft-Publishing'; 10472 10473 case 'csmnem': 10474 case 'mnem': 10475 return 'MNEM'; 10476 10477 case 'csmnemonic': 10478 case 'mnemonic': 10479 return 'MNEMONIC'; 10480 10481 case 'csiso86hungarian': 10482 case 'hu': 10483 case 'iso646hu': 10484 case 'isoir86': 10485 case 'msz77953': 10486 return 'MSZ_7795.3'; 10487 10488 case 'csnatsdano': 10489 case 'isoir91': 10490 case 'natsdano': 10491 return 'NATS-DANO'; 10492 10493 case 'csnatsdanoadd': 10494 case 'isoir92': 10495 case 'natsdanoadd': 10496 return 'NATS-DANO-ADD'; 10497 10498 case 'csnatssefi': 10499 case 'isoir81': 10500 case 'natssefi': 10501 return 'NATS-SEFI'; 10502 10503 case 'csnatssefiadd': 10504 case 'isoir82': 10505 case 'natssefiadd': 10506 return 'NATS-SEFI-ADD'; 10507 10508 case 'csiso151cuba': 10509 case 'cuba': 10510 case 'iso646cu': 10511 case 'isoir151': 10512 case 'ncnc1081': 10513 return 'NC_NC00-10:81'; 10514 10515 case 'csiso69french': 10516 case 'fr': 10517 case 'iso646fr': 10518 case 'isoir69': 10519 case 'nfz62010': 10520 return 'NF_Z_62-010'; 10521 10522 case 'csiso25french': 10523 case 'iso646fr1': 10524 case 'isoir25': 10525 case 'nfz620101973': 10526 return 'NF_Z_62-010_(1973)'; 10527 10528 case 'csiso60danishnorwegian': 10529 case 'csiso60norwegian1': 10530 case 'iso646no': 10531 case 'isoir60': 10532 case 'no': 10533 case 'ns45511': 10534 return 'NS_4551-1'; 10535 10536 case 'csiso61norwegian2': 10537 case 'iso646no2': 10538 case 'isoir61': 10539 case 'no2': 10540 case 'ns45512': 10541 return 'NS_4551-2'; 10542 10543 case 'osdebcdicdf3irv': 10544 return 'OSD_EBCDIC_DF03_IRV'; 10545 10546 case 'osdebcdicdf41': 10547 return 'OSD_EBCDIC_DF04_1'; 10548 10549 case 'osdebcdicdf415': 10550 return 'OSD_EBCDIC_DF04_15'; 10551 10552 case 'cspc8danishnorwegian': 10553 case 'pc8danishnorwegian': 10554 return 'PC8-Danish-Norwegian'; 10555 10556 case 'cspc8turkish': 10557 case 'pc8turkish': 10558 return 'PC8-Turkish'; 10559 10560 case 'csiso16portuguese': 10561 case 'iso646pt': 10562 case 'isoir16': 10563 case 'pt': 10564 return 'PT'; 10565 10566 case 'csiso84portuguese2': 10567 case 'iso646pt2': 10568 case 'isoir84': 10569 case 'pt2': 10570 return 'PT2'; 10571 10572 case 'cp154': 10573 case 'csptcp154': 10574 case 'cyrillicasian': 10575 case 'pt154': 10576 case 'ptcp154': 10577 return 'PTCP154'; 10578 10579 case 'scsu': 10580 return 'SCSU'; 10581 10582 case 'csiso10swedish': 10583 case 'fi': 10584 case 'iso646fi': 10585 case 'iso646se': 10586 case 'isoir10': 10587 case 'se': 10588 case 'sen850200b': 10589 return 'SEN_850200_B'; 10590 10591 case 'csiso11swedishfornames': 10592 case 'iso646se2': 10593 case 'isoir11': 10594 case 'se2': 10595 case 'sen850200c': 10596 return 'SEN_850200_C'; 10597 10598 case 'csshiftjis': 10599 case 'mskanji': 10600 case 'shiftjis': 10601 return 'Shift_JIS'; 10602 10603 case 'csiso102t617bit': 10604 case 'isoir102': 10605 case 't617bit': 10606 return 'T.61-7bit'; 10607 10608 case 'csiso103t618bit': 10609 case 'isoir103': 10610 case 't61': 10611 case 't618bit': 10612 return 'T.61-8bit'; 10613 10614 case 'csiso128t101g2': 10615 case 'isoir128': 10616 case 't101g2': 10617 return 'T.101-G2'; 10618 10619 case 'cstscii': 10620 case 'tscii': 10621 return 'TSCII'; 10622 10623 case 'csunicode11': 10624 case 'unicode11': 10625 return 'UNICODE-1-1'; 10626 10627 case 'csunicode11utf7': 10628 case 'unicode11utf7': 10629 return 'UNICODE-1-1-UTF-7'; 10630 10631 case 'csunknown8bit': 10632 case 'unknown8bit': 10633 return 'UNKNOWN-8BIT'; 10634 10635 case 'ansix341968': 10636 case 'ansix341986': 10637 case 'ascii': 10638 case 'cp367': 10639 case 'csascii': 10640 case 'ibm367': 10641 case 'iso646irv1991': 10642 case 'iso646us': 10643 case 'isoir6': 10644 case 'us': 10645 case 'usascii': 10646 return 'US-ASCII'; 10647 10648 case 'csusdk': 10649 case 'usdk': 10650 return 'us-dk'; 10651 10652 case 'utf7': 10653 return 'UTF-7'; 10654 10655 case 'utf8': 10656 return 'UTF-8'; 10657 10658 case 'utf16': 10659 return 'UTF-16'; 10660 10661 case 'utf16be': 10662 return 'UTF-16BE'; 10663 10664 case 'utf16le': 10665 return 'UTF-16LE'; 10666 10667 case 'utf32': 10668 return 'UTF-32'; 10669 10670 case 'utf32be': 10671 return 'UTF-32BE'; 10672 10673 case 'utf32le': 10674 return 'UTF-32LE'; 10675 10676 case 'csventurainternational': 10677 case 'venturainternational': 10678 return 'Ventura-International'; 10679 10680 case 'csventuramath': 10681 case 'venturamath': 10682 return 'Ventura-Math'; 10683 10684 case 'csventuraus': 10685 case 'venturaus': 10686 return 'Ventura-US'; 10687 10688 case 'csiso70videotexsupp1': 10689 case 'isoir70': 10690 case 'videotexsuppl': 10691 return 'videotex-suppl'; 10692 10693 case 'csviqr': 10694 case 'viqr': 10695 return 'VIQR'; 10696 10697 case 'csviscii': 10698 case 'viscii': 10699 return 'VISCII'; 10700 10701 case 'cswindows31j': 10702 case 'windows31j': 10703 return 'Windows-31J'; 10704 10705 case 'iso885911': 10706 case 'tis620': 10707 return 'windows-874'; 10708 10709 case 'cseuckr': 10710 case 'csksc56011987': 10711 case 'euckr': 10712 case 'isoir149': 10713 case 'korean': 10714 case 'ksc5601': 10715 case 'ksc56011987': 10716 case 'ksc56011989': 10717 case 'windows949': 10718 return 'windows-949'; 10719 10720 case 'windows1250': 10721 return 'windows-1250'; 10722 10723 case 'windows1251': 10724 return 'windows-1251'; 10725 10726 case 'cp819': 10727 case 'csisolatin1': 10728 case 'ibm819': 10729 case 'iso88591': 10730 case 'iso885911987': 10731 case 'isoir100': 10732 case 'l1': 10733 case 'latin1': 10734 case 'windows1252': 10735 return 'windows-1252'; 10736 10737 case 'windows1253': 10738 return 'windows-1253'; 10739 10740 case 'csisolatin5': 10741 case 'iso88599': 10742 case 'iso885991989': 10743 case 'isoir148': 10744 case 'l5': 10745 case 'latin5': 10746 case 'windows1254': 10747 return 'windows-1254'; 10748 10749 case 'windows1255': 10750 return 'windows-1255'; 10751 10752 case 'windows1256': 10753 return 'windows-1256'; 10754 10755 case 'windows1257': 10756 return 'windows-1257'; 10757 10758 case 'windows1258': 10759 return 'windows-1258'; 10760 10761 default: 10762 return $charset; 10763 } 10764 } 10765 10766 function get_curl_version() 10767 { 10768 if (is_array($curl = curl_version())) 10769 { 10770 $curl = $curl['version']; 10771 } 10772 elseif (substr($curl, 0, 5) === 'curl/') 10773 { 10774 $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5)); 10775 } 10776 elseif (substr($curl, 0, 8) === 'libcurl/') 10777 { 10778 $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8)); 10779 } 10780 else 10781 { 10782 $curl = 0; 10783 } 10784 return $curl; 10785 } 10786 10787 function is_subclass_of($class1, $class2) 10788 { 10789 if (func_num_args() !== 2) 10790 { 10791 trigger_error('Wrong parameter count for SimplePie_Misc::is_subclass_of()', E_USER_WARNING); 10792 } 10793 elseif (version_compare(PHP_VERSION, '5.0.3', '>=') || is_object($class1)) 10794 { 10795 return is_subclass_of($class1, $class2); 10796 } 10797 elseif (is_string($class1) && is_string($class2)) 10798 { 10799 if (class_exists($class1)) 10800 { 10801 if (class_exists($class2)) 10802 { 10803 $class2 = strtolower($class2); 10804 while ($class1 = strtolower(get_parent_class($class1))) 10805 { 10806 if ($class1 === $class2) 10807 { 10808 return true; 10809 } 10810 } 10811 } 10812 } 10813 else 10814 { 10815 trigger_error('Unknown class passed as parameter', E_USER_WARNNG); 10816 } 10817 } 10818 return false; 10819 } 10820 10821 /** 10822 * Strip HTML comments 10823 * 10824 * @access public 10825 * @param string $data Data to strip comments from 10826 * @return string Comment stripped string 10827 */ 10828 function strip_comments($data) 10829 { 10830 $output = ''; 10831 while (($start = strpos($data, '<!--')) !== false) 10832 { 10833 $output .= substr($data, 0, $start); 10834 if (($end = strpos($data, '-->', $start)) !== false) 10835 { 10836 $data = substr_replace($data, '', 0, $end + 3); 10837 } 10838 else 10839 { 10840 $data = ''; 10841 } 10842 } 10843 return $output . $data; 10844 } 10845 10846 function parse_date($dt) 10847 { 10848 $parser = SimplePie_Parse_Date::get(); 10849 return $parser->parse($dt); 10850 } 10851 10852 /** 10853 * Decode HTML entities 10854 * 10855 * @static 10856 * @access public 10857 * @param string $data Input data 10858 * @return string Output data 10859 */ 10860 function entities_decode($data) 10861 { 10862 $decoder =& new SimplePie_Decode_HTML_Entities($data); 10863 return $decoder->parse(); 10864 } 10865 10866 /** 10867 * Remove RFC822 comments 10868 * 10869 * @access public 10870 * @param string $data Data to strip comments from 10871 * @return string Comment stripped string 10872 */ 10873 function uncomment_rfc822($string) 10874 { 10875 $string = (string) $string; 10876 $position = 0; 10877 $length = strlen($string); 10878 $depth = 0; 10879 10880 $output = ''; 10881 10882 while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) 10883 { 10884 $output .= substr($string, $position, $pos - $position); 10885 $position = $pos + 1; 10886 if ($string[$pos - 1] !== '\\') 10887 { 10888 $depth++; 10889 while ($depth && $position < $length) 10890 { 10891 $position += strcspn($string, '()', $position); 10892 if ($string[$position - 1] === '\\') 10893 { 10894 $position++; 10895 continue; 10896 } 10897 elseif (isset($string[$position])) 10898 { 10899 switch ($string[$position]) 10900 { 10901 case '(': 10902 $depth++; 10903 break; 10904 10905 case ')': 10906 $depth--; 10907 break; 10908 } 10909 $position++; 10910 } 10911 else 10912 { 10913 break; 10914 } 10915 } 10916 } 10917 else 10918 { 10919 $output .= '('; 10920 } 10921 } 10922 $output .= substr($string, $position); 10923 10924 return $output; 10925 } 10926 10927 function parse_mime($mime) 10928 { 10929 if (($pos = strpos($mime, ';')) === false) 10930 { 10931 return trim($mime); 10932 } 10933 else 10934 { 10935 return trim(substr($mime, 0, $pos)); 10936 } 10937 } 10938 10939 function htmlspecialchars_decode($string, $quote_style) 10940 { 10941 if (function_exists('htmlspecialchars_decode')) 10942 { 10943 return htmlspecialchars_decode($string, $quote_style); 10944 } 10945 else 10946 { 10947 return strtr($string, array_flip(get_html_translation_table(HTML_SPECIALCHARS, $quote_style))); 10948 } 10949 } 10950 10951 function atom_03_construct_type($attribs) 10952 { 10953 if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64')) 10954 { 10955 $mode = SIMPLEPIE_CONSTRUCT_BASE64; 10956 } 10957 else 10958 { 10959 $mode = SIMPLEPIE_CONSTRUCT_NONE; 10960 } 10961 if (isset($attribs['']['type'])) 10962 { 10963 switch (strtolower(trim($attribs['']['type']))) 10964 { 10965 case 'text': 10966 case 'text/plain': 10967 return SIMPLEPIE_CONSTRUCT_TEXT | $mode; 10968 10969 case 'html': 10970 case 'text/html': 10971 return SIMPLEPIE_CONSTRUCT_HTML | $mode; 10972 10973 case 'xhtml': 10974 case 'application/xhtml+xml': 10975 return SIMPLEPIE_CONSTRUCT_XHTML | $mode; 10976 10977 default: 10978 return SIMPLEPIE_CONSTRUCT_NONE | $mode; 10979 } 10980 } 10981 else 10982 { 10983 return SIMPLEPIE_CONSTRUCT_TEXT | $mode; 10984 } 10985 } 10986 10987 function atom_10_construct_type($attribs) 10988 { 10989 if (isset($attribs['']['type'])) 10990 { 10991 switch (strtolower(trim($attribs['']['type']))) 10992 { 10993 case 'text': 10994 return SIMPLEPIE_CONSTRUCT_TEXT; 10995 10996 case 'html': 10997 return SIMPLEPIE_CONSTRUCT_HTML; 10998 10999 case 'xhtml': 11000 return SIMPLEPIE_CONSTRUCT_XHTML; 11001 11002 default: 11003 return SIMPLEPIE_CONSTRUCT_NONE; 11004 } 11005 } 11006 return SIMPLEPIE_CONSTRUCT_TEXT; 11007 } 11008 11009 function atom_10_content_construct_type($attribs) 11010 { 11011 if (isset($attribs['']['type'])) 11012 { 11013 $type = strtolower(trim($attribs['']['type'])); 11014 switch ($type) 11015 { 11016 case 'text': 11017 return SIMPLEPIE_CONSTRUCT_TEXT; 11018 11019 case 'html': 11020 return SIMPLEPIE_CONSTRUCT_HTML; 11021 11022 case 'xhtml': 11023 return SIMPLEPIE_CONSTRUCT_XHTML; 11024 } 11025 if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/') 11026 { 11027 return SIMPLEPIE_CONSTRUCT_NONE; 11028 } 11029 else 11030 { 11031 return SIMPLEPIE_CONSTRUCT_BASE64; 11032 } 11033 } 11034 else 11035 { 11036 return SIMPLEPIE_CONSTRUCT_TEXT; 11037 } 11038 } 11039 11040 function is_isegment_nz_nc($string) 11041 { 11042 return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string); 11043 } 11044 11045 function space_seperated_tokens($string) 11046 { 11047 $space_characters = "\x20\x09\x0A\x0B\x0C\x0D"; 11048 $string_length = strlen($string); 11049 11050 $position = strspn($string, $space_characters); 11051 $tokens = array(); 11052 11053 while ($position < $string_length) 11054 { 11055 $len = strcspn($string, $space_characters, $position); 11056 $tokens[] = substr($string, $position, $len); 11057 $position += $len; 11058 $position += strspn($string, $space_characters, $position); 11059 } 11060 11061 return $tokens; 11062 } 11063 11064 function array_unique($array) 11065 { 11066 if (version_compare(PHP_VERSION, '5.2', '>=')) 11067 { 11068 return array_unique($array); 11069 } 11070 else 11071 { 11072 $array = (array) $array; 11073 $new_array = array(); 11074 $new_array_strings = array(); 11075 foreach ($array as $key => $value) 11076 { 11077 if (is_object($value)) 11078 { 11079 if (method_exists($value, '__toString')) 11080 { 11081 $cmp = $value->__toString(); 11082 } 11083 else 11084 { 11085 trigger_error('Object of class ' . get_class($value) . ' could not be converted to string', E_USER_ERROR); 11086 } 11087 } 11088 elseif (is_array($value)) 11089 { 11090 $cmp = (string) reset($value); 11091 } 11092 else 11093 { 11094 $cmp = (string) $value; 11095 } 11096 if (!in_array($cmp, $new_array_strings)) 11097 { 11098 $new_array[$key] = $value; 11099 $new_array_strings[] = $cmp; 11100 } 11101 } 11102 return $new_array; 11103 } 11104 } 11105 11106 /** 11107 * Converts a unicode codepoint to a UTF-8 character 11108 * 11109 * @static 11110 * @access public 11111 * @param int $codepoint Unicode codepoint 11112 * @return string UTF-8 character 11113 */ 11114 function codepoint_to_utf8($codepoint) 11115 { 11116 $codepoint = (int) $codepoint; 11117 if ($codepoint < 0) 11118 { 11119 return false; 11120 } 11121 else if ($codepoint <= 0x7f) 11122 { 11123 return chr($codepoint); 11124 } 11125 else if ($codepoint <= 0x7ff) 11126 { 11127 return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f)); 11128 } 11129 else if ($codepoint <= 0xffff) 11130 { 11131 return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); 11132 } 11133 else if ($codepoint <= 0x10ffff) 11134 { 11135 return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); 11136 } 11137 else 11138 { 11139 // U+FFFD REPLACEMENT CHARACTER 11140 return "\xEF\xBF\xBD"; 11141 } 11142 } 11143 11144 /** 11145 * Re-implementation of PHP 5's stripos() 11146 * 11147 * Returns the numeric position of the first occurrence of needle in the 11148 * haystack string. 11149 * 11150 * @static 11151 * @access string 11152 * @param object $haystack 11153 * @param string $needle Note that the needle may be a string of one or more 11154 * characters. If needle is not a string, it is converted to an integer 11155 * and applied as the ordinal value of a character. 11156 * @param int $offset The optional offset parameter allows you to specify which 11157 * character in haystack to start searching. The position returned is still 11158 * relative to the beginning of haystack. 11159 * @return bool If needle is not found, stripos() will return boolean false. 11160 */ 11161 function stripos($haystack, $needle, $offset = 0) 11162 { 11163 if (function_exists('stripos')) 11164 { 11165 return stripos($haystack, $needle, $offset); 11166 } 11167 else 11168 { 11169 if (is_string($needle)) 11170 { 11171 $needle = strtolower($needle); 11172 } 11173 elseif (is_int($needle) || is_bool($needle) || is_double($needle)) 11174 { 11175 $needle = strtolower(chr($needle)); 11176 } 11177 else 11178 { 11179 trigger_error('needle is not a string or an integer', E_USER_WARNING); 11180 return false; 11181 } 11182 11183 return strpos(strtolower($haystack), $needle, $offset); 11184 } 11185 } 11186 11187 /** 11188 * Similar to parse_str() 11189 * 11190 * Returns an associative array of name/value pairs, where the value is an 11191 * array of values that have used the same name 11192 * 11193 * @static 11194 * @access string 11195 * @param string $str The input string. 11196 * @return array 11197 */ 11198 function parse_str($str) 11199 { 11200 $return = array(); 11201 $str = explode('&', $str); 11202 11203 foreach ($str as $section) 11204 { 11205 if (strpos($section, '=') !== false) 11206 { 11207 list($name, $value) = explode('=', $section, 2); 11208 $return[urldecode($name)][] = urldecode($value); 11209 } 11210 else 11211 { 11212 $return[urldecode($section)][] = null; 11213 } 11214 } 11215 11216 return $return; 11217 } 11218 11219 /** 11220 * Detect XML encoding, as per XML 1.0 Appendix F.1 11221 * 11222 * @todo Add support for EBCDIC 11223 * @param string $data XML data 11224 * @return array Possible encodings 11225 */ 11226 function xml_encoding($data) 11227 { 11228 // UTF-32 Big Endian BOM 11229 if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") 11230 { 11231 $encoding[] = 'UTF-32BE'; 11232 } 11233 // UTF-32 Little Endian BOM 11234 elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") 11235 { 11236 $encoding[] = 'UTF-32LE'; 11237 } 11238 // UTF-16 Big Endian BOM 11239 elseif (substr($data, 0, 2) === "\xFE\xFF") 11240 { 11241 $encoding[] = 'UTF-16BE'; 11242 } 11243 // UTF-16 Little Endian BOM 11244 elseif (substr($data, 0, 2) === "\xFF\xFE") 11245 { 11246 $encoding[] = 'UTF-16LE'; 11247 } 11248 // UTF-8 BOM 11249 elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") 11250 { 11251 $encoding[] = 'UTF-8'; 11252 } 11253 // UTF-32 Big Endian Without BOM 11254 elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C") 11255 { 11256 if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E")) 11257 { 11258 $parser =& new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8')); 11259 if ($parser->parse()) 11260 { 11261 $encoding[] = $parser->encoding; 11262 } 11263 } 11264 $encoding[] = 'UTF-32BE'; 11265 } 11266 // UTF-32 Little Endian Without BOM 11267 elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00") 11268 { 11269 if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00")) 11270 { 11271 $parser =& new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8')); 11272 if ($parser->parse()) 11273 { 11274 $encoding[] = $parser->encoding; 11275 } 11276 } 11277 $encoding[] = 'UTF-32LE'; 11278 } 11279 // UTF-16 Big Endian Without BOM 11280 elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C") 11281 { 11282 if ($pos = strpos($data, "\x00\x3F\x00\x3E")) 11283 { 11284 $parser =& new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8')); 11285 if ($parser->parse()) 11286 { 11287 $encoding[] = $parser->encoding; 11288 } 11289 } 11290 $encoding[] = 'UTF-16BE'; 11291 } 11292 // UTF-16 Little Endian Without BOM 11293 elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00") 11294 { 11295 if ($pos = strpos($data, "\x3F\x00\x3E\x00")) 11296 { 11297 $parser =& new SimplePie_XML_Declaration_Parser(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8')); 11298 if ($parser->parse()) 11299 { 11300 $encoding[] = $parser->encoding; 11301 } 11302 } 11303 $encoding[] = 'UTF-16LE'; 11304 } 11305 // US-ASCII (or superset) 11306 elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C") 11307 { 11308 if ($pos = strpos($data, "\x3F\x3E")) 11309 { 11310 $parser =& new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5)); 11311 if ($parser->parse()) 11312 { 11313 $encoding[] = $parser->encoding; 11314 } 11315 } 11316 $encoding[] = 'UTF-8'; 11317 } 11318 // Fallback to UTF-8 11319 else 11320 { 11321 $encoding[] = 'UTF-8'; 11322 } 11323 return $encoding; 11324 } 11325 11326 function output_javascript() 11327 { 11328 if (function_exists('ob_gzhandler')) 11329 { 11330 ob_start('ob_gzhandler'); 11331 } 11332 header('Content-type: text/javascript; charset: UTF-8'); 11333 header('Cache-Control: must-revalidate'); 11334 header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days 11335 ?> 11336 function embed_odeo(link) { 11337 document.writeln('<embed src="http://odeo.com/flash/audio_player_fullsize.swf" pluginspage="http://www.macromedia.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='+link+'"></embed>'); 11338 } 11339 11340 function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) { 11341 if (placeholder != '') { 11342 document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>'); 11343 } 11344 else { 11345 document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>'); 11346 } 11347 } 11348 11349 function embed_flash(bgcolor, width, height, link, loop, type) { 11350 document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>'); 11351 } 11352 11353 function embed_flv(width, height, link, placeholder, loop, player) { 11354 document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>'); 11355 } 11356 11357 function embed_wmedia(width, height, link) { 11358 document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>'); 11359 } 11360 <?php 11361 } 11362 } 11363 11364 /** 11365 * Decode HTML Entities 11366 * 11367 * This implements HTML5 as of revision 967 (2007-06-28) 11368 * 11369 * @package SimplePie 11370 */ 11371 class SimplePie_Decode_HTML_Entities 11372 { 11373 /** 11374 * Data to be parsed 11375 * 11376 * @access private 11377 * @var string 11378 */ 11379 var $data = ''; 11380 11381 /** 11382 * Currently consumed bytes 11383 * 11384 * @access private 11385 * @var string 11386 */ 11387 var $consumed = ''; 11388 11389 /** 11390 * Position of the current byte being parsed 11391 * 11392 * @access private 11393 * @var int 11394 */ 11395 var $position = 0; 11396 11397 /** 11398 * Create an instance of the class with the input data 11399 * 11400 * @access public 11401 * @param string $data Input data 11402 */ 11403 function SimplePie_Decode_HTML_Entities($data) 11404 { 11405 $this->data = $data; 11406 } 11407 11408 /** 11409 * Parse the input data 11410 * 11411 * @access public 11412 * @return string Output data 11413 */ 11414 function parse() 11415 { 11416 while (($this->position = strpos($this->data, '&', $this->position)) !== false) 11417 { 11418 $this->consume(); 11419 $this->entity(); 11420 $this->consumed = ''; 11421 } 11422 return $this->data; 11423 } 11424 11425 /** 11426 * Consume the next byte 11427 * 11428 * @access private 11429 * @return mixed The next byte, or false, if there is no more data 11430 */ 11431 function consume() 11432 { 11433 if (isset($this->data[$this->position])) 11434 { 11435 $this->consumed .= $this->data[$this->position]; 11436 return $this->data[$this->position++]; 11437 } 11438 else 11439 { 11440 return false; 11441 } 11442 } 11443 11444 /** 11445 * Consume a range of characters 11446 * 11447 * @access private 11448 * @param string $chars Characters to consume 11449 * @return mixed A series of characters that match the range, or false 11450 */ 11451 function consume_range($chars) 11452 { 11453 if ($len = strspn($this->data, $chars, $this->position)) 11454 { 11455 $data = substr($this->data, $this->position, $len); 11456 $this->consumed .= $data; 11457 $this->position += $len; 11458 return $data; 11459 } 11460 else 11461 { 11462 return false; 11463 } 11464 } 11465 11466 /** 11467 * Unconsume one byte 11468 * 11469 * @access private 11470 */ 11471 function unconsume() 11472 { 11473 $this->consumed = substr($this->consumed, 0, -1); 11474 $this->position--; 11475 } 11476 11477 /** 11478 * Decode an entity 11479 * 11480 * @access private 11481 */ 11482 function entity() 11483 { 11484 switch ($this->consume()) 11485 { 11486 case "\x09": 11487 case "\x0A": 11488 case "\x0B": 11489 case "\x0B": 11490 case "\x0C": 11491 case "\x20": 11492 case "\x3C": 11493 case "\x26": 11494 case false: 11495 break; 11496 11497 case "\x23": 11498 switch ($this->consume()) 11499 { 11500 case "\x78": 11501 case "\x58": 11502 $range = '0123456789ABCDEFabcdef'; 11503 $hex = true; 11504 break; 11505 11506 default: 11507 $range = '0123456789'; 11508 $hex = false; 11509 $this->unconsume(); 11510 break; 11511 } 11512 11513 if ($codepoint = $this->consume_range($range)) 11514 { 11515 static $windows_1252_specials = array(0x0D => "\x0A", 0x80 => "\xE2\x82\xAC", 0x81 => "\xEF\xBF\xBD", 0x82 => "\xE2\x80\x9A", 0x83 => "\xC6\x92", 0x84 => "\xE2\x80\x9E", 0x85 => "\xE2\x80\xA6", 0x86 => "\xE2\x80\xA0", 0x87 => "\xE2\x80\xA1", 0x88 => "\xCB\x86", 0x89 => "\xE2\x80\xB0", 0x8A => "\xC5\xA0", 0x8B => "\xE2\x80\xB9", 0x8C => "\xC5\x92", 0x8D => "\xEF\xBF\xBD", 0x8E => "\xC5\xBD", 0x8F => "\xEF\xBF\xBD", 0x90 => "\xEF\xBF\xBD", 0x91 => "\xE2\x80\x98", 0x92 => "\xE2\x80\x99", 0x93 => "\xE2\x80\x9C", 0x94 => "\xE2\x80\x9D", 0x95 => "\xE2\x80\xA2", 0x96 => "\xE2\x80\x93", 0x97 => "\xE2\x80\x94", 0x98 => "\xCB\x9C", 0x99 => "\xE2\x84\xA2", 0x9A => "\xC5\xA1", 0x9B => "\xE2\x80\xBA", 0x9C => "\xC5\x93", 0x9D => "\xEF\xBF\xBD", 0x9E => "\xC5\xBE", 0x9F => "\xC5\xB8"); 11516 11517 if ($hex) 11518 { 11519 $codepoint = hexdec($codepoint); 11520 } 11521 else 11522 { 11523 $codepoint = intval($codepoint); 11524 } 11525 11526 if (isset($windows_1252_specials[$codepoint])) 11527 { 11528 $replacement = $windows_1252_specials[$codepoint]; 11529 } 11530 else 11531 { 11532 $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint); 11533 } 11534 11535 if (!in_array($this->consume(), array(';', false), true)) 11536 { 11537 $this->unconsume(); 11538 } 11539 11540 $consumed_length = strlen($this->consumed); 11541 $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length); 11542 $this->position += strlen($replacement) - $consumed_length; 11543 } 11544 break; 11545 11546 default: 11547 static $entities = array('Aacute' => "\xC3\x81", 'aacute' => "\xC3\xA1", 'Aacute;' => "\xC3\x81", 'aacute;' => "\xC3\xA1", 'Acirc' => "\xC3\x82", 'acirc' => "\xC3\xA2", 'Acirc;' => "\xC3\x82", 'acirc;' => "\xC3\xA2", 'acute' => "\xC2\xB4", 'acute;' => "\xC2\xB4", 'AElig' => "\xC3\x86", 'aelig' => "\xC3\xA6", 'AElig;' => "\xC3\x86", 'aelig;' => "\xC3\xA6", 'Agrave' => "\xC3\x80", 'agrave' => "\xC3\xA0", 'Agrave;' => "\xC3\x80", 'agrave;' => "\xC3\xA0", 'alefsym;' => "\xE2\x84\xB5", 'Alpha;' => "\xCE\x91", 'alpha;' => "\xCE\xB1", 'AMP' => "\x26", 'amp' => "\x26", 'AMP;' => "\x26", 'amp;' => "\x26", 'and;' => "\xE2\x88\xA7", 'ang;' => "\xE2\x88\xA0", 'apos;' => "\x27", 'Aring' => "\xC3\x85", 'aring' => "\xC3\xA5", 'Aring;' => "\xC3\x85", 'aring;' => "\xC3\xA5", 'asymp;' => "\xE2\x89\x88", 'Atilde' => "\xC3\x83", 'atilde' => "\xC3\xA3", 'Atilde;' => "\xC3\x83", 'atilde;' => "\xC3\xA3", 'Auml' => "\xC3\x84", 'auml' => "\xC3\xA4", 'Auml;' => "\xC3\x84", 'auml;' => "\xC3\xA4", 'bdquo;' => "\xE2\x80\x9E", 'Beta;' => "\xCE\x92", 'beta;' => "\xCE\xB2", 'brvbar' => "\xC2\xA6", 'brvbar;' => "\xC2\xA6", 'bull;' => "\xE2\x80\xA2", 'cap;' => "\xE2\x88\xA9", 'Ccedil' => "\xC3\x87", 'ccedil' => "\xC3\xA7", 'Ccedil;' => "\xC3\x87", 'ccedil;' => "\xC3\xA7", 'cedil' => "\xC2\xB8", 'cedil;' => "\xC2\xB8", 'cent' => "\xC2\xA2", 'cent;' => "\xC2\xA2", 'Chi;' => "\xCE\xA7", 'chi;' => "\xCF\x87", 'circ;' => "\xCB\x86", 'clubs;' => "\xE2\x99\xA3", 'cong;' => "\xE2\x89\x85", 'COPY' => "\xC2\xA9", 'copy' => "\xC2\xA9", 'COPY;' => "\xC2\xA9", 'copy;' => "\xC2\xA9", 'crarr;' => "\xE2\x86\xB5", 'cup;' => "\xE2\x88\xAA", 'curren' => "\xC2\xA4", 'curren;' => "\xC2\xA4", 'Dagger;' => "\xE2\x80\xA1", 'dagger;' => "\xE2\x80\xA0", 'dArr;' => "\xE2\x87\x93", 'darr;' => "\xE2\x86\x93", 'deg' => "\xC2\xB0", 'deg;' => "\xC2\xB0", 'Delta;' => "\xCE\x94", 'delta;' => "\xCE\xB4", 'diams;' => "\xE2\x99\xA6", 'divide' => "\xC3\xB7", 'divide;' => "\xC3\xB7", 'Eacute' => "\xC3\x89", 'eacute' => "\xC3\xA9", 'Eacute;' => "\xC3\x89", 'eacute;' => "\xC3\xA9", 'Ecirc' => "\xC3\x8A", 'ecirc' => "\xC3\xAA", 'Ecirc;' => "\xC3\x8A", 'ecirc;' => "\xC3\xAA", 'Egrave' => "\xC3\x88", 'egrave' => "\xC3\xA8", 'Egrave;' => "\xC3\x88", 'egrave;' => "\xC3\xA8", 'empty;' => "\xE2\x88\x85", 'emsp;' => "\xE2\x80\x83", 'ensp;' => "\xE2\x80\x82", 'Epsilon;' => "\xCE\x95", 'epsilon;' => "\xCE\xB5", 'equiv;' => "\xE2\x89\xA1", 'Eta;' => "\xCE\x97", 'eta;' => "\xCE\xB7", 'ETH' => "\xC3\x90", 'eth' => "\xC3\xB0", 'ETH;' => "\xC3\x90", 'eth;' => "\xC3\xB0", 'Euml' => "\xC3\x8B", 'euml' => "\xC3\xAB", 'Euml;' => "\xC3\x8B", 'euml;' => "\xC3\xAB", 'euro;' => "\xE2\x82\xAC", 'exist;' => "\xE2\x88\x83", 'fnof;' => "\xC6\x92", 'forall;' => "\xE2\x88\x80", 'frac12' => "\xC2\xBD", 'frac12;' => "\xC2\xBD", 'frac14' => "\xC2\xBC", 'frac14;' => "\xC2\xBC", 'frac34' => "\xC2\xBE", 'frac34;' => "\xC2\xBE", 'frasl;' => "\xE2\x81\x84", 'Gamma;' => "\xCE\x93", 'gamma;' => "\xCE\xB3", 'ge;' => "\xE2\x89\xA5", 'GT' => "\x3E", 'gt' => "\x3E", 'GT;' => "\x3E", 'gt;' => "\x3E", 'hArr;' => "\xE2\x87\x94", 'harr;' => "\xE2\x86\x94", 'hearts;' => "\xE2\x99\xA5", 'hellip;' => "\xE2\x80\xA6", 'Iacute' => "\xC3\x8D", 'iacute' => "\xC3\xAD", 'Iacute;' => "\xC3\x8D", 'iacute;' => "\xC3\xAD", 'Icirc' => "\xC3\x8E", 'icirc' => "\xC3\xAE", 'Icirc;' => "\xC3\x8E", 'icirc;' => "\xC3\xAE", 'iexcl' => "\xC2\xA1", 'iexcl;' => "\xC2\xA1", 'Igrave' => "\xC3\x8C", 'igrave' => "\xC3\xAC", 'Igrave;' => "\xC3\x8C", 'igrave;' => "\xC3\xAC", 'image;' => "\xE2\x84\x91", 'infin;' => "\xE2\x88\x9E", 'int;' => "\xE2\x88\xAB", 'Iota;' => "\xCE\x99", 'iota;' => "\xCE\xB9", 'iquest' => "\xC2\xBF", 'iquest;' => "\xC2\xBF", 'isin;' => "\xE2\x88\x88", 'Iuml' => "\xC3\x8F", 'iuml' => "\xC3\xAF", 'Iuml;' => "\xC3\x8F", 'iuml;' => "\xC3\xAF", 'Kappa;' => "\xCE\x9A", 'kappa;' => "\xCE\xBA", 'Lambda;' => "\xCE\x9B", 'lambda;' => "\xCE\xBB", 'lang;' => "\xE3\x80\x88", 'laquo' => "\xC2\xAB", 'laquo;' => "\xC2\xAB", 'lArr;' => "\xE2\x87\x90", 'larr;' => "\xE2\x86\x90", 'lceil;' => "\xE2\x8C\x88", 'ldquo;' => "\xE2\x80\x9C", 'le;' => "\xE2\x89\xA4", 'lfloor;' => "\xE2\x8C\x8A", 'lowast;' => "\xE2\x88\x97", 'loz;' => "\xE2\x97\x8A", 'lrm;' => "\xE2\x80\x8E", 'lsaquo;' => "\xE2\x80\xB9", 'lsquo;' => "\xE2\x80\x98", 'LT' => "\x3C", 'lt' => "\x3C", 'LT;' => "\x3C", 'lt;' => "\x3C", 'macr' => "\xC2\xAF", 'macr;' => "\xC2\xAF", 'mdash;' => "\xE2\x80\x94", 'micro' => "\xC2\xB5", 'micro;' => "\xC2\xB5", 'middot' => "\xC2\xB7", 'middot;' => "\xC2\xB7", 'minus;' => "\xE2\x88\x92", 'Mu;' => "\xCE\x9C", 'mu;' => "\xCE\xBC", 'nabla;' => "\xE2\x88\x87", 'nbsp' => "\xC2\xA0", 'nbsp;' => "\xC2\xA0", 'ndash;' => "\xE2\x80\x93", 'ne;' => "\xE2\x89\xA0", 'ni;' => "\xE2\x88\x8B", 'not' => "\xC2\xAC", 'not;' => "\xC2\xAC", 'notin;' => "\xE2\x88\x89", 'nsub;' => "\xE2\x8A\x84", 'Ntilde' => "\xC3\x91", 'ntilde' => "\xC3\xB1", 'Ntilde;' => "\xC3\x91", 'ntilde;' => "\xC3\xB1", 'Nu;' => "\xCE\x9D", 'nu;' => "\xCE\xBD", 'Oacute' => "\xC3\x93", 'oacute' => "\xC3\xB3", 'Oacute;' => "\xC3\x93", 'oacute;' => "\xC3\xB3", 'Ocirc' => "\xC3\x94", 'ocirc' => "\xC3\xB4", 'Ocirc;' => "\xC3\x94", 'ocirc;' => "\xC3\xB4", 'OElig;' => "\xC5\x92", 'oelig;' => "\xC5\x93", 'Ograve' => "\xC3\x92", 'ograve' => "\xC3\xB2", 'Ograve;' => "\xC3\x92", 'ograve;' => "\xC3\xB2", 'oline;' => "\xE2\x80\xBE", 'Omega;' => "\xCE\xA9", 'omega;' => "\xCF\x89", 'Omicron;' => "\xCE\x9F", 'omicron;' => "\xCE\xBF", 'oplus;' => "\xE2\x8A\x95", 'or;' => "\xE2\x88\xA8", 'ordf' => "\xC2\xAA", 'ordf;' => "\xC2\xAA", 'ordm' => "\xC2\xBA", 'ordm;' => "\xC2\xBA", 'Oslash' => "\xC3\x98", 'oslash' => "\xC3\xB8", 'Oslash;' => "\xC3\x98", 'oslash;' => "\xC3\xB8", 'Otilde' => "\xC3\x95", 'otilde' => "\xC3\xB5", 'Otilde;' => "\xC3\x95", 'otilde;' => "\xC3\xB5", 'otimes;' => "\xE2\x8A\x97", 'Ouml' => "\xC3\x96", 'ouml' => "\xC3\xB6", 'Ouml;' => "\xC3\x96", 'ouml;' => "\xC3\xB6", 'para' => "\xC2\xB6", 'para;' => "\xC2\xB6", 'part;' => "\xE2\x88\x82", 'permil;' => "\xE2\x80\xB0", 'perp;' => "\xE2\x8A\xA5", 'Phi;' => "\xCE\xA6", 'phi;' => "\xCF\x86", 'Pi;' => "\xCE\xA0", 'pi;' => "\xCF\x80", 'piv;' => "\xCF\x96", 'plusmn' => "\xC2\xB1", 'plusmn;' => "\xC2\xB1", 'pound' => "\xC2\xA3", 'pound;' => "\xC2\xA3", 'Prime;' => "\xE2\x80\xB3", 'prime;' => "\xE2\x80\xB2", 'prod;' => "\xE2\x88\x8F", 'prop;' => "\xE2\x88\x9D", 'Psi;' => "\xCE\xA8", 'psi;' => "\xCF\x88", 'QUOT' => "\x22", 'quot' => "\x22", 'QUOT;' => "\x22", 'quot;' => "\x22", 'radic;' => "\xE2\x88\x9A", 'rang;' => "\xE3\x80\x89", 'raquo' => "\xC2\xBB", 'raquo;' => "\xC2\xBB", 'rArr;' => "\xE2\x87\x92", 'rarr;' => "\xE2\x86\x92", 'rceil;' => "\xE2\x8C\x89", 'rdquo;' => "\xE2\x80\x9D", 'real;' => "\xE2\x84\x9C", 'REG' => "\xC2\xAE", 'reg' => "\xC2\xAE", 'REG;' => "\xC2\xAE", 'reg;' => "\xC2\xAE", 'rfloor;' => "\xE2\x8C\x8B", 'Rho;' => "\xCE\xA1", 'rho;' => "\xCF\x81", 'rlm;' => "\xE2\x80\x8F", 'rsaquo;' => "\xE2\x80\xBA", 'rsquo;' => "\xE2\x80\x99", 'sbquo;' => "\xE2\x80\x9A", 'Scaron;' => "\xC5\xA0", 'scaron;' => "\xC5\xA1", 'sdot;' => "\xE2\x8B\x85", 'sect' => "\xC2\xA7", 'sect;' => "\xC2\xA7", 'shy' => "\xC2\xAD", 'shy;' => "\xC2\xAD", 'Sigma;' => "\xCE\xA3", 'sigma;' => "\xCF\x83", 'sigmaf;' => "\xCF\x82", 'sim;' => "\xE2\x88\xBC", 'spades;' => "\xE2\x99\xA0", 'sub;' => "\xE2\x8A\x82", 'sube;' => "\xE2\x8A\x86", 'sum;' => "\xE2\x88\x91", 'sup;' => "\xE2\x8A\x83", 'sup1' => "\xC2\xB9", 'sup1;' => "\xC2\xB9", 'sup2' => "\xC2\xB2", 'sup2;' => "\xC2\xB2", 'sup3' => "\xC2\xB3", 'sup3;' => "\xC2\xB3", 'supe;' => "\xE2\x8A\x87", 'szlig' => "\xC3\x9F", 'szlig;' => "\xC3\x9F", 'Tau;' => "\xCE\xA4", 'tau;' => "\xCF\x84", 'there4;' => "\xE2\x88\xB4", 'Theta;' => "\xCE\x98", 'theta;' => "\xCE\xB8", 'thetasym;' => "\xCF\x91", 'thinsp;' => "\xE2\x80\x89", 'THORN' => "\xC3\x9E", 'thorn' => "\xC3\xBE", 'THORN;' => "\xC3\x9E", 'thorn;' => "\xC3\xBE", 'tilde;' => "\xCB\x9C", 'times' => "\xC3\x97", 'times;' => "\xC3\x97", 'TRADE;' => "\xE2\x84\xA2", 'trade;' => "\xE2\x84\xA2", 'Uacute' => "\xC3\x9A", 'uacute' => "\xC3\xBA", 'Uacute;' => "\xC3\x9A", 'uacute;' => "\xC3\xBA", 'uArr;' => "\xE2\x87\x91", 'uarr;' => "\xE2\x86\x91", 'Ucirc' => "\xC3\x9B", 'ucirc' => "\xC3\xBB", 'Ucirc;' => "\xC3\x9B", 'ucirc;' => "\xC3\xBB", 'Ugrave' => "\xC3\x99", 'ugrave' => "\xC3\xB9", 'Ugrave;' => "\xC3\x99", 'ugrave;' => "\xC3\xB9", 'uml' => "\xC2\xA8", 'uml;' => "\xC2\xA8", 'upsih;' => "\xCF\x92", 'Upsilon;' => "\xCE\xA5", 'upsilon;' => "\xCF\x85", 'Uuml' => "\xC3\x9C", 'uuml' => "\xC3\xBC", 'Uuml;' => "\xC3\x9C", 'uuml;' => "\xC3\xBC", 'weierp;' => "\xE2\x84\x98", 'Xi;' => "\xCE\x9E", 'xi;' => "\xCE\xBE", 'Yacute' => "\xC3\x9D", 'yacute' => "\xC3\xBD", 'Yacute;' => "\xC3\x9D", 'yacute;' => "\xC3\xBD", 'yen' => "\xC2\xA5", 'yen;' => "\xC2\xA5", 'yuml' => "\xC3\xBF", 'Yuml;' => "\xC5\xB8", 'yuml;' => "\xC3\xBF", 'Zeta;' => "\xCE\x96", 'zeta;' => "\xCE\xB6", 'zwj;' => "\xE2\x80\x8D", 'zwnj;' => "\xE2\x80\x8C"); 11548 11549 for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++) 11550 { 11551 $consumed = substr($this->consumed, 1); 11552 if (isset($entities[$consumed])) 11553 { 11554 $match = $consumed; 11555 } 11556 } 11557 11558 if ($match !== null) 11559 { 11560 $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1); 11561 $this->position += strlen($entities[$match]) - strlen($consumed) - 1; 11562 } 11563 break; 11564 } 11565 } 11566 } 11567 11568 /** 11569 * IRI parser/serialiser 11570 * 11571 * @package SimplePie 11572 */ 11573 class SimplePie_IRI 11574 { 11575 /** 11576 * Scheme 11577 * 11578 * @access private 11579 * @var string 11580 */ 11581 var $scheme; 11582 11583 /** 11584 * User Information 11585 * 11586 * @access private 11587 * @var string 11588 */ 11589 var $userinfo; 11590 11591 /** 11592 * Host 11593 * 11594 * @access private 11595 * @var string 11596 */ 11597 var $host; 11598 11599 /** 11600 * Port 11601 * 11602 * @access private 11603 * @var string 11604 */ 11605 var $port; 11606 11607 /** 11608 * Path 11609 * 11610 * @access private 11611 * @var string 11612 */ 11613 var $path; 11614 11615 /** 11616 * Query 11617 * 11618 * @access private 11619 * @var string 11620 */ 11621 var $query; 11622 11623 /** 11624 * Fragment 11625 * 11626 * @access private 11627 * @var string 11628 */ 11629 var $fragment; 11630 11631 /** 11632 * Whether the object represents a valid IRI 11633 * 11634 * @access private 11635 * @var array 11636 */ 11637 var $valid = array(); 11638 11639 /** 11640 * Return the entire IRI when you try and read the object as a string 11641 * 11642 * @access public 11643 * @return string 11644 */ 11645 function __toString() 11646 { 11647 return $this->get_iri(); 11648 } 11649 11650 /** 11651 * Create a new IRI object, from a specified string 11652 * 11653 * @access public 11654 * @param string $iri 11655 * @return SimplePie_IRI 11656 */ 11657 function SimplePie_IRI($iri) 11658 { 11659 $iri = (string) $iri; 11660 if ($iri !== '') 11661 { 11662 $parsed = $this->parse_iri($iri); 11663 $this->set_scheme($parsed['scheme']); 11664 $this->set_authority($parsed['authority']); 11665 $this->set_path($parsed['path']); 11666 $this->set_query($parsed['query']); 11667 $this->set_fragment($parsed['fragment']); 11668 } 11669 } 11670 11671 /** 11672 * Create a new IRI object by resolving a relative IRI 11673 * 11674 * @static 11675 * @access public 11676 * @param SimplePie_IRI $base Base IRI 11677 * @param string $relative Relative IRI 11678 * @return SimplePie_IRI 11679 */ 11680 function absolutize($base, $relative) 11681 { 11682 $relative = (string) $relative; 11683 if ($relative !== '') 11684 { 11685 $relative =& new SimplePie_IRI($relative); 11686 if ($relative->get_scheme() !== null) 11687 { 11688 $target = $relative; 11689 } 11690 elseif ($base->get_iri() !== null) 11691 { 11692 if ($relative->get_authority() !== null) 11693 { 11694 $target = $relative; 11695 $target->set_scheme($base->get_scheme()); 11696 } 11697 else 11698 { 11699 $target =& new SimplePie_IRI(''); 11700 $target->set_scheme($base->get_scheme()); 11701 $target->set_userinfo($base->get_userinfo()); 11702 $target->set_host($base->get_host()); 11703 $target->set_port($base->get_port()); 11704 if ($relative->get_path() !== null) 11705 { 11706 if (strpos($relative->get_path(), '/') === 0) 11707 { 11708 $target->set_path($relative->get_path()); 11709 } 11710 elseif (($base->get_userinfo() !== null || $base->get_host() !== null || $base->get_port() !== null) && $base->get_path() === null) 11711 { 11712 $target->set_path('/' . $relative->get_path()); 11713 } 11714 elseif (($last_segment = strrpos($base->get_path(), '/')) !== false) 11715 { 11716 $target->set_path(substr($base->get_path(), 0, $last_segment + 1) . $relative->get_path()); 11717 } 11718 else 11719 { 11720 $target->set_path($relative->get_path()); 11721 } 11722 $target->set_query($relative->get_query()); 11723 } 11724 else 11725 { 11726 $target->set_path($base->get_path()); 11727 if ($relative->get_query() !== null) 11728 { 11729 $target->set_query($relative->get_query()); 11730 } 11731 elseif ($base->get_query() !== null) 11732 { 11733 $target->set_query($base->get_query()); 11734 } 11735 } 11736 } 11737 $target->set_fragment($relative->get_fragment()); 11738 } 11739 else 11740 { 11741 // No base URL, just return the relative URL 11742 $target = $relative; 11743 } 11744 } 11745 else 11746 { 11747 $target = $base; 11748 } 11749 return $target; 11750 } 11751 11752 /** 11753 * Parse an IRI into scheme/authority/path/query/fragment segments 11754 * 11755 * @access private 11756 * @param string $iri 11757 * @return array 11758 */ 11759 function parse_iri($iri) 11760 { 11761 preg_match('/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/', $iri, $match); 11762 for ($i = count($match); $i <= 9; $i++) 11763 { 11764 $match[$i] = ''; 11765 } 11766 return array('scheme' => $match[2], 'authority' => $match[4], 'path' => $match[5], 'query' => $match[7], 'fragment' => $match[9]); 11767 } 11768 11769 /** 11770 * Remove dot segments from a path 11771 * 11772 * @access private 11773 * @param string $input 11774 * @return string 11775 */ 11776 function remove_dot_segments($input) 11777 { 11778 $output = ''; 11779 while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') 11780 { 11781 // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise, 11782 if (strpos($input, '../') === 0) 11783 { 11784 $input = substr($input, 3); 11785 } 11786 elseif (strpos($input, './') === 0) 11787 { 11788 $input = substr($input, 2); 11789 } 11790 // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise, 11791 elseif (strpos($input, '/./') === 0) 11792 { 11793 $input = substr_replace($input, '/', 0, 3); 11794 } 11795 elseif ($input === '/.') 11796 { 11797 $input = '/'; 11798 } 11799 // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise, 11800 elseif (strpos($input, '/../') === 0) 11801 { 11802 $input = substr_replace($input, '/', 0, 4); 11803 $output = substr_replace($output, '', strrpos($output, '/')); 11804 } 11805 elseif ($input === '/..') 11806 { 11807 $input = '/'; 11808 $output = substr_replace($output, '', strrpos($output, '/')); 11809 } 11810 // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise, 11811 elseif ($input === '.' || $input === '..') 11812 { 11813 $input = ''; 11814 } 11815 // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer 11816 elseif (($pos = strpos($input, '/', 1)) !== false) 11817 { 11818 $output .= substr($input, 0, $pos); 11819 $input = substr_replace($input, '', 0, $pos); 11820 } 11821 else 11822 { 11823 $output .= $input; 11824 $input = ''; 11825 } 11826 } 11827 return $output . $input; 11828 } 11829 11830 /** 11831 * Replace invalid character with percent encoding 11832 * 11833 * @access private 11834 * @param string $string Input string 11835 * @param string $valid_chars Valid characters 11836 * @param int $case Normalise case 11837 * @return string 11838 */ 11839 function replace_invalid_with_pct_encoding($string, $valid_chars, $case = SIMPLEPIE_SAME_CASE) 11840 { 11841 // Normalise case 11842 if ($case & SIMPLEPIE_LOWERCASE) 11843 { 11844 $string = strtolower($string); 11845 } 11846 elseif ($case & SIMPLEPIE_UPPERCASE) 11847 { 11848 $string = strtoupper($string); 11849 } 11850 11851 // Store position and string length (to avoid constantly recalculating this) 11852 $position = 0; 11853 $strlen = strlen($string); 11854 11855 // Loop as long as we have invalid characters, advancing the position to the next invalid character 11856 while (($position += strspn($string, $valid_chars, $position)) < $strlen) 11857 { 11858 // If we have a % character 11859 if ($string[$position] === '%') 11860 { 11861 // If we have a pct-encoded section 11862 if ($position + 2 < $strlen && strspn($string, '0123456789ABCDEFabcdef', $position + 1, 2) === 2) 11863 { 11864 // Get the the represented character 11865 $chr = chr(hexdec(substr($string, $position + 1, 2))); 11866 11867 // If the character is valid, replace the pct-encoded with the actual character while normalising case 11868 if (strpos($valid_chars, $chr) !== false) 11869 { 11870 if ($case & SIMPLEPIE_LOWERCASE) 11871 { 11872 $chr = strtolower($chr); 11873 } 11874 elseif ($case & SIMPLEPIE_UPPERCASE) 11875 { 11876 $chr = strtoupper($chr); 11877 } 11878 $string = substr_replace($string, $chr, $position, 3); 11879 $strlen -= 2; 11880 $position++; 11881 } 11882 11883 // Otherwise just normalise the pct-encoded to uppercase 11884 else 11885 { 11886 $string = substr_replace($string, strtoupper(substr($string, $position + 1, 2)), $position + 1, 2); 11887 $position += 3; 11888 } 11889 } 11890 // If we don't have a pct-encoded section, just replace the % with its own esccaped form 11891 else 11892 { 11893 $string = substr_replace($string, '%25', $position, 1); 11894 $strlen += 2; 11895 $position += 3; 11896 } 11897 } 11898 // If we have an invalid character, change into its pct-encoded form 11899 else 11900 { 11901 $replacement = sprintf("%%%02X", ord($string[$position])); 11902 $string = str_replace($string[$position], $replacement, $string); 11903 $strlen = strlen($string); 11904 } 11905 } 11906 return $string; 11907 } 11908 11909 /** 11910 * Check if the object represents a valid IRI 11911 * 11912 * @access public 11913 * @return bool 11914 */ 11915 function is_valid() 11916 { 11917 return array_sum($this->valid) === count($this->valid); 11918 } 11919 11920 /** 11921 * Set the scheme. Returns true on success, false on failure (if there are 11922 * any invalid characters). 11923 * 11924 * @access public 11925 * @param string $scheme 11926 * @return bool 11927 */ 11928 function set_scheme($scheme) 11929 { 11930 if ($scheme === null || $scheme === '') 11931 { 11932 $this->scheme = null; 11933 } 11934 else 11935 { 11936 $len = strlen($scheme); 11937 switch (true) 11938 { 11939 case $len > 1: 11940 if (!strspn($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-.', 1)) 11941 { 11942 $this->scheme = null; 11943 $this->valid[__FUNCTION__] = false; 11944 return false; 11945 } 11946 11947 case $len > 0: 11948 if (!strspn($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 0, 1)) 11949 { 11950 $this->scheme = null; 11951 $this->valid[__FUNCTION__] = false; 11952 return false; 11953 } 11954 } 11955 $this->scheme = strtolower($scheme); 11956 } 11957 $this->valid[__FUNCTION__] = true; 11958 return true; 11959 } 11960 11961 /** 11962 * Set the authority. Returns true on success, false on failure (if there are 11963 * any invalid characters). 11964 * 11965 * @access public 11966 * @param string $authority 11967 * @return bool 11968 */ 11969 function set_authority($authority) 11970 { 11971 if (($userinfo_end = strrpos($authority, '@')) !== false) 11972 { 11973 $userinfo = substr($authority, 0, $userinfo_end); 11974 $authority = substr($authority, $userinfo_end + 1); 11975 } 11976 else 11977 { 11978 $userinfo = null; 11979 } 11980 11981 if (($port_start = strpos($authority, ':')) !== false) 11982 { 11983 $port = substr($authority, $port_start + 1); 11984 $authority = substr($authority, 0, $port_start); 11985 } 11986 else 11987 { 11988 $port = null; 11989 } 11990 11991 return $this->set_userinfo($userinfo) && $this->set_host($authority) && $this->set_port($port); 11992 } 11993 11994 /** 11995 * Set the userinfo. 11996 * 11997 * @access public 11998 * @param string $userinfo 11999 * @return bool 12000 */ 12001 function set_userinfo($userinfo) 12002 { 12003 if ($userinfo === null || $userinfo === '') 12004 { 12005 $this->userinfo = null; 12006 } 12007 else 12008 { 12009 $this->userinfo = $this->replace_invalid_with_pct_encoding($userinfo, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:'); 12010 } 12011 $this->valid[__FUNCTION__] = true; 12012 return true; 12013 } 12014 12015 /** 12016 * Set the host. Returns true on success, false on failure (if there are 12017 * any invalid characters). 12018 * 12019 * @access public 12020 * @param string $host 12021 * @return bool 12022 */ 12023 function set_host($host) 12024 { 12025 if ($host === null || $host === '') 12026 { 12027 $this->host = null; 12028 $this->valid[__FUNCTION__] = true; 12029 return true; 12030 } 12031 elseif ($host[0] === '[' && substr($host, -1) === ']') 12032 { 12033 if (Net_IPv6::checkIPv6(substr($host, 1, -1))) 12034 { 12035 $this->host = $host; 12036 $this->valid[__FUNCTION__] = true; 12037 return true; 12038 } 12039 else 12040 { 12041 $this->host = null; 12042 $this->valid[__FUNCTION__] = false; 12043 return false; 12044 } 12045 } 12046 else 12047 { 12048 $this->host = $this->replace_invalid_with_pct_encoding($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=', SIMPLEPIE_LOWERCASE); 12049 $this->valid[__FUNCTION__] = true; 12050 return true; 12051 } 12052 } 12053 12054 /** 12055 * Set the port. Returns true on success, false on failure (if there are 12056 * any invalid characters). 12057 * 12058 * @access public 12059 * @param string $port 12060 * @return bool 12061 */ 12062 function set_port($port) 12063 { 12064 if ($port === null || $port === '') 12065 { 12066 $this->port = null; 12067 $this->valid[__FUNCTION__] = true; 12068 return true; 12069 } 12070 elseif (strspn($port, '0123456789') === strlen($port)) 12071 { 12072 $this->port = (int) $port; 12073 $this->valid[__FUNCTION__] = true; 12074 return true; 12075 } 12076 else 12077 { 12078 $this->port = null; 12079 $this->valid[__FUNCTION__] = false; 12080 return false; 12081 } 12082 } 12083 12084 /** 12085 * Set the path. 12086 * 12087 * @access public 12088 * @param string $path 12089 * @return bool 12090 */ 12091 function set_path($path) 12092 { 12093 if ($path === null || $path === '') 12094 { 12095 $this->path = null; 12096 $this->valid[__FUNCTION__] = true; 12097 return true; 12098 } 12099 elseif (substr($path, 0, 2) === '//' && $this->userinfo === null && $this->host === null && $this->port === null) 12100 { 12101 $this->path = null; 12102 $this->valid[__FUNCTION__] = false; 12103 return false; 12104 } 12105 else 12106 { 12107 $this->path = $this->replace_invalid_with_pct_encoding($path, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=@/'); 12108 if ($this->scheme !== null) 12109 { 12110 $this->path = $this->remove_dot_segments($this->path); 12111 } 12112 $this->valid[__FUNCTION__] = true; 12113 return true; 12114 } 12115 } 12116 12117 /** 12118 * Set the query. 12119 * 12120 * @access public 12121 * @param string $query 12122 * @return bool 12123 */ 12124 function set_query($query) 12125 { 12126 if ($query === null || $query === '') 12127 { 12128 $this->query = null; 12129 } 12130 else 12131 { 12132 $this->query = $this->replace_invalid_with_pct_encoding($query, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:@/?'); 12133 } 12134 $this->valid[__FUNCTION__] = true; 12135 return true; 12136 } 12137 12138 /** 12139 * Set the fragment. 12140 * 12141 * @access public 12142 * @param string $fragment 12143 * @return bool 12144 */ 12145 function set_fragment($fragment) 12146 { 12147 if ($fragment === null || $fragment === '') 12148 { 12149 $this->fragment = null; 12150 } 12151 else 12152 { 12153 $this->fragment = $this->replace_invalid_with_pct_encoding($fragment, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~!$&\'()*+,;=:@/?'); 12154 } 12155 $this->valid[__FUNCTION__] = true; 12156 return true; 12157 } 12158 12159 /** 12160 * Get the complete IRI 12161 * 12162 * @access public 12163 * @return string 12164 */ 12165 function get_iri() 12166 { 12167 $iri = ''; 12168 if ($this->scheme !== null) 12169 { 12170 $iri .= $this->scheme . ':'; 12171 } 12172 if (($authority = $this->get_authority()) !== null) 12173 { 12174 $iri .= '//' . $authority; 12175 } 12176 if ($this->path !== null) 12177 { 12178 $iri .= $this->path; 12179 } 12180 if ($this->query !== null) 12181 { 12182 $iri .= '?' . $this->query; 12183 } 12184 if ($this->fragment !== null) 12185 { 12186 $iri .= '#' . $this->fragment; 12187 } 12188 12189 if ($iri !== '') 12190 { 12191 return $iri; 12192 } 12193 else 12194 { 12195 return null; 12196 } 12197 } 12198 12199 /** 12200 * Get the scheme 12201 * 12202 * @access public 12203 * @return string 12204 */ 12205 function get_scheme() 12206 { 12207 return $this->scheme; 12208 } 12209 12210 /** 12211 * Get the complete authority 12212 * 12213 * @access public 12214 * @return string 12215 */ 12216 function get_authority() 12217 { 12218 $authority = ''; 12219 if ($this->userinfo !== null) 12220 { 12221 $authority .= $this->userinfo . '@'; 12222 } 12223 if ($this->host !== null) 12224 { 12225 $authority .= $this->host; 12226 } 12227 if ($this->port !== null) 12228 { 12229 $authority .= ':' . $this->port; 12230 } 12231 12232 if ($authority !== '') 12233 { 12234 return $authority; 12235 } 12236 else 12237 { 12238 return null; 12239 } 12240 } 12241 12242 /** 12243 * Get the user information 12244 * 12245 * @access public 12246 * @return string 12247 */ 12248 function get_userinfo() 12249 { 12250 return $this->userinfo; 12251 } 12252 12253 /** 12254 * Get the host 12255 * 12256 * @access public 12257 * @return string 12258 */ 12259 function get_host() 12260 { 12261 return $this->host; 12262 } 12263 12264 /** 12265 * Get the port 12266 * 12267 * @access public 12268 * @return string 12269 */ 12270 function get_port() 12271 { 12272 return $this->port; 12273 } 12274 12275 /** 12276 * Get the path 12277 * 12278 * @access public 12279 * @return string 12280 */ 12281 function get_path() 12282 { 12283 return $this->path; 12284 } 12285 12286 /** 12287 * Get the query 12288 * 12289 * @access public 12290 * @return string 12291 */ 12292 function get_query() 12293 { 12294 return $this->query; 12295 } 12296 12297 /** 12298 * Get the fragment 12299 * 12300 * @access public 12301 * @return string 12302 */ 12303 function get_fragment() 12304 { 12305 return $this->fragment; 12306 } 12307 } 12308 12309 /** 12310 * Class to validate and to work with IPv6 addresses. 12311 * 12312 * @package SimplePie 12313 * @copyright 2003-2005 The PHP Group 12314 * @license http://www.opensource.org/licenses/bsd-license.php 12315 * @link http://pear.php.net/package/Net_IPv6 12316 * @author Alexander Merz <alexander.merz@web.de> 12317 * @author elfrink at introweb dot nl 12318 * @author Josh Peck <jmp at joshpeck dot org> 12319 * @author Geoffrey Sneddon <geoffers@gmail.com> 12320 */ 12321 class SimplePie_Net_IPv6 12322 { 12323 /** 12324 * Removes a possible existing netmask specification of an IP address. 12325 * 12326 * @param string $ip the (compressed) IP as Hex representation 12327 * @return string the IP the without netmask 12328 * @since 1.1.0 12329 * @access public 12330 * @static 12331 */ 12332 function removeNetmaskSpec($ip) 12333 { 12334 if (strpos($ip, '/') !== false) 12335 { 12336 list($addr, $nm) = explode('/', $ip); 12337 } 12338 else 12339 { 12340 $addr = $ip; 12341 } 12342 return $addr; 12343 } 12344 12345 /** 12346 * Uncompresses an IPv6 address 12347 * 12348 * RFC 2373 allows you to compress zeros in an address to '::'. This 12349 * function expects an valid IPv6 address and expands the '::' to 12350 * the required zeros. 12351 * 12352 * Example: FF01::101 -> FF01:0:0:0:0:0:0:101 12353 * ::1 -> 0:0:0:0:0:0:0:1 12354 * 12355 * @access public 12356 * @static 12357 * @param string $ip a valid IPv6-address (hex format) 12358 * @return string the uncompressed IPv6-address (hex format) 12359 */ 12360 function Uncompress($ip) 12361 { 12362 $uip = SimplePie_Net_IPv6::removeNetmaskSpec($ip); 12363 $c1 = -1; 12364 $c2 = -1; 12365 if (strpos($ip, '::') !== false) 12366 { 12367 list($ip1, $ip2) = explode('::', $ip); 12368 if ($ip1 === '') 12369 { 12370 $c1 = -1; 12371 } 12372 else 12373 { 12374 $pos = 0; 12375 if (($pos = substr_count($ip1, ':')) > 0) 12376 { 12377 $c1 = $pos; 12378 } 12379 else 12380 { 12381 $c1 = 0; 12382 } 12383 } 12384 if ($ip2 === '') 12385 { 12386 $c2 = -1; 12387 } 12388 else 12389 { 12390 $pos = 0; 12391 if (($pos = substr_count($ip2, ':')) > 0) 12392 { 12393 $c2 = $pos; 12394 } 12395 else 12396 { 12397 $c2 = 0; 12398 } 12399 } 12400 if (strstr($ip2, '.')) 12401 { 12402 $c2++; 12403 } 12404 // :: 12405 if ($c1 === -1 && $c2 === -1) 12406 { 12407 $uip = '0:0:0:0:0:0:0:0'; 12408 } 12409 // ::xxx 12410 else if ($c1 === -1) 12411 { 12412 $fill = str_repeat('0:', 7 - $c2); 12413 $uip = str_replace('::', $fill, $uip); 12414 } 12415 // xxx:: 12416 else if ($c2 === -1) 12417 { 12418 $fill = str_repeat(':0', 7 - $c1); 12419 $uip = str_replace('::', $fill, $uip); 12420 } 12421 // xxx::xxx 12422 else 12423 { 12424 $fill = str_repeat(':0:', 6 - $c2 - $c1); 12425 $uip = str_replace('::', $fill, $uip); 12426 $uip = str_replace('::', ':', $uip); 12427 } 12428 } 12429 return $uip; 12430 } 12431 12432 /** 12433 * Splits an IPv6 address into the IPv6 and a possible IPv4 part 12434 * 12435 * RFC 2373 allows you to note the last two parts of an IPv6 address as 12436 * an IPv4 compatible address 12437 * 12438 * Example: 0:0:0:0:0:0:13.1.68.3 12439 * 0:0:0:0:0:FFFF:129.144.52.38 12440 * 12441 * @access public 12442 * @static 12443 * @param string $ip a valid IPv6-address (hex format) 12444 * @return array [0] contains the IPv6 part, [1] the IPv4 part (hex format) 12445 */ 12446 function SplitV64($ip) 12447 { 12448 $ip = SimplePie_Net_IPv6::Uncompress($ip); 12449 if (strstr($ip, '.')) 12450 { 12451 $pos = strrpos($ip, ':'); 12452 $ip[$pos] = '_'; 12453 $ipPart = explode('_', $ip); 12454 return $ipPart; 12455 } 12456 else 12457 { 12458 return array($ip, ''); 12459 } 12460 } 12461 12462 /** 12463 * Checks an IPv6 address 12464 * 12465 * Checks if the given IP is IPv6-compatible 12466 * 12467 * @access public 12468 * @static 12469 * @param string $ip a valid IPv6-address 12470 * @return bool true if $ip is an IPv6 address 12471 */ 12472 function checkIPv6($ip) 12473 { 12474 $ipPart = SimplePie_Net_IPv6::SplitV64($ip); 12475 $count = 0; 12476 if (!empty($ipPart[0])) 12477 { 12478 $ipv6 = explode(':', $ipPart[0]); 12479 for ($i = 0; $i < count($ipv6); $i++) 12480 { 12481 $dec = hexdec($ipv6[$i]); 12482 $hex = strtoupper(preg_replace('/^[0]{1,3}(.*[0-9a-fA-F])$/', '\\1', $ipv6[$i])); 12483 if ($ipv6[$i] >= 0 && $dec <= 65535 && $hex === strtoupper(dechex($dec))) 12484 { 12485 $count++; 12486 } 12487 } 12488 if ($count === 8) 12489 { 12490 return true; 12491 } 12492 elseif ($count === 6 && !empty($ipPart[1])) 12493 { 12494 $ipv4 = explode('.', $ipPart[1]); 12495 $count = 0; 12496 foreach ($ipv4 as $ipv4_part) 12497 { 12498 if ($ipv4_part >= 0 && $ipv4_part <= 255 && preg_match('/^\d{1,3}$/', $ipv4_part)) 12499 { 12500 $count++; 12501 } 12502 } 12503 if ($count === 4) 12504 { 12505 return true; 12506 } 12507 } 12508 else 12509 { 12510 return false; 12511 } 12512 12513 } 12514 else 12515 { 12516 return false; 12517 } 12518 } 12519 } 12520 12521 /** 12522 * Date Parser 12523 * 12524 * @package SimplePie 12525 */ 12526 class SimplePie_Parse_Date 12527 { 12528 /** 12529 * Input data 12530 * 12531 * @access protected 12532 * @var string 12533 */ 12534 var $date; 12535 12536 /** 12537 * List of days, calendar day name => ordinal day number in the week 12538 * 12539 * @access protected 12540 * @var array 12541 */ 12542 var $day = array( 12543 // English 12544 'mon' => 1, 12545 'monday' => 1, 12546 'tue' => 2, 12547 'tuesday' => 2, 12548 'wed' => 3, 12549 'wednesday' => 3, 12550 'thu' => 4, 12551 'thursday' => 4, 12552 'fri' => 5, 12553 'friday' => 5, 12554 'sat' => 6, 12555 'saturday' => 6, 12556 'sun' => 7, 12557 'sunday' => 7, 12558 // Dutch 12559 'maandag' => 1, 12560 'dinsdag' => 2, 12561 'woensdag' => 3, 12562 'donderdag' => 4, 12563 'vrijdag' => 5, 12564 'zaterdag' => 6, 12565 'zondag' => 7, 12566 // French 12567 'lundi' => 1, 12568 'mardi' => 2, 12569 'mercredi' => 3, 12570 'jeudi' => 4, 12571 'vendredi' => 5, 12572 'samedi' => 6, 12573 'dimanche' => 7, 12574 // German 12575 'montag' => 1, 12576 'dienstag' => 2, 12577 'mittwoch' => 3, 12578 'donnerstag' => 4, 12579 'freitag' => 5, 12580 'samstag' => 6, 12581 'sonnabend' => 6, 12582 'sonntag' => 7, 12583 // Italian 12584 'lunedì' => 1, 12585 'martedì' => 2, 12586 'mercoledì' => 3, 12587 'giovedì' => 4, 12588 'venerdì' => 5, 12589 'sabato' => 6, 12590 'domenica' => 7, 12591 // Spanish 12592 'lunes' => 1, 12593 'martes' => 2, 12594 'miércoles' => 3, 12595 'jueves' => 4, 12596 'viernes' => 5, 12597 'sábado' => 6, 12598 'domingo' => 7, 12599 // Finnish 12600 'maanantai' => 1, 12601 'tiistai' => 2, 12602 'keskiviikko' => 3, 12603 'torstai' => 4, 12604 'perjantai' => 5, 12605 'lauantai' => 6, 12606 'sunnuntai' => 7, 12607 // Hungarian 12608 'hétfő' => 1, 12609 'kedd' => 2, 12610 'szerda' => 3, 12611 'csütörtok' => 4, 12612 'péntek' => 5, 12613 'szombat' => 6, 12614 'vasárnap' => 7, 12615 // Greek 12616 'Δευ' => 1, 12617 'Τρι' => 2, 12618 'Τετ' => 3, 12619 'Πεμ' => 4, 12620 'Παρ' => 5, 12621 'Σαβ' => 6, 12622 'Κυρ' => 7, 12623 ); 12624 12625 /** 12626 * List of months, calendar month name => calendar month number 12627 * 12628 * @access protected 12629 * @var array 12630 */ 12631 var $month = array( 12632 // English 12633 'jan' => 1, 12634 'january' => 1, 12635 'feb' => 2, 12636 'february' => 2, 12637 'mar' => 3, 12638 'march' => 3, 12639 'apr' => 4, 12640 'april' => 4, 12641 'may' => 5, 12642 // No long form of May 12643 'jun' => 6, 12644 'june' => 6, 12645 'jul' => 7, 12646 'july' => 7, 12647 'aug' => 8, 12648 'august' => 8, 12649 'sep' => 9, 12650 'september' => 8, 12651 'oct' => 10, 12652 'october' => 10, 12653 'nov' => 11, 12654 'november' => 11, 12655 'dec' => 12, 12656 'december' => 12, 12657 // Dutch 12658 'januari' => 1, 12659 'februari' => 2, 12660 'maart' => 3, 12661 'april' => 4, 12662 'mei' => 5, 12663 'juni' => 6, 12664 'juli' => 7, 12665 'augustus' => 8, 12666 'september' => 9, 12667 'oktober' => 10, 12668 'november' => 11, 12669 'december' => 12, 12670 // French 12671 'janvier' => 1, 12672 'février' => 2, 12673 'mars' => 3, 12674 'avril' => 4, 12675 'mai' => 5, 12676 'juin' => 6, 12677 'juillet' => 7, 12678 'août' => 8, 12679 'septembre' => 9, 12680 'octobre' => 10, 12681 'novembre' => 11, 12682 'décembre' => 12, 12683 // German 12684 'januar' => 1, 12685 'februar' => 2, 12686 'märz' => 3, 12687 'april' => 4, 12688 'mai' => 5, 12689 'juni' => 6, 12690 'juli' => 7, 12691 'august' => 8, 12692 'september' => 9, 12693 'oktober' => 10, 12694 'november' => 11, 12695 'dezember' => 12, 12696 // Italian 12697 'gennaio' => 1, 12698 'febbraio' => 2, 12699 'marzo' => 3, 12700 'aprile' => 4, 12701 'maggio' => 5, 12702 'giugno' => 6, 12703 'luglio' => 7, 12704 'agosto' => 8, 12705 'settembre' => 9, 12706 'ottobre' => 10, 12707 'novembre' => 11, 12708 'dicembre' => 12, 12709 // Spanish 12710 'enero' => 1, 12711 'febrero' => 2, 12712 'marzo' => 3, 12713 'abril' => 4, 12714 'mayo' => 5, 12715 'junio' => 6, 12716 'julio' => 7, 12717 'agosto' => 8, 12718 'septiembre' => 9, 12719 'setiembre' => 9, 12720 'octubre' => 10, 12721 'noviembre' => 11, 12722 'diciembre' => 12, 12723 // Finnish 12724 'tammikuu' => 1, 12725 'helmikuu' => 2, 12726 'maaliskuu' => 3, 12727 'huhtikuu' => 4, 12728 'toukokuu' => 5, 12729 'kesäkuu' => 6, 12730 'heinäkuu' => 7, 12731 'elokuu' => 8, 12732 'suuskuu' => 9, 12733 'lokakuu' => 10, 12734 'marras' => 11, 12735 'joulukuu' => 12, 12736 // Hungarian 12737 'január' => 1, 12738 'február' => 2, 12739 'március' => 3, 12740 'április' => 4, 12741 'május' => 5, 12742 'június' => 6, 12743 'július' => 7, 12744 'augusztus' => 8, 12745 'szeptember' => 9, 12746 'október' => 10, 12747 'november' => 11, 12748 'december' => 12, 12749 // Greek 12750 'Ιαν' => 1, 12751 'Φεβ' => 2, 12752 'Μάώ' => 3, 12753 'Μαώ' => 3, 12754 'Απρ' => 4, 12755 'Μάι' => 5, 12756 'Μαϊ' => 5, 12757 'Μαι' => 5, 12758 'Ιούν' => 6, 12759 'Ιον' => 6, 12760 'Ιούλ' => 7, 12761 'Ιολ' => 7, 12762 'Αύγ' => 8, 12763 'Αυγ' => 8, 12764 'Σεπ' => 9, 12765 'Οκτ' => 10, 12766 'Νοέ' => 11, 12767 'Δεκ' => 12, 12768 ); 12769 12770 /** 12771 * List of timezones, abbreviation => offset from UTC 12772 * 12773 * @access protected 12774 * @var array 12775 */ 12776 var $timezone = array( 12777 'ACDT' => 37800, 12778 'ACIT' => 28800, 12779 'ACST' => 34200, 12780 'ACT' => -18000, 12781 'ACWDT' => 35100, 12782 'ACWST' => 31500, 12783 'AEDT' => 39600, 12784 'AEST' => 36000, 12785 'AFT' => 16200, 12786 'AKDT' => -28800, 12787 'AKST' => -32400, 12788 'AMDT' => 18000, 12789 'AMT' => -14400, 12790 'ANAST' => 46800, 12791 'ANAT' => 43200, 12792 'ART' => -10800, 12793 'AZOST' => -3600, 12794 'AZST' => 18000, 12795 'AZT' => 14400, 12796 'BIOT' => 21600, 12797 'BIT' => -43200, 12798 'BOT' => -14400, 12799 'BRST' => -7200, 12800 'BRT' => -10800, 12801 'BST' => 3600, 12802 'BTT' => 21600, 12803 'CAST' => 18000, 12804 'CAT' => 7200, 12805 'CCT' => 23400, 12806 'CDT' => -18000, 12807 'CEDT' => 7200, 12808 'CET' => 3600, 12809 'CGST' => -7200, 12810 'CGT' => -10800, 12811 'CHADT' => 49500, 12812 'CHAST' => 45900, 12813 'CIST' => -28800, 12814 'CKT' => -36000, 12815 'CLDT' => -10800, 12816 'CLST' => -14400, 12817 'COT' => -18000, 12818 'CST' => -21600, 12819 'CVT' => -3600, 12820 'CXT' => 25200, 12821 'DAVT' => 25200, 12822 'DTAT' => 36000, 12823 'EADT' => -18000, 12824 'EAST' => -21600, 12825 'EAT' => 10800, 12826 'ECT' => -18000, 12827 'EDT' => -14400, 12828 'EEST' => 10800, 12829 'EET' => 7200, 12830 'EGT' => -3600, 12831 'EKST' => 21600, 12832 'EST' => -18000, 12833 'FJT' => 43200, 12834 'FKDT' => -10800, 12835 'FKST' => -14400, 12836 'FNT' => -7200, 12837 'GALT' => -21600, 12838 'GEDT' => 14400, 12839 'GEST' => 10800, 12840 'GFT' => -10800, 12841 'GILT' => 43200, 12842 'GIT' => -32400, 12843 'GST' => 14400, 12844 'GST' => -7200, 12845 'GYT' => -14400, 12846 'HAA' => -10800, 12847 'HAC' => -18000, 12848 'HADT' => -32400, 12849 'HAE' => -14400, 12850 'HAP' => -25200, 12851 'HAR' => -21600, 12852 'HAST' => -36000, 12853 'HAT' => -9000, 12854 'HAY' => -28800, 12855 'HKST' => 28800, 12856 'HMT' => 18000, 12857 'HNA' => -14400, 12858 'HNC' => -21600, 12859 'HNE' => -18000, 12860 'HNP' => -28800, 12861 'HNR' => -25200, 12862 'HNT' => -12600, 12863 'HNY' => -32400, 12864 'IRDT' => 16200, 12865 'IRKST' => 32400, 12866 'IRKT' => 28800, 12867 'IRST' => 12600, 12868 'JFDT' => -10800, 12869 'JFST' => -14400, 12870 'JST' => 32400, 12871 'KGST' => 21600, 12872 'KGT' => 18000, 12873 'KOST' => 39600, 12874 'KOVST' => 28800, 12875 'KOVT' => 25200, 12876 'KRAST' => 28800, 12877 'KRAT' => 25200, 12878 'KST' => 32400, 12879 'LHDT' => 39600, 12880 'LHST' => 37800, 12881 'LINT' => 50400, 12882 'LKT' => 21600, 12883 'MAGST' => 43200, 12884 'MAGT' => 39600, 12885 'MAWT' => 21600, 12886 'MDT' => -21600, 12887 'MESZ' => 7200, 12888 'MEZ' => 3600, 12889 'MHT' => 43200, 12890 'MIT' => -34200, 12891 'MNST' => 32400, 12892 'MSDT' => 14400, 12893 'MSST' => 10800, 12894 'MST' => -25200, 12895 'MUT' => 14400, 12896 'MVT' => 18000, 12897 'MYT' => 28800, 12898 'NCT' => 39600, 12899 'NDT' => -9000, 12900 'NFT' => 41400, 12901 'NMIT' => 36000, 12902 'NOVST' => 25200, 12903 'NOVT' => 21600, 12904 'NPT' => 20700, 12905 'NRT' => 43200, 12906 'NST' => -12600, 12907 'NUT' => -39600, 12908 'NZDT' => 46800, 12909 'NZST' => 43200, 12910 'OMSST' => 25200, 12911 'OMST' => 21600, 12912 'PDT' => -25200, 12913 'PET' => -18000, 12914 'PETST' => 46800, 12915 'PETT' => 43200, 12916 'PGT' => 36000, 12917 'PHOT' => 46800, 12918 'PHT' => 28800, 12919 'PKT' => 18000, 12920 'PMDT' => -7200, 12921 'PMST' => -10800, 12922 'PONT' => 39600, 12923 'PST' => -28800, 12924 'PWT' => 32400, 12925 'PYST' => -10800, 12926 'PYT' => -14400, 12927 'RET' => 14400, 12928 'ROTT' => -10800, 12929 'SAMST' => 18000, 12930 'SAMT' => 14400, 12931 'SAST' => 7200, 12932 'SBT' => 39600, 12933 'SCDT' => 46800, 12934 'SCST' => 43200, 12935 'SCT' => 14400, 12936 'SEST' => 3600, 12937 'SGT' => 28800, 12938 'SIT' => 28800, 12939 'SRT' => -10800, 12940 'SST' => -39600, 12941 'SYST' => 10800, 12942 'SYT' => 7200, 12943 'TFT' => 18000, 12944 'THAT' => -36000, 12945 'TJT' => 18000, 12946 'TKT' => -36000, 12947 'TMT' => 18000, 12948 'TOT' => 46800, 12949 'TPT' => 32400, 12950 'TRUT' => 36000, 12951 'TVT' => 43200, 12952 'TWT' => 28800, 12953 'UYST' => -7200, 12954 'UYT' => -10800, 12955 'UZT' => 18000, 12956 'VET' => -14400, 12957 'VLAST' => 39600, 12958 'VLAT' => 36000, 12959 'VOST' => 21600, 12960 'VUT' => 39600, 12961 'WAST' => 7200, 12962 'WAT' => 3600, 12963 'WDT' => 32400, 12964 'WEST' => 3600, 12965 'WFT' => 43200, 12966 'WIB' => 25200, 12967 'WIT' => 32400, 12968 'WITA' => 28800, 12969 'WKST' => 18000, 12970 'WST' => 28800, 12971 'YAKST' => 36000, 12972 'YAKT' => 32400, 12973 'YAPT' => 36000, 12974 'YEKST' => 21600, 12975 'YEKT' => 18000, 12976 ); 12977 12978 /** 12979 * Cached PCRE for SimplePie_Parse_Date::$day 12980 * 12981 * @access protected 12982 * @var string 12983 */ 12984 var $day_pcre; 12985 12986 /** 12987 * Cached PCRE for SimplePie_Parse_Date::$month 12988 * 12989 * @access protected 12990 * @var string 12991 */ 12992 var $month_pcre; 12993 12994 /** 12995 * Array of user-added callback methods 12996 * 12997 * @access private 12998 * @var array 12999 */ 13000 var $built_in = array(); 13001 13002 /** 13003 * Array of user-added callback methods 13004 * 13005 * @access private 13006 * @var array 13007 */ 13008 var $user = array(); 13009 13010 /** 13011 * Create new SimplePie_Parse_Date object, and set self::day_pcre, 13012 * self::month_pcre, and self::built_in 13013 * 13014 * @access private 13015 */ 13016 function SimplePie_Parse_Date() 13017 { 13018 $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')'; 13019 $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')'; 13020 13021 static $cache; 13022 if (!isset($cache[get_class($this)])) 13023 { 13024 $all_methods = get_class_methods($this); 13025 13026 foreach ($all_methods as $method) 13027 { 13028 if (strtolower(substr($method, 0, 5)) === 'date_') 13029 { 13030 $cache[get_class($this)][] = $method; 13031 } 13032 } 13033 } 13034 13035 foreach ($cache[get_class($this)] as $method) 13036 { 13037 $this->built_in[] = $method; 13038 } 13039 } 13040 13041 /** 13042 * Get the object 13043 * 13044 * @access public 13045 */ 13046 function get() 13047 { 13048 static $object; 13049 if (!$object) 13050 { 13051 $object =& new SimplePie_Parse_Date; 13052 } 13053 return $object; 13054 } 13055 13056 /** 13057 * Parse a date 13058 * 13059 * @final 13060 * @access public 13061 * @param string $date Date to parse 13062 * @return int Timestamp corresponding to date string, or false on failure 13063 */ 13064 function parse($date) 13065 { 13066 foreach ($this->user as $method) 13067 { 13068 if (($returned = call_user_func($method, $date)) !== false) 13069 { 13070 return $returned; 13071 } 13072 } 13073 13074 foreach ($this->built_in as $method) 13075 { 13076 if (($returned = call_user_func(array(&$this, $method), $date)) !== false) 13077 { 13078 return $returned; 13079 } 13080 } 13081 13082 return false; 13083 } 13084 13085 /** 13086 * Add a callback method to parse a date 13087 * 13088 * @final 13089 * @access public 13090 * @param callback $callback 13091 */ 13092 function add_callback($callback) 13093 { 13094 if (is_callable($callback)) 13095 { 13096 $this->user[] = $callback; 13097 } 13098 else 13099 { 13100 trigger_error('User-supplied function must be a valid callback', E_USER_WARNING); 13101 } 13102 } 13103 13104 /** 13105 * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as 13106 * well as allowing any of upper or lower case "T", horizontal tabs, or 13107 * spaces to be used as the time seperator (including more than one)) 13108 * 13109 * @access protected 13110 * @return int Timestamp 13111 */ 13112 function date_w3cdtf($date) 13113 { 13114 static $pcre; 13115 if (!$pcre) 13116 { 13117 $year = '([0-9]{4})'; 13118 $month = $day = $hour = $minute = $second = '([0-9]{2})'; 13119 $decimal = '([0-9]*)'; 13120 $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))'; 13121 $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/'; 13122 } 13123 if (preg_match($pcre, $date, $match)) 13124 { 13125 /* 13126 Capturing subpatterns: 13127 1: Year 13128 2: Month 13129 3: Day 13130 4: Hour 13131 5: Minute 13132 6: Second 13133 7: Decimal fraction of a second 13134 8: Zulu 13135 9: Timezone ± 13136 10: Timezone hours 13137 11: Timezone minutes 13138 */ 13139 13140 // Fill in empty matches 13141 for ($i = count($match); $i <= 3; $i++) 13142 { 13143 $match[$i] = '1'; 13144 } 13145 13146 for ($i = count($match); $i <= 7; $i++) 13147 { 13148 $match[$i] = '0'; 13149 } 13150 13151 // Numeric timezone 13152 if (isset($match[9]) && $match[9] !== '') 13153 { 13154 $timezone = $match[10] * 3600; 13155 $timezone += $match[11] * 60; 13156 if ($match[9] === '-') 13157 { 13158 $timezone = 0 - $timezone; 13159 } 13160 } 13161 else 13162 { 13163 $timezone = 0; 13164 } 13165 13166 // Convert the number of seconds to an integer, taking decimals into account 13167 $second = round($match[6] + $match[7] / pow(10, strlen($match[7]))); 13168 13169 return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone; 13170 } 13171 else 13172 { 13173 return false; 13174 } 13175 } 13176 13177 /** 13178 * Remove RFC822 comments 13179 * 13180 * @access protected 13181 * @param string $data Data to strip comments from 13182 * @return string Comment stripped string 13183 */ 13184 function remove_rfc2822_comments($string) 13185 { 13186 $string = (string) $string; 13187 $position = 0; 13188 $length = strlen($string); 13189 $depth = 0; 13190 13191 $output = ''; 13192 13193 while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) 13194 { 13195 $output .= substr($string, $position, $pos - $position); 13196 $position = $pos + 1; 13197 if ($string[$pos - 1] !== '\\') 13198 { 13199 $depth++; 13200 while ($depth && $position < $length) 13201 { 13202 $position += strcspn($string, '()', $position); 13203 if ($string[$position - 1] === '\\') 13204 { 13205 $position++; 13206 continue; 13207 } 13208 elseif (isset($string[$position])) 13209 { 13210 switch ($string[$position]) 13211 { 13212 case '(': 13213 $depth++; 13214 break; 13215 13216 case ')': 13217 $depth--; 13218 break; 13219 } 13220 $position++; 13221 } 13222 else 13223 { 13224 break; 13225 } 13226 } 13227 } 13228 else 13229 { 13230 $output .= '('; 13231 } 13232 } 13233 $output .= substr($string, $position); 13234 13235 return $output; 13236 } 13237 13238 /** 13239 * Parse RFC2822's date format 13240 * 13241 * @access protected 13242 * @return int Timestamp 13243 */ 13244 function date_rfc2822($date) 13245 { 13246 static $pcre; 13247 if (!$pcre) 13248 { 13249 $wsp = '[\x09\x20]'; 13250 $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)'; 13251 $optional_fws = $fws . '?'; 13252 $day_name = $this->day_pcre; 13253 $month = $this->month_pcre; 13254 $day = '([0-9]{1,2})'; 13255 $hour = $minute = $second = '([0-9]{2})'; 13256 $year = '([0-9]{2,4})'; 13257 $num_zone = '([+\-])([0-9]{2})([0-9]{2})'; 13258 $character_zone = '([A-Z]{1,5})'; 13259 $zone = '(?:' . $num_zone . '|' . $character_zone . ')'; 13260 $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i'; 13261 } 13262 if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match)) 13263 { 13264 /* 13265 Capturing subpatterns: 13266 1: Day name 13267 2: Day 13268 3: Month 13269 4: Year 13270 5: Hour 13271 6: Minute 13272 7: Second 13273 8: Timezone ± 13274 9: Timezone hours 13275 10: Timezone minutes 13276 11: Alphabetic timezone 13277 */ 13278 13279 // Find the month number 13280 $month = $this->month[strtolower($match[3])]; 13281 13282 // Numeric timezone 13283 if ($match[8] !== '') 13284 { 13285 $timezone = $match[9] * 3600; 13286 $timezone += $match[10] * 60; 13287 if ($match[8] === '-') 13288 { 13289 $timezone = 0 - $timezone; 13290 } 13291 } 13292 // Character timezone 13293 elseif (isset($this->timezone[strtoupper($match[11])])) 13294 { 13295 $timezone = $this->timezone[strtoupper($match[11])]; 13296 } 13297 // Assume everything else to be -0000 13298 else 13299 { 13300 $timezone = 0; 13301 } 13302 13303 // Deal with 2/3 digit years 13304 if ($match[4] < 50) 13305 { 13306 $match[4] += 2000; 13307 } 13308 elseif ($match[4] < 1000) 13309 { 13310 $match[4] += 1900; 13311 } 13312 13313 // Second is optional, if it is empty set it to zero 13314 if ($match[7] !== '') 13315 { 13316 $second = $match[7]; 13317 } 13318 else 13319 { 13320 $second = 0; 13321 } 13322 13323 return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone; 13324 } 13325 else 13326 { 13327 return false; 13328 } 13329 } 13330 13331 /** 13332 * Parse RFC850's date format 13333 * 13334 * @access protected 13335 * @return int Timestamp 13336 */ 13337 function date_rfc850($date) 13338 { 13339 static $pcre; 13340 if (!$pcre) 13341 { 13342 $space = '[\x09\x20]+'; 13343 $day_name = $this->day_pcre; 13344 $month = $this->month_pcre; 13345 $day = '([0-9]{1,2})'; 13346 $year = $hour = $minute = $second = '([0-9]{2})'; 13347 $zone = '([A-Z]{1,5})'; 13348 $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i'; 13349 } 13350 if (preg_match($pcre, $date, $match)) 13351 { 13352 /* 13353 Capturing subpatterns: 13354 1: Day name 13355 2: Day 13356 3: Month 13357 4: Year 13358 5: Hour 13359 6: Minute 13360 7: Second 13361 8: Timezone 13362 */ 13363 13364 // Month 13365 $month = $this->month[strtolower($match[3])]; 13366 13367 // Character timezone 13368 if (isset($this->timezone[strtoupper($match[8])])) 13369 { 13370 $timezone = $this->timezone[strtoupper($match[8])]; 13371 } 13372 // Assume everything else to be -0000 13373 else 13374 { 13375 $timezone = 0; 13376 } 13377 13378 // Deal with 2 digit year 13379 if ($match[4] < 50) 13380 { 13381 $match[4] += 2000; 13382 } 13383 else 13384 { 13385 $match[4] += 1900; 13386 } 13387 13388 return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone; 13389 } 13390 else 13391 { 13392 return false; 13393 } 13394 } 13395 13396 /** 13397 * Parse C99's asctime()'s date format 13398 * 13399 * @access protected 13400 * @return int Timestamp 13401 */ 13402 function date_asctime($date) 13403 { 13404 static $pcre; 13405 if (!$pcre) 13406 { 13407 $space = '[\x09\x20]+'; 13408 $wday_name = $this->day_pcre; 13409 $mon_name = $this->month_pcre; 13410 $day = '([0-9]{1,2})'; 13411 $hour = $sec = $min = '([0-9]{2})'; 13412 $year = '([0-9]{4})'; 13413 $terminator = '\x0A?\x00?'; 13414 $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i'; 13415 } 13416 if (preg_match($pcre, $date, $match)) 13417 { 13418 /* 13419 Capturing subpatterns: 13420 1: Day name 13421 2: Month 13422 3: Day 13423 4: Hour 13424 5: Minute 13425 6: Second 13426 7: Year 13427 */ 13428 13429 $month = $this->month[strtolower($match[2])]; 13430 return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]); 13431 } 13432 else 13433 { 13434 return false; 13435 } 13436 } 13437 13438 /** 13439 * Parse dates using strtotime() 13440 * 13441 * @access protected 13442 * @return int Timestamp 13443 */ 13444 function date_strtotime($date) 13445 { 13446 $strtotime = strtotime($date); 13447 if ($strtotime === -1 || $strtotime === false) 13448 { 13449 return false; 13450 } 13451 else 13452 { 13453 return $strtotime; 13454 } 13455 } 13456 } 13457 13458 /** 13459 * Content-type sniffing 13460 * 13461 * @package SimplePie 13462 */ 13463 class SimplePie_Content_Type_Sniffer 13464 { 13465 /** 13466 * File object 13467 * 13468 * @var SimplePie_File 13469 * @access private 13470 */ 13471 var $file; 13472 13473 /** 13474 * Create an instance of the class with the input file 13475 * 13476 * @access public 13477 * @param SimplePie_Content_Type_Sniffer $file Input file 13478 */ 13479 function SimplePie_Content_Type_Sniffer($file) 13480 { 13481 $this->file = $file; 13482 } 13483 13484 /** 13485 * Get the Content-Type of the specified file 13486 * 13487 * @access public 13488 * @return string Actual Content-Type 13489 */ 13490 function get_type() 13491 { 13492 if (isset($this->file->headers['content-type'])) 13493 { 13494 if (!isset($this->file->headers['content-encoding']) 13495 && ($this->file->headers['content-type'] === 'text/plain' 13496 || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1' 13497 || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1')) 13498 { 13499 return $this->text_or_binary(); 13500 } 13501 13502 if (($pos = strpos($this->file->headers['content-type'], ';')) !== false) 13503 { 13504 $official = substr($this->file->headers['content-type'], 0, $pos); 13505 } 13506 else 13507 { 13508 $official = $this->file->headers['content-type']; 13509 } 13510 $official = strtolower($official); 13511 13512 if ($official === 'unknown/unknown' 13513 || $official === 'application/unknown') 13514 { 13515 return $this->unknown(); 13516 } 13517 elseif (substr($official, -4) === '+xml' 13518 || $official === 'text/xml' 13519 || $official === 'application/xml') 13520 { 13521 return $official; 13522 } 13523 elseif (substr($official, 0, 6) === 'image/') 13524 { 13525 if ($return = $this->image()) 13526 { 13527 return $return; 13528 } 13529 else 13530 { 13531 return $official; 13532 } 13533 } 13534 elseif ($official === 'text/html') 13535 { 13536 return $this->feed_or_html(); 13537 } 13538 else 13539 { 13540 return $official; 13541 } 13542 } 13543 else 13544 { 13545 return $this->unknown(); 13546 } 13547 } 13548 13549 /** 13550 * Sniff text or binary 13551 * 13552 * @access private 13553 * @return string Actual Content-Type 13554 */ 13555 function text_or_binary() 13556 { 13557 if (substr($this->file->body, 0, 2) === "\xFE\xFF" 13558 || substr($this->file->body, 0, 2) === "\xFF\xFE" 13559 || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF" 13560 || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF") 13561 { 13562 return 'text/plain'; 13563 } 13564 elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body)) 13565 { 13566 return 'application/octect-stream'; 13567 } 13568 else 13569 { 13570 return 'text/plain'; 13571 } 13572 } 13573 13574 /** 13575 * Sniff unknown 13576 * 13577 * @access private 13578 * @return string Actual Content-Type 13579 */ 13580 function unknown() 13581 { 13582 $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20"); 13583 if (strtolower(substr($this->file->body, $ws, 14)) === '<!doctype html' 13584 || strtolower(substr($this->file->body, $ws, 5)) === '<html' 13585 || strtolower(substr($this->file->body, $ws, 7)) === '<script') 13586 { 13587 return 'text/html'; 13588 } 13589 elseif (substr($this->file->body, 0, 5) === '%PDF-') 13590 { 13591 return 'application/pdf'; 13592 } 13593 elseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-') 13594 { 13595 return 'application/postscript'; 13596 } 13597 elseif (substr($this->file->body, 0, 6) === 'GIF87a' 13598 || substr($this->file->body, 0, 6) === 'GIF89a') 13599 { 13600 return 'image/gif'; 13601 } 13602 elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") 13603 { 13604 return 'image/png'; 13605 } 13606 elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF") 13607 { 13608 return 'image/jpeg'; 13609 } 13610 elseif (substr($this->file->body, 0, 2) === "\x42\x4D") 13611 { 13612 return 'image/bmp'; 13613 } 13614 else 13615 { 13616 return $this->text_or_binary(); 13617 } 13618 } 13619 13620 /** 13621 * Sniff images 13622 * 13623 * @access private 13624 * @return string Actual Content-Type 13625 */ 13626 function image() 13627 { 13628 if (substr($this->file->body, 0, 6) === 'GIF87a' 13629 || substr($this->file->body, 0, 6) === 'GIF89a') 13630 { 13631 return 'image/gif'; 13632 } 13633 elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") 13634 { 13635 return 'image/png'; 13636 } 13637 elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF") 13638 { 13639 return 'image/jpeg'; 13640 } 13641 elseif (substr($this->file->body, 0, 2) === "\x42\x4D") 13642 { 13643 return 'image/bmp'; 13644 } 13645 else 13646 { 13647 return false; 13648 } 13649 } 13650 13651 /** 13652 * Sniff HTML 13653 * 13654 * @access private 13655 * @return string Actual Content-Type 13656 */ 13657 function feed_or_html() 13658 { 13659 $len = strlen($this->file->body); 13660 $pos = strspn($this->file->body, "\x09\x0A\x0D\x20"); 13661 13662 while ($pos < $len) 13663 { 13664 switch ($this->file->body[$pos]) 13665 { 13666 case "\x09": 13667 case "\x0A": 13668 case "\x0D": 13669 case "\x20": 13670 $pos += strspn($this->file->body, "\x09\x0A\x0D\x20", $pos); 13671 continue 2; 13672 13673 case '<': 13674 $pos++; 13675 break; 13676 13677 default: 13678 return 'text/html'; 13679 } 13680 13681 if (substr($this->file->body, $pos, 3) === '!--') 13682 { 13683 $pos += 3; 13684 if ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false) 13685 { 13686 $pos += 3; 13687 } 13688 else 13689 { 13690 return 'text/html'; 13691 } 13692 } 13693 elseif (substr($this->file->body, $pos, 1) === '!') 13694 { 13695 if ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false) 13696 { 13697 $pos++; 13698 } 13699 else 13700 { 13701 return 'text/html'; 13702 } 13703 } 13704 elseif (substr($this->file->body, $pos, 1) === '?') 13705 { 13706 if ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false) 13707 { 13708 $pos += 2; 13709 } 13710 else 13711 { 13712 return 'text/html'; 13713 } 13714 } 13715 elseif (substr($this->file->body, $pos, 3) === 'rss' 13716 || substr($this->file->body, $pos, 7) === 'rdf:RDF') 13717 { 13718 return 'application/rss+xml'; 13719 } 13720 elseif (substr($this->file->body, $pos, 4) === 'feed') 13721 { 13722 return 'application/atom+xml'; 13723 } 13724 else 13725 { 13726 return 'text/html'; 13727 } 13728 } 13729 13730 return 'text/html'; 13731 } 13732 } 13733 13734 /** 13735 * Parses the XML Declaration 13736 * 13737 * @package SimplePie 13738 */ 13739 class SimplePie_XML_Declaration_Parser 13740 { 13741 /** 13742 * XML Version 13743 * 13744 * @access public 13745 * @var string 13746 */ 13747 var $version = '1.0'; 13748 13749 /** 13750 * Encoding 13751 * 13752 * @access public 13753 * @var string 13754 */ 13755 var $encoding = 'UTF-8'; 13756 13757 /** 13758 * Standalone 13759 * 13760 * @access public 13761 * @var bool 13762 */ 13763 var $standalone = false; 13764 13765 /** 13766 * Current state of the state machine 13767 * 13768 * @access private 13769 * @var string 13770 */ 13771 var $state = 'before_version_name'; 13772 13773 /** 13774 * Input data 13775 * 13776 * @access private 13777 * @var string 13778 */ 13779 var $data = ''; 13780 13781 /** 13782 * Input data length (to avoid calling strlen() everytime this is needed) 13783 * 13784 * @access private 13785 * @var int 13786 */ 13787 var $data_length = 0; 13788 13789 /** 13790 * Current position of the pointer 13791 * 13792 * @var int 13793 * @access private 13794 */ 13795 var $position = 0; 13796 13797 /** 13798 * Create an instance of the class with the input data 13799 * 13800 * @access public 13801 * @param string $data Input data 13802 */ 13803 function SimplePie_XML_Declaration_Parser($data) 13804 { 13805 $this->data = $data; 13806 $this->data_length = strlen($this->data); 13807 } 13808 13809 /** 13810 * Parse the input data 13811 * 13812 * @access public 13813 * @return bool true on success, false on failure 13814 */ 13815 function parse() 13816 { 13817 while ($this->state && $this->state !== 'emit' && $this->has_data()) 13818 { 13819 $state = $this->state; 13820 $this->$state(); 13821 } 13822 $this->data = ''; 13823 if ($this->state === 'emit') 13824 { 13825 return true; 13826 } 13827 else 13828 { 13829 $this->version = ''; 13830 $this->encoding = ''; 13831 $this->standalone = ''; 13832 return false; 13833 } 13834 } 13835 13836 /** 13837 * Check whether there is data beyond the pointer 13838 * 13839 * @access private 13840 * @return bool true if there is further data, false if not 13841 */ 13842 function has_data() 13843 { 13844 return (bool) ($this->position < $this->data_length); 13845 } 13846 13847 /** 13848 * Advance past any whitespace 13849 * 13850 * @return int Number of whitespace characters passed 13851 */ 13852 function skip_whitespace() 13853 { 13854 $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position); 13855 $this->position += $whitespace; 13856 return $whitespace; 13857 } 13858 13859 /** 13860 * Read value 13861 */ 13862 function get_value() 13863 { 13864 $quote = substr($this->data, $this->position, 1); 13865 if ($quote === '"' || $quote === "'") 13866 { 13867 $this->position++; 13868 $len = strcspn($this->data, $quote, $this->position); 13869 if ($this->has_data()) 13870 { 13871 $value = substr($this->data, $this->position, $len); 13872 $this->position += $len + 1; 13873 return $value; 13874 } 13875 } 13876 return false; 13877 } 13878 13879 function before_version_name() 13880 { 13881 if ($this->skip_whitespace()) 13882 { 13883 $this->state = 'version_name'; 13884 } 13885 else 13886 { 13887 $this->state = false; 13888 } 13889 } 13890 13891 function version_name() 13892 { 13893 if (substr($this->data, $this->position, 7) === 'version') 13894 { 13895 $this->position += 7; 13896 $this->skip_whitespace(); 13897 $this->state = 'version_equals'; 13898 } 13899 else 13900 { 13901 $this->state = false; 13902 } 13903 } 13904 13905 function version_equals() 13906 { 13907 if (substr($this->data, $this->position, 1) === '=') 13908 { 13909 $this->position++; 13910 $this->skip_whitespace(); 13911 $this->state = 'version_value'; 13912 } 13913 else 13914 { 13915 $this->state = false; 13916 } 13917 } 13918 13919 function version_value() 13920 { 13921 if ($this->version = $this->get_value()) 13922 { 13923 $this->skip_whitespace(); 13924 if ($this->has_data()) 13925 { 13926 $this->state = 'encoding_name'; 13927 } 13928 else 13929 { 13930 $this->state = 'emit'; 13931 } 13932 } 13933 else 13934 { 13935 $this->state = 'standalone_name'; 13936 } 13937 } 13938 13939 function encoding_name() 13940 { 13941 if (substr($this->data, $this->position, 8) === 'encoding') 13942 { 13943 $this->position += 8; 13944 $this->skip_whitespace(); 13945 $this->state = 'encoding_equals'; 13946 } 13947 else 13948 { 13949 $this->state = false; 13950 } 13951 } 13952 13953 function encoding_equals() 13954 { 13955 if (substr($this->data, $this->position, 1) === '=') 13956 { 13957 $this->position++; 13958 $this->skip_whitespace(); 13959 $this->state = 'encoding_value'; 13960 } 13961 else 13962 { 13963 $this->state = false; 13964 } 13965 } 13966 13967 function encoding_value() 13968 { 13969 if ($this->encoding = $this->get_value()) 13970 { 13971 $this->skip_whitespace(); 13972 if ($this->has_data()) 13973 { 13974 $this->state = 'standalone_name'; 13975 } 13976 else 13977 { 13978 $this->state = 'emit'; 13979 } 13980 } 13981 else 13982 { 13983 $this->state = false; 13984 } 13985 } 13986 13987 function standalone_name() 13988 { 13989 if (substr($this->data, $this->position, 10) === 'standalone') 13990 { 13991 $this->position += 10; 13992 $this->skip_whitespace(); 13993 $this->state = 'standalone_equals'; 13994 } 13995 else 13996 { 13997 $this->state = false; 13998 } 13999 } 14000 14001 function standalone_equals() 14002 { 14003 if (substr($this->data, $this->position, 1) === '=') 14004 { 14005 $this->position++; 14006 $this->skip_whitespace(); 14007 $this->state = 'standalone_value'; 14008 } 14009 else 14010 { 14011 $this->state = false; 14012 } 14013 } 14014 14015 function standalone_value() 14016 { 14017 if ($standalone = $this->get_value()) 14018 { 14019 switch ($standalone) 14020 { 14021 case 'yes': 14022 $this->standalone = true; 14023 break; 14024 14025 case 'no': 14026 $this->standalone = false; 14027 break; 14028 14029 default: 14030 $this->state = false; 14031 return; 14032 } 14033 14034 $this->skip_whitespace(); 14035 if ($this->has_data()) 14036 { 14037 $this->state = false; 14038 } 14039 else 14040 { 14041 $this->state = 'emit'; 14042 } 14043 } 14044 else 14045 { 14046 $this->state = false; 14047 } 14048 } 14049 } 14050 14051 class SimplePie_Locator 14052 { 14053 var $useragent; 14054 var $timeout; 14055 var $file; 14056 var $local = array(); 14057 var $elsewhere = array(); 14058 var $file_class = 'SimplePie_File'; 14059 var $cached_entities = array(); 14060 var $http_base; 14061 var $base; 14062 var $base_location = 0; 14063 var $checked_feeds = 0; 14064 var $max_checked_feeds = 10; 14065 var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer'; 14066 14067 function SimplePie_Locator(&$file, $timeout = 10, $useragent = null, $file_class = 'SimplePie_File', $max_checked_feeds = 10, $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer') 14068 { 14069 $this->file =& $file; 14070 $this->file_class = $file_class; 14071 $this->useragent = $useragent; 14072 $this->timeout = $timeout; 14073 $this->max_checked_feeds = $max_checked_feeds; 14074 $this->content_type_sniffer_class = $content_type_sniffer_class; 14075 } 14076 14077 function find($type = SIMPLEPIE_LOCATOR_ALL, &$working) 14078 { 14079 if ($this->is_feed($this->file)) 14080 { 14081 return $this->file; 14082 } 14083 14084 if ($this->file->method & SIMPLEPIE_FILE_SOURCE_REMOTE) 14085 { 14086 $sniffer =& new $this->content_type_sniffer_class($this->file); 14087 if ($sniffer->get_type() !== 'text/html') 14088 { 14089 return null; 14090 } 14091 } 14092 14093 if ($type & ~SIMPLEPIE_LOCATOR_NONE) 14094 { 14095 $this->get_base(); 14096 } 14097 14098 if ($type & SIMPLEPIE_LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery()) 14099 { 14100 return $working[0]; 14101 } 14102 14103 if ($type & (SIMPLEPIE_LOCATOR_LOCAL_EXTENSION | SIMPLEPIE_LOCATOR_LOCAL_BODY | SIMPLEPIE_LOCATOR_REMOTE_EXTENSION | SIMPLEPIE_LOCATOR_REMOTE_BODY) && $this->get_links()) 14104 { 14105 if ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local)) 14106 { 14107 return $working; 14108 } 14109 14110 if ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local)) 14111 { 14112 return $working; 14113 } 14114 14115 if ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere)) 14116 { 14117 return $working; 14118 } 14119 14120 if ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere)) 14121 { 14122 return $working; 14123 } 14124 } 14125 return null; 14126 } 14127 14128 function is_feed(&$file) 14129 { 14130 if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE) 14131 { 14132 $sniffer =& new $this->content_type_sniffer_class($file); 14133 $sniffed = $sniffer->get_type(); 14134 if (in_array($sniffed, array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml'))) 14135 { 14136 return true; 14137 } 14138 else 14139 { 14140 return false; 14141 } 14142 } 14143 elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL) 14144 { 14145 return true; 14146 } 14147 else 14148 { 14149 return false; 14150 } 14151 } 14152 14153 function get_base() 14154 { 14155 $this->http_base = $this->file->url; 14156 $this->base = $this->http_base; 14157 $elements = SimplePie_Misc::get_element('base', $this->file->body); 14158 foreach ($elements as $element) 14159 { 14160 if ($element['attribs']['href']['data'] !== '') 14161 { 14162 $this->base = SimplePie_Misc::absolutize_url(trim($element['attribs']['href']['data']), $this->http_base); 14163 $this->base_location = $element['offset']; 14164 break; 14165 } 14166 } 14167 } 14168 14169 function autodiscovery() 14170 { 14171 $links = array_merge(SimplePie_Misc::get_element('link', $this->file->body), SimplePie_Misc::get_element('a', $this->file->body), SimplePie_Misc::get_element('area', $this->file->body)); 14172 $done = array(); 14173 $feeds = array(); 14174 foreach ($links as $link) 14175 { 14176 if ($this->checked_feeds === $this->max_checked_feeds) 14177 { 14178 break; 14179 } 14180 if (isset($link['attribs']['href']['data']) && isset($link['attribs']['rel']['data'])) 14181 { 14182 $rel = array_unique(SimplePie_Misc::space_seperated_tokens(strtolower($link['attribs']['rel']['data']))); 14183 14184 if ($this->base_location < $link['offset']) 14185 { 14186 $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->base); 14187 } 14188 else 14189 { 14190 $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->http_base); 14191 } 14192 14193 if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !empty($link['attribs']['type']['data']) && in_array(strtolower(SimplePie_Misc::parse_mime($link['attribs']['type']['data'])), array('application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href])) 14194 { 14195 $this->checked_feeds++; 14196 $feed =& new $this->file_class($href, $this->timeout, 5, null, $this->useragent); 14197 if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) 14198 { 14199 $feeds[$href] = $feed; 14200 } 14201 } 14202 $done[] = $href; 14203 } 14204 } 14205 14206 if (!empty($feeds)) 14207 { 14208 return array_values($feeds); 14209 } 14210 else { 14211 return null; 14212 } 14213 } 14214 14215 function get_links() 14216 { 14217 $links = SimplePie_Misc::get_element('a', $this->file->body); 14218 foreach ($links as $link) 14219 { 14220 if (isset($link['attribs']['href']['data'])) 14221 { 14222 $href = trim($link['attribs']['href']['data']); 14223 $parsed = SimplePie_Misc::parse_url($href); 14224 if ($parsed['scheme'] === '' || preg_match('/^(http(s)|feed)?$/i', $parsed['scheme'])) 14225 { 14226 if ($this->base_location < $link['offset']) 14227 { 14228 $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->base); 14229 } 14230 else 14231 { 14232 $href = SimplePie_Misc::absolutize_url(trim($link['attribs']['href']['data']), $this->http_base); 14233 } 14234 14235 $current = SimplePie_Misc::parse_url($this->file->url); 14236 14237 if ($parsed['authority'] === '' || $parsed['authority'] === $current['authority']) 14238 { 14239 $this->local[] = $href; 14240 } 14241 else 14242 { 14243 $this->elsewhere[] = $href; 14244 } 14245 } 14246 } 14247 } 14248 $this->local = array_unique($this->local); 14249 $this->elsewhere = array_unique($this->elsewhere); 14250 if (!empty($this->local) || !empty($this->elsewhere)) 14251 { 14252 return true; 14253 } 14254 return null; 14255 } 14256 14257 function extension(&$array) 14258 { 14259 foreach ($array as $key => $value) 14260 { 14261 if ($this->checked_feeds === $this->max_checked_feeds) 14262 { 14263 break; 14264 } 14265 if (in_array(strtolower(strrchr($value, '.')), array('.rss', '.rdf', '.atom', '.xml'))) 14266 { 14267 $this->checked_feeds++; 14268 $feed =& new $this->file_class($value, $this->timeout, 5, null, $this->useragent); 14269 if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) 14270 { 14271 return $feed; 14272 } 14273 else 14274 { 14275 unset($array[$key]); 14276 } 14277 } 14278 } 14279 return null; 14280 } 14281 14282 function body(&$array) 14283 { 14284 foreach ($array as $key => $value) 14285 { 14286 if ($this->checked_feeds === $this->max_checked_feeds) 14287 { 14288 break; 14289 } 14290 if (preg_match('/(rss|rdf|atom|xml)/i', $value)) 14291 { 14292 $this->checked_feeds++; 14293 $feed =& new $this->file_class($value, $this->timeout, 5, null, $this->useragent); 14294 if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) 14295 { 14296 return $feed; 14297 } 14298 else 14299 { 14300 unset($array[$key]); 14301 } 14302 } 14303 } 14304 return null; 14305 } 14306 } 14307 14308 class SimplePie_Parser 14309 { 14310 var $error_code; 14311 var $error_string; 14312 var $current_line; 14313 var $current_column; 14314 var $current_byte; 14315 var $separator = ' '; 14316 var $namespace = array(''); 14317 var $element = array(''); 14318 var $xml_base = array(''); 14319 var $xml_base_explicit = array(false); 14320 var $xml_lang = array(''); 14321 var $data = array(); 14322 var $datas = array(array()); 14323 var $current_xhtml_construct = -1; 14324 var $encoding; 14325 14326 function parse(&$data, $encoding) 14327 { 14328 // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character 14329 if (strtoupper($encoding) === 'US-ASCII') 14330 { 14331 $this->encoding = 'UTF-8'; 14332 } 14333 else 14334 { 14335 $this->encoding = $encoding; 14336 } 14337 14338 // Strip BOM: 14339 // UTF-32 Big Endian BOM 14340 if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") 14341 { 14342 $data = substr($data, 4); 14343 } 14344 // UTF-32 Little Endian BOM 14345 elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") 14346 { 14347 $data = substr($data, 4); 14348 } 14349 // UTF-16 Big Endian BOM 14350 elseif (substr($data, 0, 2) === "\xFE\xFF") 14351 { 14352 $data = substr($data, 2); 14353 } 14354 // UTF-16 Little Endian BOM 14355 elseif (substr($data, 0, 2) === "\xFF\xFE") 14356 { 14357 $data = substr($data, 2); 14358 } 14359 // UTF-8 BOM 14360 elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") 14361 { 14362 $data = substr($data, 3); 14363 } 14364 14365 if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false) 14366 { 14367 $declaration =& new SimplePie_XML_Declaration_Parser(substr($data, 5, $pos - 5)); 14368 if ($declaration->parse()) 14369 { 14370 $data = substr($data, $pos + 2); 14371 $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' . $data; 14372 } 14373 else 14374 { 14375 $this->error_string = 'SimplePie bug! Please report this!'; 14376 return false; 14377 } 14378 } 14379 14380 $return = true; 14381 14382 static $xml_is_sane = null; 14383 if ($xml_is_sane === null) 14384 { 14385 $parser_check = xml_parser_create(); 14386 xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); 14387 xml_parser_free($parser_check); 14388 $xml_is_sane = isset($values[0]['value']); 14389 } 14390 14391 // Create the parser 14392 if ($xml_is_sane) 14393 { 14394 $xml = xml_parser_create_ns($this->encoding, $this->separator); 14395 xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1); 14396 xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0); 14397 xml_set_object($xml, $this); 14398 xml_set_character_data_handler($xml, 'cdata'); 14399 xml_set_element_handler($xml, 'tag_open', 'tag_close'); 14400 14401 // Parse! 14402 if (!xml_parse($xml, $data, true)) 14403 { 14404 $this->error_code = xml_get_error_code($xml); 14405 $this->error_string = xml_error_string($this->error_code); 14406 $return = false; 14407 } 14408 $this->current_line = xml_get_current_line_number($xml); 14409 $this->current_column = xml_get_current_column_number($xml); 14410 $this->current_byte = xml_get_current_byte_index($xml); 14411 xml_parser_free($xml); 14412 return $return; 14413 } 14414 else 14415 { 14416 libxml_clear_errors(); 14417 $xml =& new XMLReader(); 14418 $xml->xml($data); 14419 while (@$xml->read()) 14420 { 14421 switch ($xml->nodeType) 14422 { 14423 14424 case constant('XMLReader::END_ELEMENT'): 14425 if ($xml->namespaceURI !== '') 14426 { 14427 $tagName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}"; 14428 } 14429 else 14430 { 14431 $tagName = $xml->localName; 14432 } 14433 $this->tag_close(null, $tagName); 14434 break; 14435 case constant('XMLReader::ELEMENT'): 14436 $empty = $xml->isEmptyElement; 14437 if ($xml->namespaceURI !== '') 14438 { 14439 $tagName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}"; 14440 } 14441 else 14442 { 14443 $tagName = $xml->localName; 14444 } 14445 $attributes = array(); 14446 while ($xml->moveToNextAttribute()) 14447 { 14448 if ($xml->namespaceURI !== '') 14449 { 14450 $attrName = "{$xml->namespaceURI}{$this->separator}{$xml->localName}"; 14451 } 14452 else 14453 { 14454 $attrName = $xml->localName; 14455 } 14456 $attributes[$attrName] = $xml->value; 14457 } 14458 $this->tag_open(null, $tagName, $attributes); 14459 if ($empty) 14460 { 14461 $this->tag_close(null, $tagName); 14462 } 14463 break; 14464 case constant('XMLReader::TEXT'): 14465 14466 case constant('XMLReader::CDATA'): 14467 $this->cdata(null, $xml->value); 14468 break; 14469 } 14470 } 14471 if ($error = libxml_get_last_error()) 14472 { 14473 $this->error_code = $error->code; 14474 $this->error_string = $error->message; 14475 $this->current_line = $error->line; 14476 $this->current_column = $error->column; 14477 return false; 14478 } 14479 else 14480 { 14481 return true; 14482 } 14483 } 14484 } 14485 14486 function get_error_code() 14487 { 14488 return $this->error_code; 14489 } 14490 14491 function get_error_string() 14492 { 14493 return $this->error_string; 14494 } 14495 14496 function get_current_line() 14497 { 14498 return $this->current_line; 14499 } 14500 14501 function get_current_column() 14502 { 14503 return $this->current_column; 14504 } 14505 14506 function get_current_byte() 14507 { 14508 return $this->current_byte; 14509 } 14510 14511 function get_data() 14512 { 14513 return $this->data; 14514 } 14515 14516 function tag_open($parser, $tag, $attributes) 14517 { 14518 list($this->namespace[], $this->element[]) = $this->split_ns($tag); 14519 14520 $attribs = array(); 14521 foreach ($attributes as $name => $value) 14522 { 14523 list($attrib_namespace, $attribute) = $this->split_ns($name); 14524 $attribs[$attrib_namespace][$attribute] = $value; 14525 } 14526 14527 if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['base'])) 14528 { 14529 $this->xml_base[] = SimplePie_Misc::absolutize_url($attribs[SIMPLEPIE_NAMESPACE_XML]['base'], end($this->xml_base)); 14530 $this->xml_base_explicit[] = true; 14531 } 14532 else 14533 { 14534 $this->xml_base[] = end($this->xml_base); 14535 $this->xml_base_explicit[] = end($this->xml_base_explicit); 14536 } 14537 14538 if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['lang'])) 14539 { 14540 $this->xml_lang[] = $attribs[SIMPLEPIE_NAMESPACE_XML]['lang']; 14541 } 14542 else 14543 { 14544 $this->xml_lang[] = end($this->xml_lang); 14545 } 14546 14547 if ($this->current_xhtml_construct >= 0) 14548 { 14549 $this->current_xhtml_construct++; 14550 if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML) 14551 { 14552 $this->data['data'] .= '<' . end($this->element); 14553 if (isset($attribs[''])) 14554 { 14555 foreach ($attribs[''] as $name => $value) 14556 { 14557 $this->data['data'] .= ' ' . $name . '="' . htmlspecialchars($value, ENT_COMPAT, $this->encoding) . '"'; 14558 } 14559 } 14560 $this->data['data'] .= '>'; 14561 } 14562 } 14563 else 14564 { 14565 $this->datas[] =& $this->data; 14566 $this->data =& $this->data['child'][end($this->namespace)][end($this->element)][]; 14567 $this->data = array('data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang)); 14568 if ((end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] === 'xml') 14569 || (end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] === 'xhtml')) 14570 { 14571 $this->current_xhtml_construct = 0; 14572 } 14573 } 14574 } 14575 14576 function cdata($parser, $cdata) 14577 { 14578 if ($this->current_xhtml_construct >= 0) 14579 { 14580 $this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding); 14581 } 14582 else 14583 { 14584 $this->data['data'] .= $cdata; 14585 } 14586 } 14587 14588 function tag_close($parser, $tag) 14589 { 14590 if ($this->current_xhtml_construct >= 0) 14591 { 14592 $this->current_xhtml_construct--; 14593 if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param'))) 14594 { 14595 $this->data['data'] .= '</' . end($this->element) . '>'; 14596 } 14597 } 14598 if ($this->current_xhtml_construct === -1) 14599 { 14600 $this->data =& $this->datas[count($this->datas) - 1]; 14601 array_pop($this->datas); 14602 } 14603 14604 array_pop($this->element); 14605 array_pop($this->namespace); 14606 array_pop($this->xml_base); 14607 array_pop($this->xml_base_explicit); 14608 array_pop($this->xml_lang); 14609 } 14610 14611 function split_ns($string) 14612 { 14613 static $cache = array(); 14614 if (!isset($cache[$string])) 14615 { 14616 if ($pos = strpos($string, $this->separator)) 14617 { 14618 static $separator_length; 14619 if (!$separator_length) 14620 { 14621 $separator_length = strlen($this->separator); 14622 } 14623 $namespace = substr($string, 0, $pos); 14624 $local_name = substr($string, $pos + $separator_length); 14625 if (strtolower($namespace) === SIMPLEPIE_NAMESPACE_ITUNES) 14626 { 14627 $namespace = SIMPLEPIE_NAMESPACE_ITUNES; 14628 } 14629 14630 // Normalize the Media RSS namespaces 14631 if ($namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG) 14632 { 14633 $namespace = SIMPLEPIE_NAMESPACE_MEDIARSS; 14634 } 14635 $cache[$string] = array($namespace, $local_name); 14636 } 14637 else 14638 { 14639 $cache[$string] = array('', $string); 14640 } 14641 } 14642 return $cache[$string]; 14643 } 14644 } 14645 14646 /** 14647 * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shorten a string while preserving HTML tags 14648 */ 14649 class SimplePie_Sanitize 14650 { 14651 // Private vars 14652 var $base; 14653 14654 // Options 14655 var $remove_div = true; 14656 var $image_handler = ''; 14657 var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'); 14658 var $encode_instead_of_strip = false; 14659 var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'); 14660 var $strip_comments = false; 14661 var $output_encoding = 'UTF-8'; 14662 var $enable_cache = true; 14663 var $cache_location = './cache'; 14664 var $cache_name_function = 'md5'; 14665 var $cache_class = 'SimplePie_Cache'; 14666 var $file_class = 'SimplePie_File'; 14667 var $timeout = 10; 14668 var $useragent = ''; 14669 var $force_fsockopen = false; 14670 14671 var $replace_url_attributes = array( 14672 'a' => 'href', 14673 'area' => 'href', 14674 'blockquote' => 'cite', 14675 'del' => 'cite', 14676 'form' => 'action', 14677 'img' => array('longdesc', 'src'), 14678 'input' => 'src', 14679 'ins' => 'cite', 14680 'q' => 'cite' 14681 ); 14682 14683 function remove_div($enable = true) 14684 { 14685 $this->remove_div = (bool) $enable; 14686 } 14687 14688 function set_image_handler($page = false) 14689 { 14690 if ($page) 14691 { 14692 $this->image_handler = (string) $page; 14693 } 14694 else 14695 { 14696 $this->image_handler = false; 14697 } 14698 } 14699 14700 function pass_cache_data($enable_cache = true, $cache_location = './cache', $cache_name_function = 'md5', $cache_class = 'SimplePie_Cache') 14701 { 14702 if (isset($enable_cache)) 14703 { 14704 $this->enable_cache = (bool) $enable_cache; 14705 } 14706 14707 if ($cache_location) 14708 { 14709 $this->cache_location = (string) $cache_location; 14710 } 14711 14712 if ($cache_name_function) 14713 { 14714 $this->cache_name_function = (string) $cache_name_function; 14715 } 14716 14717 if ($cache_class) 14718 { 14719 $this->cache_class = (string) $cache_class; 14720 } 14721 } 14722 14723 function pass_file_data($file_class = 'SimplePie_File', $timeout = 10, $useragent = '', $force_fsockopen = false) 14724 { 14725 if ($file_class) 14726 { 14727 $this->file_class = (string) $file_class; 14728 } 14729 14730 if ($timeout) 14731 { 14732 $this->timeout = (string) $timeout; 14733 } 14734 14735 if ($useragent) 14736 { 14737 $this->useragent = (string) $useragent; 14738 } 14739 14740 if ($force_fsockopen) 14741 { 14742 $this->force_fsockopen = (string) $force_fsockopen; 14743 } 14744 } 14745 14746 function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style')) 14747 { 14748 if ($tags) 14749 { 14750 if (is_array($tags)) 14751 { 14752 $this->strip_htmltags = $tags; 14753 } 14754 else 14755 { 14756 $this->strip_htmltags = explode(',', $tags); 14757 } 14758 } 14759 else 14760 { 14761 $this->strip_htmltags = false; 14762 } 14763 } 14764 14765 function encode_instead_of_strip($encode = false) 14766 { 14767 $this->encode_instead_of_strip = (bool) $encode; 14768 } 14769 14770 function strip_attributes($attribs = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc')) 14771 { 14772 if ($attribs) 14773 { 14774 if (is_array($attribs)) 14775 { 14776 $this->strip_attributes = $attribs; 14777 } 14778 else 14779 { 14780 $this->strip_attributes = explode(',', $attribs); 14781 } 14782 } 14783 else 14784 { 14785 $this->strip_attributes = false; 14786 } 14787 } 14788 14789 function strip_comments($strip = false) 14790 { 14791 $this->strip_comments = (bool) $strip; 14792 } 14793 14794 function set_output_encoding($encoding = 'UTF-8') 14795 { 14796 $this->output_encoding = (string) $encoding; 14797 } 14798 14799 /** 14800 * Set element/attribute key/value pairs of HTML attributes 14801 * containing URLs that need to be resolved relative to the feed 14802 * 14803 * @access public 14804 * @since 1.0 14805 * @param array $element_attribute Element/attribute key/value pairs 14806 */ 14807 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')) 14808 { 14809 $this->replace_url_attributes = (array) $element_attribute; 14810 } 14811 14812 function sanitize($data, $type, $base = '') 14813 { 14814 $data = trim($data); 14815 if ($data !== '' || $type & SIMPLEPIE_CONSTRUCT_IRI) 14816 { 14817 if ($type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML) 14818 { 14819 if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data)) 14820 { 14821 $type |= SIMPLEPIE_CONSTRUCT_HTML; 14822 } 14823 else 14824 { 14825 $type |= SIMPLEPIE_CONSTRUCT_TEXT; 14826 } 14827 } 14828 14829 if ($type & SIMPLEPIE_CONSTRUCT_BASE64) 14830 { 14831 $data = base64_decode($data); 14832 } 14833 14834 if ($type & SIMPLEPIE_CONSTRUCT_XHTML) 14835 { 14836 if ($this->remove_div) 14837 { 14838 $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '', $data); 14839 $data = preg_replace('/<\/div>$/', '', $data); 14840 } 14841 else 14842 { 14843 $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '<div>', $data); 14844 } 14845 } 14846 14847 if ($type & (SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML)) 14848 { 14849 // Strip comments 14850 if ($this->strip_comments) 14851 { 14852 $data = SimplePie_Misc::strip_comments($data); 14853 } 14854 14855 // Strip out HTML tags and attributes that might cause various security problems. 14856 // Based on recommendations by Mark Pilgrim at: 14857 // http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely 14858 if ($this->strip_htmltags) 14859 { 14860 foreach ($this->strip_htmltags as $tag) 14861 { 14862 $pcre = "/<($tag)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$tag" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>|(\/)?>)/siU'; 14863 while (preg_match($pcre, $data)) 14864 { 14865 $data = preg_replace_callback($pcre, array(&$this, 'do_strip_htmltags'), $data); 14866 } 14867 } 14868 } 14869 14870 if ($this->strip_attributes) 14871 { 14872 foreach ($this->strip_attributes as $attrib) 14873 { 14874 $data = preg_replace('/(<[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*)' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . trim($attrib) . '(?:\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>/', '\1\2\3>', $data); 14875 } 14876 } 14877 14878 // Replace relative URLs 14879 $this->base = $base; 14880 foreach ($this->replace_url_attributes as $element => $attributes) 14881 { 14882 $data = $this->replace_urls($data, $element, $attributes); 14883 } 14884 14885 // If image handling (caching, etc.) is enabled, cache and rewrite all the image tags. 14886 if (isset($this->image_handler) && ((string) $this->image_handler) !== '' && $this->enable_cache) 14887 { 14888 $images = SimplePie_Misc::get_element('img', $data); 14889 foreach ($images as $img) 14890 { 14891 if (isset($img['attribs']['src']['data'])) 14892 { 14893 $image_url = call_user_func($this->cache_name_function, $img['attribs']['src']['data']); 14894 $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $image_url, 'spi'); 14895 14896 if ($cache->load()) 14897 { 14898 $img['attribs']['src']['data'] = $this->image_handler . $image_url; 14899 $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data); 14900 } 14901 else 14902 { 14903 $file =& new $this->file_class($img['attribs']['src']['data'], $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen); 14904 $headers = $file->headers; 14905 14906 if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) 14907 { 14908 if ($cache->save(array('headers' => $file->headers, 'body' => $file->body))) 14909 { 14910 $img['attribs']['src']['data'] = $this->image_handler . $image_url; 14911 $data = str_replace($img['full'], SimplePie_Misc::element_implode($img), $data); 14912 } 14913 else 14914 { 14915 trigger_error("$this->cache_location is not writeable", E_USER_WARNING); 14916 } 14917 } 14918 } 14919 } 14920 } 14921 } 14922 14923 // Having (possibly) taken stuff out, there may now be whitespace at the beginning/end of the data 14924 $data = trim($data); 14925 } 14926 14927 if ($type & SIMPLEPIE_CONSTRUCT_IRI) 14928 { 14929 $data = SimplePie_Misc::absolutize_url($data, $base); 14930 } 14931 14932 if ($type & (SIMPLEPIE_CONSTRUCT_TEXT | SIMPLEPIE_CONSTRUCT_IRI)) 14933 { 14934 $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8'); 14935 } 14936 14937 if ($this->output_encoding !== 'UTF-8') 14938 { 14939 $data = SimplePie_Misc::change_encoding($data, 'UTF-8', $this->output_encoding); 14940 } 14941 } 14942 return $data; 14943 } 14944 14945 function replace_urls($data, $tag, $attributes) 14946 { 14947 if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags)) 14948 { 14949 $elements = SimplePie_Misc::get_element($tag, $data); 14950 foreach ($elements as $element) 14951 { 14952 if (is_array($attributes)) 14953 { 14954 foreach ($attributes as $attribute) 14955 { 14956 if (isset($element['attribs'][$attribute]['data'])) 14957 { 14958 $element['attribs'][$attribute]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attribute]['data'], $this->base); 14959 $new_element = SimplePie_Misc::element_implode($element); 14960 $data = str_replace($element['full'], $new_element, $data); 14961 $element['full'] = $new_element; 14962 } 14963 } 14964 } 14965 elseif (isset($element['attribs'][$attributes]['data'])) 14966 { 14967 $element['attribs'][$attributes]['data'] = SimplePie_Misc::absolutize_url($element['attribs'][$attributes]['data'], $this->base); 14968 $data = str_replace($element['full'], SimplePie_Misc::element_implode($element), $data); 14969 } 14970 } 14971 } 14972 return $data; 14973 } 14974 14975 function do_strip_htmltags($match) 14976 { 14977 if ($this->encode_instead_of_strip) 14978 { 14979 if (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style'))) 14980 { 14981 $match[1] = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8'); 14982 $match[2] = htmlspecialchars($match[2], ENT_COMPAT, 'UTF-8'); 14983 return "<$match[1]$match[2]>$match[3]</$match[1]>"; 14984 } 14985 else 14986 { 14987 return htmlspecialchars($match[0], ENT_COMPAT, 'UTF-8'); 14988 } 14989 } 14990 elseif (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style'))) 14991 { 14992 return $match[4]; 14993 } 14994 else 14995 { 14996 return ''; 14997 } 14998 } 14999 } 15000 15001 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Dec 30 05:55:15 2009 | Cross-referenced by PHPXref 0.7 |