[ Index ]

PHP Cross Reference of Joomla 1.5.26 DE

title

Body

[close]

/libraries/simplepie/ -> simplepie.php (source)

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