[ XREF Home ] [ Index ]

PHP Cross Reference of WordPress Trunk

Provided by Yoast

title

Body

[close]

/wp-includes/ -> class-simplepie.php (source)

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