ここの情報は古いです。ご理解頂いた上でお取り扱いください。

Changeset 3043


Ignore:
Timestamp:
May 19, 2007, 2:22:56 PM (13 years ago)
Author:
kunitada
Message:

MyNETS1.0.1 merge

Location:
OpenPNE/branches/kunitada/MyNETS/trunk
Files:
196 added
810 edited

Legend:

Unmodified
Added
Removed
  • OpenPNE/branches/kunitada/MyNETS/trunk/bin/config.inc.php

    r2 r3043  
    11<?php
    2 /**
     2/* ========================================================================
     3 *
     4 * @license This source file is subject to version 3.0 of the PHP license,
     5 *                      that is available at http://www.php.net/license/3_01.txt
     6 *                      If you did not receive a copy of the PHP license and are unable
     7 *                      to obtain it through the world-wide-web, please send a note to
     8 *                      license@php.net so we can mail you a copy immediately. 
     9 *
     10 * @category   Application of MyNETS
     11 * @project    OpenPNE UsagiProject 2006-2007
     12 * @package    MyNETS
     13 * @author     UsagiProject <info@usagi.mynets.jp>
     14 * @copyright  2006-2007 UsagiProject <author member ad http://usagi.mynets.jp/member.html>
     15 * @version    MyNETS,v 1.0.0
     16 * @since      File available since Release 1.0.0 Nighty
     17 * @chengelog  [2007/02/17] Ver1.1.0Nighty package
     18 * ========================================================================
     19 */
     20
     21/*
    322 * @copyright 2005-2006 OpenPNE Project
    4  * @license   http://www.php.net/license/3_01.txt PHP License 3.01
     23 * @link      http://www.tejimaya.com/openpne.shtml
    524 */
    625
  • OpenPNE/branches/kunitada/MyNETS/trunk/bin/mail.php

    r134 r3043  
    11<?php
    2 /**
     2/* ========================================================================
     3 *
     4 * @license This source file is subject to version 3.0 of the PHP license,
     5 *                      that is available at http://www.php.net/license/3_01.txt
     6 *                      If you did not receive a copy of the PHP license and are unable
     7 *                      to obtain it through the world-wide-web, please send a note to
     8 *                      license@php.net so we can mail you a copy immediately. 
     9 *
     10 * @category   Application of MyNETS
     11 * @project    OpenPNE UsagiProject 2006-2007
     12 * @package    MyNETS
     13 * @author     UsagiProject <info@usagi.mynets.jp>
     14 * @copyright  2006-2007 UsagiProject <author member ad http://usagi.mynets.jp/member.html>
     15 * @version    MyNETS,v 1.0.0
     16 * @since      File available since Release 1.0.0 Nighty
     17 * @chengelog  [2007/02/17] Ver1.1.0Nighty package
     18 * ========================================================================
     19 */
     20
     21/*
    322 * @copyright 2005-2006 OpenPNE Project
    4  * @license   http://www.php.net/license/3_01.txt PHP License 3.01
     23 * @link      http://www.tejimaya.com/openpne.shtml
    524 */
    625
  • OpenPNE/branches/kunitada/MyNETS/trunk/bin/tool_ashiato_update_log.php

    r225 r3043  
    11<?php
    2 /**
     2/* ========================================================================
     3 *
     4 * @license This source file is subject to version 3.0 of the PHP license,
     5 *                      that is available at http://www.php.net/license/3_01.txt
     6 *                      If you did not receive a copy of the PHP license and are unable
     7 *                      to obtain it through the world-wide-web, please send a note to
     8 *                      license@php.net so we can mail you a copy immediately. 
     9 *
     10 * @category   Application of MyNETS
     11 * @project    OpenPNE UsagiProject 2006-2007
     12 * @package    MyNETS
     13 * @author     UsagiProject <info@usagi.mynets.jp>
     14 * @copyright  2006-2007 UsagiProject <author member ad http://usagi.mynets.jp/member.html>
     15 * @version    MyNETS,v 1.0.0
     16 * @since      File available since Release 1.0.0 Nighty
     17 * @chengelog  [2007/02/17] Ver1.1.0Nighty package
     18 * ========================================================================
     19 */
     20
     21/*
    322 * @copyright 2005-2006 OpenPNE Project
    4  * @license   http://www.php.net/license/3_01.txt PHP License 3.01
     23 * @link      http://www.tejimaya.com/openpne.shtml
    524 */
    625
  • OpenPNE/branches/kunitada/MyNETS/trunk/bin/tool_rss_cache.php

    r134 r3043  
    11<?php
    2 /**
     2/* ========================================================================
     3 *
     4 * @license This source file is subject to version 3.0 of the PHP license,
     5 *              that is available at http://www.php.net/license/3_01.txt
     6 *              If you did not receive a copy of the PHP license and are unable
     7 *              to obtain it through the world-wide-web, please send a note to
     8 *              license@php.net so we can mail you a copy immediately. 
     9 *
     10 * @category   Application of MyNETS
     11 * @project    OpenPNE UsagiProject 2006-2007
     12 * @package    MyNETS
     13 * @author     UsagiProject <info@usagi.mynets.jp>
     14 * @copyright  2006-2007 UsagiProject <author member ad http://usagi.mynets.jp/member.html>
     15 * @version    MyNETS,v 1.0.0
     16 * @since      File available since Release 1.0.0 Nighty
     17 * @chengelog  [2007/02/17] Ver1.1.0Nighty package
     18 * ========================================================================
     19 */
     20
     21/*
    322 * @copyright 2005-2006 OpenPNE Project
    4  * @license   http://www.php.net/license/3_01.txt PHP License 3.01
     23 * @link      http://www.tejimaya.com/openpne.shtml
    524 */
    625
    726require_once './config.inc.php';
    827require_once OPENPNE_WEBAPP_DIR . '/init.inc';
     28
     29$sql = "DELETE FROM " . MYNETS_PREFIX_NAME . "c_rss_cache WHERE r_datetime < ?";
     30$datetime = date('Y-m-d 00:00:00', strtotime('-90 day'));
     31db_query($sql, array($datetime));
    932
    1033//-------------config-------------//
     
    121144    }
    122145
    123     $sql = "INSERT INTO c_rss_cache" .
     146    $sql = "INSERT INTO " . MYNETS_PREFIX_NAME . "c_rss_cache" .
    124147            "(c_member_id, subject, body, r_datetime, link, cache_date)" .
    125148        " VALUES $values_list";
     
    129152function db_c_member_list4exists_rssAc_member_id($c_member_id, $limit)
    130153{
    131     $sql = "SELECT c_member_id, rss FROM c_member" .
     154    $sql = "SELECT c_member_id, rss FROM " . MYNETS_PREFIX_NAME . "c_member" .
    132155            " WHERE rss <> '' AND c_member_id > ?" .
    133156            " ORDER BY c_member_id";
     
    138161function db_c_member_list4no_exists_rssAc_member_id($c_member_id_from, $c_member_id_to)
    139162{
    140     $sql = "SELECT c_member_id, rss FROM c_member WHERE rss = ''";
     163    $sql = "SELECT c_member_id, rss FROM " . MYNETS_PREFIX_NAME . "c_member WHERE rss = ''";
    141164    if (intval($c_member_id_from) > 0)
    142165        $sql .= " AND c_member_id > " . intval($c_member_id_from);
     
    150173function db_delete_rss_cache4c_member_list($c_member_list)
    151174{
    152     $sql = "DELETE FROM c_rss_cache WHERE c_member_id IN (0";
     175    $sql = "DELETE FROM " . MYNETS_PREFIX_NAME . "c_rss_cache WHERE c_member_id IN (0";
    153176    foreach ($c_member_list as $c_member) {
    154177        _log('delete', $c_member['c_member_id']);
  • OpenPNE/branches/kunitada/MyNETS/trunk/bin/tool_send_birthday_mail.php

    r2 r3043  
    11<?php
    2 /**
     2/* ========================================================================
     3 *
     4 * @license This source file is subject to version 3.0 of the PHP license,
     5 *                      that is available at http://www.php.net/license/3_01.txt
     6 *                      If you did not receive a copy of the PHP license and are unable
     7 *                      to obtain it through the world-wide-web, please send a note to
     8 *                      license@php.net so we can mail you a copy immediately. 
     9 *
     10 * @category   Application of MyNETS
     11 * @project    OpenPNE UsagiProject 2006-2007
     12 * @package    MyNETS
     13 * @author     UsagiProject <info@usagi.mynets.jp>
     14 * @copyright  2006-2007 UsagiProject <author member ad http://usagi.mynets.jp/member.html>
     15 * @version    MyNETS,v 1.0.0
     16 * @since      File available since Release 1.0.0 Nighty
     17 * @chengelog  [2007/02/17] Ver1.1.0Nighty package
     18 * ========================================================================
     19 */
     20
     21/*
    322 * @copyright 2005-2006 OpenPNE Project
    4  * @license   http://www.php.net/license/3_01.txt PHP License 3.01
     23 * @link      http://www.tejimaya.com/openpne.shtml
    524 */
    625
  • OpenPNE/branches/kunitada/MyNETS/trunk/bin/tool_send_dairy_news.php

    r2 r3043  
    11<?php
    2 /**
     2/* ========================================================================
     3 *
     4 * @license This source file is subject to version 3.0 of the PHP license,
     5 *                      that is available at http://www.php.net/license/3_01.txt
     6 *                      If you did not receive a copy of the PHP license and are unable
     7 *                      to obtain it through the world-wide-web, please send a note to
     8 *                      license@php.net so we can mail you a copy immediately. 
     9 *
     10 * @category   Application of MyNETS
     11 * @project    OpenPNE UsagiProject 2006-2007
     12 * @package    MyNETS
     13 * @author     UsagiProject <info@usagi.mynets.jp>
     14 * @copyright  2006-2007 UsagiProject <author member ad http://usagi.mynets.jp/member.html>
     15 * @version    MyNETS,v 1.0.0
     16 * @since      File available since Release 1.0.0 Nighty
     17 * @chengelog  [2007/02/17] Ver1.1.0Nighty package
     18 * ========================================================================
     19 */
     20
     21/*
    322 * @copyright 2005-2006 OpenPNE Project
    4  * @license   http://www.php.net/license/3_01.txt PHP License 3.01
     23 * @link      http://www.tejimaya.com/openpne.shtml
    524 */
    625
  • OpenPNE/branches/kunitada/MyNETS/trunk/bin/tool_send_mail_in_queue.php

    r275 r3043  
    11<?php
    2 /**
     2/* ========================================================================
     3 *
     4 * @license This source file is subject to version 3.0 of the PHP license,
     5 *                      that is available at http://www.php.net/license/3_01.txt
     6 *                      If you did not receive a copy of the PHP license and are unable
     7 *                      to obtain it through the world-wide-web, please send a note to
     8 *                      license@php.net so we can mail you a copy immediately. 
     9 *
     10 * @category   Application of MyNETS
     11 * @project    OpenPNE UsagiProject 2006-2007
     12 * @package    MyNETS
     13 * @author     UsagiProject <info@usagi.mynets.jp>
     14 * @copyright  2006-2007 UsagiProject <author member ad http://usagi.mynets.jp/member.html>
     15 * @version    MyNETS,v 1.0.0
     16 * @since      File available since Release 1.0.0 Nighty
     17 * @chengelog  [2007/02/17] Ver1.1.0Nighty package
     18 * ========================================================================
     19 */
     20
     21/*
    322 * @copyright 2005-2006 OpenPNE Project
    4  * @license   http://www.php.net/license/3_01.txt PHP License 3.01
     23 * @link      http://www.tejimaya.com/openpne.shtml
    524 */
    625
  • OpenPNE/branches/kunitada/MyNETS/trunk/bin/tool_send_schedule_mail.php

    r2 r3043  
    11<?php
    2 /**
     2/* ========================================================================
     3 *
     4 * @license This source file is subject to version 3.0 of the PHP license,
     5 *                      that is available at http://www.php.net/license/3_01.txt
     6 *                      If you did not receive a copy of the PHP license and are unable
     7 *                      to obtain it through the world-wide-web, please send a note to
     8 *                      license@php.net so we can mail you a copy immediately. 
     9 *
     10 * @category   Application of MyNETS
     11 * @project    OpenPNE UsagiProject 2006-2007
     12 * @package    MyNETS
     13 * @author     UsagiProject <info@usagi.mynets.jp>
     14 * @copyright  2006-2007 UsagiProject <author member ad http://usagi.mynets.jp/member.html>
     15 * @version    MyNETS,v 1.0.0
     16 * @since      File available since Release 1.0.0 Nighty
     17 * @chengelog  [2007/02/17] Ver1.1.0Nighty package
     18 * ========================================================================
     19 */
     20
     21/*
    322 * @copyright 2005-2006 OpenPNE Project
    4  * @license   http://www.php.net/license/3_01.txt PHP License 3.01
     23 * @link      http://www.tejimaya.com/openpne.shtml
    524 */
    625
  • OpenPNE/branches/kunitada/MyNETS/trunk/config.php.sample

    r831 r3043  
    11<?php
     2
     3/* ========================================================================
     4 *
     5 * @license This source file is subject to version 3.01 of the PHP license,
     6 *              that is available at http://www.php.net/license/3_01.txt
     7 *              If you did not receive a copy of the PHP license and are unable
     8 *              to obtain it through the world-wide-web, please send a note to
     9 *              license@php.net so we can mail you a copy immediately. 
     10 *
     11 * @category   Application of MyNETS
     12 * @project    OpenPNE UsagiProject 2006-2007
     13 * @package    MyNETS
     14 * @author     UsagiProject <info@usagi.mynets.jp>
     15 * @copyright  2006-2007 UsagiProject <author member ad http://usagi.mynets.jp/member.html>
     16 * @version    MyNETS,v 1.0.0
     17 * @since      File available since Release 1.0.0 Nighty
     18 * @chengelog  [2007/02/17] Ver1.1.0Nighty package
     19 * ========================================================================
     20 */
     21
     22
    223//// サーバー管理設定 ////
    324
     
    1940);
    2041
     42//MyNETSでテーブルのPREFIXを利用するかどうか
     43//define('MYNETS_PREFIX_NAME','MyNETS_');
     44define('MYNETS_PREFIX_NAME','');
     45
    2146// DB暗号化キー(56バイト以内のASCII文字列)
    2247define('ENCRYPT_KEY', '');
     
    3358// 1: on  ... エラー表示、エラーログを記録しない
    3459// 2: on  ... 1 + Smartyデバッグコンソール
    35 define('OPENPNE_DEBUGGING', 1);
     60define('OPENPNE_DEBUGGING', 0);
    3661
    3762// 無効にするモジュール
     63$GLOBALS['_OPENPNE_DISABLE_MODULES'] = array();
    3864//$GLOBALS['_OPENPNE_DISABLE_MODULES'] = array('admin', 'setup');
    3965
     
    188214
    189215///
    190 // webapp_biz ディレクトリ使用設定
    191 // PNEBIZ機能を使用する場合は
    192 // setup/sql/install/option-pnebiz-mysql4X.sqlを実行した後
    193 // USE_BIZ_DIRをtrueにしてください
    194 ///
    195 
    196 define('USE_BIZ_DIR', false);
    197 define('OPENPNE_WEBAPP_BIZ_DIR' , OPENPNE_DIR . '/webapp_biz');
    198 define('OPENPNE_MODULES_BIZ_DIR', OPENPNE_WEBAPP_BIZ_DIR . '/modules');
    199 
    200 ///
    201216// デバッグ、エラーハンドリング、ログ設定
    202217///
    203218
    204219error_reporting(E_ALL ^ E_NOTICE);
     220$GLOBALS['SMARTY'] = array();
    205221
    206222switch(OPENPNE_DEBUGGING) {
     
    211227    ini_set('display_errors', true);
    212228    ini_set('log_errors', false);
     229//  $GLOBALS['SMARTY']['autoload_filters'] = array( "pre" => array("strip"),"output"=>array("comment") );
    213230    break;
    214231// 本番運用環境
     
    218235    ini_set('log_errors', true);
    219236    ini_set('error_log', OPENPNE_VAR_DIR . '/log/php_errors.log');
     237    $GLOBALS['SMARTY']['autoload_filters'] = array( "pre" => array("strip"),"output"=>array("comment") );
    220238    break;
    221239}
     
    274292// 画像変換時に許可する解像度のリスト (幅x高さ)
    275293// (空の配列を指定すると無制限になります)
    276 $GLOBALS['_OPENPNE_IMG_ALLOWED_SIZE'] = array('76x76', '120x120', '180x180');
     294$GLOBALS['_OPENPNE_IMG_ALLOWED_SIZE'] = array('36x36', '76x76', '120x120', '180x180', '360x360');
    277295
    278296// 画像キャッシュのファイル名のprefix
     
    294312// ImageMagick のオプション(デフォルトは -resize)
    295313//define('IMGMAGICK_OPT', '-thumbnail');
     314//define('IMGMAGICK_OPT', '-deconstruct -coalesce -resize');
    296315
    297316// アップロード画像のファイルサイズ制限(KB)
     
    405424define('DISPLAY_OPENPNE_INFO', true);
    406425
    407 // OpenPNE更新情報のURL設定
    408 define('OPENPNE_INFO_URL', 'http://info.openpne.jp/rss');
     426// OpenPNE Usagi Project更新情報のURL設定
     427define('OPENPNE_INFO_URL', 'http://usagi.mynets.jp/PRESS/feed/');
    409428
    410429
    411430// 携帯版でUser-Agentのチェックをするかどうか
    412431define('CHECK_KTAI_UA', true);
    413 
    414 // コミュニティに地図を表示するかどうか
    415 define('OPENPNE_USE_COMMU_MAP', true);
    416432
    417433// メール一斉送信のメールキューの使用
     
    420436define('SEND_MAIL_QUEUE_NUM', 10);
    421437
     438/* ここからうさぎちゃん */
     439
     440// 未ログイン日数を変更(default=3)
     441//define('LASTLOGIN_DAYS', 7);
     442
     443// SKIN Folder Path
     444define('SKIN_FOLDER','default');
     445
    422446?>
  • OpenPNE/branches/kunitada/MyNETS/trunk/lib/include/Etag.php

    r2 r3043  
    11<?php
    22
    3 /** 
     3/**
    44 * Etag class
    55 *
     
    157157        }
    158158
    159         if ($this->request_headers['If-None-Match']) {
     159        if (@isset($this->request_headers['If-None-Match'])) {
    160160            // Etagによる確認
    161161            $match = $this->request_headers['If-None-Match'];
     
    166166                return true;
    167167            }
    168         } elseif ($this->request_headers['If-Modified-Since']) {
     168        } elseif (@isset($this->request_headers['If-Modified-Since'])) {
    169169            // 最終更新日時による確認
    170170            $since = $this->parse_http_date($this->request_headers['If-Modified-Since']);
  • OpenPNE/branches/kunitada/MyNETS/trunk/lib/include/PHP/Compat/Function/mime_content_type.php

    r2 r3043  
    6161}
    6262
    63 ?> 
     63?>
  • OpenPNE/branches/kunitada/MyNETS/trunk/lib/include/PNE/SimplePie.php

    r122 r3043  
    33 * @license  GNU Lesser General Public License (LGPL)
    44 * @see      simplepie.inc
     5 */
     6
     7/**
     8 * 2006-2007 UsagiProject Updated
     9 *  author member ad http://usagi.mynets.jp/member.html
     10 * Updated: 03-05-2007
     11 * Category:Application of MyNETS
     12 * Version: MyNETS 1.0.0+
    513 */
    614
     
    1523    /**
    1624     * use Snoopy instead of fopen
    17      * 
     25     *
    1826     * PHP Bug #36017 fopen() crashes PHP when opening a URL in PHP4.4.2
    1927     * @see http://bugs.php.net/bug.php?id=36017
     
    3644     * This modification supports the above format.
    3745     */
     46/*
    3847    function parse_date($date)
    3948    {
     
    5463        }
    5564    }
     65*/
    5666
    5767    /**
    5868     * is_feed
    59      * 
     69     *
    6070     * RSS/Atom feeds don't contain '<html'
    6171     * Some HTML files contain '<rdf:RDF' and don't contain '<!DOCTYPE HTML'
     
    7585        }
    7686    }
     87
     88    function check_link_elements($data, $url) {
     89        if (preg_match_all('/<link (.*)>/siU', $data, $matches)) {
     90            foreach($matches[1] as $match) {
     91                if (preg_match('/type=[\'|"](application\/rss\+xml|application\/atom\+xml|application\/rdf\+xml|application\/xml\+rss|application\/xml\+atom|application\/xml\+rdf|application\/xml|application\/x\.atom\+xml|text\/xml)[\'|"]/iU', $match, $type)) {
     92                    if (preg_match('/href=[\'|"](.*)[\'|"]/iU', $match, $href)) {
     93                        $href = SimplePie_Misc::absolutize_url($href[1], $url);
     94                        if ($this->is_feed($href)) {
     95                            return $href;
     96                        }
     97                    }
     98                }
     99            }
     100        } else return false;
     101    }
     102
    77103}
    78104
  • OpenPNE/branches/kunitada/MyNETS/trunk/lib/include/kcaptcha/util/font_preparer.php

    r227 r3043  
    4040    closedir($handle);
    4141}
    42 ?> 
     42?>
  • OpenPNE/branches/kunitada/MyNETS/trunk/lib/include/simplepie.inc

    r2 r3043  
    55Takes the hard work out of managing a complete RSS/Atom solution.
    66
    7 Version: 1.0 Beta 2
    8 Updated: 30 May 2006
     7Version: "Lemon Meringue"
     8Updated: 24 November 2006
    99Copyright: 2004-2006 Ryan Parman, Geoffrey Sneddon
    1010http://simplepie.org
     
    2020http://simplepie.org/support/
    2121
     22*****************************************************
     232006-2007 UsagiProject Updated
     24  author member ad http://usagi.mynets.jp/member.html
     25Updated: 02-23-2007
     26Category:Application of MyNETS
     27Version: MyNETS 1.0.0 02-23-2007
    2228****************************************************/
    2329
    24 class SimplePie {
    25 
    26         // SimplePie Information
    27         var $name = 'SimplePie';
    28         var $version = '1.0 Beta 2';
    29         var $build = '20060530';
    30         var $url = 'http://simplepie.org/';
    31         var $useragent;
    32         var $linkback;
    33 
    34         // Run-time Variables
    35         var $rss_url;
    36         var $encoding;
    37         var $xml_dump = false;
    38         var $caching = true;
    39         var $max_minutes = 60;
    40         var $cache_location = './cache';
    41         var $bypass_image_hotlink = 'i';
    42         var $bypass_image_hotlink_page = false;
    43         var $replace_headers = false;
    44         var $remove_div = true;
    45         var $order_by_date = true;
    46         var $strip_ads = false;
    47         var $strip_htmltags = 'blink,body,doctype,embed,font,form,frame,frameset,html,iframe,input,marquee,meta,noscript,object,param,script,style';
    48         var $strip_attributes = 'class,id,style,onclick,onmouseover,onmouseout,onfocus,onblur';
    49         var $encode_instead_of_strip = false;
    50 
    51         // RSS Auto-Discovery Variables
    52         var $parsed_url;
    53         var $local = array();
    54         var $elsewhere = array();
    55 
    56         // XML Parsing Variables
    57         var $xml;
    58         var $tagName;
    59         var $insideItem;
    60         var $insideChannel;
    61         var $insideImage;
    62         var $insideAuthor;
    63         var $itemNumber = 0;
    64         var $authorNumber = 0;
    65         var $categoryNumber = 0;
    66         var $enclosureNumber = 0;
    67         var $linkNumber = 0;
    68         var $itemLinkNumber = 0;
    69         var $data = false;
    70         var $attribs;
    71         var $xmldata;
    72         var $feed_xmlbase;
    73         var $item_xmlbase;
    74         var $xhtml_prefix;
    75 
    76 
    77 
    78 
    79         /****************************************************
    80         CONSTRUCTOR
    81         Initiates a couple of variables.  Accepts feed_url, cache_location,
    82         and cache_max_minutes.
    83         ****************************************************/
    84         function SimplePie($feed_url = null, $cache_location = null, $cache_max_minutes = null) {
    85                 $this->useragent = $this->name . '/' . $this->version . ' (Feed Parser; ' . $this->url . '; Allow like Gecko) Build/' . $this->build;
    86                 $this->linkback = '<a href="' . $this->url . '" title="' . $this->name . ' ' . $this->version . '">' . $this->name . '</a>';
    87                
    88                 if (!is_null($feed_url)) {
    89                         $this->feed_url($feed_url);
    90                 }
    91 
    92                 if (!is_null($cache_location)) {
    93                         $this->cache_location($cache_location);
    94                 }
    95 
    96                 if (!is_null($cache_max_minutes)) {
    97                         $this->cache_max_minutes($cache_max_minutes);
    98                 }
    99 
    100                 if (!is_null($feed_url)) {
    101                         return $this->init();
    102                 }
    103 
    104                 // If we've passed an xmldump variable in the URL, snap into XMLdump mode
    105                 if (isset($_GET['xmldump'])) {
    106                         $this->enable_xmldump($_GET['xmldump']);
    107                 }
    108         }
    109 
    110 
    111 
    112 
    113         /****************************************************
    114         CONFIGURE OPTIONS
    115         Set various options (feed URL, XML dump, caching, etc.)
    116         ****************************************************/
    117         // Feed URL
    118         function feed_url($url) {
    119                 $url = $this->fix_protocol($url, 1);
    120                 $this->rss_url = $url;
    121                 return true;
    122         }
    123 
    124         // XML Dump
    125         function enable_xmldump($enable) {
    126                 $this->xml_dump = (bool) $enable;
    127                 return true;
    128         }
    129 
    130         // Bypass Image Hotlink
    131         function bypass_image_hotlink($getvar='i') {
    132                 $this->bypass_image_hotlink = (string) $getvar;
    133                 return true;
    134         }
    135 
    136         // Bypass Image Hotlink Page
    137         function bypass_image_hotlink_page($page = false) {
    138                 $this->bypass_image_hotlink_page = (string) $page;
    139                 return true;
    140         }
    141 
    142         // Caching
    143         function enable_caching($enable) {
    144                 $this->caching = (bool) $enable;
    145                 return true;
    146         }
    147 
    148         // Cache Timeout
    149         function cache_max_minutes($minutes) {
    150                 $this->max_minutes = (int) $minutes;
    151                 return true;
    152         }
    153 
    154         // Cache Location
    155         function cache_location($location) {
    156                 $this->cache_location = (string) $location;
    157                 return true;
    158         }
    159 
    160         // Replace H1, H2, and H3 tags with the less important H4 tags.
    161         function replace_headers($enable) {
    162                 $this->replace_headers = (bool) $enable;
    163                 return true;
    164         }
    165        
    166         // Remove outer div in XHTML content within Atom
    167         function remove_div($enable) {
    168                 $this->remove_div = (bool) $enable;
    169                 return true;
    170         }
    171        
    172         // Order the items by date
    173         function order_by_date($enable) {
    174                 $this->order_by_date = (bool) $enable;
    175                 return true;
    176         }
    177        
    178         // Strip out certain well-known ads
    179         function strip_ads($enable) {
    180                 $this->strip_ads = (bool) $enable;
    181                 return true;
    182         }
    183        
    184         // Strip out potentially dangerous tags
    185         function strip_htmltags($tags, $encode=false) {
    186                 $this->strip_htmltags = (string) $tags;
    187                 $this->encode_instead_of_strip = (bool) $encode;
    188                 return true;
    189         }
    190        
    191         // Encode dangerous tags instead of stripping them
    192         function encode_instead_of_strip($encode=true) {
    193                 $this->encode_instead_of_strip = (bool) $encode;
    194                 return true;
    195         }
    196 
    197         // Strip out potentially dangerous attributes
    198         function strip_attributes($attrib) {
    199                 $this->strip_attributes = (string) $attrib;
    200                 return true;
    201         }
    202 
    203 
    204 
    205 
    206         /****************************************************
    207         MAIN INITIALIZATION FUNCTION
    208         Rewrites the feed so that it actually resembles XML, processes the XML,
    209         and builds an array from the feed.
    210         ****************************************************/
    211         function init() {
    212                 // If Bypass Image Hotlink is enabled, send image to the page and quit.
    213                 if ($this->bypass_image_hotlink) {
    214                         if (isset($_GET[$this->bypass_image_hotlink]) && !empty($_GET[$this->bypass_image_hotlink])) {
    215                                 $this->display_image($_GET[$this->bypass_image_hotlink]);
    216                                 exit;
    217                         }
    218                 }
    219 
    220                 // If Bypass Image Hotlink is enabled, send image to the page and quit.
    221                 if (isset($_GET['js'])) {
    222 
    223                         // JavaScript for the Odeo Player
    224                         $embed='';
    225                         $embed.='function embed_odeo(link) {';
    226                         $embed.='document.writeln(\'';
    227                         $embed.='<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
    228                         $embed.='    codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" ';
    229                         $embed.='    width="440" ';
    230                         $embed.='    height="80" ';
    231                         $embed.='    align="middle">';
    232                         $embed.='<param name="movie" value="http://odeo.com/flash/audio_player_fullsize.swf" />';
    233                         $embed.='<param name="allowScriptAccess" value="any" />';
    234                         $embed.='<param name="quality" value="high">';
    235                         $embed.='<param name="wmode" value="transparent">';
    236                         $embed.='<param name="flashvars" value="valid_sample_rate=true&external_url=\'+link+\'" />';
    237                         $embed.='<embed src="http://odeo.com/flash/audio_player_fullsize.swf" ';
    238                         $embed.='    pluginspage="http://www.macromedia.com/go/getflashplayer" ';
    239                         $embed.='    type="application/x-shockwave-flash" ';
    240                         $embed.='    quality="high" ';
    241                         $embed.='    width="440" ';
    242                         $embed.='    height="80" ';
    243                         $embed.='    wmode="transparent" ';
    244                         $embed.='    allowScriptAccess="any" ';
    245                         $embed.='    flashvars="valid_sample_rate=true&external_url=\'+link+\'">';
    246                         $embed.='</embed>';
    247                         $embed.='</object>';
    248                         $embed.='\');';
    249                         $embed.='}';
    250 
    251                         $embed.="\r\n";
    252 
    253                         $embed.='function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) {';
    254                         $embed.='document.writeln(\'';
    255                         $embed.='<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" ';
    256                         $embed.='    style="cursor:hand; cursor:pointer;" ';
    257                         $embed.='    type="\'+type+\'" ';
    258                         $embed.='    codebase="http://www.apple.com/qtactivex/qtplugin.cab" ';
    259                         $embed.='    bgcolor="\'+bgcolor+\'" ';
    260                         $embed.='    width="\'+width+\'" ';
    261                         $embed.='    height="\'+height+\'">';
    262                         $embed.='<param name="href" value="\'+link+\'" />';
    263                         $embed.='<param name="src" value="\'+placeholder+\'" />';
    264                         $embed.='<param name="autoplay" value="false" />';
    265                         $embed.='<param name="target" value="myself" />';
    266                         $embed.='<param name="controller" value="false" />';
    267                         $embed.='<param name="loop" value="\'+loop+\'" />';
    268                         $embed.='<param name="scale" value="aspect" />';
    269                         $embed.='<param name="bgcolor" value="\'+bgcolor+\'">';
    270                         $embed.='<embed type="\'+type+\'" ';
    271                         $embed.='    style="cursor:hand; cursor:pointer;" ';
    272                         $embed.='    href="\'+link+\'" ';
    273                         $embed.='    src="\'+placeholder+\'"';
    274                         $embed.='    width="\'+width+\'" ';
    275                         $embed.='    height="\'+height+\'" ';
    276                         $embed.='    autoplay="false" ';
    277                         $embed.='    target="myself" ';
    278                         $embed.='    controller="false" ';
    279                         $embed.='    loop="\'+loop+\'" ';
    280                         $embed.='    scale="aspect" ';
    281                         $embed.='    bgcolor="\'+bgcolor+\'" ';
    282                         $embed.='    pluginspage="http://www.apple.com/quicktime/download/">';
    283                         $embed.='</embed>';
    284                         $embed.='</object>';
    285                         $embed.='\');';
    286                         $embed.='}';
    287 
    288                         $embed.="\r\n";
    289 
    290                         $embed.='function embed_flash(bgcolor, width, height, link, loop, type) {';
    291                         $embed.='document.writeln(\'';
    292                         $embed.='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ';
    293                         $embed.='    codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" ';
    294                         $embed.='    bgcolor="\'+bgcolor+\'" ';
    295                         $embed.='    width="\'+width+\'" ';
    296                         $embed.='    height="\'+height+\'">';
    297                         $embed.='<param name="movie" value="\'+link+\'">';
    298                         $embed.='<param name="quality" value="high">';
    299                         $embed.='<param name="loop" value="\'+loop+\'">';
    300                         $embed.='<param name="bgcolor" value="\'+bgcolor+\'">';
    301                         $embed.='<embed src="\'+link+\'" ';
    302                         $embed.='    pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" ';
    303                         $embed.='    type="\'+type+\'" ';
    304                         $embed.='    quality="high" ';
    305                         $embed.='    width="\'+width+\'" ';
    306                         $embed.='    height="\'+height+\'" ';
    307                         $embed.='    bgcolor="\'+bgcolor+\'" ';
    308                         $embed.='    loop="\'+loop+\'">';
    309                         $embed.='</embed>';
    310                         $embed.='</object>';
    311                         $embed.='\');';
    312                         $embed.='}';
    313 
    314                         $embed.="\r\n";
    315 
    316                         $embed.='function embed_wmedia(width, height, link) {';
    317                         $embed.='document.writeln(\'';
    318                         $embed.='<object classid="CLSID:22D6F312-B0F6-11D0-94AB-0080C74C7E95"';
    319                         $embed.='    type="application/x-oleobject"';
    320                         $embed.='    width="\'+width+\'"';
    321                         $embed.='    height="\'+height+\'"';
    322                         $embed.='    standby="Loading Windows Media Player...">';
    323                         $embed.='<param name="FileName" value="\'+link+\'">';
    324                         $embed.='<param name="autosize" value="true">';
    325                         $embed.='<param name="ShowControls" value="true">';
    326                         $embed.='<param name="ShowStatusBar" value="false">';
    327                         $embed.='<param name="ShowDisplay" value="false">';
    328                         $embed.='<param name="autostart" value="false">';
    329                         $embed.='<embed type="application/x-mplayer2" ';
    330                         $embed.='    src="\'+link+\'" ';
    331                         $embed.='    autosize="1" ';
    332                         $embed.='    width="\'+width+\'" ';
    333                         $embed.='    height="\'+height+\'" ';
    334                         $embed.='    showcontrols="1" ';
    335                         $embed.='    showstatusbar="0" ';
    336                         $embed.='    showdisplay="0" ';
    337                         $embed.='    autostart="0">';
    338                         $embed.='</embed>';
    339                         $embed.='</object>';
    340                         $embed.='\');';
    341                         $embed.='}';
    342 
    343                         $embed.="\r\n";
    344 
    345                         // enable gzip compression
    346                         ob_start ("ob_gzhandler");
    347                         header("Content-type: text/javascript; charset: UTF-8");
    348                         header("Cache-Control: must-revalidate");
    349                         header("Expires: " .  gmdate("D, d M Y H:i:s", time() + 60*60*24) . " GMT");
    350                         echo $embed;
    351                         exit;
    352                 }
    353 
    354                 // If this is a .Mac Photocast, change it to the real URL.
    355                 if (stristr($this->rss_url, 'http://photocast.mac.com')) {
    356                         $this->rss_url = preg_replace('%http://photocast.mac.com%i', 'http://web.mac.com', $this->rss_url);
    357                 }
    358 
    359                 // Clear all outdated cache from the server's cache folder
    360                 $this->clear_cache($this->cache_location, $this->max_minutes);
    361 
    362                 if (!empty($this->rss_url)) {
    363                         // Read the XML file for processing.
    364                         $cache_filename = $this->cache_location . '/' . urlencode($this->rss_url) . '.spc';
    365                         if ($this->caching && !$this->xml_dump && substr($this->rss_url, 0, 7) == 'http://' && file_exists($cache_filename)) {
    366                                 if ($fp = fopen($cache_filename, 'r')) {
    367                                         $data = '';
    368                                         while (!feof($fp)) {
    369                                                 $data .= fread($fp, 2048);
    370                                         }
    371                                         fclose($fp);
    372                                         $mp_rss = unserialize($data);
    373                                         if (empty($mp_rss)) {
    374                                                 $this->caching = false;
    375                                                 return $this->init();
    376                                         } else if (isset($mp_rss['feed_url'])) {
    377                                                 $this->rss_url = $mp_rss['feed_url'];
    378                                                 return $this->init();
    379                                         } else {
    380                                                 $this->data = $mp_rss;
    381                                                 return true;
    382                                         }
    383                                 } else {
    384                                         $this->caching = false;
    385                                         return $this->init();
    386                                 }
    387                         } else {
    388                                 // Get the file
    389                                 $mp_rss = $this->get_file($this->rss_url);
    390 
    391                                 // Check if file is a feed or a webpage
    392                                 // If it's a webpage, auto-discover the feed and re-pass it to init()
    393                                 $discovery = $this->rss_locator($mp_rss, $this->rss_url);
    394                                 if ($discovery) {
    395                                         if ($discovery != $this->rss_url) {
    396                                                 $this->rss_url = $discovery;
    397                                                 if ($this->caching && substr($this->rss_url, 0, 7) == 'http://') {
    398                                                         if ($this->is_writeable_createable($cache_filename)) {
    399                                                                 $fp = fopen($cache_filename, 'w');
    400                                                                 fwrite($fp, serialize(array('feed_url' => $discovery)));
    401                                                                 fclose($fp);
    402                                                         }
    403                                                         else trigger_error("$cache_filename is not writeable", E_USER_WARNING);
    404                                                 }
    405                                                 return $this->init();
    406                                         }
    407                                 } else {
    408                                         $this->sp_error("A feed could not be found at $this->rss_url", E_USER_WARNING, __FILE__, __LINE__);
    409                                         return false;
    410                                 }
    411 
    412                                 // Trim out any whitespace at the beginning or the end of the file
    413                                 $mp_rss = trim($mp_rss);
    414 
    415                                 // Get encoding
    416                                 // Attempt to support everything from libiconv (http://www.gnu.org/software/libiconv/)
    417                                 // Support everything from mbstring (http://www.php.net/manual/en/ref.mbstring.php#mbstring.supported-encodings)
    418                                 $use_iconv = false;
    419                                 $use_mbstring = false;
    420                                 $utf8_fail = true;
    421                                 if (preg_match('/encoding=["|\'](.*)["|\']/Ui', $mp_rss, $encoding)) {
    422                                         $match = $encoding;
    423                                         switch (strtolower($encoding[1])) {
    424 
    425                                                 // 7bit
    426                                                 case '7bit':
    427                                                 case '7-bit':
    428                                                         $encoding = '7bit';
    429                                                         $use_mbstring = true;
    430                                                         break;
    431 
    432                                                 // 8bit
    433                                                 case '8bit':
    434                                                 case '8-bit':
    435                                                         $encoding = '8bit';
    436                                                         $use_mbstring = true;
    437                                                         break;
    438 
    439                                                 // ARMSCII-8
    440                                                 case 'armscii-8':
    441                                                 case 'armscii':
    442                                                         $encoding = 'ARMSCII-8';
    443                                                         $use_iconv = true;
    444                                                         break;
    445 
    446                                                 // ASCII
    447                                                 case 'us-ascii':
    448                                                 case 'ascii':
    449                                                         $encoding = 'US-ASCII';
    450                                                         $use_iconv = true;
    451                                                         $use_mbstring = true;
    452                                                         $utf8_fail = false;
    453                                                         break;
    454 
    455                                                 // BASE64
    456                                                 case 'base64':
    457                                                 case 'base-64':
    458                                                         $encoding = 'BASE64';
    459                                                         $use_mbstring = true;
    460                                                         break;
    461 
    462                                                 // Big5 - Traditional Chinese, mainly used in Taiwan
    463                                                 case 'big5':
    464                                                 case '950':
    465                                                         $encoding = 'BIG5';
    466                                                         $use_iconv = true;
    467                                                         $use_mbstring = true;
    468                                                         break;
    469 
    470                                                 // Big5 with Hong Kong extensions, Traditional Chinese
    471                                                 case 'big5-hkscs':
    472                                                         $encoding = 'BIG5-HKSCS';
    473                                                         $use_iconv = true;
    474                                                         $use_mbstring = true;
    475                                                         break;
    476 
    477                                                 // byte2be
    478                                                 case 'byte2be':
    479                                                         $encoding = 'byte2be';
    480                                                         $use_mbstring = true;
    481                                                         break;
    482 
    483                                                 // byte2le
    484                                                 case 'byte2le':
    485                                                         $encoding = 'byte2le';
    486                                                         $use_mbstring = true;
    487                                                         break;
    488 
    489                                                 // byte4be
    490                                                 case 'byte4be':
    491                                                         $encoding = 'byte4be';
    492                                                         $use_mbstring = true;
    493                                                         break;
    494 
    495                                                 // byte4le
    496                                                 case 'byte4le':
    497                                                         $encoding = 'byte4le';
    498                                                         $use_mbstring = true;
    499                                                         break;
    500 
    501                                                 // EUC-CN
    502                                                 case 'euc-cn':
    503                                                 case 'euccn':
    504                                                         $encoding = 'EUC-CN';
    505                                                         $use_iconv = true;
    506                                                         $use_mbstring = true;
    507                                                         break;
    508 
    509                                                 // EUC-JISX0213
    510                                                 case 'euc-jisx0213':
    511                                                 case 'eucjisx0213':
    512                                                         $encoding = 'EUC-JISX0213';
    513                                                         $use_iconv = true;
    514                                                         break;
    515 
    516                                                 // EUC-JP
    517                                                 case 'euc-jp':
    518                                                 case 'eucjp':
    519                                                         $encoding = 'EUC-JP';
    520                                                         $use_iconv = true;
    521                                                         $use_mbstring = true;
    522                                                         break;
    523 
    524                                                 // EUCJP-win
    525                                                 case 'euc-jp-win':
    526                                                 case 'eucjp-win':
    527                                                 case 'eucjpwin':
    528                                                         $encoding = 'EUCJP-win';
    529                                                         $use_iconv = true;
    530                                                         $use_mbstring = true;
    531                                                         break;
    532 
    533                                                 // EUC-KR
    534                                                 case 'euc-kr':
    535                                                 case 'euckr':
    536                                                         $encoding = 'EUC-KR';
    537                                                         $use_iconv = true;
    538                                                         $use_mbstring = true;
    539                                                         break;
    540 
    541                                                 // EUC-TW
    542                                                 case 'euc-tw':
    543                                                 case 'euctw':
    544                                                         $encoding = 'EUC-TW';
    545                                                         $use_iconv = true;
    546                                                         $use_mbstring = true;
    547                                                         break;
    548 
    549                                                 // GB18030 - Simplified Chinese, national standard character set
    550                                                 case 'gb18030-2000':
    551                                                 case 'gb18030':
    552                                                         $encoding = 'GB18030';
    553                                                         $use_iconv = true;
    554                                                         break;
    555 
    556                                                 // GB2312 - Simplified Chinese, national standard character set
    557                                                 case 'gb2312':
    558                                                 case '936':
    559                                                         $encoding = 'GB2312';
    560                                                         $use_mbstring = true;
    561                                                         break;
    562 
    563                                                 // GBK
    564                                                 case 'gbk':
    565                                                         $encoding = 'GBK';
    566                                                         $use_iconv = true;
    567                                                         break;
    568 
    569                                                 // Georgian-Academy
    570                                                 case 'georgian-academy':
    571                                                         $encoding = 'Georgian-Academy';
    572                                                         $use_iconv = true;
    573                                                         break;
    574 
    575                                                 // Georgian-PS
    576                                                 case 'georgian-ps':
    577                                                         $encoding = 'Georgian-PS';
    578                                                         $use_iconv = true;
    579                                                         break;
    580 
    581                                                 // HTML-ENTITIES
    582                                                 case 'html-entities':
    583                                                 case 'htmlentities':
    584                                                         $encoding = 'HTML-ENTITIES';
    585                                                         $use_mbstring = true;
    586                                                         break;
    587 
    588                                                 // HZ
    589                                                 case 'hz':
    590                                                         $encoding = 'HZ';
    591                                                         $use_iconv = true;
    592                                                         $use_mbstring = true;
    593                                                         break;
    594 
    595                                                 // ISO-2022-CN
    596                                                 case 'iso-2022-cn':
    597                                                 case 'iso2022-cn':
    598                                                 case 'iso2022cn':
    599                                                         $encoding = 'ISO-2022-CN';
    600                                                         $use_iconv = true;
    601                                                         break;
    602 
    603                                                 // ISO-2022-CN-EXT
    604                                                 case 'iso-2022-cn-ext':
    605                                                 case 'iso2022-cn-ext':
    606                                                 case 'iso2022cn-ext':
    607                                                 case 'iso2022cnext':
    608                                                         $encoding = 'ISO-2022-CN';
    609                                                         $use_iconv = true;
    610                                                         break;
    611 
    612                                                 // ISO-2022-JP
    613                                                 case 'iso-2022-jp':
    614                                                 case 'iso2022-jp':
    615                                                 case 'iso2022jp':
    616                                                         $encoding = 'ISO-2022-JP';
    617                                                         $use_iconv = true;
    618                                                         $use_mbstring = true;
    619                                                         break;
    620 
    621                                                 // ISO-2022-JP-1
    622                                                 case 'iso-2022-jp-1':
    623                                                 case 'iso2022-jp-1':
    624                                                 case 'iso2022jp-1':
    625                                                 case 'iso2022jp1':
    626                                                         $encoding = 'ISO-2022-JP-1';
    627                                                         $use_iconv = true;
    628                                                         break;
    629 
    630                                                 // ISO-2022-JP-2
    631                                                 case 'iso-2022-jp-2':
    632                                                 case 'iso2022-jp-2':
    633                                                 case 'iso2022jp-2':
    634                                                 case 'iso2022jp2':
    635                                                         $encoding = 'ISO-2022-JP-2';
    636                                                         $use_iconv = true;
    637                                                         break;
    638 
    639                                                 // ISO-2022-JP-3
    640                                                 case 'iso-2022-jp-3':
    641                                                 case 'iso2022-jp-3':
    642                                                 case 'iso2022jp-3':
    643                                                 case 'iso2022jp3':
    644                                                         $encoding = 'ISO-2022-JP-3';
    645                                                         $use_iconv = true;
    646                                                         break;
    647 
    648                                                 // ISO-2022-KR
    649                                                 case 'iso-2022-kr':
    650                                                 case 'iso2022-kr':
    651                                                 case 'iso2022kr':
    652                                                         $encoding = 'ISO-2022-KR';
    653                                                         $use_iconv = true;
    654                                                         $use_mbstring = true;
    655                                                         break;
    656 
    657                                                 // ISO-8859-1
    658                                                 case 'iso-8859-1':
    659                                                 case 'iso8859-1':
    660                                                         $encoding = 'ISO-8859-1';
    661                                                         $use_iconv = true;
    662                                                         $use_mbstring = true;
    663                                                         $utf8_fail = false;
    664                                                         break;
    665 
    666                                                 // ISO-8859-2
    667                                                 case 'iso-8859-2':
    668                                                 case 'iso8859-2':
    669                                                         $encoding = 'ISO-8859-2';
    670                                                         $use_iconv = true;
    671                                                         $use_mbstring = true;
    672                                                         break;
    673 
    674                                                 // ISO-8859-3
    675                                                 case 'iso-8859-3':
    676                                                 case 'iso8859-3':
    677                                                         $encoding = 'ISO-8859-3';
    678                                                         $use_iconv = true;
    679                                                         $use_mbstring = true;
    680                                                         break;
    681 
    682                                                 // ISO-8859-4
    683                                                 case 'iso-8859-4':
    684                                                 case 'iso8859-4':
    685                                                         $encoding = 'ISO-8859-4';
    686                                                         $use_iconv = true;
    687                                                         $use_mbstring = true;
    688                                                         break;
    689 
    690                                                 // ISO-8859-5
    691                                                 case 'iso-8859-5':
    692                                                 case 'iso8859-5':
    693                                                         $encoding = 'ISO-8859-5';
    694                                                         $use_iconv = true;
    695                                                         $use_mbstring = true;
    696                                                         break;
    697 
    698                                                 // ISO-8859-6
    699                                                 case 'iso-8859-6':
    700                                                 case 'iso8859-6':
    701                                                         $encoding = 'ISO-8859-6';
    702                                                         $use_iconv = true;
    703                                                         $use_mbstring = true;
    704                                                         break;
    705 
    706                                                 // ISO-8859-7
    707                                                 case 'iso-8859-7':
    708                                                 case 'iso8859-7':
    709                                                         $encoding = 'ISO-8859-7';
    710                                                         $use_iconv = true;
    711                                                         $use_mbstring = true;
    712                                                         break;
    713 
    714                                                 // ISO-8859-8
    715                                                 case 'iso-8859-8':
    716                                                 case 'iso8859-8':
    717                                                         $encoding = 'ISO-8859-8';
    718                                                         $use_iconv = true;
    719                                                         $use_mbstring = true;
    720                                                         break;
    721 
    722                                                 // ISO-8859-9
    723                                                 case 'iso-8859-9':
    724                                                 case 'iso8859-9':
    725                                                         $encoding = 'ISO-8859-9';
    726                                                         $use_iconv = true;
    727                                                         $use_mbstring = true;
    728                                                         break;
    729 
    730                                                 // ISO-8859-10
    731                                                 case 'iso-8859-10':
    732                                                 case 'iso8859-10':
    733                                                         $encoding = 'ISO-8859-10';
    734                                                         $use_iconv = true;
    735                                                         $use_mbstring = true;
    736                                                         break;
    737 
    738                                                 // mbstring/iconv functions don't appear to support 11 & 12
    739 
    740                                                 // ISO-8859-13
    741                                                 case 'iso-8859-13':
    742                                                 case 'iso8859-13':
    743                                                         $encoding = 'ISO-8859-13';
    744                                                         $use_iconv = true;
    745                                                         $use_mbstring = true;
    746                                                         break;
    747 
    748                                                 // ISO-8859-14
    749                                                 case 'iso-8859-14':
    750                                                 case 'iso8859-14':
    751                                                         $encoding = 'ISO-8859-14';
    752                                                         $use_iconv = true;
    753                                                         $use_mbstring = true;
    754                                                         break;
    755 
    756                                                 // ISO-8859-15
    757                                                 case 'iso-8859-15':
    758                                                 case 'iso8859-15':
    759                                                         $encoding = 'ISO-8859-15';
    760                                                         $use_iconv = true;
    761                                                         $use_mbstring = true;
    762                                                         break;
    763 
    764                                                 // ISO-8859-16
    765                                                 case 'iso-8859-16':
    766                                                 case 'iso8859-16':
    767                                                         $encoding = 'ISO-8859-16';
    768                                                         $use_iconv = true;
    769                                                         break;
    770 
    771                                                 // JIS
    772                                                 case 'jis':
    773                                                         $encoding = 'JIS';
    774                                                         $use_mbstring = true;
    775                                                         break;
    776 
    777                                                 // JOHAB - Korean
    778                                                 case 'johab':
    779                                                         $encoding = 'JOHAB';
    780                                                         $use_iconv = true;
    781                                                         break;
    782 
    783                                                 // Russian
    784                                                 case 'koi8-r':
    785                                                 case 'koi8r':
    786                                                         $encoding = 'KOI8-R';
    787                                                         $use_iconv = true;
    788                                                         $use_mbstring = true;
    789                                                         break;
    790 
    791                                                 // Turkish
    792                                                 case 'koi8-t':
    793                                                 case 'koi8t':
    794                                                         $encoding = 'KOI8-T';
    795                                                         $use_iconv = true;
    796                                                         break;
    797 
    798                                                 // Ukrainian
    799                                                 case 'koi8-u':
    800                                                 case 'koi8u':
    801                                                         $encoding = 'KOI8-U';
    802                                                         $use_iconv = true;
    803                                                         break;
    804 
    805                                                 // Russian+Ukrainian
    806                                                 case 'koi8-ru':
    807                                                 case 'koi8ru':
    808                                                         $encoding = 'KOI8-RU';
    809                                                         $use_iconv = true;
    810                                                         break;
    811 
    812                                                 // Macintosh (Mac OS Classic)
    813                                                 case 'macintosh':
    814                                                         $encoding = 'Macintosh';
    815                                                         $use_iconv = true;
    816                                                         break;
    817 
    818                                                 // MacArabic (Mac OS Classic)
    819                                                 case 'macarabic':
    820                                                         $encoding = 'MacArabic';
    821                                                         $use_iconv = true;
    822                                                         break;
    823 
    824                                                 // MacCentralEurope (Mac OS Classic)
    825                                                 case 'maccentraleurope':
    826                                                         $encoding = 'MacCentralEurope';
    827                                                         $use_iconv = true;
    828                                                         break;
    829 
    830                                                 // MacCroatian (Mac OS Classic)
    831                                                 case 'maccroatian':
    832                                                         $encoding = 'MacCroatian';
    833                                                         $use_iconv = true;
    834                                                         break;
    835 
    836                                                 // MacCyrillic (Mac OS Classic)
    837                                                 case 'maccyrillic':
    838                                                         $encoding = 'MacCyrillic';
    839                                                         $use_iconv = true;
    840                                                         break;
    841 
    842                                                 // MacGreek (Mac OS Classic)
    843                                                 case 'macgreek':
    844                                                         $encoding = 'MacGreek';
    845                                                         $use_iconv = true;
    846                                                         break;
    847 
    848                                                 // MacHebrew (Mac OS Classic)
    849                                                 case 'machebrew':
    850                                                         $encoding = 'MacHebrew';
    851                                                         $use_iconv = true;
    852                                                         break;
    853 
    854                                                 // MacIceland (Mac OS Classic)
    855                                                 case 'maciceland':
    856                                                         $encoding = 'MacIceland';
    857                                                         $use_iconv = true;
    858                                                         break;
    859 
    860                                                 // MacRoman (Mac OS Classic)
    861                                                 case 'macroman':
    862                                                         $encoding = 'MacRoman';
    863                                                         $use_iconv = true;
    864                                                         break;
    865 
    866                                                 // MacRomania (Mac OS Classic)
    867                                                 case 'macromania':
    868                                                         $encoding = 'MacRomania';
    869                                                         $use_iconv = true;
    870                                                         break;
    871 
    872                                                 // MacThai (Mac OS Classic)
    873                                                 case 'macthai':
    874                                                         $encoding = 'MacThai';
    875                                                         $use_iconv = true;
    876                                                         break;
    877 
    878                                                 // MacTurkish (Mac OS Classic)
    879                                                 case 'macturkish':
    880                                                         $encoding = 'MacTurkish';
    881                                                         $use_iconv = true;
    882                                                         break;
    883 
    884                                                 // MacUkraine (Mac OS Classic)
    885                                                 case 'macukraine':
    886                                                         $encoding = 'MacUkraine';
    887                                                         $use_iconv = true;
    888                                                         break;
    889 
    890                                                 // MuleLao-1
    891                                                 case 'mulelao-1':
    892                                                 case 'mulelao1':
    893                                                         $encoding = 'MuleLao-1';
    894                                                         $use_iconv = true;
    895                                                         break;
    896 
    897                                                 // Shift_JIS
    898                                                 case 'shift_jis':
    899                                                 case 'sjis':
    900                                                 case '932':
    901                                                         $encoding = 'Shift_JIS';
    902                                                         $use_iconv = true;
    903                                                         $use_mbstring = true;
    904                                                         break;
    905 
    906                                                 // Shift_JISX0213
    907                                                 case 'shift-jisx0213':
    908                                                 case 'shiftjisx0213':
    909                                                         $encoding = 'Shift_JISX0213';
    910                                                         $use_iconv = true;
    911                                                         break;
    912 
    913                                                 // SJIS-win
    914                                                 case 'sjis-win':
    915                                                 case 'sjiswin':
    916                                                 case 'shift_jis-win':
    917                                                         $encoding = 'SJIS-win';
    918                                                         $use_iconv = true;
    919                                                         $use_mbstring = true;
    920                                                         break;
    921 
    922                                                 // TCVN - Vietnamese
    923                                                 case 'tcvn':
    924                                                         $encoding = 'TCVN';
    925                                                         $use_iconv = true;
    926                                                         break;
    927 
    928                                                 // TDS565 - Turkish
    929                                                 case 'tds565':
    930                                                         $encoding = 'TDS565';
    931                                                         $use_iconv = true;
    932                                                         break;
    933 
    934                                                 // TIS-620 Thai
    935                                                 case 'tis-620':
    936                                                 case 'tis620':
    937                                                         $encoding = 'TIS-620';
    938                                                         $use_iconv = true;
    939                                                         $use_mbstring = true;
    940                                                         break;
    941 
    942                                                 // UCS-2
    943                                                 case 'ucs-2':
    944                                                 case 'ucs2':
    945                                                 case 'utf-16':
    946                                                 case 'utf16':
    947                                                         $encoding = 'UCS-2';
    948                                                         $use_iconv = true;
    949                                                         $use_mbstring = true;
    950                                                         break;
    951 
    952                                                 // UCS-2BE
    953                                                 case 'ucs-2be':
    954                                                 case 'ucs2be':
    955                                                 case 'utf-16be':
    956                                                 case 'utf16be':
    957                                                         $encoding = 'UCS-2BE';
    958                                                         $use_iconv = true;
    959                                                         $use_mbstring = true;
    960                                                         break;
    961 
    962                                                 // UCS-2LE
    963                                                 case 'ucs-2le':
    964                                                 case 'ucs2le':
    965                                                 case 'utf-16le':
    966                                                 case 'utf16le':
    967                                                         $encoding = 'UCS-2LE';
    968                                                         $use_iconv = true;
    969                                                         $use_mbstring = true;
    970                                                         break;
    971 
    972                                                 // UCS-2-INTERNAL
    973                                                 case 'ucs-2-internal':
    974                                                 case 'ucs2internal':
    975                                                         $encoding = 'UCS-2-INTERNAL';
    976                                                         $use_iconv = true;
    977                                                         break;
    978 
    979                                                 // UCS-4
    980                                                 case 'ucs-4':
    981                                                 case 'ucs4':
    982                                                 case 'utf-32':
    983                                                 case 'utf32':
    984                                                         $encoding = 'UCS-4';
    985                                                         $use_iconv = true;
    986                                                         $use_mbstring = true;
    987                                                         break;
    988 
    989                                                 // UCS-4BE
    990                                                 case 'ucs-4be':
    991                                                 case 'ucs4be':
    992                                                 case 'utf-32be':
    993                                                 case 'utf32be':
    994                                                         $encoding = 'UCS-4BE';
    995                                                         $use_iconv = true;
    996                                                         $use_mbstring = true;
    997                                                         break;
    998 
    999                                                 // UCS-4LE
    1000                                                 case 'ucs-4le':
    1001                                                 case 'ucs4le':
    1002                                                 case 'utf-32le':
    1003                                                 case 'utf32le':
    1004                                                         $encoding = 'UCS-4LE';
    1005                                                         $use_iconv = true;
    1006                                                         $use_mbstring = true;
    1007                                                         break;
    1008 
    1009                                                 // UCS-4-INTERNAL
    1010                                                 case 'ucs-4-internal':
    1011                                                 case 'ucs4internal':
    1012                                                         $encoding = 'UCS-4-INTERNAL';
    1013                                                         $use_iconv = true;
    1014                                                         break;
    1015 
    1016                                                 // UCS-16
    1017                                                 case 'ucs-16':
    1018                                                 case 'ucs16':
    1019                                                         $encoding = 'UCS-16';
    1020                                                         $use_iconv = true;
    1021                                                         $use_mbstring = true;
    1022                                                         break;
    1023 
    1024                                                 // UCS-16BE
    1025                                                 case 'ucs-16be':
    1026                                                 case 'ucs16be':
    1027                                                         $encoding = 'UCS-16BE';
    1028                                                         $use_iconv = true;
    1029                                                         $use_mbstring = true;
    1030                                                         break;
    1031 
    1032                                                 // UCS-16LE
    1033                                                 case 'ucs-16le':
    1034                                                 case 'ucs16le':
    1035                                                         $encoding = 'UCS-16LE';
    1036                                                         $use_iconv = true;
    1037                                                         $use_mbstring = true;
    1038                                                         break;
    1039 
    1040                                                 // UCS-32
    1041                                                 case 'ucs-32':
    1042                                                 case 'ucs32':
    1043                                                         $encoding = 'UCS-32';
    1044                                                         $use_iconv = true;
    1045                                                         $use_mbstring = true;
    1046                                                         break;
    1047 
    1048                                                 // UCS-32BE
    1049                                                 case 'ucs-32be':
    1050                                                 case 'ucs32be':
    1051                                                         $encoding = 'UCS-32BE';
    1052                                                         $use_iconv = true;
    1053                                                         $use_mbstring = true;
    1054                                                         break;
    1055 
    1056                                                 // UCS-32LE
    1057                                                 case 'ucs-32le':
    1058                                                 case 'ucs32le':
    1059                                                         $encoding = 'UCS-32LE';
    1060                                                         $use_iconv = true;
    1061                                                         $use_mbstring = true;
    1062                                                         break;
    1063 
    1064                                                 // UTF-7
    1065                                                 case 'utf-7':
    1066                                                 case 'utf7':
    1067                                                         $encoding = 'UTF-7';
    1068                                                         $use_iconv = true;
    1069                                                         $use_mbstring = true;
    1070                                                         break;
    1071 
    1072                                                 // UTF7-IMAP
    1073                                                 case 'utf-7-imap':
    1074                                                 case 'utf7-imap':
    1075                                                 case 'utf7imap':
    1076                                                         $encoding = 'UTF7-IMAP';
    1077                                                         $use_mbstring = true;
    1078                                                         break;
    1079 
    1080                                                 // VISCII - Vietnamese ASCII
    1081                                                 case 'viscii':
    1082                                                         $encoding = 'VISCII';
    1083                                                         $use_iconv = true;
    1084                                                         break;
    1085 
    1086                                                 // Windows-specific Central & Eastern Europe
    1087                                                 case 'cp1250':
    1088                                                 case 'windows-1250':
    1089                                                 case 'win-1250':
    1090                                                 case '1250':
    1091                                                         $encoding = 'Windows-1250';
    1092                                                         $use_iconv = true;
    1093                                                         break;
    1094 
    1095                                                 // Windows-specific Cyrillic
    1096                                                 case 'cp1251':
    1097                                                 case 'windows-1251':
    1098                                                 case 'win-1251':
    1099                                                 case '1251':
    1100                                                         $encoding = 'Windows-1251';
    1101                                                         $use_iconv = true;
    1102                                                         $use_mbstring = true;
    1103                                                         break;
    1104 
    1105                                                 // Windows-specific Western Europe
    1106                                                 case 'cp1252':
    1107                                                 case 'windows-1252':
    1108                                                 case '1252':
    1109                                                         $encoding = 'Windows-1252';
    1110                                                         $use_iconv = true;
    1111                                                         $use_mbstring = true;
    1112                                                         break;
    1113 
    1114                                                 // Windows-specific Greek
    1115                                                 case 'cp1253':
    1116                                                 case 'windows-1253':
    1117                                                 case '1253':
    1118                                                         $encoding = 'Windows-1253';
    1119                                                         $use_iconv = true;
    1120                                                         break;
    1121 
    1122                                                 // Windows-specific Turkish
    1123                                                 case 'cp1254':
    1124                                                 case 'windows-1254':
    1125                                                 case '1254':
    1126                                                         $encoding = 'Windows-1254';
    1127                                                         $use_iconv = true;
    1128                                                         break;
    1129 
    1130                                                 // Windows-specific Hebrew
    1131                                                 case 'cp1255':
    1132                                                 case 'windows-1255':
    1133                                                 case '1255':
    1134                                                         $encoding = 'Windows-1255';
    1135                                                         $use_iconv = true;
    1136                                                         break;
    1137 
    1138                                                 // Windows-specific Arabic
    1139                                                 case 'cp1256':
    1140                                                 case 'windows-1256':
    1141                                                 case '1256':
    1142                                                         $encoding = 'Windows-1256';
    1143                                                         $use_iconv = true;
    1144                                                         break;
    1145 
    1146                                                 // Windows-specific Baltic
    1147                                                 case 'cp1257':
    1148                                                 case 'windows-1257':
    1149                                                 case '1257':
    1150                                                         $encoding = 'Windows-1257';
    1151                                                         $use_iconv = true;
    1152                                                         break;
    1153 
    1154                                                 // Windows-specific Vietnamese
    1155                                                 case 'cp1258':
    1156                                                 case 'windows-1258':
    1157                                                 case '1258':
    1158                                                         $encoding = 'Windows-1258';
    1159                                                         $use_iconv = true;
    1160                                                         break;
    1161 
    1162                                                 // Default to UTF-8
    1163                                                 default:
    1164                                                         $encoding = 'UTF-8';
    1165                                                         break;
    1166                                         }
    1167                                 } else {
    1168                                         $mp_rss = preg_replace ('/<\?xml(.*)( standalone="no")(.*)\?>/msiU', '<?xml\\1\\3?>', $mp_rss, 1);
    1169                                         $mp_rss = preg_replace ('/<\?xml(.*)\?>/msiU', '<?xml\\1 encoding="UTF-8"?>', $mp_rss, 1);
    1170                                         preg_match('/encoding=["|\'](.*)["|\']/Ui', $mp_rss, $match);
    1171                                         $use_iconv = true;
    1172                                         $use_mbstring = true;
    1173                                         $utf8_fail = false;
    1174                                         $encoding = 'UTF-8';
    1175                                 }
    1176                                 $this->encoding = $encoding;
    1177 
    1178                                 // If function is available and able, convert characters to UTF-8, and overwrite $this->encoding
    1179                                 if (function_exists('iconv') && $use_iconv && iconv($encoding, 'UTF-8', $mp_rss)) {
    1180                                         $mp_rss = iconv($encoding, 'UTF-8//TRANSLIT', $mp_rss);
    1181                                         $mp_rss = str_replace ($match[0], 'encoding="UTF-8"', $mp_rss);
    1182                                         $this->encoding = 'UTF-8';
    1183                                 }
    1184                                 else if (function_exists('mb_convert_encoding') && $use_mbstring) {
    1185                                         $mp_rss = mb_convert_encoding($mp_rss, 'UTF-8', $encoding);
    1186                                         $mp_rss = str_replace ($match[0], 'encoding="UTF-8"', $mp_rss);
    1187                                         $this->encoding = 'UTF-8';
    1188                                 }
    1189                                 else if (($use_mbstring || $use_iconv) && $utf8_fail) {
    1190                                                 $this->encoding = 'UTF-8';
    1191                                                 $mp_rss = str_replace ($match[0], 'encoding="UTF-8"', $mp_rss);
    1192                                 }
    1193                                 $mp_rss = preg_replace('/<(.*)>[\s]*<\!\[CDATA\[/msiU', '<\\1 spencoded="false"><![CDATA[', $mp_rss); // Add an internal attribute to CDATA sections
    1194                                 $mp_rss = str_replace(']] spencoded="false">', ']]>', $mp_rss); // Remove it when we're on the end of a CDATA block (therefore making it ill-formed)
    1195 
    1196                                 // If we're RSS
    1197                                 if (preg_match('/<rdf:rdf/i', $mp_rss) || preg_match('/<rss/i', $mp_rss)) {
    1198                                         $sp_elements = array(
    1199                                                 'author',
    1200                                                 'link',
    1201                                         );
    1202                                 // Or if we're Atom
    1203                                 } else {
    1204                                         $sp_elements = array(
    1205                                                 'content',
    1206                                                 'copyright',
    1207                                                 'name',
    1208                                                 'subtitle',
    1209                                                 'summary',
    1210                                                 'tagline',
    1211                                                 'title',
    1212                                         );
    1213                                 }
    1214                                 foreach ($sp_elements as $full) {
    1215                                         // The (<\!\[CDATA\[)? never matches any CDATA block, therefore the CDATA gets added, but never replaced
    1216                                         $mp_rss = preg_replace("/<$full(.*)>[\s]*(<\!\[CDATA\[)?(.*)(]]>)?[\s]*<\/$full>/msiU", "<$full\\1><![CDATA[\\3]]></$full>", $mp_rss);
    1217                                         // The following line is a work-around for the above bug
    1218                                         $mp_rss = preg_replace("/<$full(.*)><\!\[CDATA\[[\s]*<\!\[CDATA\[/msiU", "<$full\\1><![CDATA[", $mp_rss);
    1219                                         // Deal with CDATA within CDATA (this can be caused by us inserting CDATA above)
    1220                                         $mp_rss = preg_replace_callback("/<($full)(.*)><!\[CDATA\[(.*)\]\]><\/$full>/msiU", array(&$this, 'cdata_in_cdata'), $mp_rss);
    1221                                 }
    1222 
    1223                                 // If XML Dump is enabled, send feed to the page and quit.
    1224                                 if ($this->xml_dump) {
    1225                                         header("Content-type: text/xml; charset=" . $this->encoding);
    1226                                         echo $mp_rss;
    1227                                         exit;
    1228                                 }
    1229 
    1230                                 $this->xml = xml_parser_create_ns($this->encoding);
    1231                                 $this->namespaces = array('xml' => 'HTTP://WWW.W3.ORG/XML/1998/NAMESPACE', 'atom' => 'ATOM', 'rss2' => 'RSS', 'rdf' => 'RDF', 'rss1' => 'RSS', 'dc' => 'DC', 'xhtml' => 'XHTML', 'content' => 'CONTENT');
    1232                                 xml_parser_set_option($this->xml, XML_OPTION_SKIP_WHITE, 1);
    1233                                 xml_set_object($this->xml, $this);
    1234                                 xml_set_character_data_handler($this->xml, 'dataHandler');
    1235                                 xml_set_element_handler($this->xml, 'startHandler', 'endHandler');
    1236                                 xml_set_start_namespace_decl_handler($this->xml, 'startNameSpace');
    1237                                 xml_set_end_namespace_decl_handler($this->xml, 'endNameSpace');
    1238                                 if (xml_parse($this->xml, $mp_rss))
    1239                                 {
    1240                                         xml_parser_free($this->xml);
    1241                                         $this->parse_xml_data_array();
    1242                                         $this->data['feedinfo']['encoding'] = $this->encoding;
    1243                                         if ($this->order_by_date && !empty($this->data['items'])) {
    1244                                                 usort($this->data['items'], create_function('$a,$b', 'if ($a->date == $b->date) return 0; return ($a->date < $b->date) ? 1 : -1;'));
    1245                                         }
    1246                                         if ($this->caching && substr($this->rss_url, 0, 7) == 'http://') {
    1247                                                 if ($this->is_writeable_createable($cache_filename)) {
    1248                                                         $fp = fopen($cache_filename, 'w');
    1249                                                         fwrite($fp, serialize($this->data));
    1250                                                         fclose($fp);
    1251                                                 }
    1252                                                 else trigger_error("$cache_filename is not writeable", E_USER_WARNING);
    1253                                         }
    1254                                         return true;
    1255                                 }
    1256                                 else
    1257                                 {
    1258                                         $this->sp_error(sprintf('XML error: %s at line %d, column %d', xml_error_string(xml_get_error_code($this->xml)), xml_get_current_line_number($this->xml), xml_get_current_column_number($this->xml)), E_USER_WARNING, __FILE__, __LINE__);
    1259                                         xml_parser_free($this->xml);
    1260                                         $this->data = array();
    1261                                         return false;
    1262                                 }
    1263                         }
    1264                 }
    1265                 else {
    1266                         return false;
    1267                 }
    1268         }
    1269 
    1270 
    1271 
    1272 
    1273         /****************************************************
    1274         SIMPLEPIE ERROR (internal function)
    1275         ****************************************************/
    1276         function sp_error($message, $level, $file, $line) {
    1277                 $this->error = $message;
    1278                 switch ($level) {
    1279                         case E_USER_ERROR:
    1280                                 $note = 'PHP Error';
    1281                                 break;
    1282                         case E_USER_WARNING:
    1283                                 $note = 'PHP Warning';
    1284                                 break;
    1285                         case E_USER_NOTICE:
    1286                                 $note = 'PHP Notice';
    1287                                 break;
    1288                         default:
    1289                                 $note = 'Unknown Error';
    1290                                 break;
    1291                 }
    1292                 error_log("$note: $message in $file on line $line", 0);
    1293         }
    1294 
    1295 
    1296 
    1297 
    1298         /****************************************************
    1299         GET FEED ENCODING
    1300         ****************************************************/
    1301         function get_encoding() {
    1302                 if (isset($this->encoding)) {
    1303                         return $this->encoding;
    1304                 } else if (isset($this->data['feedinfo']['encoding'])) {
    1305                         return $this->data['feedinfo']['encoding'];
    1306                 } else return false;
    1307         }
    1308 
    1309         function handle_content_type($mime='text/html') {
    1310                 if (!headers_sent() && $this->get_encoding()) header('Content-type: ' . $mime . '; charset=' . $this->get_encoding());
    1311         }
    1312 
    1313 
    1314 
    1315 
    1316         /****************************************************
    1317         GET FEED VERSION NUMBER
    1318         ****************************************************/
    1319         function get_version() {
    1320                 if (isset($this->data['feedinfo'])) {
    1321                         return (isset($this->data['feedinfo']['version'])) ? $this->data[feedinfo][type] . ' ' . $this->data[feedinfo][version] : $this->data['feedinfo']['type'];
    1322                 }
    1323                 else return false;
    1324         }
    1325 
    1326 
    1327 
    1328 
    1329         /****************************************************
    1330         SUBSCRIPTION URLS
    1331         This allows people to subscribe to the feed in various services.
    1332         ****************************************************/
    1333         function subscribe_url() {
    1334                 return (empty($this->rss_url)) ? false : $this->fix_protocol($this->rss_url, 1);
    1335         }
    1336 
    1337         function subscribe_feed() {
    1338                 return (empty($this->rss_url)) ? false : $this->fix_protocol($this->rss_url, 2);
    1339         }
    1340 
    1341         function subscribe_podcast() {
    1342                 return (empty($this->rss_url)) ? false : $this->fix_protocol($this->rss_url, 3);
    1343         }
    1344 
    1345         function subscribe_aol() {
    1346                 return (empty($this->rss_url)) ? false : 'http://feeds.my.aol.com/add.jsp?url=' . rawurlencode($this->subscribe_url());
    1347         }
    1348 
    1349         function subscribe_bloglines() {
    1350                 return (empty($this->rss_url)) ? false : 'http://www.bloglines.com/sub/' . rawurlencode($this->subscribe_url());
    1351         }
    1352 
    1353         function subscribe_google() {
    1354                 return (empty($this->rss_url)) ? false : 'http://fusion.google.com/add?feedurl=' . rawurlencode($this->subscribe_url());
    1355         }
    1356 
    1357         function subscribe_msn() {
    1358                 return (empty($this->rss_url)) ? false : 'http://my.msn.com/addtomymsn.armx?id=rss&amp;ut=' . rawurlencode($this->subscribe_url()) . '&amp;ru=' . rawurlencode($this->get_feed_link());
    1359         }
    1360 
    1361         function subscribe_netvibes() {
    1362                 return (empty($this->rss_url)) ? false : 'http://www.netvibes.com/subscribe.php?url=' . rawurlencode($this->subscribe_url());
    1363         }
    1364 
    1365         function subscribe_newsburst() {
    1366                 return (empty($this->rss_url)) ? false : 'http://www.newsburst.com/Source/?add=' . rawurlencode($this->subscribe_url());
    1367         }
    1368 
    1369         function subscribe_newsgator() {
    1370                 return (empty($this->rss_url)) ? false : 'http://www.newsgator.com/ngs/subscriber/subext.aspx?url=' . rawurlencode($this->subscribe_url());
    1371         }
    1372 
    1373         function subscribe_odeo() {
    1374                 return (empty($this->rss_url)) ? false : 'http://www.odeo.com/listen/subscribe?feed=' . rawurlencode($this->subscribe_url());
    1375         }
    1376 
    1377         function subscribe_pluck() {
    1378                 return (empty($this->rss_url)) ? false : 'http://client.pluck.com/pluckit/prompt.aspx?GCID=C12286x053&amp;a=' . rawurlencode($this->subscribe_url());
    1379         }
    1380 
    1381         function subscribe_podnova() {
    1382                 return (empty($this->rss_url)) ? false : 'http://www.podnova.com/index_your_podcasts.srf?action=add&url=' . rawurlencode($this->subscribe_url());
    1383         }
    1384 
    1385         function subscribe_rojo() {
    1386                 return (empty($this->rss_url)) ? false : 'http://www.rojo.com/add-subscription?resource=' . rawurlencode($this->subscribe_url());
    1387         }
    1388 
    1389         function subscribe_yahoo() {
    1390                 return (empty($this->rss_url)) ? false : 'http://add.my.yahoo.com/rss?url=' . rawurlencode($this->subscribe_url());
    1391         }
    1392 
    1393 
    1394 
    1395 
    1396         /****************************************************
    1397         PARSE OUT GENERAL FEED-RELATED DATA
    1398         ****************************************************/
    1399         // Reads the feed's title
    1400         function get_feed_title() {
    1401                 return (isset($this->data['info']['title'])) ? $this->data['info']['title'] : false;
    1402         }
    1403 
    1404         // Reads the feed's link (URL)
    1405         function get_feed_link() {
    1406                 return (isset($this->data['info']['link'][0])) ? $this->data['info']['link'][0] : false;
    1407         }
    1408 
    1409         // Reads the feed's link (URL)
    1410         function get_feed_links($key) {
    1411                 return (isset($this->data['info']['link'][$key])) ? $this->data['info']['link'][$key] : false;
    1412         }
    1413 
    1414         // Reads the feed's description
    1415         function get_feed_description() {
    1416                 return (isset($this->data['info']['description'])) ? $this->data['info']['description'] : false;
    1417         }
    1418 
    1419         // Reads the feed's copyright information.
    1420         function get_feed_copyright() {
    1421                 return (isset($this->data['info']['copyright'])) ? $this->data['info']['copyright'] : false;
    1422         }
    1423 
    1424         // Reads the feed's language
    1425         function get_feed_language() {
    1426                 return (isset($this->data['info']['language'])) ? $this->data['info']['language'] : false;
    1427         }
    1428 
    1429 
    1430 
    1431 
    1432         /****************************************************
    1433         PARSE OUT IMAGE-RELATED DATA
    1434         Apparently Atom doesn't have feed images.
    1435         ****************************************************/
    1436         // Check if an image element exists (returns true/false)
    1437         function get_image_exist() {
    1438                 return (isset($this->data['info']['image']['url'])) ? true : false;
    1439         }
    1440 
    1441         // Get the image title (to be used in alt and/or title)
    1442         function get_image_title() {
    1443                 return (isset($this->data['info']['image']['title'])) ? $this->data['info']['image']['title'] : false;
    1444         }
    1445 
    1446         // The path to the actual image
    1447         function get_image_url() {
    1448                 return (isset($this->data['info']['image']['url'])) ? $this->data['info']['image']['url'] : false;
    1449         }
    1450 
    1451         // The URL that the image is supposed to link to.
    1452         function get_image_link() {
    1453                 return (isset($this->data['info']['image']['link'])) ? $this->data['info']['image']['link'] : false;
    1454         }
    1455 
    1456         // Get the image width
    1457         function get_image_width() {
    1458                 return (isset($this->data['info']['image']['width'])) ? $this->data['info']['image']['width'] : false;
    1459         }
    1460 
    1461         // Get the image height
    1462         function get_image_height() {
    1463                 return (isset($this->data['info']['image']['height'])) ? $this->data['info']['image']['height'] : false;
    1464         }
    1465 
    1466 
    1467 
    1468 
    1469         /****************************************************
    1470         PARSE OUT ITEM-RELATED DATA
    1471         ****************************************************/
    1472         // Get the size of the array of items (for use in a for-loop)
    1473         function get_item_quantity($max=0) {
    1474                 $qty = (isset($this->data['items'])) ? sizeof($this->data['items']) : 0;
    1475                 if ($max != 0) return ($qty > $max) ? $max : $qty;
    1476                 else return $qty;
    1477         }
    1478        
    1479         function get_item($key) {
    1480                 return $this->data['items'][$key];
    1481         }
    1482        
    1483         function get_items($start = 0, $end = 0) {
    1484                 return ($end == 0) ? array_slice($this->data['items'], $start) : array_slice($this->data['items'], $start, $end);
    1485         }
    1486 
    1487 
    1488 
    1489 
    1490         /****************************************************
    1491         FIX PROTOCOL
    1492         Convert feed:// and no-protocol URL's to http://
    1493         Feed is allowed to have no protocol.  Local files are toggled in init().
    1494         This is an internal function and is not intended to be used publically.
    1495 
    1496         $http=1, http://www.domain.com/feed.xml (absolute)
    1497         $http=2, feed://www.domain.com/feed.xml (absolute)
    1498         $http=3, podcast://www.domain.com/feed.xml (absolute)
    1499         ****************************************************/
    1500         function fix_protocol($mp_feed_proto, $http = 1) {
    1501                 $url = $mp_feed_proto;
    1502 
    1503                 $url = preg_replace('/feed:(\/\/)?(http:\/\/)?/i', 'http://', $url);
    1504                 $url = preg_replace('/(feed:)?(\/\/)?https:\/\//i', 'https://', $url);
    1505                 $url = preg_replace('/p(od)?cast:(\/\/)?(http:\/\/)?/i', 'http://', $url);
    1506                 $url = preg_replace('/(p(od)?cast:)?(\/\/)?https:\/\//i', 'https://', $url);
    1507                 if (!stristr($url, 'http://') && !stristr($url, 'https://') && !file_exists($url)) $url = "http://$url";
    1508 
    1509                 if ($http == 1) return $url;
    1510                 else if ($http == 2) {
    1511                         if (strstr($url, 'http://')) {
    1512                                 $url = substr_replace($url, 'feed', 0, 4);
    1513                                 return $url;
    1514                         }
    1515                         else return $url;
    1516                 }
    1517                 else if ($http == 3) {
    1518                         if (strstr($url, 'http://')) {
    1519                                 $url = substr_replace($url, 'podcast', 0, 4);
    1520                                 return $url;
    1521                         }
    1522                         else return $url;
    1523                 }
    1524         }
    1525 
    1526 
    1527 
    1528 
    1529         /****************************************************
    1530         ULTRA-LIBERAL FEED LOCATOR
    1531         Based upon http://diveintomark.org/archives/2002/08/15/ultraliberal_rss_locator
    1532         This function enables support for RSS auto-discovery-on-crack.
    1533         ****************************************************/
    1534         function rss_locator($data, $url) {
    1535 
    1536                 $this->url = $url;
    1537                 $this->parsed_url = parse_url($url);
    1538                 if (!isset($this->parsed_url['path'])) {
    1539                         $this->parsed_url['path'] = '/';
    1540                 }
    1541 
    1542                 // Check is the URL we're given is a feed
    1543                 if ($this->is_feed($data, false)) {
    1544                         return $url;
    1545                 }
    1546 
    1547                 // Feeds pointed to by LINK tags in the header of the page (autodiscovery)
    1548                 $stage1 = $this->check_link_elements($data);
    1549                 if ($stage1) {
    1550                         return $stage1;
    1551                 }
    1552 
    1553                 // Grab all the links in the page, and put them into two arrays (local, and external)
    1554                 if ($this->get_links($data)) {
    1555 
    1556                         // <A> links to feeds on the same server ending in ".rss", ".rdf", ".xml", or ".atom"
    1557                         $stage2 = $this->check_link_extension($this->local);
    1558                         if ($stage2) {
    1559                                 return $stage2;
    1560                         }
    1561 
    1562                         // <A> links to feeds on the same server containing "rss", "rdf", "xml", or "atom"
    1563                         $stage3 = $this->check_link_body($this->local);
    1564                         if ($stage3) {
    1565                                 return $stage3;
    1566                         }
    1567 
    1568                         // <A> links to feeds on external servers ending in ".rss", ".rdf", ".xml", or ".atom"
    1569                         $stage4 = $this->check_link_extension($this->elsewhere);
    1570                         if ($stage4) {
    1571                                 return $stage4;
    1572                         }
    1573 
    1574                         // <A> links to feeds on external servers containing "rss", "rdf", "xml", or "atom"
    1575                         $stage5 = $this->check_link_body($this->elsewhere);
    1576                         if ($stage5) {
    1577                                 return $stage5;
    1578                         }
    1579                 }
    1580 
    1581                 return false;
    1582         }
    1583 
    1584         function check_link_elements($data) {
    1585                 if (preg_match_all('/<link (.*)>/siU', $data, $matches)) {
    1586                         foreach($matches[1] as $match) {
    1587                                 if (preg_match('/type=[\'|"]?(application\/rss\+xml|application\/atom\+xml|application\/rdf\+xml|application\/xml\+rss|application\/xml\+atom|application\/xml\+rdf|application\/xml|application\/x\.atom\+xml|text\/xml)[\'|"]?/iU', $match, $type)) {
    1588                                         $href = $this->get_attribute($match, 'href');
    1589                                         if (!empty($href[1])) {
    1590                                                 $href = $this->absolutize_url($href[1], $this->parsed_url);
    1591                                                 if ($this->is_feed($href)) {
    1592                                                         return $href;
    1593                                                 }
    1594                                         }
    1595                                 }
    1596                         }
    1597                 } else return false;
    1598         }
    1599 
    1600         function check_link_extension($array) {
    1601                 foreach ($array as $value) {
    1602                         $parsed = @parse_url($value);
    1603                         if (isset($parsed['path'])) {
    1604                                 $ext = strtolower(pathinfo($parsed['path'], PATHINFO_EXTENSION));
    1605                                 if (($ext == 'rss' || $ext == 'rdf' || $ext == 'xml' || $ext == 'atom') && $this->is_feed($value)) {
    1606                                         return $this->absolutize_url($value, $this->parsed_url);
    1607                                 }
    1608                         }
    1609                 }
    1610                 return false;
    1611         }
    1612 
    1613         function check_link_body($array) {
    1614                 foreach ($array as $value) {
    1615                         $value2 = @parse_url($value);
    1616                         if (!empty($value2['path'])) {
    1617                                 if (strlen(pathinfo($value2['path'], PATHINFO_EXTENSION)) > 0) {
    1618                                         $value3 = substr_replace($value, '', strpos($value, $value2['path'])+strpos($value2['path'], pathinfo($value2['path'], PATHINFO_EXTENSION))-1, strlen(pathinfo($value2['path'], PATHINFO_EXTENSION))+1);
    1619                                 } else {
    1620                                         $value3 = $value;
    1621                                 }
    1622                                 if ((stristr($value3, 'rss') || stristr($value3, 'rdf') || stristr($value3, 'xml') || stristr($value3, 'atom') || stristr($value3, 'feed')) && $this->is_feed($value)) {
    1623                                         return $this->absolutize_url($value, $this->parsed_url);
    1624                                 }
    1625                         }
    1626                 }
    1627                 return false;
    1628         }
    1629 
    1630         function get_links($data) {
    1631                 if (preg_match_all('/href="(.*)"/iU', $data, $matches)) {
    1632                         $this->parse_links($matches);
    1633                 }
    1634                 if (preg_match_all('/href=\'(.*)\'/iU', $data, $matches)) {
    1635                         $this->parse_links($matches);
    1636                 }
    1637                 if (preg_match_all('/href=(.*)[ |\/|>]/iU', $data, $matches)) {
    1638                         foreach ($matches[1] as $key => $value) {
    1639                                 if (substr($value, 0, 1) == '"' || substr($value, 0, 1) == "'") {
    1640                                         unset($matches[1][$key]);
    1641                                 }
    1642                         }
    1643                         $this->parse_links($matches);
    1644                 }
    1645                 if (!empty($this->local) || !empty($this->elsewhere)) {
    1646                         $this->local = array_unique($this->local);
    1647                         $this->elsewhere = array_unique($this->elsewhere);
    1648                         return true;
    1649                 } else return false;
    1650         }
    1651 
    1652         function parse_links($matches) {
    1653                 foreach ($matches[1] as $match) {
    1654                         if (strtolower(substr($match, 0, 11)) != 'javascript:') {
    1655                                 $parsed = @parse_url($match);
    1656                                 if (!isset($parsed['host']) || $parsed['host'] == $this->parsed_url['host']) {
    1657                                         $this->local[] = $this->absolutize_url($match, $this->parsed_url);
    1658                                 } else {
    1659                                         $this->elsewhere[] = $this->absolutize_url($match, $this->parsed_url);
    1660                                 }
    1661                         }
    1662                 }
    1663         }
    1664 
    1665         function is_feed($data, $is_url = true) {
    1666                 if ($is_url) {
    1667                         $data = $this->get_file($data);
    1668                 }
    1669                 if (stristr($data, '<!DOCTYPE HTML')) {
    1670                         return false;
    1671                 }
    1672                 else if (stristr($data, '<rss') || stristr($data, '<rdf:RDF') || preg_match('/<([a-z0-9]+\:)?feed/mi', $data)) {
    1673                         return true;
    1674                 } else {
    1675                         return false;
    1676                 }
    1677         }
    1678 
    1679         function absolutize_url($href, $location) {
    1680                 @$href_parts = parse_url($href);
    1681                 if (!empty($href_parts['scheme'])) {
    1682                         return $href;
    1683                 } else {
    1684                         if (isset($location['host'])) {
    1685                                 $full_url = $location['scheme'] . '://' . $location['host'];
    1686                         } else {
    1687                                 $full_url = '';
    1688                         }
    1689                         if (isset($location['port'])) {
    1690                                 $full_url .= ':' . $location['port'];
    1691                         }
    1692                         if (!empty($href_parts['path'])) {
    1693                                 if (substr($href_parts['path'], 0, 1) == '/') {
    1694                                         $full_url .= $href_parts['path'];
    1695                                 } else if (!empty($location['path'])) {
    1696                                         $full_url .= dirname($location['path'] . 'a') . '/' . $href_parts['path'];
    1697                                 } else {
    1698                                         $full_url .= $href_parts['path'];
    1699                                 }
    1700                         } else if (!empty($location['path'])) {
    1701                                 $full_url .= $location['path'];
    1702                         } else {
    1703                                 $full_url .= '/';
    1704                         }
    1705                         if (!empty($href_parts['query'])) {
    1706                                 $full_url .= '?' . $href_parts['query'];
    1707                         } else if (!empty($location['query'])) {
    1708                                 $full_url .= '?' . $location['query'];
    1709                         }
    1710                         if (!empty($href_parts['fragment'])) {
    1711                                 $full_url .= '#' . $href_parts['fragment'];
    1712                         } else if (!empty($location['fragment'])) {
    1713                                 $full_url .= '#' . $location['fragment'];
    1714                         }
    1715                         return $full_url;
    1716                 }
    1717         }
    1718 
    1719 
    1720 
    1721 
    1722         /****************************************************
    1723         DISPLAY IMAGES
    1724         Some websites have a setting that blocks images from being loaded
    1725         into other pages.  This gets around those blocks by spoofing the referrer.
    1726         ****************************************************/
    1727         function display_image($image_url) {
    1728                 $image = $this->get_file(urldecode($image_url));
    1729                 $suffix = pathinfo($image_url, PATHINFO_EXTENSION);
    1730 
    1731                 switch($suffix) {
    1732                         case 'bmp':
    1733                                 $mime='image/bmp';
    1734                                 break;
    1735                         case 'gif':
    1736                                 $mime='image/gif';
    1737                                 break;
    1738                         case 'ico':
    1739                                 $mime='image/icon';
    1740                                 break;
    1741                         case 'jpe':
    1742                         case 'jpg':
    1743                         case 'jpeg':
    1744                                 $mime='image/jpeg';
    1745                                 break;
    1746                         case 'jfif':
    1747                                 $mime='image/pipeg';
    1748                                 break;
    1749                         case 'png':
    1750                                 $mime='image/png';
    1751                                 break;
    1752                         case 'tif':
    1753                         case 'tiff':
    1754                                 $mime='image/tiff';
    1755                                 break;
    1756                         default:
    1757                                 $mime='image';
    1758                 }
    1759 
    1760                 header('Content-type: ' . $mime);
    1761                 echo $image;
    1762                 //echo $image_url;
    1763                 exit;
    1764         }
    1765 
    1766 
    1767 
    1768 
    1769         /****************************************************
    1770         DELETE OUTDATED CACHE FILES
    1771         Copyright 2004 by "adam at roomvoter dot com". This material
    1772         may be distributed only subject to the terms and conditions set
    1773         forth in the Open Publication License, v1.0 or later (the latest
    1774         version is presently available at http://www.opencontent.org/openpub/).
    1775         This function deletes cache files that have not been used in a hour.
    1776         ****************************************************/
    1777         function clear_cache($path, $max_minutes=60) {
    1778                 if (is_dir($path) ) {
    1779                         $handle = opendir($path);
    1780                         while (false !== ($file = readdir($handle))) {
    1781                                 if ($file != '.' && $file != '..' && pathinfo($file, PATHINFO_EXTENSION) == 'spc') {
    1782                                         $diff = (time() - filemtime("$path/$file"))/60;
    1783                                         if ($diff > $max_minutes) unlink("$path/$file");
    1784                                 }
    1785                         }
    1786                         closedir($handle);
    1787                 }
    1788         }
    1789 
    1790 
    1791 
    1792 
    1793         /****************************************************
    1794         OPENS A FILE, WITH EITHER FOPEN OR CURL
    1795         ****************************************************/
    1796         function get_file($url) {
    1797                 if (substr($url, 0, 7) == 'http://' && extension_loaded('curl')) {
    1798                         $gch = curl_init();
    1799                         curl_setopt ($gch, CURLOPT_URL, $url);
    1800                         curl_setopt ($gch, CURLOPT_HEADER, 0);
    1801                         curl_setopt ($gch, CURLOPT_FOLLOWLOCATION, 1);
    1802                         curl_setopt ($gch, CURLOPT_TIMEOUT, 10);
    1803                         curl_setopt ($gch, CURLOPT_RETURNTRANSFER, 1);
    1804                         curl_setopt ($gch, CURLOPT_REFERER, $url);
    1805                         curl_setopt ($gch, CURLOPT_USERAGENT, $this->useragent);
    1806                         $data = curl_exec ($gch);
    1807                         curl_close ($gch);
    1808                 } else {
    1809                         $old_ua = ini_get('user_agent');
    1810                         ini_set('user_agent', $this->useragent);
    1811                         if ($fp = fopen($url, 'r')) {
    1812                                 stream_set_blocking($fp, false);
    1813                                 stream_set_timeout($fp, 10);
    1814                                 $status = socket_get_status($fp);
    1815                                 $data = '';
    1816                                 while (!feof($fp) && !$status['timed_out'])     {
    1817                                         $data .= fread($fp, 2048);
    1818                                         $status = socket_get_status($fp);
    1819                                 }
    1820                                 if ($status['timed_out'])
    1821                                         return false;
    1822                                 fclose($fp);
    1823                         } else return false;
    1824                         ini_set('user_agent', $old_ua);
    1825                 }
    1826                 return $data;
    1827         }
    1828 
    1829 
    1830 
    1831 
    1832         /****************************************************
    1833         CHECKS IF A FILE IS WRITEABLE, OR CREATEABLE
    1834         ****************************************************/
    1835         function is_writeable_createable($file) {
    1836                 if (file_exists($file))
    1837                         return is_writeable($file);
    1838                 else
    1839                         return is_writeable(dirname($file));
    1840         }
    1841 
    1842 
    1843 
    1844 
    1845         /****************************************************
    1846         GET ATTRIBUTE
    1847         ****************************************************/
    1848         function get_attribute($data, $attribute_name) {
    1849                 if (preg_match("/$attribute_name='(.*)'/iU", $data, $match)) {
    1850                         return $match;
    1851                 } else if (preg_match("/$attribute_name=\"(.*)\"/iU", $data, $match)) {
    1852                         return $match;
    1853                 } else if (preg_match("/$attribute_name=(.*)[ |\/|>]/iU", $data, $match)) {
    1854                         return $match;
    1855                 }
    1856         }
    1857 
    1858 
    1859 
    1860 
    1861         /****************************************************
    1862         CALLBACK FUNCTION TO DEAL WITH CDATA WITHIN CDATA
    1863         ****************************************************/
    1864         function cdata_in_cdata($match) {
    1865                 $match[3] = preg_replace_callback('/<!\[CDATA\[(.*)\]\]>/msiU', array(&$this, 'real_cdata_in_cdata'), $match[3]);
    1866                 return "<$match[1]$match[2]><![CDATA[$match[3]]]></$match[1]>";
    1867         }
    1868 
    1869 
    1870 
    1871 
    1872         /****************************************************
    1873         CALLBACK FUNCTION TO REALLY DEAL WITH CDATA WITHIN CDATA
    1874         ****************************************************/
    1875         function real_cdata_in_cdata($match) {
    1876                 return htmlentities($match[1], ENT_NOQUOTES, $this->encoding);
    1877         }
    1878 
    1879 
    1880 
    1881 
    1882         /****************************************************
    1883         ADD DATA TO XMLDATA
    1884         ****************************************************/
    1885         function do_add_content(&$array, $data) {
    1886                 if ($this->is_first) {
    1887                         $array['data'] = $data;
    1888                         $array['attribs'] = $this->attribs;
    1889                 } else $array['data'] .= $data;
    1890         }
    1891 
    1892 
    1893 
    1894 
    1895         /****************************************************
    1896         PARSE XMLDATA
    1897         ****************************************************/
    1898         function parse_xml_data_array() {
    1899                 // Feed level xml:base
    1900                 if (!empty($this->xmldata['feeddata']['attribs']['XML:BASE'])) {
    1901                         $this->feed_xmlbase = parse_url($this->xmldata['feeddata']['attribs']['XML:BASE']);
    1902                 }
    1903                 else if (!empty($this->xmldata['feeddata']['attribs'][$this->namespaces['xml'] . ':BASE'])) {
    1904                         $this->feed_xmlbase = parse_url($this->xmldata['feeddata']['attribs'][$this->namespaces['xml'] . ':BASE']);
    1905                 }
    1906                 else if (substr($this->rss_url, 0, 28) == 'http://feeds.feedburner.com/' && !empty($this->xmldata['info']['link'][0]['data'])) {
    1907                         $this->feed_xmlbase = parse_url($this->xmldata['info']['link'][0]['data']);
    1908                 } else {
    1909                         $this->feed_xmlbase = $this->parsed_url;
    1910                 }
    1911                
    1912                 // Feed Info
    1913                 if (isset($this->xmldata['feedinfo']['type'])) {
    1914                         $this->data['feedinfo'] = $this->xmldata['feedinfo'];
    1915                 }
    1916                
    1917                 // Feed Title
    1918                 if (!empty($this->xmldata['info']['title']['data'])) {
    1919                         $this->data['info']['title'] = $this->sanitise($this->xmldata['info']['title']['data'], $this->xmldata['info']['title']['attribs']);
    1920                 }
    1921                
    1922                 // Feed Link(s)
    1923                 if (!empty($this->xmldata['info']['link'])) {
    1924                         foreach ($this->xmldata['info']['link'] as $num => $link) {
    1925                                 if (empty($link['attribs']['REL']) || $link['attribs']['REL'] == 'alternate') {
    1926                                         if (empty($link['data'])) {
    1927                                                 $this->data['info']['link'][$num] = $this->sanitise($link['attribs']['HREF'], $link['attribs'], true);
    1928                                         } else {
    1929                                                 $this->data['info']['link'][$num] = $this->sanitise($link['data'], $link['attribs'], true);
    1930                                         }
    1931                                 }
    1932                         }
    1933                 }
    1934                
    1935                 // Feed Description
    1936                 if (!empty($this->xmldata['info']['description']['data'])) {
    1937                         $this->data['info']['description'] = $this->sanitise($this->xmldata['info']['description']['data'], $this->xmldata['info']['description']['attribs']);
    1938                 }
    1939                 else if (!empty($this->xmldata['info']['dc:description']['data'])) {
    1940                         $this->data['info']['description'] = $this->sanitise($this->xmldata['info']['dc:description']['data'], $this->xmldata['info']['dc:description']['attribs']);
    1941                 }
    1942                 else if (!empty($this->xmldata['info']['tagline']['data'])) {
    1943                         $this->data['info']['description'] = $this->sanitise($this->xmldata['info']['tagline']['data'], $this->xmldata['info']['tagline']['attribs']);
    1944                 }
    1945                 else if (!empty($this->xmldata['info']['subtitle']['data'])) {
    1946                         $this->data['info']['description'] = $this->sanitise($this->xmldata['info']['subtitle']['data'], $this->xmldata['info']['subtitle']['attribs']);
    1947                 }
    1948                
    1949                 // Feed Language
    1950                 if (!empty($this->xmldata['info']['language']['data'])) {
    1951                         $this->data['info']['language'] = $this->sanitise($this->xmldata['info']['language']['data'], $this->xmldata['info']['language']['attribs']);
    1952                 }
    1953                
    1954                 // Feed Copyright
    1955                 if (!empty($this->xmldata['info']['copyright']['data'])) {
    1956                         $this->data['info']['copyright'] = $this->sanitise($this->xmldata['info']['copyright']['data'], $this->xmldata['info']['copyright']['attribs']);
    1957                 }
    1958                
    1959                 // Feed Image
    1960                 if (!empty($this->xmldata['info']['image']['title']['data'])) {
    1961                         $this->data['info']['image']['title'] = $this->sanitise($this->xmldata['info']['image']['title']['data'], $this->xmldata['info']['image']['title']['attribs']);
    1962                 }
    1963                 if (!empty($this->xmldata['info']['image']['url']['data'])) {
    1964                         $this->data['info']['image']['url'] = $this->sanitise($this->xmldata['info']['image']['url']['data'], $this->xmldata['info']['image']['url']['attribs'], true);
    1965                 }
    1966                 else if (!empty($this->xmldata['info']['logo']['data'])) {
    1967                         $this->data['info']['image']['url'] = $this->sanitise($this->xmldata['info']['logo']['data'], $this->xmldata['info']['logo']['attribs'], true);
    1968                 }
    1969                 if (!empty($this->xmldata['info']['image']['link']['data'])) {
    1970                         $this->data['info']['image']['link'] = $this->sanitise($this->xmldata['info']['image']['link']['data'], $this->xmldata['info']['image']['link']['attribs'], true);
    1971                 }
    1972                 if (!empty($this->xmldata['info']['image']['width']['data'])) {
    1973                         $this->data['info']['image']['width'] = $this->sanitise($this->xmldata['info']['image']['width']['data'], $this->xmldata['info']['image']['width']['attribs']);
    1974                 }
    1975                 if (!empty($this->xmldata['info']['image']['height']['data'])) {
    1976                         $this->data['info']['image']['height'] = $this->sanitise($this->xmldata['info']['image']['height']['data'], $this->xmldata['info']['image']['height']['attribs']);
    1977                 }
    1978                
    1979                 // Items
    1980                 if (!empty($this->xmldata['items'])) {
    1981                         foreach ($this->xmldata['items'] as $num => $item) {
    1982                                 // Item level xml:base
    1983                                 if (!empty($item['attribs']['XML:BASE'])) {
    1984                                         $this->item_xmlbase = parse_url($this->absolutize_url($item['attribs']['XML:BASE'], $this->feed_xmlbase));
    1985                                 }
    1986                                 else if (!empty($item['attribs'][$this->namespaces['xml'] . ':BASE'])) {
    1987                                         $this->item_xmlbase = parse_url($this->absolutize_url($item['attribs'][$this->namespaces['xml'] . ':BASE'], $this->feed_xmlbase));
    1988                                 }
    1989                                
    1990                                 // Clear vars
    1991                                 $id = null;
    1992                                 $title = null;
    1993                                 $description = null;
    1994                                 $categories = array();
    1995                                 $author = array();
    1996                                 $date = null;
    1997                                 $links = array();
    1998                                 $enclosures = array();
    1999        
    2000                                 // Title
    2001                                 if (!empty($item['title']['data'])) {
    2002                                         $title = $this->sanitise($item['title']['data'], $item['title']['attribs']);
    2003                                 }
    2004                                 else if (!empty($item['dc:title']['data'])) {
    2005                                         $title = $this->sanitise($item['dc:title']['data'], $item['dc:title']['attribs']);
    2006                                 }
    2007                                
    2008                                 // Description
    2009                                 if (!empty($item['content']['data'])) {
    2010                                         $description = $this->sanitise($item['content']['data'], $item['content']['attribs']);
    2011                                 }
    2012                                 else if (!empty($item['encoded']['data'])) {
    2013                                         $description = $this->sanitise($item['encoded']['data'], $item['encoded']['attribs']);
    2014                                 }
    2015                                 else if (!empty($item['summary']['data'])) {
    2016                                         $description = $this->sanitise($item['summary']['data'], $item['summary']['attribs']);
    2017                                 }
    2018                                 else if (!empty($item['description']['data'])) {
    2019                                         $description = $this->sanitise($item['description']['data'], $item['description']['attribs']);
    2020                                 }
    2021                                 else if (!empty($item['dc:description']['data'])) {
    2022                                         $description = $this->sanitise($item['dc:description']['data'], $item['dc:description']['attribs']);
    2023                                 }
    2024                                 else if (!empty($item['longdesc']['data'])) {
    2025                                         $description = $this->sanitise($item['longdesc']['data'], $item['longdesc']['attribs']);
    2026                                 }
    2027                                
    2028                                 // Link
    2029                                 if (!empty($item['link'])) {
    2030                                         foreach ($item['link'] as $link) {
    2031                                                 if (empty($link['attribs']['REL']) || $link['attribs']['REL'] == 'alternate') {
    2032                                                         if (empty($link['data'])) {
    2033                                                                 $links[sizeof($links)] = $this->sanitise($link['attribs']['HREF'], $link['attribs'], true);
    2034                                                         } else {
    2035                                                                 $links[sizeof($links)] = $this->sanitise($link['data'], $link['attribs'], true);
    2036                                                         }
    2037                                                 } else if ($link['attribs']['REL'] == 'enclosure' && !empty($link['attribs']['HREF'])) {
    2038                                                         $href = null;
    2039                                                         $type = null;
    2040                                                         $length = null;
    2041                                                         $href = $this->sanitise($link['attribs']['HREF'], $link['attribs'], true);
    2042                                                         if (!empty($link['attribs']['TYPE'])) {
    2043                                                                 $type = $this->sanitise($link['attribs']['TYPE'], $link['attribs']);
    2044                                                         }
    2045                                                         if (!empty($link['attribs']['LENGTH'])) {
    2046                                                                 $length = $this->sanitise($link['attribs']['LENGTH'], $link['attribs']);
    2047                                                         }
    2048                                                         $enclosures[] = new SimplePie_Enclosure($href, $type, $length);
    2049                                                 }
    2050                                         }
    2051                                 }
    2052                                
    2053                                 // Enclosures
    2054                                 if (!empty($item['enclosure'])) {
    2055                                         foreach ($item['enclosure'] as $enclosure) {
    2056                                                 if (!empty($enclosure['attribs']['URL'])) {
    2057                                                         $href = null;
    2058                                                         $type = null;
    2059                                                         $length = null;
    2060                                                         $href = $this->sanitise($enclosure['attribs']['URL'], $enclosure['attribs'], true);
    2061                                                         if (!empty($enclosure['attribs']['TYPE'])) {
    2062                                                                 $type = $this->sanitise($enclosure['attribs']['TYPE'], $enclosure['attribs']);
    2063                                                         }
    2064                                                         if (!empty($enclosure['attribs']['LENGTH'])) {
    2065                                                                 $length = $this->sanitise($enclosure['attribs']['LENGTH'], $enclosure['attribs']);
    2066                                                         }
    2067                                                         $enclosures[] = new SimplePie_Enclosure($href, $type, $length);
    2068                                                 }
    2069                                         }
    2070                                 }
    2071                                
    2072                                 // ID
    2073                                 if (!empty($item['guid']['data'])) {
    2074                                         if (empty($item['guid']['attribs']['ISPERMALINK']) || strtolower($item['guid']['attribs']['ISPERMALINK']) != 'false') {
    2075                                                 $links[sizeof($links)] = $this->sanitise($item['guid']['data'], $item['guid']['attribs']);
    2076                                         }
    2077                                         $id = $this->sanitise($item['guid']['data'], $item['guid']['attribs']);
    2078                                 }
    2079                                 else if (!empty($item['id']['data'])) {
    2080                                         $id = $this->sanitise($item['id']['data'], $item['id']['attribs']);
    2081                                 }
    2082                                
    2083                                 // Date
    2084                                 if (!empty($item['pubdate']['data'])) {
    2085                                         $date = $this->parse_date($this->sanitise($item['pubdate']['data'], $item['pubdate']['attribs']));
    2086                                 }
    2087                                 else if (!empty($item['dc:date']['data'])) {
    2088                                         $date = $this->parse_date($this->sanitise($item['dc:date']['data'], $item['dc:date']['attribs']));
    2089                                 }
    2090                                 else if (!empty($item['issued']['data'])) {
    2091                                         $date = $this->parse_date($this->sanitise($item['issued']['data'], $item['issued']['attribs']));
    2092                                 }
    2093                                 else if (!empty($item['published']['data'])) {
    2094                                         $date = $this->parse_date($this->sanitise($item['published']['data'], $item['published']['attribs']));
    2095                                 }
    2096                                 else if (!empty($item['modified']['data'])) {
    2097                                         $date = $this->parse_date($this->sanitise($item['modified']['data'], $item['modified']['attribs']));
    2098                                 }
    2099                                 else if (!empty($item['updated']['data'])) {
    2100                                         $date = $this->parse_date($this->sanitise($item['updated']['data'], $item['updated']['attribs']));
    2101                                 }
    2102                                
    2103                                 // Categories
    2104                                 if (!empty($item['category'])) {
    2105                                         foreach ($item['category'] as $category) {
    2106                                                 $categories[sizeof($categories)] = $this->sanitise($category['data'], $category['attribs']);
    2107                                         }
    2108                                 }
    2109                                 if (!empty($item['subject'])) {
    2110                                         foreach ($item['subject'] as $category) {
    2111                                                 $categories[sizeof($categories)] = $this->sanitise($category['data'], $category['attribs']);
    2112                                         }
    2113                                 }
    2114                                
    2115                                 // Author
    2116                                 $authors = array();
    2117                                 if (!empty($item['creator'])) {
    2118                                         foreach($item['creator'] as $creator) {
    2119                                                 $authors[] = new SimplePie_Author($this->sanitise($creator['data'], $creator['attribs']), null, null);
    2120                                         }
    2121                                 }
    2122                                 if (!empty($item['author'])) {
    2123                                         foreach($item['author'] as $author) {
    2124                                                 $name = null;
    2125                                                 $link = null;
    2126                                                 $email = null;
    2127                                                 if (!empty($author['name'])) {
    2128                                                         $name = $this->sanitise($author['name']['data'], $author['name']['attribs']);
    2129                                                 }
    2130                                                 if (!empty($author['url'])) {
    2131                                                         $link = $this->sanitise($author['url']['data'], $author['url']['attribs'], true);
    2132                                                 }
    2133                                                 else if (!empty($author['uri'])) {
    2134                                                         $link = $this->sanitise($author['uri']['data'], $author['uri']['attribs'], true);
    2135                                                 }
    2136                                                 else if (!empty($author['homepage'])) {
    2137                                                         $link = $this->sanitise($author['homepage']['data'], $author['homepage']['attribs'], true);
    2138                                                 }
    2139                                                 if (!empty($author['email'])) {
    2140                                                         $email = $this->sanitise($author['email']['data'], $author['email']['attribs']);
    2141                                                 }
    2142                                                 if (!empty($author['rss'])) {
    2143                                                         $sane = $this->sanitise($author['rss']['data'], $author['rss']['attribs']);
    2144                                                         if (preg_match('/(.*)@(.*) \((.*)\)/msiU', $sane, $matches)) {
    2145                                                                 $name = trim($matches[3]);
    2146                                                                 $email = trim("$matches[1]@$matches[2]");
    2147                                                         } else {
    2148                                                                 $email = $sane;
    2149                                                         }
    2150                                                 }
    2151                                                 $authors[] = new SimplePie_Author($name, $link, $email);
    2152                                         }
    2153                                 }
    2154                                 $this->data['items'][] = new SimplePie_Item($id, $title, $description, array_unique($categories), array_unique($authors), $date, array_unique($links), array_unique($enclosures));
    2155                         } // End Items
    2156                 }
    2157                 unset($this->xmldata);
    2158         } // End parse_xml_data_array();
    2159        
    2160         function sanitise($data, $attribs, $is_url = false) {
    2161                 $this->attribs = $attribs;
    2162                 if (isset($this->data['feedinfo']['type']) && $this->data['feedinfo']['type'] == 'Atom') {
    2163                         if (!empty($attribs['MODE']) && $attribs['MODE'] == 'base64') {
    2164                                 $data = base64_decode($data);
    2165                         } else if ((!empty($attribs['MODE']) && $attribs['MODE'] == 'escaped' || !empty($attribs['TYPE']) && ($attribs['TYPE'] == 'html' || $attribs['TYPE'] == 'text/html')) && (empty($attribs['SPENCODED']) || $attribs['SPENCODED'] != 'false')) {
    2166                                 $data = $this->entities_decode($data);
    2167                         }
    2168                         if (!empty($attribs['TYPE']) && ($attribs['TYPE'] == 'xhtml' || $attribs['TYPE'] == 'application/xhtml+xml')) {
    2169                                 if ($this->remove_div) {
    2170                                         $data = preg_replace('/<div( .*)?>/msiU', '', strrev(preg_replace('/>vid\/</i', '', strrev($data), 1)), 1);
    2171                                 } else {
    2172                                         $data = preg_replace('/<div( .*)?>/msiU', '<div>', $data, 1);
    2173                                 }
    2174                                 $data = preg_replace("/<(\/)?$this->xhtml_prefix:/msiU", '<\\1', $data);
    2175                         }
    2176                 } else {
    2177                         if (empty($attribs['SPENCODED']) || $attribs['SPENCODED'] != 'false') {
    2178                                 $data = $this->entities_decode($data);
    2179                         }
    2180                 }
    2181                 $data = trim($data);
    2182                 $data = str_replace(' spencoded="false">', '>', $data);
    2183 
    2184                 // Strip out HTML tags and attributes that might cause various security problems.
    2185                 // Based on recommendations by Mark Pilgrim at:
    2186                 // http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely
    2187                 if ($this->strip_htmltags) {
    2188                         $tags_to_strip = explode(',', $this->strip_htmltags);
    2189                         foreach ($tags_to_strip as $tag) {
    2190                                 if ($this->encode_instead_of_strip) {
    2191                                         // For encoded angled brackets (do these first)
    2192                                         $data = preg_replace('/&lt;(!)?(\/)?'. trim($tag) .'(\w|\s|=|-|"|\'|&quot;|:|;|%|\/|\.|\?|&|,|#|!|\+|\(|\))*&gt;/i', '&amp;lt;\\0&amp;gt;', $data);
    2193                                         $data = str_replace('&amp;lt;&lt;', '&amp;lt;', $data);
    2194                                         $data = str_replace('&gt;&amp;gt;', '&amp;gt;', $data);
    2195 
    2196                                         // For angled brackets
    2197                                         $data = preg_replace('/<(!)?(\/)?'. trim($tag) .'(\w|\s|=|-|"|\'|&quot;|:|;|%|\/|\.|\?|&|,|#|!|\+|\(|\))*>/i', '&lt;\\0&gt;', $data);
    2198                                         $data = str_replace('&lt;<', '&lt;', $data);
    2199                                         $data = str_replace('>&gt;', '&gt;', $data);
    2200                                 }
    2201                                 else {
    2202                                         $data = preg_replace('/(&lt;|<)(!)?(\/)?'. trim($tag) .'(\w|\s|=|-|"|\'|&quot;|:|;|%|\/|\.|\?|&|,|#|!|\+|\(|\))*(&gt;|>)/i', '', $data);
    2203                                 }
    2204                         }
    2205                 }
    2206 
    2207                 if ($this->strip_attributes) {
    2208                         $attribs_to_strip = explode(',', $this->strip_attributes);
    2209                         foreach ($attribs_to_strip as $attrib) {
    2210                                 $data = preg_replace('/ '. trim($attrib) .'=(\'|&apos;|"|&quot;)?(\w|\s|=|-|:|;|\/|\.|\?|&|,|#|!|\(|\)|\'|&apos;|<|>|\+|{|})*(\'|&apos;|"|&quot;)?/i', '', $data);
    2211                         }
    2212                 }