Completed
Push — master ( 9c4a34...7640d6 )
by Mia
03:09
created

SimplePie_Misc::encoding()   F

Complexity

Conditions 808
Paths 808

Size

Total Lines 1064
Code Lines 1059

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 429496.7295

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 1064
ccs 0
cts 1060
cp 0
rs 2
cc 808
eloc 1059
nc 808
nop 1
crap 429496.7295

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * SimplePie
5
 *
6
 * A PHP-Based RSS and Atom Feed Framework.
7
 * Takes the hard work out of managing a complete RSS/Atom solution.
8
 *
9
 * Please note: This file is automatically generated by a build script. The
10
 * full original source is always available from http://simplepie.org/
11
 *
12
 * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
13
 * All rights reserved.
14
 *
15
 * Redistribution and use in source and binary forms, with or without modification, are
16
 * permitted provided that the following conditions are met:
17
 *
18
 *     * Redistributions of source code must retain the above copyright notice, this list of
19
 *       conditions and the following disclaimer.
20
 *
21
 *     * Redistributions in binary form must reproduce the above copyright notice, this list
22
 *       of conditions and the following disclaimer in the documentation and/or other materials
23
 *       provided with the distribution.
24
 *
25
 *     * Neither the name of the SimplePie Team nor the names of its contributors may be used
26
 *       to endorse or promote products derived from this software without specific prior
27
 *       written permission.
28
 *
29
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
30
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
31
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
32
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
34
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
36
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37
 * POSSIBILITY OF SUCH DAMAGE.
38
 *
39
 * @package SimplePie
40
 * @version 1.3.1
41
 * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
42
 * @author Ryan Parman
43
 * @author Geoffrey Sneddon
44
 * @author Ryan McCue
45
 * @link http://simplepie.org/ SimplePie
46
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
47
 */
48
49
define('SIMPLEPIE_NAME', 'SimplePie');
50
define('SIMPLEPIE_VERSION', '1.3.1');
51
define('SIMPLEPIE_BUILD', '20121030175911');
52
define('SIMPLEPIE_URL', 'http://simplepie.org');
53
define('SIMPLEPIE_USERAGENT', SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION . ' (Feed Parser; ' . SIMPLEPIE_URL . '; Allow like Gecko) Build/' . SIMPLEPIE_BUILD);
54
define('SIMPLEPIE_LINKBACK', '<a href="' . SIMPLEPIE_URL . '" title="' . SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . '">' . SIMPLEPIE_NAME . '</a>');
55
define('SIMPLEPIE_LOCATOR_NONE', 0);
56
define('SIMPLEPIE_LOCATOR_AUTODISCOVERY', 1);
57
define('SIMPLEPIE_LOCATOR_LOCAL_EXTENSION', 2);
58
define('SIMPLEPIE_LOCATOR_LOCAL_BODY', 4);
59
define('SIMPLEPIE_LOCATOR_REMOTE_EXTENSION', 8);
60
define('SIMPLEPIE_LOCATOR_REMOTE_BODY', 16);
61
define('SIMPLEPIE_LOCATOR_ALL', 31);
62
define('SIMPLEPIE_TYPE_NONE', 0);
63
define('SIMPLEPIE_TYPE_RSS_090', 1);
64
define('SIMPLEPIE_TYPE_RSS_091_NETSCAPE', 2);
65
define('SIMPLEPIE_TYPE_RSS_091_USERLAND', 4);
66
define('SIMPLEPIE_TYPE_RSS_091', 6);
67
define('SIMPLEPIE_TYPE_RSS_092', 8);
68
define('SIMPLEPIE_TYPE_RSS_093', 16);
69
define('SIMPLEPIE_TYPE_RSS_094', 32);
70
define('SIMPLEPIE_TYPE_RSS_10', 64);
71
define('SIMPLEPIE_TYPE_RSS_20', 128);
72
define('SIMPLEPIE_TYPE_RSS_RDF', 65);
73
define('SIMPLEPIE_TYPE_RSS_SYNDICATION', 190);
74
define('SIMPLEPIE_TYPE_RSS_ALL', 255);
75
define('SIMPLEPIE_TYPE_ATOM_03', 256);
76
define('SIMPLEPIE_TYPE_ATOM_10', 512);
77
define('SIMPLEPIE_TYPE_ATOM_ALL', 768);
78
define('SIMPLEPIE_TYPE_ALL', 1023);
79
define('SIMPLEPIE_CONSTRUCT_NONE', 0);
80
define('SIMPLEPIE_CONSTRUCT_TEXT', 1);
81
define('SIMPLEPIE_CONSTRUCT_HTML', 2);
82
define('SIMPLEPIE_CONSTRUCT_XHTML', 4);
83
define('SIMPLEPIE_CONSTRUCT_BASE64', 8);
84
define('SIMPLEPIE_CONSTRUCT_IRI', 16);
85
define('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32);
86
define('SIMPLEPIE_CONSTRUCT_ALL', 63);
87
define('SIMPLEPIE_SAME_CASE', 1);
88
define('SIMPLEPIE_LOWERCASE', 2);
89
define('SIMPLEPIE_UPPERCASE', 4);
90
define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*');
91
define('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*');
92
define('SIMPLEPIE_NAMESPACE_XML', 'http://www.w3.org/XML/1998/namespace');
93
define('SIMPLEPIE_NAMESPACE_ATOM_10', 'http://www.w3.org/2005/Atom');
94
define('SIMPLEPIE_NAMESPACE_ATOM_03', 'http://purl.org/atom/ns#');
95
define('SIMPLEPIE_NAMESPACE_RDF', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
96
define('SIMPLEPIE_NAMESPACE_RSS_090', 'http://my.netscape.com/rdf/simple/0.9/');
97
define('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/');
98
define('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/');
99
define('SIMPLEPIE_NAMESPACE_RSS_20', '');
100
define('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/');
101
define('SIMPLEPIE_NAMESPACE_DC_11', 'http://purl.org/dc/elements/1.1/');
102
define('SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO', 'http://www.w3.org/2003/01/geo/wgs84_pos#');
103
define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss');
104
define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/');
105
define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss');
106
define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2', 'http://video.search.yahoo.com/mrss');
107
define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3', 'http://video.search.yahoo.com/mrss/');
108
define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4', 'http://www.rssboard.org/media-rss');
109
define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5', 'http://www.rssboard.org/media-rss/');
110
define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd');
111
define('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml');
112
define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/');
113
define('SIMPLEPIE_FILE_SOURCE_NONE', 0);
114
define('SIMPLEPIE_FILE_SOURCE_REMOTE', 1);
115
define('SIMPLEPIE_FILE_SOURCE_LOCAL', 2);
116
define('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4);
117
define('SIMPLEPIE_FILE_SOURCE_CURL', 8);
118
define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16);
119
class SimplePie
120
{
121
    
122
    public $data = array();
123
    
124
    public $error;
125
    
126
    public $sanitize;
127
    
128
    public $useragent = SIMPLEPIE_USERAGENT;
129
    
130
    public $feed_url;
131
    
132
    public $file;
133
    
134
    public $raw_data;
135
    
136
    public $timeout = 10;
137
    
138
    public $force_fsockopen = false;
139
    
140
    public $force_feed = false;
141
    
142
    public $cache = true;
143
    
144
    public $cache_duration = 3600;
145
    
146
    public $autodiscovery_cache_duration = 604800; // 7 Days.
147
    
148
    public $cache_location = './cache';
149
    
150
    public $cache_name_function = 'md5';
151
    
152
    public $order_by_date = true;
153
    
154
    public $input_encoding = false;
155
    
156
    public $autodiscovery = SIMPLEPIE_LOCATOR_ALL;
157
    
158
    public $registry;
159
    
160
    public $max_checked_feeds = 10;
161
    
162
    public $all_discovered_feeds = array();
163
    
164
    public $image_handler = '';
165
    
166
    public $multifeed_url = array();
167
    
168
    public $multifeed_objects = array();
169
    
170
    public $config_settings = null;
171
    
172
    public $item_limit = 0;
173
    
174
    public $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
175
    
176
    public $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
177
    
178
    public function __construct()
179
    {
180
        if (version_compare(PHP_VERSION, '5.2', '<'))
181
        {
182
            trigger_error('PHP 4.x, 5.0 and 5.1 are no longer supported. Please upgrade to PHP 5.2 or newer.');
183
            die();
184
        }
185
        // Other objects, instances created here so we can set options on them
186
        $this->sanitize = new SimplePie_Sanitize();
187
        $this->registry = new SimplePie_Registry();
188
        if (func_num_args() > 0)
189
        {
190
            $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
191
            trigger_error('Passing parameters to the constructor is no longer supported. Please use set_feed_url(), set_cache_location(), and set_cache_location() directly.', $level);
192
            $args = func_get_args();
193
            switch (count($args)) {
194
                case 3:
195
                    $this->set_cache_duration($args[2]);
196
                case 2:
197
                    $this->set_cache_location($args[1]);
198
                case 1:
199
                    $this->set_feed_url($args[0]);
200
                    $this->init();
201
            }
202
        }
203
    }
204
    
205
    public function __toString()
206
    {
207
        return md5(serialize($this->data));
208
    }
209
    
210
    public function __destruct()
211
    {
212
        if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
213
        {
214
            if (!empty($this->data['items']))
215
            {
216
                foreach ($this->data['items'] as $item)
217
                {
218
                    $item->__destruct();
219
                }
220
                unset($item, $this->data['items']);
221
            }
222
            if (!empty($this->data['ordered_items']))
223
            {
224
                foreach ($this->data['ordered_items'] as $item)
225
                {
226
                    $item->__destruct();
227
                }
228
                unset($item, $this->data['ordered_items']);
229
            }
230
        }
231
    }
232
    
233
    public function force_feed($enable = false)
234
    {
235
        $this->force_feed = (bool) $enable;
236
    }
237
    
238
    public function set_feed_url($url)
239
    {
240
        $this->multifeed_url = array();
241
        if (is_array($url))
242
        {
243
            foreach ($url as $value)
244
            {
245
                $this->multifeed_url[] = $this->registry->call('Misc', 'fix_protocol', array($value, 1));
246
            }
247
        }
248
        else
249
        {
250
            $this->feed_url = $this->registry->call('Misc', 'fix_protocol', array($url, 1));
251
        }
252
    }
253
    
254
    public function set_file(&$file)
255
    {
256
        if ($file instanceof SimplePie_File)
257
        {
258
            $this->feed_url = $file->url;
259
            $this->file =& $file;
260
            return true;
261
        }
262
        return false;
263
    }
264
    
265
    public function set_raw_data($data)
266
    {
267
        $this->raw_data = $data;
268
    }
269
    
270
    public function set_timeout($timeout = 10)
271
    {
272
        $this->timeout = (int) $timeout;
273
    }
274
    
275
    public function force_fsockopen($enable = false)
276
    {
277
        $this->force_fsockopen = (bool) $enable;
278
    }
279
    
280
    public function enable_cache($enable = true)
281
    {
282
        $this->cache = (bool) $enable;
283
    }
284
    
285
    public function set_cache_duration($seconds = 3600)
286
    {
287
        $this->cache_duration = (int) $seconds;
288
    }
289
    
290
    public function set_autodiscovery_cache_duration($seconds = 604800)
291
    {
292
        $this->autodiscovery_cache_duration = (int) $seconds;
293
    }
294
    
295
    public function set_cache_location($location = './cache')
296
    {
297
        $this->cache_location = (string) $location;
298
    }
299
    
300
    public function enable_order_by_date($enable = true)
301
    {
302
        $this->order_by_date = (bool) $enable;
303
    }
304
    
305
    public function set_input_encoding($encoding = false)
306
    {
307
        if ($encoding)
308
        {
309
            $this->input_encoding = (string) $encoding;
310
        }
311
        else
312
        {
313
            $this->input_encoding = false;
314
        }
315
    }
316
    
317
    public function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL)
318
    {
319
        $this->autodiscovery = (int) $level;
320
    }
321
    
322
    public function &get_registry()
323
    {
324
        return $this->registry;
325
    }
326
    
327
    
328
    public function set_cache_class($class = 'SimplePie_Cache')
329
    {
330
        return $this->registry->register('Cache', $class, true);
331
    }
332
    
333
    public function set_locator_class($class = 'SimplePie_Locator')
334
    {
335
        return $this->registry->register('Locator', $class, true);
336
    }
337
    
338
    public function set_parser_class($class = 'SimplePie_Parser')
339
    {
340
        return $this->registry->register('Parser', $class, true);
341
    }
342
    
343
    public function set_file_class($class = 'SimplePie_File')
344
    {
345
        return $this->registry->register('File', $class, true);
346
    }
347
    
348
    public function set_sanitize_class($class = 'SimplePie_Sanitize')
349
    {
350
        return $this->registry->register('Sanitize', $class, true);
351
    }
352
    
353
    public function set_item_class($class = 'SimplePie_Item')
354
    {
355
        return $this->registry->register('Item', $class, true);
356
    }
357
    
358
    public function set_author_class($class = 'SimplePie_Author')
359
    {
360
        return $this->registry->register('Author', $class, true);
361
    }
362
    
363
    public function set_category_class($class = 'SimplePie_Category')
364
    {
365
        return $this->registry->register('Category', $class, true);
366
    }
367
    
368
    public function set_enclosure_class($class = 'SimplePie_Enclosure')
369
    {
370
        return $this->registry->register('Enclosure', $class, true);
371
    }
372
    
373
    public function set_caption_class($class = 'SimplePie_Caption')
374
    {
375
        return $this->registry->register('Caption', $class, true);
376
    }
377
    
378
    public function set_copyright_class($class = 'SimplePie_Copyright')
379
    {
380
        return $this->registry->register('Copyright', $class, true);
381
    }
382
    
383
    public function set_credit_class($class = 'SimplePie_Credit')
384
    {
385
        return $this->registry->register('Credit', $class, true);
386
    }
387
    
388
    public function set_rating_class($class = 'SimplePie_Rating')
389
    {
390
        return $this->registry->register('Rating', $class, true);
391
    }
392
    
393
    public function set_restriction_class($class = 'SimplePie_Restriction')
394
    {
395
        return $this->registry->register('Restriction', $class, true);
396
    }
397
    
398
    public function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer')
399
    {
400
        return $this->registry->register('Content_Type_Sniffer', $class, true);
401
    }
402
    
403
    public function set_source_class($class = 'SimplePie_Source')
404
    {
405
        return $this->registry->register('Source', $class, true);
406
    }
407
    
408
    
409
    public function set_useragent($ua = SIMPLEPIE_USERAGENT)
410
    {
411
        $this->useragent = (string) $ua;
412
    }
413
    
414
    public function set_cache_name_function($function = 'md5')
415
    {
416
        if (is_callable($function))
417
        {
418
            $this->cache_name_function = $function;
419
        }
420
    }
421
    
422
    public function set_stupidly_fast($set = false)
423
    {
424
        if ($set)
425
        {
426
            $this->enable_order_by_date(false);
427
            $this->remove_div(false);
428
            $this->strip_comments(false);
429
            $this->strip_htmltags(false);
430
            $this->strip_attributes(false);
431
            $this->set_image_handler(false);
432
        }
433
    }
434
    
435
    public function set_max_checked_feeds($max = 10)
436
    {
437
        $this->max_checked_feeds = (int) $max;
438
    }
439
    public function remove_div($enable = true)
440
    {
441
        $this->sanitize->remove_div($enable);
442
    }
443
    public function strip_htmltags($tags = '', $encode = null)
444
    {
445
        if ($tags === '')
446
        {
447
            $tags = $this->strip_htmltags;
448
        }
449
        $this->sanitize->strip_htmltags($tags);
450
        if ($encode !== null)
451
        {
452
            $this->sanitize->encode_instead_of_strip($tags);
453
        }
454
    }
455
    public function encode_instead_of_strip($enable = true)
456
    {
457
        $this->sanitize->encode_instead_of_strip($enable);
458
    }
459
    public function strip_attributes($attribs = '')
460
    {
461
        if ($attribs === '')
462
        {
463
            $attribs = $this->strip_attributes;
464
        }
465
        $this->sanitize->strip_attributes($attribs);
466
    }
467
    
468
    public function set_output_encoding($encoding = 'UTF-8')
469
    {
470
        $this->sanitize->set_output_encoding($encoding);
471
    }
472
    public function strip_comments($strip = false)
473
    {
474
        $this->sanitize->strip_comments($strip);
475
    }
476
    
477
    public function set_url_replacements($element_attribute = null)
478
    {
479
        $this->sanitize->set_url_replacements($element_attribute);
480
    }
481
    
482
    public function set_image_handler($page = false, $qs = 'i')
483
    {
484
        if ($page !== false)
485
        {
486
            $this->sanitize->set_image_handler($page . '?' . $qs . '=');
487
        }
488
        else
489
        {
490
            $this->image_handler = '';
491
        }
492
    }
493
    
494
    public function set_item_limit($limit = 0)
495
    {
496
        $this->item_limit = (int) $limit;
497
    }
498
    
499
    public function init()
500
    {
501
        // Check absolute bare minimum requirements.
502
        if (!extension_loaded('xml') || !extension_loaded('pcre'))
503
        {
504
            return false;
505
        }
506
        // Then check the xml extension is sane (i.e., libxml 2.7.x issue on PHP < 5.2.9 and libxml 2.7.0 to 2.7.2 on any version) if we don't have xmlreader.
507
        elseif (!extension_loaded('xmlreader'))
508
        {
509
            static $xml_is_sane = null;
510
            if ($xml_is_sane === null)
511
            {
512
                $parser_check = xml_parser_create();
513
                xml_parse_into_struct($parser_check, '<foo>&amp;</foo>', $values);
514
                xml_parser_free($parser_check);
515
                $xml_is_sane = isset($values[0]['value']);
516
            }
517
            if (!$xml_is_sane)
518
            {
519
                return false;
520
            }
521
        }
522
        if (method_exists($this->sanitize, 'set_registry'))
523
        {
524
            $this->sanitize->set_registry($this->registry);
525
        }
526
        // Pass whatever was set with config options over to the sanitizer.
527
        // Pass the classes in for legacy support; new classes should use the registry instead
528
        $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->registry->get_class('Cache'));
529
        $this->sanitize->pass_file_data($this->registry->get_class('File'), $this->timeout, $this->useragent, $this->force_fsockopen);
530
        if (!empty($this->multifeed_url))
531
        {
532
            $i = 0;
533
            $success = 0;
534
            $this->multifeed_objects = array();
535
            $this->error = array();
536
            foreach ($this->multifeed_url as $url)
537
            {
538
                $this->multifeed_objects[$i] = clone $this;
539
                $this->multifeed_objects[$i]->set_feed_url($url);
540
                $single_success = $this->multifeed_objects[$i]->init();
541
                $success |= $single_success;
542
                if (!$single_success)
543
                {
544
                    $this->error[$i] = $this->multifeed_objects[$i]->error();
545
                }
546
                $i++;
547
            }
548
            return (bool) $success;
549
        }
550
        elseif ($this->feed_url === null && $this->raw_data === null)
551
        {
552
            return false;
553
        }
554
        $this->error = null;
555
        $this->data = array();
556
        $this->multifeed_objects = array();
557
        $cache = false;
558
        if ($this->feed_url !== null)
559
        {
560
            $parsed_feed_url = $this->registry->call('Misc', 'parse_url', array($this->feed_url));
561
            // Decide whether to enable caching
562
            if ($this->cache && $parsed_feed_url['scheme'] !== '')
563
            {
564
                $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'));
565
            }
566
            // Fetch the data via SimplePie_File into $this->raw_data
567
            if (($fetched = $this->fetch_data($cache)) === true)
568
            {
569
                return true;
570
            }
571
            elseif ($fetched === false) {
572
                return false;
573
            }
574
            list($headers, $sniffed) = $fetched;
575
        }
576
        // Set up array of possible encodings
577
        $encodings = array();
578
        // First check to see if input has been overridden.
579
        if ($this->input_encoding !== false)
580
        {
581
            $encodings[] = $this->input_encoding;
582
        }
583
        $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity');
584
        $text_types = array('text/xml', 'text/xml-external-parsed-entity');
585
        // RFC 3023 (only applies to sniffed content)
586
        if (isset($sniffed))
587
        {
588
            if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml')
589
            {
590
                if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
591
                {
592
                    $encodings[] = strtoupper($charset[1]);
593
                }
594
                $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry)));
595
                $encodings[] = 'UTF-8';
596
            }
597
            elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml')
598
            {
599
                if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
600
                {
601
                    $encodings[] = $charset[1];
602
                }
603
                $encodings[] = 'US-ASCII';
604
            }
605
            // Text MIME-type default
606
            elseif (substr($sniffed, 0, 5) === 'text/')
607
            {
608
                $encodings[] = 'US-ASCII';
609
            }
610
        }
611
        // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1
612
        $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry)));
613
        $encodings[] = 'UTF-8';
614
        $encodings[] = 'ISO-8859-1';
615
        // There's no point in trying an encoding twice
616
        $encodings = array_unique($encodings);
617
        // Loop through each possible encoding, till we return something, or run out of possibilities
618
        foreach ($encodings as $encoding)
619
        {
620
            // Change the encoding to UTF-8 (as we always use UTF-8 internally)
621
            if ($utf8_data = $this->registry->call('Misc', 'change_encoding', array($this->raw_data, $encoding, 'UTF-8')))
622
            {
623
                // Create new parser
624
                $parser = $this->registry->create('Parser');
625
                // If it's parsed fine
626
                if ($parser->parse($utf8_data, 'UTF-8'))
627
                {
628
                    $this->data = $parser->get_data();
629
                    if (!($this->get_type() & ~SIMPLEPIE_TYPE_NONE))
630
                    {
631
                        $this->error = "A feed could not be found at $this->feed_url. This does not appear to be a valid RSS or Atom feed.";
632
                        $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));
633
                        return false;
634
                    }
635
                    if (isset($headers))
636
                    {
637
                        $this->data['headers'] = $headers;
638
                    }
639
                    $this->data['build'] = SIMPLEPIE_BUILD;
640
                    // Cache the file if caching is enabled
641
                    if ($cache && !$cache->save($this))
642
                    {
643
                        trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
644
                    }
645
                    return true;
646
                }
647
            }
648
        }
649
        if (isset($parser))
650
        {
651
            // We have an error, just set SimplePie_Misc::error to it and quit
652
            $this->error = sprintf('This XML document is invalid, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());
653
        }
654
        else
655
        {
656
            $this->error = 'The data could not be converted to UTF-8. You MUST have either the iconv or mbstring extension installed. Upgrading to PHP 5.x (which includes iconv) is highly recommended.';
657
        }
658
        $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));
659
        return false;
660
    }
661
    
662
    protected function fetch_data(&$cache)
663
    {
664
        // If it's enabled, use the cache
665
        if ($cache)
666
        {
667
            // Load the Cache
668
            $this->data = $cache->load();
669
            if (!empty($this->data))
670
            {
671
                // If the cache is for an outdated build of SimplePie
672
                if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD)
673
                {
674
                    $cache->unlink();
675
                    $this->data = array();
676
                }
677
                // If we've hit a collision just rerun it with caching disabled
678
                elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url)
679
                {
680
                    $cache = false;
681
                    $this->data = array();
682
                }
683
                // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL.
684
                elseif (isset($this->data['feed_url']))
685
                {
686
                    // If the autodiscovery cache is still valid use it.
687
                    if ($cache->mtime() + $this->autodiscovery_cache_duration > time())
688
                    {
689
                        // Do not need to do feed autodiscovery yet.
690
                        if ($this->data['feed_url'] !== $this->data['url'])
691
                        {
692
                            $this->set_feed_url($this->data['feed_url']);
693
                            return $this->init();
694
                        }
695
                        $cache->unlink();
696
                        $this->data = array();
697
                    }
698
                }
699
                // Check if the cache has been updated
700
                elseif ($cache->mtime() + $this->cache_duration < time())
701
                {
702
                    // If we have last-modified and/or etag set
703
                    if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag']))
704
                    {
705
                        $headers = array(
706
                            'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
707
                        );
708
                        if (isset($this->data['headers']['last-modified']))
709
                        {
710
                            $headers['if-modified-since'] = $this->data['headers']['last-modified'];
711
                        }
712
                        if (isset($this->data['headers']['etag']))
713
                        {
714
                            $headers['if-none-match'] = $this->data['headers']['etag'];
715
                        }
716
                        $file = $this->registry->create('File', array($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen));
717
                        if ($file->success)
718
                        {
719
                            if ($file->status_code === 304)
720
                            {
721
                                $cache->touch();
722
                                return true;
723
                            }
724
                        }
725
                        else
726
                        {
727
                            unset($file);
728
                        }
729
                    }
730
                }
731
                // If the cache is still valid, just return true
732
                else
733
                {
734
                    $this->raw_data = false;
735
                    return true;
736
                }
737
            }
738
            // If the cache is empty, delete it
739
            else
740
            {
741
                $cache->unlink();
742
                $this->data = array();
743
            }
744
        }
745
        // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it.
746
        if (!isset($file))
747
        {
748
            if ($this->file instanceof SimplePie_File && $this->file->url === $this->feed_url)
749
            {
750
                $file =& $this->file;
751
            }
752
            else
753
            {
754
                $headers = array(
755
                    'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
756
                );
757
                $file = $this->registry->create('File', array($this->feed_url, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen));
758
            }
759
        }
760
        // If the file connection has an error, set SimplePie::error to that and quit
761
        if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
762
        {
763
            $this->error = $file->error;
764
            return !empty($this->data);
765
        }
766
        if (!$this->force_feed)
767
        {
768
            // Check if the supplied URL is a feed, if it isn't, look for it.
769
            $locate = $this->registry->create('Locator', array(&$file, $this->timeout, $this->useragent, $this->max_checked_feeds));
770
            if (!$locate->is_feed($file))
771
            {
772
                // We need to unset this so that if SimplePie::set_file() has been called that object is untouched
773
                unset($file);
774
                try
775
                {
776
                    if (!($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds)))
777
                    {
778
                        $this->error = "A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or " . SIMPLEPIE_NAME . " was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed.";
779
                        $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));
780
                        return false;
781
                    }
782
                }
783
                catch (SimplePie_Exception $e)
784
                {
785
                    // This is usually because DOMDocument doesn't exist
786
                    $this->error = $e->getMessage();
787
                    $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, $e->getFile(), $e->getLine()));
788
                    return false;
789
                }
790
                if ($cache)
791
                {
792
                    $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
793
                    if (!$cache->save($this))
794
                    {
795
                        trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
796
                    }
797
                    $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'));
798
                }
799
                $this->feed_url = $file->url;
800
            }
801
            $locate = null;
802
        }
803
        $this->raw_data = $file->body;
804
        $headers = $file->headers;
805
        $sniffer = $this->registry->create('Content_Type_Sniffer', array(&$file));
806
        $sniffed = $sniffer->get_type();
807
        return array($headers, $sniffed);
808
    }
809
    
810
    public function error()
811
    {
812
        return $this->error;
813
    }
814
    
815
    public function get_raw_data()
816
    {
817
        return $this->raw_data;
818
    }
819
    
820
    public function get_encoding()
821
    {
822
        return $this->sanitize->output_encoding;
823
    }
824
    
825
    public function handle_content_type($mime = 'text/html')
826
    {
827
        if (!headers_sent())
828
        {
829
            $header = "Content-type: $mime;";
830
            if ($this->get_encoding())
831
            {
832
                $header .= ' charset=' . $this->get_encoding();
833
            }
834
            else
835
            {
836
                $header .= ' charset=UTF-8';
837
            }
838
            header($header);
839
        }
840
    }
841
    
842
    public function get_type()
843
    {
844
        if (!isset($this->data['type']))
845
        {
846
            $this->data['type'] = SIMPLEPIE_TYPE_ALL;
847
            if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed']))
848
            {
849
                $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10;
850
            }
851
            elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed']))
852
            {
853
                $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03;
854
            }
855
            elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF']))
856
            {
857
                if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel'])
858
                || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image'])
859
                || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item'])
860
                || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput']))
861
                {
862
                    $this->data['type'] &= SIMPLEPIE_TYPE_RSS_10;
863
                }
864
                if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel'])
865
                || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image'])
866
                || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item'])
867
                || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput']))
868
                {
869
                    $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090;
870
                }
871
            }
872
            elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss']))
873
            {
874
                $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL;
875
                if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version']))
876
                {
877
                    switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version']))
878
                    {
879
                        case '0.91':
880
                            $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091;
881
                            if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data']))
882
                            {
883
                                switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data']))
884
                                {
885
                                    case '0':
886
                                        $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE;
887
                                        break;
888
                                    case '24':
889
                                        $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND;
890
                                        break;
891
                                }
892
                            }
893
                            break;
894
                        case '0.92':
895
                            $this->data['type'] &= SIMPLEPIE_TYPE_RSS_092;
896
                            break;
897
                        case '0.93':
898
                            $this->data['type'] &= SIMPLEPIE_TYPE_RSS_093;
899
                            break;
900
                        case '0.94':
901
                            $this->data['type'] &= SIMPLEPIE_TYPE_RSS_094;
902
                            break;
903
                        case '2.0':
904
                            $this->data['type'] &= SIMPLEPIE_TYPE_RSS_20;
905
                            break;
906
                    }
907
                }
908
            }
909
            else
910
            {
911
                $this->data['type'] = SIMPLEPIE_TYPE_NONE;
912
            }
913
        }
914
        return $this->data['type'];
915
    }
916
    
917
    public function subscribe_url()
918
    {
919
        if ($this->feed_url !== null)
920
        {
921
            return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI);
922
        }
923
        else
924
        {
925
            return null;
926
        }
927
    }
928
    
929
    public function get_feed_tags($namespace, $tag)
930
    {
931
        $type = $this->get_type();
932
        if ($type & SIMPLEPIE_TYPE_ATOM_10)
933
        {
934
            if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]))
935
            {
936
                return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag];
937
            }
938
        }
939
        if ($type & SIMPLEPIE_TYPE_ATOM_03)
940
        {
941
            if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]))
942
            {
943
                return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag];
944
            }
945
        }
946
        if ($type & SIMPLEPIE_TYPE_RSS_RDF)
947
        {
948
            if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]))
949
            {
950
                return $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag];
951
            }
952
        }
953
        if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
954
        {
955
            if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]))
956
            {
957
                return $this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag];
958
            }
959
        }
960
        return null;
961
    }
962
    
963
    public function get_channel_tags($namespace, $tag)
964
    {
965
        $type = $this->get_type();
966
        if ($type & SIMPLEPIE_TYPE_ATOM_ALL)
967
        {
968
            if ($return = $this->get_feed_tags($namespace, $tag))
969
            {
970
                return $return;
971
            }
972
        }
973
        if ($type & SIMPLEPIE_TYPE_RSS_10)
974
        {
975
            if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel'))
976
            {
977
                if (isset($channel[0]['child'][$namespace][$tag]))
978
                {
979
                    return $channel[0]['child'][$namespace][$tag];
980
                }
981
            }
982
        }
983
        if ($type & SIMPLEPIE_TYPE_RSS_090)
984
        {
985
            if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel'))
986
            {
987
                if (isset($channel[0]['child'][$namespace][$tag]))
988
                {
989
                    return $channel[0]['child'][$namespace][$tag];
990
                }
991
            }
992
        }
993
        if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
994
        {
995
            if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel'))
996
            {
997
                if (isset($channel[0]['child'][$namespace][$tag]))
998
                {
999
                    return $channel[0]['child'][$namespace][$tag];
1000
                }
1001
            }
1002
        }
1003
        return null;
1004
    }
1005
    
1006
    public function get_image_tags($namespace, $tag)
1007
    {
1008
        $type = $this->get_type();
1009
        if ($type & SIMPLEPIE_TYPE_RSS_10)
1010
        {
1011
            if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image'))
1012
            {
1013
                if (isset($image[0]['child'][$namespace][$tag]))
1014
                {
1015
                    return $image[0]['child'][$namespace][$tag];
1016
                }
1017
            }
1018
        }
1019
        if ($type & SIMPLEPIE_TYPE_RSS_090)
1020
        {
1021
            if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image'))
1022
            {
1023
                if (isset($image[0]['child'][$namespace][$tag]))
1024
                {
1025
                    return $image[0]['child'][$namespace][$tag];
1026
                }
1027
            }
1028
        }
1029
        if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION)
1030
        {
1031
            if ($image = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'image'))
1032
            {
1033
                if (isset($image[0]['child'][$namespace][$tag]))
1034
                {
1035
                    return $image[0]['child'][$namespace][$tag];
1036
                }
1037
            }
1038
        }
1039
        return null;
1040
    }
1041
    
1042
    public function get_base($element = array())
1043
    {
1044
        if (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base']))
1045
        {
1046
            return $element['xml_base'];
1047
        }
1048
        elseif ($this->get_link() !== null)
1049
        {
1050
            return $this->get_link();
1051
        }
1052
        else
1053
        {
1054
            return $this->subscribe_url();
1055
        }
1056
    }
1057
    
1058
    public function sanitize($data, $type, $base = '')
1059
    {
1060
        return $this->sanitize->sanitize($data, $type, $base);
1061
    }
1062
    
1063
    public function get_title()
1064
    {
1065
        if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
1066
        {
1067
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
1068
        }
1069
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
1070
        {
1071
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
1072
        }
1073
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
1074
        {
1075
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
1076
        }
1077
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
1078
        {
1079
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
1080
        }
1081
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
1082
        {
1083
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
1084
        }
1085
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
1086
        {
1087
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1088
        }
1089
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
1090
        {
1091
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1092
        }
1093
        else
1094
        {
1095
            return null;
1096
        }
1097
    }
1098
    
1099
    public function get_category($key = 0)
1100
    {
1101
        $categories = $this->get_categories();
1102
        if (isset($categories[$key]))
1103
        {
1104
            return $categories[$key];
1105
        }
1106
        else
1107
        {
1108
            return null;
1109
        }
1110
    }
1111
    
1112
    public function get_categories()
1113
    {
1114
        $categories = array();
1115
        foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
1116
        {
1117
            $term = null;
1118
            $scheme = null;
1119
            $label = null;
1120
            if (isset($category['attribs']['']['term']))
1121
            {
1122
                $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
1123
            }
1124
            if (isset($category['attribs']['']['scheme']))
1125
            {
1126
                $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
1127
            }
1128
            if (isset($category['attribs']['']['label']))
1129
            {
1130
                $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
1131
            }
1132
            $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
1133
        }
1134
        foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
1135
        {
1136
            // This is really the label, but keep this as the term also for BC.
1137
            // Label will also work on retrieving because that falls back to term.
1138
            $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1139
            if (isset($category['attribs']['']['domain']))
1140
            {
1141
                $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
1142
            }
1143
            else
1144
            {
1145
                $scheme = null;
1146
            }
1147
            $categories[] = $this->registry->create('Category', array($term, $scheme, null));
1148
        }
1149
        foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
1150
        {
1151
            $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
1152
        }
1153
        foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
1154
        {
1155
            $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
1156
        }
1157
        if (!empty($categories))
1158
        {
1159
            return array_unique($categories);
1160
        }
1161
        else
1162
        {
1163
            return null;
1164
        }
1165
    }
1166
    
1167
    public function get_author($key = 0)
1168
    {
1169
        $authors = $this->get_authors();
1170
        if (isset($authors[$key]))
1171
        {
1172
            return $authors[$key];
1173
        }
1174
        else
1175
        {
1176
            return null;
1177
        }
1178
    }
1179
    
1180
    public function get_authors()
1181
    {
1182
        $authors = array();
1183
        foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
1184
        {
1185
            $name = null;
1186
            $uri = null;
1187
            $email = null;
1188
            if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
1189
            {
1190
                $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1191
            }
1192
            if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
1193
            {
1194
                $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
1195
            }
1196
            if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
1197
            {
1198
                $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1199
            }
1200
            if ($name !== null || $email !== null || $uri !== null)
1201
            {
1202
                $authors[] = $this->registry->create('Author', array($name, $uri, $email));
1203
            }
1204
        }
1205
        if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
1206
        {
1207
            $name = null;
1208
            $url = null;
1209
            $email = null;
1210
            if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
1211
            {
1212
                $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1213
            }
1214
            if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
1215
            {
1216
                $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
1217
            }
1218
            if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
1219
            {
1220
                $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1221
            }
1222
            if ($name !== null || $email !== null || $url !== null)
1223
            {
1224
                $authors[] = $this->registry->create('Author', array($name, $url, $email));
1225
            }
1226
        }
1227
        foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
1228
        {
1229
            $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
1230
        }
1231
        foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
1232
        {
1233
            $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
1234
        }
1235
        foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
1236
        {
1237
            $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
1238
        }
1239
        if (!empty($authors))
1240
        {
1241
            return array_unique($authors);
1242
        }
1243
        else
1244
        {
1245
            return null;
1246
        }
1247
    }
1248
    
1249
    public function get_contributor($key = 0)
1250
    {
1251
        $contributors = $this->get_contributors();
1252
        if (isset($contributors[$key]))
1253
        {
1254
            return $contributors[$key];
1255
        }
1256
        else
1257
        {
1258
            return null;
1259
        }
1260
    }
1261
    
1262
    public function get_contributors()
1263
    {
1264
        $contributors = array();
1265
        foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
1266
        {
1267
            $name = null;
1268
            $uri = null;
1269
            $email = null;
1270
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
1271
            {
1272
                $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1273
            }
1274
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
1275
            {
1276
                $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
1277
            }
1278
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
1279
            {
1280
                $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1281
            }
1282
            if ($name !== null || $email !== null || $uri !== null)
1283
            {
1284
                $contributors[] = $this->registry->create('Author', array($name, $uri, $email));
1285
            }
1286
        }
1287
        foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
1288
        {
1289
            $name = null;
1290
            $url = null;
1291
            $email = null;
1292
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
1293
            {
1294
                $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1295
            }
1296
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
1297
            {
1298
                $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
1299
            }
1300
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
1301
            {
1302
                $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1303
            }
1304
            if ($name !== null || $email !== null || $url !== null)
1305
            {
1306
                $contributors[] = $this->registry->create('Author', array($name, $url, $email));
1307
            }
1308
        }
1309
        if (!empty($contributors))
1310
        {
1311
            return array_unique($contributors);
1312
        }
1313
        else
1314
        {
1315
            return null;
1316
        }
1317
    }
1318
    
1319
    public function get_link($key = 0, $rel = 'alternate')
1320
    {
1321
        $links = $this->get_links($rel);
1322
        if (isset($links[$key]))
1323
        {
1324
            return $links[$key];
1325
        }
1326
        else
1327
        {
1328
            return null;
1329
        }
1330
    }
1331
    
1332
    public function get_permalink()
1333
    {
1334
        return $this->get_link(0);
1335
    }
1336
    
1337
    public function get_links($rel = 'alternate')
1338
    {
1339
        if (!isset($this->data['links']))
1340
        {
1341
            $this->data['links'] = array();
1342
            if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
1343
            {
1344
                foreach ($links as $link)
1345
                {
1346
                    if (isset($link['attribs']['']['href']))
1347
                    {
1348
                        $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
1349
                        $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
1350
                    }
1351
                }
1352
            }
1353
            if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
1354
            {
1355
                foreach ($links as $link)
1356
                {
1357
                    if (isset($link['attribs']['']['href']))
1358
                    {
1359
                        $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
1360
                        $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
1361
                    }
1362
                }
1363
            }
1364
            if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
1365
            {
1366
                $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
1367
            }
1368
            if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
1369
            {
1370
                $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
1371
            }
1372
            if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
1373
            {
1374
                $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
1375
            }
1376
            $keys = array_keys($this->data['links']);
1377
            foreach ($keys as $key)
1378
            {
1379
                if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))
1380
                {
1381
                    if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
1382
                    {
1383
                        $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
1384
                        $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
1385
                    }
1386
                    else
1387
                    {
1388
                        $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
1389
                    }
1390
                }
1391
                elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
1392
                {
1393
                    $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
1394
                }
1395
                $this->data['links'][$key] = array_unique($this->data['links'][$key]);
1396
            }
1397
        }
1398
        if (isset($this->data['links'][$rel]))
1399
        {
1400
            return $this->data['links'][$rel];
1401
        }
1402
        else
1403
        {
1404
            return null;
1405
        }
1406
    }
1407
    public function get_all_discovered_feeds()
1408
    {
1409
        return $this->all_discovered_feeds;
1410
    }
1411
    
1412
    public function get_description()
1413
    {
1414
        if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
1415
        {
1416
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
1417
        }
1418
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
1419
        {
1420
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
1421
        }
1422
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
1423
        {
1424
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
1425
        }
1426
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
1427
        {
1428
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
1429
        }
1430
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
1431
        {
1432
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
1433
        }
1434
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
1435
        {
1436
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1437
        }
1438
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
1439
        {
1440
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1441
        }
1442
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
1443
        {
1444
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
1445
        }
1446
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
1447
        {
1448
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
1449
        }
1450
        else
1451
        {
1452
            return null;
1453
        }
1454
    }
1455
    
1456
    public function get_copyright()
1457
    {
1458
        if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
1459
        {
1460
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
1461
        }
1462
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
1463
        {
1464
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
1465
        }
1466
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright'))
1467
        {
1468
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1469
        }
1470
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
1471
        {
1472
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1473
        }
1474
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
1475
        {
1476
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1477
        }
1478
        else
1479
        {
1480
            return null;
1481
        }
1482
    }
1483
    
1484
    public function get_language()
1485
    {
1486
        if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language'))
1487
        {
1488
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1489
        }
1490
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
1491
        {
1492
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1493
        }
1494
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
1495
        {
1496
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1497
        }
1498
        elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang']))
1499
        {
1500
            return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
1501
        }
1502
        elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang']))
1503
        {
1504
            return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
1505
        }
1506
        elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang']))
1507
        {
1508
            return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
1509
        }
1510
        elseif (isset($this->data['headers']['content-language']))
1511
        {
1512
            return $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT);
1513
        }
1514
        else
1515
        {
1516
            return null;
1517
        }
1518
    }
1519
    
1520
    public function get_latitude()
1521
    {
1522
        if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
1523
        {
1524
            return (float) $return[0]['data'];
1525
        }
1526
        elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
1527
        {
1528
            return (float) $match[1];
1529
        }
1530
        else
1531
        {
1532
            return null;
1533
        }
1534
    }
1535
    
1536
    public function get_longitude()
1537
    {
1538
        if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
1539
        {
1540
            return (float) $return[0]['data'];
1541
        }
1542
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
1543
        {
1544
            return (float) $return[0]['data'];
1545
        }
1546
        elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
1547
        {
1548
            return (float) $match[2];
1549
        }
1550
        else
1551
        {
1552
            return null;
1553
        }
1554
    }
1555
    
1556
    public function get_image_title()
1557
    {
1558
        if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
1559
        {
1560
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1561
        }
1562
        elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
1563
        {
1564
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1565
        }
1566
        elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
1567
        {
1568
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1569
        }
1570
        elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
1571
        {
1572
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1573
        }
1574
        elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
1575
        {
1576
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
1577
        }
1578
        else
1579
        {
1580
            return null;
1581
        }
1582
    }
1583
    
1584
    public function get_image_url()
1585
    {
1586
        if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
1587
        {
1588
            return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
1589
        }
1590
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
1591
        {
1592
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
1593
        }
1594
        elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
1595
        {
1596
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
1597
        }
1598
        elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'url'))
1599
        {
1600
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
1601
        }
1602
        elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'url'))
1603
        {
1604
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
1605
        }
1606
        elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))
1607
        {
1608
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
1609
        }
1610
        else
1611
        {
1612
            return null;
1613
        }
1614
    }
1615
    
1616
    public function get_image_link()
1617
    {
1618
        if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
1619
        {
1620
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
1621
        }
1622
        elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
1623
        {
1624
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
1625
        }
1626
        elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
1627
        {
1628
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
1629
        }
1630
        else
1631
        {
1632
            return null;
1633
        }
1634
    }
1635
    
1636
    public function get_image_width()
1637
    {
1638
        if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'width'))
1639
        {
1640
            return round($return[0]['data']);
1641
        }
1642
        elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))
1643
        {
1644
            return 88.0;
1645
        }
1646
        else
1647
        {
1648
            return null;
1649
        }
1650
    }
1651
    
1652
    public function get_image_height()
1653
    {
1654
        if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'height'))
1655
        {
1656
            return round($return[0]['data']);
1657
        }
1658
        elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url'))
1659
        {
1660
            return 31.0;
1661
        }
1662
        else
1663
        {
1664
            return null;
1665
        }
1666
    }
1667
    
1668
    public function get_item_quantity($max = 0)
1669
    {
1670
        $max = (int) $max;
1671
        $qty = count($this->get_items());
1672
        if ($max === 0)
1673
        {
1674
            return $qty;
1675
        }
1676
        else
1677
        {
1678
            return ($qty > $max) ? $max : $qty;
1679
        }
1680
    }
1681
    
1682
    public function get_item($key = 0)
1683
    {
1684
        $items = $this->get_items();
1685
        if (isset($items[$key]))
1686
        {
1687
            return $items[$key];
1688
        }
1689
        else
1690
        {
1691
            return null;
1692
        }
1693
    }
1694
    
1695
    public function get_items($start = 0, $end = 0)
1696
    {
1697
        if (!isset($this->data['items']))
1698
        {
1699
            if (!empty($this->multifeed_objects))
1700
            {
1701
                $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit);
1702
            }
1703
            else
1704
            {
1705
                $this->data['items'] = array();
1706
                if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry'))
1707
                {
1708
                    $keys = array_keys($items);
1709
                    foreach ($keys as $key)
1710
                    {
1711
                        $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
1712
                    }
1713
                }
1714
                if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry'))
1715
                {
1716
                    $keys = array_keys($items);
1717
                    foreach ($keys as $key)
1718
                    {
1719
                        $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
1720
                    }
1721
                }
1722
                if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item'))
1723
                {
1724
                    $keys = array_keys($items);
1725
                    foreach ($keys as $key)
1726
                    {
1727
                        $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
1728
                    }
1729
                }
1730
                if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item'))
1731
                {
1732
                    $keys = array_keys($items);
1733
                    foreach ($keys as $key)
1734
                    {
1735
                        $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
1736
                    }
1737
                }
1738
                if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item'))
1739
                {
1740
                    $keys = array_keys($items);
1741
                    foreach ($keys as $key)
1742
                    {
1743
                        $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
1744
                    }
1745
                }
1746
            }
1747
        }
1748
        if (!empty($this->data['items']))
1749
        {
1750
            // If we want to order it by date, check if all items have a date, and then sort it
1751
            if ($this->order_by_date && empty($this->multifeed_objects))
1752
            {
1753
                if (!isset($this->data['ordered_items']))
1754
                {
1755
                    $do_sort = true;
1756
                    foreach ($this->data['items'] as $item)
1757
                    {
1758
                        if (!$item->get_date('U'))
1759
                        {
1760
                            $do_sort = false;
1761
                            break;
1762
                        }
1763
                    }
1764
                    $item = null;
1765
                    $this->data['ordered_items'] = $this->data['items'];
1766
                    if ($do_sort)
1767
                    {
1768
                        usort($this->data['ordered_items'], array(get_class($this), 'sort_items'));
1769
                    }
1770
                }
1771
                $items = $this->data['ordered_items'];
1772
            }
1773
            else
1774
            {
1775
                $items = $this->data['items'];
1776
            }
1777
            // Slice the data as desired
1778
            if ($end === 0)
1779
            {
1780
                return array_slice($items, $start);
1781
            }
1782
            else
1783
            {
1784
                return array_slice($items, $start, $end);
1785
            }
1786
        }
1787
        else
1788
        {
1789
            return array();
1790
        }
1791
    }
1792
    
1793
    public function set_favicon_handler($page = false, $qs = 'i')
1794
    {
1795
        $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
1796
        trigger_error('Favicon handling has been removed, please use your own handling', $level);
1797
        return false;
1798
    }
1799
    
1800
    public function get_favicon()
1801
    {
1802
        $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
1803
        trigger_error('Favicon handling has been removed, please use your own handling', $level);
1804
        if (($url = $this->get_link()) !== null)
1805
        {
1806
            return 'http://g.etfv.co/' . urlencode($url);
1807
        }
1808
        return false;
1809
    }
1810
    
1811
    public function __call($method, $args)
1812
    {
1813
        if (strpos($method, 'subscribe_') === 0)
1814
        {
1815
            $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
1816
            trigger_error('subscribe_*() has been deprecated, implement the callback yourself', $level);
1817
            return '';
1818
        }
1819
        if ($method === 'enable_xml_dump')
1820
        {
1821
            $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
1822
            trigger_error('enable_xml_dump() has been deprecated, use get_raw_data() instead', $level);
1823
            return false;
1824
        }
1825
        $class = get_class($this);
1826
        $trace = debug_backtrace();
1827
        $file = $trace[0]['file'];
1828
        $line = $trace[0]['line'];
1829
        trigger_error("Call to undefined method $class::$method() in $file on line $line", E_USER_ERROR);
1830
    }
1831
    
1832
    public static function sort_items($a, $b)
1833
    {
1834
        return $a->get_date('U') <= $b->get_date('U');
1835
    }
1836
    
1837
    public static function merge_items($urls, $start = 0, $end = 0, $limit = 0)
1838
    {
1839
        if (is_array($urls) && sizeof($urls) > 0)
1840
        {
1841
            $items = array();
1842
            foreach ($urls as $arg)
1843
            {
1844
                if ($arg instanceof SimplePie)
1845
                {
1846
                    $items = array_merge($items, $arg->get_items(0, $limit));
1847
                }
1848
                else
1849
                {
1850
                    trigger_error('Arguments must be SimplePie objects', E_USER_WARNING);
1851
                }
1852
            }
1853
            $do_sort = true;
1854
            foreach ($items as $item)
1855
            {
1856
                if (!$item->get_date('U'))
1857
                {
1858
                    $do_sort = false;
1859
                    break;
1860
                }
1861
            }
1862
            $item = null;
1863
            if ($do_sort)
1864
            {
1865
                usort($items, array(get_class($urls[0]), 'sort_items'));
1866
            }
1867
            if ($end === 0)
1868
            {
1869
                return array_slice($items, $start);
1870
            }
1871
            else
1872
            {
1873
                return array_slice($items, $start, $end);
1874
            }
1875
        }
1876
        else
1877
        {
1878
            trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING);
1879
            return array();
1880
        }
1881
    }
1882
}
1883
class SimplePie_Author
1884
{
1885
    
1886
    var $name;
1887
    
1888
    var $link;
1889
    
1890
    var $email;
1891
    
1892
    public function __construct($name = null, $link = null, $email = null)
1893
    {
1894
        $this->name = $name;
1895
        $this->link = $link;
1896
        $this->email = $email;
1897
    }
1898
    
1899
    public function __toString()
1900
    {
1901
        // There is no $this->data here
1902
        return md5(serialize($this));
1903
    }
1904
    
1905
    public function get_name()
1906
    {
1907
        if ($this->name !== null)
1908
        {
1909
            return $this->name;
1910
        }
1911
        else
1912
        {
1913
            return null;
1914
        }
1915
    }
1916
    
1917
    public function get_link()
1918
    {
1919
        if ($this->link !== null)
1920
        {
1921
            return $this->link;
1922
        }
1923
        else
1924
        {
1925
            return null;
1926
        }
1927
    }
1928
    
1929
    public function get_email()
1930
    {
1931
        if ($this->email !== null)
1932
        {
1933
            return $this->email;
1934
        }
1935
        else
1936
        {
1937
            return null;
1938
        }
1939
    }
1940
}
1941
interface SimplePie_Cache_Base
1942
{
1943
    
1944
    const TYPE_FEED = 'spc';
1945
    
1946
    const TYPE_IMAGE = 'spi';
1947
    
1948
    public function __construct($location, $name, $type);
1949
    
1950
    public function save($data);
1951
    
1952
    public function load();
1953
    
1954
    public function mtime();
1955
    
1956
    public function touch();
1957
    
1958
    public function unlink();
1959
}
1960
abstract class SimplePie_Cache_DB implements SimplePie_Cache_Base
1961
{
1962
    
1963
    protected static function prepare_simplepie_object_for_cache($data)
1964
    {
1965
        $items = $data->get_items();
1966
        $items_by_id = array();
1967
        if (!empty($items))
1968
        {
1969
            foreach ($items as $item)
1970
            {
1971
                $items_by_id[$item->get_id()] = $item;
1972
            }
1973
            if (count($items_by_id) !== count($items))
1974
            {
1975
                $items_by_id = array();
1976
                foreach ($items as $item)
1977
                {
1978
1979
                    $items_by_id[$item->get_id(true)] = $item;
1980
                }
1981
            }
1982
            if (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))
1983
            {
1984
                $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];
1985
            }
1986
            elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))
1987
            {
1988
                $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];
1989
            }
1990
            elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))
1991
            {
1992
                $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];
1993
            }
1994
            elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]))
1995
            {
1996
                $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0];
1997
            }
1998
            else
1999
            {
2000
                $channel = null;
2001
            }
2002
            if ($channel !== null)
2003
            {
2004
                if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']))
2005
                {
2006
                    unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']);
2007
                }
2008
                if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']))
2009
                {
2010
                    unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']);
2011
                }
2012
                if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']))
2013
                {
2014
                    unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']);
2015
                }
2016
                if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']))
2017
                {
2018
                    unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']);
2019
                }
2020
                if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']))
2021
                {
2022
                    unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']);
2023
                }
2024
            }
2025
            if (isset($data->data['items']))
2026
            {
2027
                unset($data->data['items']);
2028
            }
2029
            if (isset($data->data['ordered_items']))
2030
            {
2031
                unset($data->data['ordered_items']);
2032
            }
2033
        }
2034
        return array(serialize($data->data), $items_by_id);
2035
    }
2036
}
2037
class SimplePie_Cache_File implements SimplePie_Cache_Base
2038
{
2039
    
2040
    protected $location;
2041
    
2042
    protected $filename;
2043
    
2044
    protected $extension;
2045
    
2046
    protected $name;
2047
    
2048
    public function __construct($location, $name, $type)
2049
    {
2050
        $this->location = $location;
2051
        $this->filename = $name;
2052
        $this->extension = $type;
2053
        $this->name = "$this->location/$this->filename.$this->extension";
2054
    }
2055
    
2056
    public function save($data)
2057
    {
2058
        if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location))
2059
        {
2060
            if ($data instanceof SimplePie)
2061
            {
2062
                $data = $data->data;
2063
            }
2064
            $data = serialize($data);
2065
            return (bool) file_put_contents($this->name, $data);
2066
        }
2067
        return false;
2068
    }
2069
    
2070
    public function load()
2071
    {
2072
        if (file_exists($this->name) && is_readable($this->name))
2073
        {
2074
            return unserialize(file_get_contents($this->name));
2075
        }
2076
        return false;
2077
    }
2078
    
2079
    public function mtime()
2080
    {
2081
        if (file_exists($this->name))
2082
        {
2083
            return filemtime($this->name);
2084
        }
2085
        return false;
2086
    }
2087
    
2088
    public function touch()
2089
    {
2090
        if (file_exists($this->name))
2091
        {
2092
            return touch($this->name);
2093
        }
2094
        return false;
2095
    }
2096
    
2097
    public function unlink()
2098
    {
2099
        if (file_exists($this->name))
2100
        {
2101
            return unlink($this->name);
2102
        }
2103
        return false;
2104
    }
2105
}
2106
class SimplePie_Cache_Memcache implements SimplePie_Cache_Base
2107
{
2108
    
2109
    protected $cache;
2110
    
2111
    protected $options;
2112
    
2113
    protected $name;
2114
    
2115
    public function __construct($location, $name, $type)
2116
    {
2117
        $this->options = array(
2118
            'host' => '127.0.0.1',
2119
            'port' => 11211,
2120
            'extras' => array(
2121
                'timeout' => 3600, // one hour
2122
                'prefix' => 'simplepie_',
2123
            ),
2124
        );
2125
        $parsed = SimplePie_Cache::parse_URL($location);
2126
        $this->options['host'] = empty($parsed['host']) ? $this->options['host'] : $parsed['host'];
2127
        $this->options['port'] = empty($parsed['port']) ? $this->options['port'] : $parsed['port'];
2128
        $this->options['extras'] = array_merge($this->options['extras'], $parsed['extras']);
2129
        $this->name = $this->options['extras']['prefix'] . md5("$name:$type");
2130
        $this->cache = new Memcache();
2131
        $this->cache->addServer($this->options['host'], (int) $this->options['port']);
2132
    }
2133
    
2134
    public function save($data)
2135
    {
2136
        if ($data instanceof SimplePie)
2137
        {
2138
            $data = $data->data;
2139
        }
2140
        return $this->cache->set($this->name, serialize($data), MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']);
2141
    }
2142
    
2143
    public function load()
2144
    {
2145
        $data = $this->cache->get($this->name);
2146
        if ($data !== false)
2147
        {
2148
            return unserialize($data);
2149
        }
2150
        return false;
2151
    }
2152
    
2153
    public function mtime()
2154
    {
2155
        $data = $this->cache->get($this->name);
2156
        if ($data !== false)
2157
        {
2158
            // essentially ignore the mtime because Memcache expires on it's own
2159
            return time();
2160
        }
2161
        return false;
2162
    }
2163
    
2164
    public function touch()
2165
    {
2166
        $data = $this->cache->get($this->name);
2167
        if ($data !== false)
2168
        {
2169
            return $this->cache->set($this->name, $data, MEMCACHE_COMPRESSED, (int) $this->duration);
2170
        }
2171
        return false;
2172
    }
2173
    
2174
    public function unlink()
2175
    {
2176
        return $this->cache->delete($this->name, 0);
2177
    }
2178
}
2179
class SimplePie_Cache_MySQL extends SimplePie_Cache_DB
2180
{
2181
    
2182
    protected $mysql;
2183
    
2184
    protected $options;
2185
    
2186
    protected $id;
2187
    
2188
    public function __construct($location, $name, $type)
2189
    {
2190
        $this->options = array(
2191
            'user' => null,
2192
            'pass' => null,
2193
            'host' => '127.0.0.1',
2194
            'port' => '3306',
2195
            'path' => '',
2196
            'extras' => array(
2197
                'prefix' => '',
2198
            ),
2199
        );
2200
        $this->options = array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location));
2201
        // Path is prefixed with a "/"
2202
        $this->options['dbname'] = substr($this->options['path'], 1);
2203
        try
2204
        {
2205
            $this->mysql = new PDO("mysql:dbname={$this->options['dbname']};host={$this->options['host']};port={$this->options['port']}", $this->options['user'], $this->options['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
2206
        }
2207
        catch (PDOException $e)
2208
        {
2209
            $this->mysql = null;
2210
            return;
2211
        }
2212
        $this->id = $name . $type;
2213
        if (!$query = $this->mysql->query('SHOW TABLES'))
2214
        {
2215
            $this->mysql = null;
2216
            return;
2217
        }
2218
        $db = array();
2219
        while ($row = $query->fetchColumn())
2220
        {
2221
            $db[] = $row;
2222
        }
2223
        if (!in_array($this->options['extras']['prefix'] . 'cache_data', $db))
2224
        {
2225
            $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))');
2226
            if ($query === false)
2227
            {
2228
                $this->mysql = null;
2229
            }
2230
        }
2231
        if (!in_array($this->options['extras']['prefix'] . 'items', $db))
2232
        {
2233
            $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` TEXT CHARACTER SET utf8 NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))');
2234
            if ($query === false)
2235
            {
2236
                $this->mysql = null;
2237
            }
2238
        }
2239
    }
2240
    
2241
    public function save($data)
2242
    {
2243
        if ($this->mysql === null)
2244
        {
2245
            return false;
2246
        }
2247
        if ($data instanceof SimplePie)
2248
        {
2249
            $data = clone $data;
2250
            $prepared = self::prepare_simplepie_object_for_cache($data);
2251
            $query = $this->mysql->prepare('SELECT COUNT(*) FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed');
2252
            $query->bindValue(':feed', $this->id);
2253
            if ($query->execute())
2254
            {
2255
                if ($query->fetchColumn() > 0)
2256
                {
2257
                    $items = count($prepared[1]);
2258
                    if ($items)
2259
                    {
2260
                        $sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = :items, `data` = :data, `mtime` = :time WHERE `id` = :feed';
2261
                        $query = $this->mysql->prepare($sql);
2262
                        $query->bindValue(':items', $items);
2263
                    }
2264
                    else
2265
                    {
2266
                        $sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `data` = :data, `mtime` = :time WHERE `id` = :feed';
2267
                        $query = $this->mysql->prepare($sql);
2268
                    }
2269
                    $query->bindValue(':data', $prepared[0]);
2270
                    $query->bindValue(':time', time());
2271
                    $query->bindValue(':feed', $this->id);
2272
                    if (!$query->execute())
2273
                    {
2274
                        return false;
2275
                    }
2276
                }
2277
                else
2278
                {
2279
                    $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:feed, :count, :data, :time)');
2280
                    $query->bindValue(':feed', $this->id);
2281
                    $query->bindValue(':count', count($prepared[1]));
2282
                    $query->bindValue(':data', $prepared[0]);
2283
                    $query->bindValue(':time', time());
2284
                    if (!$query->execute())
2285
                    {
2286
                        return false;
2287
                    }
2288
                }
2289
                $ids = array_keys($prepared[1]);
2290
                if (!empty($ids))
2291
                {
2292
                    foreach ($ids as $id)
2293
                    {
2294
                        $database_ids[] = $this->mysql->quote($id);
2295
                    }
2296
                    $query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `id` = ' . implode(' OR `id` = ', $database_ids) . ' AND `feed_id` = :feed');
2297
                    $query->bindValue(':feed', $this->id);
2298
                    if ($query->execute())
2299
                    {
2300
                        $existing_ids = array();
2301
                        while ($row = $query->fetchColumn())
2302
                        {
2303
                            $existing_ids[] = $row;
2304
                        }
2305
                        $new_ids = array_diff($ids, $existing_ids);
2306
                        foreach ($new_ids as $new_id)
2307
                        {
2308
                            if (!($date = $prepared[1][$new_id]->get_date('U')))
2309
                            {
2310
                                $date = time();
2311
                            }
2312
                            $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(:feed, :id, :data, :date)');
2313
                            $query->bindValue(':feed', $this->id);
2314
                            $query->bindValue(':id', $new_id);
2315
                            $query->bindValue(':data', serialize($prepared[1][$new_id]->data));
2316
                            $query->bindValue(':date', $date);
2317
                            if (!$query->execute())
2318
                            {
2319
                                return false;
2320
                            }
2321
                        }
2322
                        return true;
2323
                    }
2324
                }
2325
                else
2326
                {
2327
                    return true;
2328
                }
2329
            }
2330
        }
2331
        else
2332
        {
2333
            $query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed');
2334
            $query->bindValue(':feed', $this->id);
2335
            if ($query->execute())
2336
            {
2337
                if ($query->rowCount() > 0)
2338
                {
2339
                    $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = 0, `data` = :data, `mtime` = :time WHERE `id` = :feed');
2340
                    $query->bindValue(':data', serialize($data));
2341
                    $query->bindValue(':time', time());
2342
                    $query->bindValue(':feed', $this->id);
2343
                    if ($this->execute())
2344
                    {
2345
                        return true;
2346
                    }
2347
                }
2348
                else
2349
                {
2350
                    $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:id, 0, :data, :time)');
2351
                    $query->bindValue(':id', $this->id);
2352
                    $query->bindValue(':data', serialize($data));
2353
                    $query->bindValue(':time', time());
2354
                    if ($query->execute())
2355
                    {
2356
                        return true;
2357
                    }
2358
                }
2359
            }
2360
        }
2361
        return false;
2362
    }
2363
    
2364
    public function load()
2365
    {
2366
        if ($this->mysql === null)
2367
        {
2368
            return false;
2369
        }
2370
        $query = $this->mysql->prepare('SELECT `items`, `data` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id');
2371
        $query->bindValue(':id', $this->id);
2372
        if ($query->execute() && ($row = $query->fetch()))
2373
        {
2374
            $data = unserialize($row[1]);
2375
            if (isset($this->options['items'][0]))
2376
            {
2377
                $items = (int) $this->options['items'][0];
2378
            }
2379
            else
2380
            {
2381
                $items = (int) $row[0];
2382
            }
2383
            if ($items !== 0)
2384
            {
2385
                if (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]))
2386
                {
2387
                    $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0];
2388
                }
2389
                elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]))
2390
                {
2391
                    $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0];
2392
                }
2393
                elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]))
2394
                {
2395
                    $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0];
2396
                }
2397
                elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]))
2398
                {
2399
                    $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0];
2400
                }
2401
                else
2402
                {
2403
                    $feed = null;
2404
                }
2405
                if ($feed !== null)
2406
                {
2407
                    $sql = 'SELECT `data` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :feed ORDER BY `posted` DESC';
2408
                    if ($items > 0)
2409
                    {
2410
                        $sql .= ' LIMIT ' . $items;
2411
                    }
2412
                    $query = $this->mysql->prepare($sql);
2413
                    $query->bindValue(':feed', $this->id);
2414
                    if ($query->execute())
2415
                    {
2416
                        while ($row = $query->fetchColumn())
2417
                        {
2418
                            $feed['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'][] = unserialize($row);
2419
                        }
2420
                    }
2421
                    else
2422
                    {
2423
                        return false;
2424
                    }
2425
                }
2426
            }
2427
            return $data;
2428
        }
2429
        return false;
2430
    }
2431
    
2432
    public function mtime()
2433
    {
2434
        if ($this->mysql === null)
2435
        {
2436
            return false;
2437
        }
2438
        $query = $this->mysql->prepare('SELECT `mtime` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id');
2439
        $query->bindValue(':id', $this->id);
2440
        if ($query->execute() && ($time = $query->fetchColumn()))
2441
        {
2442
            return $time;
2443
        }
2444
        else
2445
        {
2446
            return false;
2447
        }
2448
    }
2449
    
2450
    public function touch()
2451
    {
2452
        if ($this->mysql === null)
2453
        {
2454
            return false;
2455
        }
2456
        $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `mtime` = :time WHERE `id` = :id');
2457
        $query->bindValue(':time', time());
2458
        $query->bindValue(':id', $this->id);
2459
        if ($query->execute() && $query->rowCount() > 0)
2460
        {
2461
            return true;
2462
        }
2463
        else
2464
        {
2465
            return false;
2466
        }
2467
    }
2468
    
2469
    public function unlink()
2470
    {
2471
        if ($this->mysql === null)
2472
        {
2473
            return false;
2474
        }
2475
        $query = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id');
2476
        $query->bindValue(':id', $this->id);
2477
        $query2 = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :id');
2478
        $query2->bindValue(':id', $this->id);
2479
        if ($query->execute() && $query2->execute())
2480
        {
2481
            return true;
2482
        }
2483
        else
2484
        {
2485
            return false;
2486
        }
2487
    }
2488
}
2489
class SimplePie_Cache
2490
{
2491
    
2492
    protected static $handlers = array(
2493
        'mysql' => 'SimplePie_Cache_MySQL',
2494
        'memcache' => 'SimplePie_Cache_Memcache',
2495
    );
2496
    
2497
    private function __construct() { }
2498
    
2499
    public static function get_handler($location, $filename, $extension)
2500
    {
2501
        $type = explode(':', $location, 2);
2502
        $type = $type[0];
2503
        if (!empty(self::$handlers[$type]))
2504
        {
2505
            $class = self::$handlers[$type];
2506
            return new $class($location, $filename, $extension);
2507
        }
2508
        return new SimplePie_Cache_File($location, $filename, $extension);
2509
    }
2510
    
2511
    public function create($location, $filename, $extension)
2512
    {
2513
        trigger_error('Cache::create() has been replaced with Cache::get_handler(). Switch to the registry system to use this.', E_USER_DEPRECATED);
2514
        return self::get_handler($location, $filename, $extension);
2515
    }
2516
    
2517
    public static function register($type, $class)
2518
    {
2519
        self::$handlers[$type] = $class;
2520
    }
2521
    
2522
    public static function parse_URL($url)
2523
    {
2524
        $params = parse_url($url);
2525
        $params['extras'] = array();
2526
        if (isset($params['query']))
2527
        {
2528
            parse_str($params['query'], $params['extras']);
2529
        }
2530
        return $params;
2531
    }
2532
}
2533
class SimplePie_Caption
2534
{
2535
    
2536
    var $type;
2537
    
2538
    var $lang;
2539
    
2540
    var $startTime;
2541
    
2542
    var $endTime;
2543
    
2544
    var $text;
2545
    
2546
    public function __construct($type = null, $lang = null, $startTime = null, $endTime = null, $text = null)
2547
    {
2548
        $this->type = $type;
2549
        $this->lang = $lang;
2550
        $this->startTime = $startTime;
2551
        $this->endTime = $endTime;
2552
        $this->text = $text;
2553
    }
2554
    
2555
    public function __toString()
2556
    {
2557
        // There is no $this->data here
2558
        return md5(serialize($this));
2559
    }
2560
    
2561
    public function get_endtime()
2562
    {
2563
        if ($this->endTime !== null)
2564
        {
2565
            return $this->endTime;
2566
        }
2567
        else
2568
        {
2569
            return null;
2570
        }
2571
    }
2572
    
2573
    public function get_language()
2574
    {
2575
        if ($this->lang !== null)
2576
        {
2577
            return $this->lang;
2578
        }
2579
        else
2580
        {
2581
            return null;
2582
        }
2583
    }
2584
    
2585
    public function get_starttime()
2586
    {
2587
        if ($this->startTime !== null)
2588
        {
2589
            return $this->startTime;
2590
        }
2591
        else
2592
        {
2593
            return null;
2594
        }
2595
    }
2596
    
2597
    public function get_text()
2598
    {
2599
        if ($this->text !== null)
2600
        {
2601
            return $this->text;
2602
        }
2603
        else
2604
        {
2605
            return null;
2606
        }
2607
    }
2608
    
2609
    public function get_type()
2610
    {
2611
        if ($this->type !== null)
2612
        {
2613
            return $this->type;
2614
        }
2615
        else
2616
        {
2617
            return null;
2618
        }
2619
    }
2620
}
2621
class SimplePie_Category
2622
{
2623
    
2624
    var $term;
2625
    
2626
    var $scheme;
2627
    
2628
    var $label;
2629
    
2630
    public function __construct($term = null, $scheme = null, $label = null)
2631
    {
2632
        $this->term = $term;
2633
        $this->scheme = $scheme;
2634
        $this->label = $label;
2635
    }
2636
    
2637
    public function __toString()
2638
    {
2639
        // There is no $this->data here
2640
        return md5(serialize($this));
2641
    }
2642
    
2643
    public function get_term()
2644
    {
2645
        if ($this->term !== null)
2646
        {
2647
            return $this->term;
2648
        }
2649
        else
2650
        {
2651
            return null;
2652
        }
2653
    }
2654
    
2655
    public function get_scheme()
2656
    {
2657
        if ($this->scheme !== null)
2658
        {
2659
            return $this->scheme;
2660
        }
2661
        else
2662
        {
2663
            return null;
2664
        }
2665
    }
2666
    
2667
    public function get_label()
2668
    {
2669
        if ($this->label !== null)
2670
        {
2671
            return $this->label;
2672
        }
2673
        else
2674
        {
2675
            return $this->get_term();
2676
        }
2677
    }
2678
}
2679
class SimplePie_Content_Type_Sniffer
2680
{
2681
    
2682
    var $file;
2683
    
2684
    public function __construct($file)
2685
    {
2686
        $this->file = $file;
2687
    }
2688
    
2689
    public function get_type()
2690
    {
2691
        if (isset($this->file->headers['content-type']))
2692
        {
2693
            if (!isset($this->file->headers['content-encoding'])
2694
                && ($this->file->headers['content-type'] === 'text/plain'
2695
                    || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1'
2696
                    || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1'
2697
                    || $this->file->headers['content-type'] === 'text/plain; charset=UTF-8'))
2698
            {
2699
                return $this->text_or_binary();
2700
            }
2701
            if (($pos = strpos($this->file->headers['content-type'], ';')) !== false)
2702
            {
2703
                $official = substr($this->file->headers['content-type'], 0, $pos);
2704
            }
2705
            else
2706
            {
2707
                $official = $this->file->headers['content-type'];
2708
            }
2709
            $official = trim(strtolower($official));
2710
            if ($official === 'unknown/unknown'
2711
                || $official === 'application/unknown')
2712
            {
2713
                return $this->unknown();
2714
            }
2715
            elseif (substr($official, -4) === '+xml'
2716
                || $official === 'text/xml'
2717
                || $official === 'application/xml')
2718
            {
2719
                return $official;
2720
            }
2721
            elseif (substr($official, 0, 6) === 'image/')
2722
            {
2723
                if ($return = $this->image())
2724
                {
2725
                    return $return;
2726
                }
2727
                else
2728
                {
2729
                    return $official;
2730
                }
2731
            }
2732
            elseif ($official === 'text/html')
2733
            {
2734
                return $this->feed_or_html();
2735
            }
2736
            else
2737
            {
2738
                return $official;
2739
            }
2740
        }
2741
        else
2742
        {
2743
            return $this->unknown();
2744
        }
2745
    }
2746
    
2747
    public function text_or_binary()
2748
    {
2749
        if (substr($this->file->body, 0, 2) === "\xFE\xFF"
2750
            || substr($this->file->body, 0, 2) === "\xFF\xFE"
2751
            || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF"
2752
            || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF")
2753
        {
2754
            return 'text/plain';
2755
        }
2756
        elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body))
2757
        {
2758
            return 'application/octect-stream';
2759
        }
2760
        else
2761
        {
2762
            return 'text/plain';
2763
        }
2764
    }
2765
    
2766
    public function unknown()
2767
    {
2768
        $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20");
2769
        if (strtolower(substr($this->file->body, $ws, 14)) === '<!doctype html'
2770
            || strtolower(substr($this->file->body, $ws, 5)) === '<html'
2771
            || strtolower(substr($this->file->body, $ws, 7)) === '<script')
2772
        {
2773
            return 'text/html';
2774
        }
2775
        elseif (substr($this->file->body, 0, 5) === '%PDF-')
2776
        {
2777
            return 'application/pdf';
2778
        }
2779
        elseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-')
2780
        {
2781
            return 'application/postscript';
2782
        }
2783
        elseif (substr($this->file->body, 0, 6) === 'GIF87a'
2784
            || substr($this->file->body, 0, 6) === 'GIF89a')
2785
        {
2786
            return 'image/gif';
2787
        }
2788
        elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
2789
        {
2790
            return 'image/png';
2791
        }
2792
        elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF")
2793
        {
2794
            return 'image/jpeg';
2795
        }
2796
        elseif (substr($this->file->body, 0, 2) === "\x42\x4D")
2797
        {
2798
            return 'image/bmp';
2799
        }
2800
        elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00")
2801
        {
2802
            return 'image/vnd.microsoft.icon';
2803
        }
2804
        else
2805
        {
2806
            return $this->text_or_binary();
2807
        }
2808
    }
2809
    
2810
    public function image()
2811
    {
2812
        if (substr($this->file->body, 0, 6) === 'GIF87a'
2813
            || substr($this->file->body, 0, 6) === 'GIF89a')
2814
        {
2815
            return 'image/gif';
2816
        }
2817
        elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
2818
        {
2819
            return 'image/png';
2820
        }
2821
        elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF")
2822
        {
2823
            return 'image/jpeg';
2824
        }
2825
        elseif (substr($this->file->body, 0, 2) === "\x42\x4D")
2826
        {
2827
            return 'image/bmp';
2828
        }
2829
        elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00")
2830
        {
2831
            return 'image/vnd.microsoft.icon';
2832
        }
2833
        else
2834
        {
2835
            return false;
2836
        }
2837
    }
2838
    
2839
    public function feed_or_html()
2840
    {
2841
        $len = strlen($this->file->body);
2842
        $pos = strspn($this->file->body, "\x09\x0A\x0D\x20");
2843
        while ($pos < $len)
2844
        {
2845
            switch ($this->file->body[$pos])
2846
            {
2847
                case "\x09":
2848
                case "\x0A":
2849
                case "\x0D":
2850
                case "\x20":
2851
                    $pos += strspn($this->file->body, "\x09\x0A\x0D\x20", $pos);
2852
                    continue 2;
2853
                case '<':
2854
                    $pos++;
2855
                    break;
2856
                default:
2857
                    return 'text/html';
2858
            }
2859
            if (substr($this->file->body, $pos, 3) === '!--')
2860
            {
2861
                $pos += 3;
2862
                if ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false)
2863
                {
2864
                    $pos += 3;
2865
                }
2866
                else
2867
                {
2868
                    return 'text/html';
2869
                }
2870
            }
2871
            elseif (substr($this->file->body, $pos, 1) === '!')
2872
            {
2873
                if ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false)
2874
                {
2875
                    $pos++;
2876
                }
2877
                else
2878
                {
2879
                    return 'text/html';
2880
                }
2881
            }
2882
            elseif (substr($this->file->body, $pos, 1) === '?')
2883
            {
2884
                if ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false)
2885
                {
2886
                    $pos += 2;
2887
                }
2888
                else
2889
                {
2890
                    return 'text/html';
2891
                }
2892
            }
2893
            elseif (substr($this->file->body, $pos, 3) === 'rss'
2894
                || substr($this->file->body, $pos, 7) === 'rdf:RDF')
2895
            {
2896
                return 'application/rss+xml';
2897
            }
2898
            elseif (substr($this->file->body, $pos, 4) === 'feed')
2899
            {
2900
                return 'application/atom+xml';
2901
            }
2902
            else
2903
            {
2904
                return 'text/html';
2905
            }
2906
        }
2907
        return 'text/html';
2908
    }
2909
}
2910
class SimplePie_Copyright
2911
{
2912
    
2913
    var $url;
2914
    
2915
    var $label;
2916
    
2917
    public function __construct($url = null, $label = null)
2918
    {
2919
        $this->url = $url;
2920
        $this->label = $label;
2921
    }
2922
    
2923
    public function __toString()
2924
    {
2925
        // There is no $this->data here
2926
        return md5(serialize($this));
2927
    }
2928
    
2929
    public function get_url()
2930
    {
2931
        if ($this->url !== null)
2932
        {
2933
            return $this->url;
2934
        }
2935
        else
2936
        {
2937
            return null;
2938
        }
2939
    }
2940
    
2941
    public function get_attribution()
2942
    {
2943
        if ($this->label !== null)
2944
        {
2945
            return $this->label;
2946
        }
2947
        else
2948
        {
2949
            return null;
2950
        }
2951
    }
2952
}
2953
class SimplePie_Core extends SimplePie
2954
{
2955
}
2956
class SimplePie_Credit
2957
{
2958
    
2959
    var $role;
2960
    
2961
    var $scheme;
2962
    
2963
    var $name;
2964
    
2965
    public function __construct($role = null, $scheme = null, $name = null)
2966
    {
2967
        $this->role = $role;
2968
        $this->scheme = $scheme;
2969
        $this->name = $name;
2970
    }
2971
    
2972
    public function __toString()
2973
    {
2974
        // There is no $this->data here
2975
        return md5(serialize($this));
2976
    }
2977
    
2978
    public function get_role()
2979
    {
2980
        if ($this->role !== null)
2981
        {
2982
            return $this->role;
2983
        }
2984
        else
2985
        {
2986
            return null;
2987
        }
2988
    }
2989
    
2990
    public function get_scheme()
2991
    {
2992
        if ($this->scheme !== null)
2993
        {
2994
            return $this->scheme;
2995
        }
2996
        else
2997
        {
2998
            return null;
2999
        }
3000
    }
3001
    
3002
    public function get_name()
3003
    {
3004
        if ($this->name !== null)
3005
        {
3006
            return $this->name;
3007
        }
3008
        else
3009
        {
3010
            return null;
3011
        }
3012
    }
3013
}
3014
class SimplePie_Decode_HTML_Entities
3015
{
3016
    
3017
    var $data = '';
3018
    
3019
    var $consumed = '';
3020
    
3021
    var $position = 0;
3022
    
3023
    public function __construct($data)
3024
    {
3025
        $this->data = $data;
3026
    }
3027
    
3028
    public function parse()
3029
    {
3030
        while (($this->position = strpos($this->data, '&', $this->position)) !== false)
3031
        {
3032
            $this->consume();
3033
            $this->entity();
3034
            $this->consumed = '';
3035
        }
3036
        return $this->data;
3037
    }
3038
    
3039
    public function consume()
3040
    {
3041
        if (isset($this->data[$this->position]))
3042
        {
3043
            $this->consumed .= $this->data[$this->position];
3044
            return $this->data[$this->position++];
3045
        }
3046
        else
3047
        {
3048
            return false;
3049
        }
3050
    }
3051
    
3052
    public function consume_range($chars)
3053
    {
3054
        if ($len = strspn($this->data, $chars, $this->position))
3055
        {
3056
            $data = substr($this->data, $this->position, $len);
3057
            $this->consumed .= $data;
3058
            $this->position += $len;
3059
            return $data;
3060
        }
3061
        else
3062
        {
3063
            return false;
3064
        }
3065
    }
3066
    
3067
    public function unconsume()
3068
    {
3069
        $this->consumed = substr($this->consumed, 0, -1);
3070
        $this->position--;
3071
    }
3072
    
3073
    public function entity()
3074
    {
3075
        switch ($this->consume())
3076
        {
3077
            case "\x09":
3078
            case "\x0A":
3079
            case "\x0B":
3080
            case "\x0B":
3081
            case "\x0C":
3082
            case "\x20":
3083
            case "\x3C":
3084
            case "\x26":
3085
            case false:
3086
                break;
3087
            case "\x23":
3088
                switch ($this->consume())
3089
                {
3090
                    case "\x78":
3091
                    case "\x58":
3092
                        $range = '0123456789ABCDEFabcdef';
3093
                        $hex = true;
3094
                        break;
3095
                    default:
3096
                        $range = '0123456789';
3097
                        $hex = false;
3098
                        $this->unconsume();
3099
                        break;
3100
                }
3101
                if ($codepoint = $this->consume_range($range))
3102
                {
3103
                    static $windows_1252_specials = array(0x0D => "\x0A", 0x80 => "\xE2\x82\xAC", 0x81 => "\xEF\xBF\xBD", 0x82 => "\xE2\x80\x9A", 0x83 => "\xC6\x92", 0x84 => "\xE2\x80\x9E", 0x85 => "\xE2\x80\xA6", 0x86 => "\xE2\x80\xA0", 0x87 => "\xE2\x80\xA1", 0x88 => "\xCB\x86", 0x89 => "\xE2\x80\xB0", 0x8A => "\xC5\xA0", 0x8B => "\xE2\x80\xB9", 0x8C => "\xC5\x92", 0x8D => "\xEF\xBF\xBD", 0x8E => "\xC5\xBD", 0x8F => "\xEF\xBF\xBD", 0x90 => "\xEF\xBF\xBD", 0x91 => "\xE2\x80\x98", 0x92 => "\xE2\x80\x99", 0x93 => "\xE2\x80\x9C", 0x94 => "\xE2\x80\x9D", 0x95 => "\xE2\x80\xA2", 0x96 => "\xE2\x80\x93", 0x97 => "\xE2\x80\x94", 0x98 => "\xCB\x9C", 0x99 => "\xE2\x84\xA2", 0x9A => "\xC5\xA1", 0x9B => "\xE2\x80\xBA", 0x9C => "\xC5\x93", 0x9D => "\xEF\xBF\xBD", 0x9E => "\xC5\xBE", 0x9F => "\xC5\xB8");
3104
                    if ($hex)
3105
                    {
3106
                        $codepoint = hexdec($codepoint);
3107
                    }
3108
                    else
3109
                    {
3110
                        $codepoint = intval($codepoint);
3111
                    }
3112
                    if (isset($windows_1252_specials[$codepoint]))
3113
                    {
3114
                        $replacement = $windows_1252_specials[$codepoint];
3115
                    }
3116
                    else
3117
                    {
3118
                        $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint);
3119
                    }
3120
                    if (!in_array($this->consume(), array(';', false), true))
3121
                    {
3122
                        $this->unconsume();
3123
                    }
3124
                    $consumed_length = strlen($this->consumed);
3125
                    $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length);
3126
                    $this->position += strlen($replacement) - $consumed_length;
3127
                }
3128
                break;
3129
            default:
3130
                static $entities = array(
3131
                    'Aacute' => "\xC3\x81",
3132
                    'aacute' => "\xC3\xA1",
3133
                    'Aacute;' => "\xC3\x81",
3134
                    'aacute;' => "\xC3\xA1",
3135
                    'Acirc' => "\xC3\x82",
3136
                    'acirc' => "\xC3\xA2",
3137
                    'Acirc;' => "\xC3\x82",
3138
                    'acirc;' => "\xC3\xA2",
3139
                    'acute' => "\xC2\xB4",
3140
                    'acute;' => "\xC2\xB4",
3141
                    'AElig' => "\xC3\x86",
3142
                    'aelig' => "\xC3\xA6",
3143
                    'AElig;' => "\xC3\x86",
3144
                    'aelig;' => "\xC3\xA6",
3145
                    'Agrave' => "\xC3\x80",
3146
                    'agrave' => "\xC3\xA0",
3147
                    'Agrave;' => "\xC3\x80",
3148
                    'agrave;' => "\xC3\xA0",
3149
                    'alefsym;' => "\xE2\x84\xB5",
3150
                    'Alpha;' => "\xCE\x91",
3151
                    'alpha;' => "\xCE\xB1",
3152
                    'AMP' => "\x26",
3153
                    'amp' => "\x26",
3154
                    'AMP;' => "\x26",
3155
                    'amp;' => "\x26",
3156
                    'and;' => "\xE2\x88\xA7",
3157
                    'ang;' => "\xE2\x88\xA0",
3158
                    'apos;' => "\x27",
3159
                    'Aring' => "\xC3\x85",
3160
                    'aring' => "\xC3\xA5",
3161
                    'Aring;' => "\xC3\x85",
3162
                    'aring;' => "\xC3\xA5",
3163
                    'asymp;' => "\xE2\x89\x88",
3164
                    'Atilde' => "\xC3\x83",
3165
                    'atilde' => "\xC3\xA3",
3166
                    'Atilde;' => "\xC3\x83",
3167
                    'atilde;' => "\xC3\xA3",
3168
                    'Auml' => "\xC3\x84",
3169
                    'auml' => "\xC3\xA4",
3170
                    'Auml;' => "\xC3\x84",
3171
                    'auml;' => "\xC3\xA4",
3172
                    'bdquo;' => "\xE2\x80\x9E",
3173
                    'Beta;' => "\xCE\x92",
3174
                    'beta;' => "\xCE\xB2",
3175
                    'brvbar' => "\xC2\xA6",
3176
                    'brvbar;' => "\xC2\xA6",
3177
                    'bull;' => "\xE2\x80\xA2",
3178
                    'cap;' => "\xE2\x88\xA9",
3179
                    'Ccedil' => "\xC3\x87",
3180
                    'ccedil' => "\xC3\xA7",
3181
                    'Ccedil;' => "\xC3\x87",
3182
                    'ccedil;' => "\xC3\xA7",
3183
                    'cedil' => "\xC2\xB8",
3184
                    'cedil;' => "\xC2\xB8",
3185
                    'cent' => "\xC2\xA2",
3186
                    'cent;' => "\xC2\xA2",
3187
                    'Chi;' => "\xCE\xA7",
3188
                    'chi;' => "\xCF\x87",
3189
                    'circ;' => "\xCB\x86",
3190
                    'clubs;' => "\xE2\x99\xA3",
3191
                    'cong;' => "\xE2\x89\x85",
3192
                    'COPY' => "\xC2\xA9",
3193
                    'copy' => "\xC2\xA9",
3194
                    'COPY;' => "\xC2\xA9",
3195
                    'copy;' => "\xC2\xA9",
3196
                    'crarr;' => "\xE2\x86\xB5",
3197
                    'cup;' => "\xE2\x88\xAA",
3198
                    'curren' => "\xC2\xA4",
3199
                    'curren;' => "\xC2\xA4",
3200
                    'Dagger;' => "\xE2\x80\xA1",
3201
                    'dagger;' => "\xE2\x80\xA0",
3202
                    'dArr;' => "\xE2\x87\x93",
3203
                    'darr;' => "\xE2\x86\x93",
3204
                    'deg' => "\xC2\xB0",
3205
                    'deg;' => "\xC2\xB0",
3206
                    'Delta;' => "\xCE\x94",
3207
                    'delta;' => "\xCE\xB4",
3208
                    'diams;' => "\xE2\x99\xA6",
3209
                    'divide' => "\xC3\xB7",
3210
                    'divide;' => "\xC3\xB7",
3211
                    'Eacute' => "\xC3\x89",
3212
                    'eacute' => "\xC3\xA9",
3213
                    'Eacute;' => "\xC3\x89",
3214
                    'eacute;' => "\xC3\xA9",
3215
                    'Ecirc' => "\xC3\x8A",
3216
                    'ecirc' => "\xC3\xAA",
3217
                    'Ecirc;' => "\xC3\x8A",
3218
                    'ecirc;' => "\xC3\xAA",
3219
                    'Egrave' => "\xC3\x88",
3220
                    'egrave' => "\xC3\xA8",
3221
                    'Egrave;' => "\xC3\x88",
3222
                    'egrave;' => "\xC3\xA8",
3223
                    'empty;' => "\xE2\x88\x85",
3224
                    'emsp;' => "\xE2\x80\x83",
3225
                    'ensp;' => "\xE2\x80\x82",
3226
                    'Epsilon;' => "\xCE\x95",
3227
                    'epsilon;' => "\xCE\xB5",
3228
                    'equiv;' => "\xE2\x89\xA1",
3229
                    'Eta;' => "\xCE\x97",
3230
                    'eta;' => "\xCE\xB7",
3231
                    'ETH' => "\xC3\x90",
3232
                    'eth' => "\xC3\xB0",
3233
                    'ETH;' => "\xC3\x90",
3234
                    'eth;' => "\xC3\xB0",
3235
                    'Euml' => "\xC3\x8B",
3236
                    'euml' => "\xC3\xAB",
3237
                    'Euml;' => "\xC3\x8B",
3238
                    'euml;' => "\xC3\xAB",
3239
                    'euro;' => "\xE2\x82\xAC",
3240
                    'exist;' => "\xE2\x88\x83",
3241
                    'fnof;' => "\xC6\x92",
3242
                    'forall;' => "\xE2\x88\x80",
3243
                    'frac12' => "\xC2\xBD",
3244
                    'frac12;' => "\xC2\xBD",
3245
                    'frac14' => "\xC2\xBC",
3246
                    'frac14;' => "\xC2\xBC",
3247
                    'frac34' => "\xC2\xBE",
3248
                    'frac34;' => "\xC2\xBE",
3249
                    'frasl;' => "\xE2\x81\x84",
3250
                    'Gamma;' => "\xCE\x93",
3251
                    'gamma;' => "\xCE\xB3",
3252
                    'ge;' => "\xE2\x89\xA5",
3253
                    'GT' => "\x3E",
3254
                    'gt' => "\x3E",
3255
                    'GT;' => "\x3E",
3256
                    'gt;' => "\x3E",
3257
                    'hArr;' => "\xE2\x87\x94",
3258
                    'harr;' => "\xE2\x86\x94",
3259
                    'hearts;' => "\xE2\x99\xA5",
3260
                    'hellip;' => "\xE2\x80\xA6",
3261
                    'Iacute' => "\xC3\x8D",
3262
                    'iacute' => "\xC3\xAD",
3263
                    'Iacute;' => "\xC3\x8D",
3264
                    'iacute;' => "\xC3\xAD",
3265
                    'Icirc' => "\xC3\x8E",
3266
                    'icirc' => "\xC3\xAE",
3267
                    'Icirc;' => "\xC3\x8E",
3268
                    'icirc;' => "\xC3\xAE",
3269
                    'iexcl' => "\xC2\xA1",
3270
                    'iexcl;' => "\xC2\xA1",
3271
                    'Igrave' => "\xC3\x8C",
3272
                    'igrave' => "\xC3\xAC",
3273
                    'Igrave;' => "\xC3\x8C",
3274
                    'igrave;' => "\xC3\xAC",
3275
                    'image;' => "\xE2\x84\x91",
3276
                    'infin;' => "\xE2\x88\x9E",
3277
                    'int;' => "\xE2\x88\xAB",
3278
                    'Iota;' => "\xCE\x99",
3279
                    'iota;' => "\xCE\xB9",
3280
                    'iquest' => "\xC2\xBF",
3281
                    'iquest;' => "\xC2\xBF",
3282
                    'isin;' => "\xE2\x88\x88",
3283
                    'Iuml' => "\xC3\x8F",
3284
                    'iuml' => "\xC3\xAF",
3285
                    'Iuml;' => "\xC3\x8F",
3286
                    'iuml;' => "\xC3\xAF",
3287
                    'Kappa;' => "\xCE\x9A",
3288
                    'kappa;' => "\xCE\xBA",
3289
                    'Lambda;' => "\xCE\x9B",
3290
                    'lambda;' => "\xCE\xBB",
3291
                    'lang;' => "\xE3\x80\x88",
3292
                    'laquo' => "\xC2\xAB",
3293
                    'laquo;' => "\xC2\xAB",
3294
                    'lArr;' => "\xE2\x87\x90",
3295
                    'larr;' => "\xE2\x86\x90",
3296
                    'lceil;' => "\xE2\x8C\x88",
3297
                    'ldquo;' => "\xE2\x80\x9C",
3298
                    'le;' => "\xE2\x89\xA4",
3299
                    'lfloor;' => "\xE2\x8C\x8A",
3300
                    'lowast;' => "\xE2\x88\x97",
3301
                    'loz;' => "\xE2\x97\x8A",
3302
                    'lrm;' => "\xE2\x80\x8E",
3303
                    'lsaquo;' => "\xE2\x80\xB9",
3304
                    'lsquo;' => "\xE2\x80\x98",
3305
                    'LT' => "\x3C",
3306
                    'lt' => "\x3C",
3307
                    'LT;' => "\x3C",
3308
                    'lt;' => "\x3C",
3309
                    'macr' => "\xC2\xAF",
3310
                    'macr;' => "\xC2\xAF",
3311
                    'mdash;' => "\xE2\x80\x94",
3312
                    'micro' => "\xC2\xB5",
3313
                    'micro;' => "\xC2\xB5",
3314
                    'middot' => "\xC2\xB7",
3315
                    'middot;' => "\xC2\xB7",
3316
                    'minus;' => "\xE2\x88\x92",
3317
                    'Mu;' => "\xCE\x9C",
3318
                    'mu;' => "\xCE\xBC",
3319
                    'nabla;' => "\xE2\x88\x87",
3320
                    'nbsp' => "\xC2\xA0",
3321
                    'nbsp;' => "\xC2\xA0",
3322
                    'ndash;' => "\xE2\x80\x93",
3323
                    'ne;' => "\xE2\x89\xA0",
3324
                    'ni;' => "\xE2\x88\x8B",
3325
                    'not' => "\xC2\xAC",
3326
                    'not;' => "\xC2\xAC",
3327
                    'notin;' => "\xE2\x88\x89",
3328
                    'nsub;' => "\xE2\x8A\x84",
3329
                    'Ntilde' => "\xC3\x91",
3330
                    'ntilde' => "\xC3\xB1",
3331
                    'Ntilde;' => "\xC3\x91",
3332
                    'ntilde;' => "\xC3\xB1",
3333
                    'Nu;' => "\xCE\x9D",
3334
                    'nu;' => "\xCE\xBD",
3335
                    'Oacute' => "\xC3\x93",
3336
                    'oacute' => "\xC3\xB3",
3337
                    'Oacute;' => "\xC3\x93",
3338
                    'oacute;' => "\xC3\xB3",
3339
                    'Ocirc' => "\xC3\x94",
3340
                    'ocirc' => "\xC3\xB4",
3341
                    'Ocirc;' => "\xC3\x94",
3342
                    'ocirc;' => "\xC3\xB4",
3343
                    'OElig;' => "\xC5\x92",
3344
                    'oelig;' => "\xC5\x93",
3345
                    'Ograve' => "\xC3\x92",
3346
                    'ograve' => "\xC3\xB2",
3347
                    'Ograve;' => "\xC3\x92",
3348
                    'ograve;' => "\xC3\xB2",
3349
                    'oline;' => "\xE2\x80\xBE",
3350
                    'Omega;' => "\xCE\xA9",
3351
                    'omega;' => "\xCF\x89",
3352
                    'Omicron;' => "\xCE\x9F",
3353
                    'omicron;' => "\xCE\xBF",
3354
                    'oplus;' => "\xE2\x8A\x95",
3355
                    'or;' => "\xE2\x88\xA8",
3356
                    'ordf' => "\xC2\xAA",
3357
                    'ordf;' => "\xC2\xAA",
3358
                    'ordm' => "\xC2\xBA",
3359
                    'ordm;' => "\xC2\xBA",
3360
                    'Oslash' => "\xC3\x98",
3361
                    'oslash' => "\xC3\xB8",
3362
                    'Oslash;' => "\xC3\x98",
3363
                    'oslash;' => "\xC3\xB8",
3364
                    'Otilde' => "\xC3\x95",
3365
                    'otilde' => "\xC3\xB5",
3366
                    'Otilde;' => "\xC3\x95",
3367
                    'otilde;' => "\xC3\xB5",
3368
                    'otimes;' => "\xE2\x8A\x97",
3369
                    'Ouml' => "\xC3\x96",
3370
                    'ouml' => "\xC3\xB6",
3371
                    'Ouml;' => "\xC3\x96",
3372
                    'ouml;' => "\xC3\xB6",
3373
                    'para' => "\xC2\xB6",
3374
                    'para;' => "\xC2\xB6",
3375
                    'part;' => "\xE2\x88\x82",
3376
                    'permil;' => "\xE2\x80\xB0",
3377
                    'perp;' => "\xE2\x8A\xA5",
3378
                    'Phi;' => "\xCE\xA6",
3379
                    'phi;' => "\xCF\x86",
3380
                    'Pi;' => "\xCE\xA0",
3381
                    'pi;' => "\xCF\x80",
3382
                    'piv;' => "\xCF\x96",
3383
                    'plusmn' => "\xC2\xB1",
3384
                    'plusmn;' => "\xC2\xB1",
3385
                    'pound' => "\xC2\xA3",
3386
                    'pound;' => "\xC2\xA3",
3387
                    'Prime;' => "\xE2\x80\xB3",
3388
                    'prime;' => "\xE2\x80\xB2",
3389
                    'prod;' => "\xE2\x88\x8F",
3390
                    'prop;' => "\xE2\x88\x9D",
3391
                    'Psi;' => "\xCE\xA8",
3392
                    'psi;' => "\xCF\x88",
3393
                    'QUOT' => "\x22",
3394
                    'quot' => "\x22",
3395
                    'QUOT;' => "\x22",
3396
                    'quot;' => "\x22",
3397
                    'radic;' => "\xE2\x88\x9A",
3398
                    'rang;' => "\xE3\x80\x89",
3399
                    'raquo' => "\xC2\xBB",
3400
                    'raquo;' => "\xC2\xBB",
3401
                    'rArr;' => "\xE2\x87\x92",
3402
                    'rarr;' => "\xE2\x86\x92",
3403
                    'rceil;' => "\xE2\x8C\x89",
3404
                    'rdquo;' => "\xE2\x80\x9D",
3405
                    'real;' => "\xE2\x84\x9C",
3406
                    'REG' => "\xC2\xAE",
3407
                    'reg' => "\xC2\xAE",
3408
                    'REG;' => "\xC2\xAE",
3409
                    'reg;' => "\xC2\xAE",
3410
                    'rfloor;' => "\xE2\x8C\x8B",
3411
                    'Rho;' => "\xCE\xA1",
3412
                    'rho;' => "\xCF\x81",
3413
                    'rlm;' => "\xE2\x80\x8F",
3414
                    'rsaquo;' => "\xE2\x80\xBA",
3415
                    'rsquo;' => "\xE2\x80\x99",
3416
                    'sbquo;' => "\xE2\x80\x9A",
3417
                    'Scaron;' => "\xC5\xA0",
3418
                    'scaron;' => "\xC5\xA1",
3419
                    'sdot;' => "\xE2\x8B\x85",
3420
                    'sect' => "\xC2\xA7",
3421
                    'sect;' => "\xC2\xA7",
3422
                    'shy' => "\xC2\xAD",
3423
                    'shy;' => "\xC2\xAD",
3424
                    'Sigma;' => "\xCE\xA3",
3425
                    'sigma;' => "\xCF\x83",
3426
                    'sigmaf;' => "\xCF\x82",
3427
                    'sim;' => "\xE2\x88\xBC",
3428
                    'spades;' => "\xE2\x99\xA0",
3429
                    'sub;' => "\xE2\x8A\x82",
3430
                    'sube;' => "\xE2\x8A\x86",
3431
                    'sum;' => "\xE2\x88\x91",
3432
                    'sup;' => "\xE2\x8A\x83",
3433
                    'sup1' => "\xC2\xB9",
3434
                    'sup1;' => "\xC2\xB9",
3435
                    'sup2' => "\xC2\xB2",
3436
                    'sup2;' => "\xC2\xB2",
3437
                    'sup3' => "\xC2\xB3",
3438
                    'sup3;' => "\xC2\xB3",
3439
                    'supe;' => "\xE2\x8A\x87",
3440
                    'szlig' => "\xC3\x9F",
3441
                    'szlig;' => "\xC3\x9F",
3442
                    'Tau;' => "\xCE\xA4",
3443
                    'tau;' => "\xCF\x84",
3444
                    'there4;' => "\xE2\x88\xB4",
3445
                    'Theta;' => "\xCE\x98",
3446
                    'theta;' => "\xCE\xB8",
3447
                    'thetasym;' => "\xCF\x91",
3448
                    'thinsp;' => "\xE2\x80\x89",
3449
                    'THORN' => "\xC3\x9E",
3450
                    'thorn' => "\xC3\xBE",
3451
                    'THORN;' => "\xC3\x9E",
3452
                    'thorn;' => "\xC3\xBE",
3453
                    'tilde;' => "\xCB\x9C",
3454
                    'times' => "\xC3\x97",
3455
                    'times;' => "\xC3\x97",
3456
                    'TRADE;' => "\xE2\x84\xA2",
3457
                    'trade;' => "\xE2\x84\xA2",
3458
                    'Uacute' => "\xC3\x9A",
3459
                    'uacute' => "\xC3\xBA",
3460
                    'Uacute;' => "\xC3\x9A",
3461
                    'uacute;' => "\xC3\xBA",
3462
                    'uArr;' => "\xE2\x87\x91",
3463
                    'uarr;' => "\xE2\x86\x91",
3464
                    'Ucirc' => "\xC3\x9B",
3465
                    'ucirc' => "\xC3\xBB",
3466
                    'Ucirc;' => "\xC3\x9B",
3467
                    'ucirc;' => "\xC3\xBB",
3468
                    'Ugrave' => "\xC3\x99",
3469
                    'ugrave' => "\xC3\xB9",
3470
                    'Ugrave;' => "\xC3\x99",
3471
                    'ugrave;' => "\xC3\xB9",
3472
                    'uml' => "\xC2\xA8",
3473
                    'uml;' => "\xC2\xA8",
3474
                    'upsih;' => "\xCF\x92",
3475
                    'Upsilon;' => "\xCE\xA5",
3476
                    'upsilon;' => "\xCF\x85",
3477
                    'Uuml' => "\xC3\x9C",
3478
                    'uuml' => "\xC3\xBC",
3479
                    'Uuml;' => "\xC3\x9C",
3480
                    'uuml;' => "\xC3\xBC",
3481
                    'weierp;' => "\xE2\x84\x98",
3482
                    'Xi;' => "\xCE\x9E",
3483
                    'xi;' => "\xCE\xBE",
3484
                    'Yacute' => "\xC3\x9D",
3485
                    'yacute' => "\xC3\xBD",
3486
                    'Yacute;' => "\xC3\x9D",
3487
                    'yacute;' => "\xC3\xBD",
3488
                    'yen' => "\xC2\xA5",
3489
                    'yen;' => "\xC2\xA5",
3490
                    'yuml' => "\xC3\xBF",
3491
                    'Yuml;' => "\xC5\xB8",
3492
                    'yuml;' => "\xC3\xBF",
3493
                    'Zeta;' => "\xCE\x96",
3494
                    'zeta;' => "\xCE\xB6",
3495
                    'zwj;' => "\xE2\x80\x8D",
3496
                    'zwnj;' => "\xE2\x80\x8C"
3497
                );
3498
                for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++)
3499
                {
3500
                    $consumed = substr($this->consumed, 1);
3501
                    if (isset($entities[$consumed]))
3502
                    {
3503
                        $match = $consumed;
3504
                    }
3505
                }
3506
                if ($match !== null)
3507
                {
3508
                     $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1);
3509
                    $this->position += strlen($entities[$match]) - strlen($consumed) - 1;
3510
                }
3511
                break;
3512
        }
3513
    }
3514
}
3515
class SimplePie_Enclosure
3516
{
3517
    
3518
    var $bitrate;
3519
    
3520
    var $captions;
3521
    
3522
    var $categories;
3523
    
3524
    var $channels;
3525
    
3526
    var $copyright;
3527
    
3528
    var $credits;
3529
    
3530
    var $description;
3531
    
3532
    var $duration;
3533
    
3534
    var $expression;
3535
    
3536
    var $framerate;
3537
    
3538
    var $handler;
3539
    
3540
    var $hashes;
3541
    
3542
    var $height;
3543
    
3544
    var $javascript;
3545
    
3546
    var $keywords;
3547
    
3548
    var $lang;
3549
    
3550
    var $length;
3551
    
3552
    var $link;
3553
    
3554
    var $medium;
3555
    
3556
    var $player;
3557
    
3558
    var $ratings;
3559
    
3560
    var $restrictions;
3561
    
3562
    var $samplingrate;
3563
    
3564
    var $thumbnails;
3565
    
3566
    var $title;
3567
    
3568
    var $type;
3569
    
3570
    var $width;
3571
    
3572
    public function __construct($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null)
3573
    {
3574
        $this->bitrate = $bitrate;
3575
        $this->captions = $captions;
3576
        $this->categories = $categories;
3577
        $this->channels = $channels;
3578
        $this->copyright = $copyright;
3579
        $this->credits = $credits;
3580
        $this->description = $description;
3581
        $this->duration = $duration;
3582
        $this->expression = $expression;
3583
        $this->framerate = $framerate;
3584
        $this->hashes = $hashes;
3585
        $this->height = $height;
3586
        $this->keywords = $keywords;
3587
        $this->lang = $lang;
3588
        $this->length = $length;
3589
        $this->link = $link;
3590
        $this->medium = $medium;
3591
        $this->player = $player;
3592
        $this->ratings = $ratings;
3593
        $this->restrictions = $restrictions;
3594
        $this->samplingrate = $samplingrate;
3595
        $this->thumbnails = $thumbnails;
3596
        $this->title = $title;
3597
        $this->type = $type;
3598
        $this->width = $width;
3599
        if (class_exists('idna_convert'))
3600
        {
3601
            $idn = new idna_convert();
3602
            $parsed = SimplePie_Misc::parse_url($link);
3603
            $this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
3604
        }
3605
        $this->handler = $this->get_handler(); // Needs to load last
3606
    }
3607
    
3608
    public function __toString()
3609
    {
3610
        // There is no $this->data here
3611
        return md5(serialize($this));
3612
    }
3613
    
3614
    public function get_bitrate()
3615
    {
3616
        if ($this->bitrate !== null)
3617
        {
3618
            return $this->bitrate;
3619
        }
3620
        else
3621
        {
3622
            return null;
3623
        }
3624
    }
3625
    
3626
    public function get_caption($key = 0)
3627
    {
3628
        $captions = $this->get_captions();
3629
        if (isset($captions[$key]))
3630
        {
3631
            return $captions[$key];
3632
        }
3633
        else
3634
        {
3635
            return null;
3636
        }
3637
    }
3638
    
3639
    public function get_captions()
3640
    {
3641
        if ($this->captions !== null)
3642
        {
3643
            return $this->captions;
3644
        }
3645
        else
3646
        {
3647
            return null;
3648
        }
3649
    }
3650
    
3651
    public function get_category($key = 0)
3652
    {
3653
        $categories = $this->get_categories();
3654
        if (isset($categories[$key]))
3655
        {
3656
            return $categories[$key];
3657
        }
3658
        else
3659
        {
3660
            return null;
3661
        }
3662
    }
3663
    
3664
    public function get_categories()
3665
    {
3666
        if ($this->categories !== null)
3667
        {
3668
            return $this->categories;
3669
        }
3670
        else
3671
        {
3672
            return null;
3673
        }
3674
    }
3675
    
3676
    public function get_channels()
3677
    {
3678
        if ($this->channels !== null)
3679
        {
3680
            return $this->channels;
3681
        }
3682
        else
3683
        {
3684
            return null;
3685
        }
3686
    }
3687
    
3688
    public function get_copyright()
3689
    {
3690
        if ($this->copyright !== null)
3691
        {
3692
            return $this->copyright;
3693
        }
3694
        else
3695
        {
3696
            return null;
3697
        }
3698
    }
3699
    
3700
    public function get_credit($key = 0)
3701
    {
3702
        $credits = $this->get_credits();
3703
        if (isset($credits[$key]))
3704
        {
3705
            return $credits[$key];
3706
        }
3707
        else
3708
        {
3709
            return null;
3710
        }
3711
    }
3712
    
3713
    public function get_credits()
3714
    {
3715
        if ($this->credits !== null)
3716
        {
3717
            return $this->credits;
3718
        }
3719
        else
3720
        {
3721
            return null;
3722
        }
3723
    }
3724
    
3725
    public function get_description()
3726
    {
3727
        if ($this->description !== null)
3728
        {
3729
            return $this->description;
3730
        }
3731
        else
3732
        {
3733
            return null;
3734
        }
3735
    }
3736
    
3737
    public function get_duration($convert = false)
3738
    {
3739
        if ($this->duration !== null)
3740
        {
3741
            if ($convert)
3742
            {
3743
                $time = SimplePie_Misc::time_hms($this->duration);
3744
                return $time;
3745
            }
3746
            else
3747
            {
3748
                return $this->duration;
3749
            }
3750
        }
3751
        else
3752
        {
3753
            return null;
3754
        }
3755
    }
3756
    
3757
    public function get_expression()
3758
    {
3759
        if ($this->expression !== null)
3760
        {
3761
            return $this->expression;
3762
        }
3763
        else
3764
        {
3765
            return 'full';
3766
        }
3767
    }
3768
    
3769
    public function get_extension()
3770
    {
3771
        if ($this->link !== null)
3772
        {
3773
            $url = SimplePie_Misc::parse_url($this->link);
3774
            if ($url['path'] !== '')
3775
            {
3776
                return pathinfo($url['path'], PATHINFO_EXTENSION);
3777
            }
3778
        }
3779
        return null;
3780
    }
3781
    
3782
    public function get_framerate()
3783
    {
3784
        if ($this->framerate !== null)
3785
        {
3786
            return $this->framerate;
3787
        }
3788
        else
3789
        {
3790
            return null;
3791
        }
3792
    }
3793
    
3794
    public function get_handler()
3795
    {
3796
        return $this->get_real_type(true);
3797
    }
3798
    
3799
    public function get_hash($key = 0)
3800
    {
3801
        $hashes = $this->get_hashes();
3802
        if (isset($hashes[$key]))
3803
        {
3804
            return $hashes[$key];
3805
        }
3806
        else
3807
        {
3808
            return null;
3809
        }
3810
    }
3811
    
3812
    public function get_hashes()
3813
    {
3814
        if ($this->hashes !== null)
3815
        {
3816
            return $this->hashes;
3817
        }
3818
        else
3819
        {
3820
            return null;
3821
        }
3822
    }
3823
    
3824
    public function get_height()
3825
    {
3826
        if ($this->height !== null)
3827
        {
3828
            return $this->height;
3829
        }
3830
        else
3831
        {
3832
            return null;
3833
        }
3834
    }
3835
    
3836
    public function get_language()
3837
    {
3838
        if ($this->lang !== null)
3839
        {
3840
            return $this->lang;
3841
        }
3842
        else
3843
        {
3844
            return null;
3845
        }
3846
    }
3847
    
3848
    public function get_keyword($key = 0)
3849
    {
3850
        $keywords = $this->get_keywords();
3851
        if (isset($keywords[$key]))
3852
        {
3853
            return $keywords[$key];
3854
        }
3855
        else
3856
        {
3857
            return null;
3858
        }
3859
    }
3860
    
3861
    public function get_keywords()
3862
    {
3863
        if ($this->keywords !== null)
3864
        {
3865
            return $this->keywords;
3866
        }
3867
        else
3868
        {
3869
            return null;
3870
        }
3871
    }
3872
    
3873
    public function get_length()
3874
    {
3875
        if ($this->length !== null)
3876
        {
3877
            return $this->length;
3878
        }
3879
        else
3880
        {
3881
            return null;
3882
        }
3883
    }
3884
    
3885
    public function get_link()
3886
    {
3887
        if ($this->link !== null)
3888
        {
3889
            return urldecode($this->link);
3890
        }
3891
        else
3892
        {
3893
            return null;
3894
        }
3895
    }
3896
    
3897
    public function get_medium()
3898
    {
3899
        if ($this->medium !== null)
3900
        {
3901
            return $this->medium;
3902
        }
3903
        else
3904
        {
3905
            return null;
3906
        }
3907
    }
3908
    
3909
    public function get_player()
3910
    {
3911
        if ($this->player !== null)
3912
        {
3913
            return $this->player;
3914
        }
3915
        else
3916
        {
3917
            return null;
3918
        }
3919
    }
3920
    
3921
    public function get_rating($key = 0)
3922
    {
3923
        $ratings = $this->get_ratings();
3924
        if (isset($ratings[$key]))
3925
        {
3926
            return $ratings[$key];
3927
        }
3928
        else
3929
        {
3930
            return null;
3931
        }
3932
    }
3933
    
3934
    public function get_ratings()
3935
    {
3936
        if ($this->ratings !== null)
3937
        {
3938
            return $this->ratings;
3939
        }
3940
        else
3941
        {
3942
            return null;
3943
        }
3944
    }
3945
    
3946
    public function get_restriction($key = 0)
3947
    {
3948
        $restrictions = $this->get_restrictions();
3949
        if (isset($restrictions[$key]))
3950
        {
3951
            return $restrictions[$key];
3952
        }
3953
        else
3954
        {
3955
            return null;
3956
        }
3957
    }
3958
    
3959
    public function get_restrictions()
3960
    {
3961
        if ($this->restrictions !== null)
3962
        {
3963
            return $this->restrictions;
3964
        }
3965
        else
3966
        {
3967
            return null;
3968
        }
3969
    }
3970
    
3971
    public function get_sampling_rate()
3972
    {
3973
        if ($this->samplingrate !== null)
3974
        {
3975
            return $this->samplingrate;
3976
        }
3977
        else
3978
        {
3979
            return null;
3980
        }
3981
    }
3982
    
3983
    public function get_size()
3984
    {
3985
        $length = $this->get_length();
3986
        if ($length !== null)
3987
        {
3988
            return round($length/1048576, 2);
3989
        }
3990
        else
3991
        {
3992
            return null;
3993
        }
3994
    }
3995
    
3996
    public function get_thumbnail($key = 0)
3997
    {
3998
        $thumbnails = $this->get_thumbnails();
3999
        if (isset($thumbnails[$key]))
4000
        {
4001
            return $thumbnails[$key];
4002
        }
4003
        else
4004
        {
4005
            return null;
4006
        }
4007
    }
4008
    
4009
    public function get_thumbnails()
4010
    {
4011
        if ($this->thumbnails !== null)
4012
        {
4013
            return $this->thumbnails;
4014
        }
4015
        else
4016
        {
4017
            return null;
4018
        }
4019
    }
4020
    
4021
    public function get_title()
4022
    {
4023
        if ($this->title !== null)
4024
        {
4025
            return $this->title;
4026
        }
4027
        else
4028
        {
4029
            return null;
4030
        }
4031
    }
4032
    
4033
    public function get_type()
4034
    {
4035
        if ($this->type !== null)
4036
        {
4037
            return $this->type;
4038
        }
4039
        else
4040
        {
4041
            return null;
4042
        }
4043
    }
4044
    
4045
    public function get_width()
4046
    {
4047
        if ($this->width !== null)
4048
        {
4049
            return $this->width;
4050
        }
4051
        else
4052
        {
4053
            return null;
4054
        }
4055
    }
4056
    
4057
    public function native_embed($options='')
4058
    {
4059
        return $this->embed($options, true);
4060
    }
4061
    
4062
    public function embed($options = '', $native = false)
4063
    {
4064
        // Set up defaults
4065
        $audio = '';
4066
        $video = '';
4067
        $alt = '';
4068
        $altclass = '';
4069
        $loop = 'false';
4070
        $width = 'auto';
4071
        $height = 'auto';
4072
        $bgcolor = '#ffffff';
4073
        $mediaplayer = '';
4074
        $widescreen = false;
4075
        $handler = $this->get_handler();
4076
        $type = $this->get_real_type();
4077
        // Process options and reassign values as necessary
4078
        if (is_array($options))
4079
        {
4080
            extract($options);
4081
        }
4082
        else
4083
        {
4084
            $options = explode(',', $options);
4085
            foreach($options as $option)
4086
            {
4087
                $opt = explode(':', $option, 2);
4088
                if (isset($opt[0], $opt[1]))
4089
                {
4090
                    $opt[0] = trim($opt[0]);
4091
                    $opt[1] = trim($opt[1]);
4092
                    switch ($opt[0])
4093
                    {
4094
                        case 'audio':
4095
                            $audio = $opt[1];
4096
                            break;
4097
                        case 'video':
4098
                            $video = $opt[1];
4099
                            break;
4100
                        case 'alt':
4101
                            $alt = $opt[1];
4102
                            break;
4103
                        case 'altclass':
4104
                            $altclass = $opt[1];
4105
                            break;
4106
                        case 'loop':
4107
                            $loop = $opt[1];
4108
                            break;
4109
                        case 'width':
4110
                            $width = $opt[1];
4111
                            break;
4112
                        case 'height':
4113
                            $height = $opt[1];
4114
                            break;
4115
                        case 'bgcolor':
4116
                            $bgcolor = $opt[1];
4117
                            break;
4118
                        case 'mediaplayer':
4119
                            $mediaplayer = $opt[1];
4120
                            break;
4121
                        case 'widescreen':
4122
                            $widescreen = $opt[1];
4123
                            break;
4124
                    }
4125
                }
4126
            }
4127
        }
4128
        $mime = explode('/', $type, 2);
4129
        $mime = $mime[0];
4130
        // Process values for 'auto'
4131
        if ($width === 'auto')
4132
        {
4133
            if ($mime === 'video')
4134
            {
4135
                if ($height === 'auto')
4136
                {
4137
                    $width = 480;
4138
                }
4139
                elseif ($widescreen)
4140
                {
4141
                    $width = round((intval($height)/9)*16);
4142
                }
4143
                else
4144
                {
4145
                    $width = round((intval($height)/3)*4);
4146
                }
4147
            }
4148
            else
4149
            {
4150
                $width = '100%';
4151
            }
4152
        }
4153
        if ($height === 'auto')
4154
        {
4155
            if ($mime === 'audio')
4156
            {
4157
                $height = 0;
4158
            }
4159
            elseif ($mime === 'video')
4160
            {
4161
                if ($width === 'auto')
4162
                {
4163
                    if ($widescreen)
4164
                    {
4165
                        $height = 270;
4166
                    }
4167
                    else
4168
                    {
4169
                        $height = 360;
4170
                    }
4171
                }
4172
                elseif ($widescreen)
4173
                {
4174
                    $height = round((intval($width)/16)*9);
4175
                }
4176
                else
4177
                {
4178
                    $height = round((intval($width)/4)*3);
4179
                }
4180
            }
4181
            else
4182
            {
4183
                $height = 376;
4184
            }
4185
        }
4186
        elseif ($mime === 'audio')
4187
        {
4188
            $height = 0;
4189
        }
4190
        // Set proper placeholder value
4191
        if ($mime === 'audio')
4192
        {
4193
            $placeholder = $audio;
4194
        }
4195
        elseif ($mime === 'video')
4196
        {
4197
            $placeholder = $video;
4198
        }
4199
        $embed = '';
4200
        // Flash
4201
        if ($handler === 'flash')
4202
        {
4203
            if ($native)
4204
            {
4205
                $embed .= "<embed src=\"" . $this->get_link() . "\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\"></embed>";
4206
            }
4207
            else
4208
            {
4209
                $embed .= "<script type='text/javascript'>embed_flash('$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$loop', '$type');</script>";
4210
            }
4211
        }
4212
        // Flash Media Player file types.
4213
        // Preferred handler for MP3 file types.
4214
        elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== ''))
4215
        {
4216
            $height += 20;
4217
            if ($native)
4218
            {
4219
                $embed .= "<embed src=\"$mediaplayer\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"application/x-shockwave-flash\" quality=\"high\" width=\"$width\" height=\"$height\" wmode=\"transparent\" flashvars=\"file=" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\"></embed>";
4220
            }
4221
            else
4222
            {
4223
                $embed .= "<script type='text/javascript'>embed_flv('$width', '$height', '" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "', '$placeholder', '$loop', '$mediaplayer');</script>";
4224
            }
4225
        }
4226
        // QuickTime 7 file types.  Need to test with QuickTime 6.
4227
        // Only handle MP3's if the Flash Media Player is not present.
4228
        elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === ''))
4229
        {
4230
            $height += 16;
4231
            if ($native)
4232
            {
4233
                if ($placeholder !== '')
4234
                {
4235
                    $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" href=\"" . $this->get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>";
4236
                }
4237
                else
4238
                {
4239
                    $embed .= "<embed type=\"$type\" style=\"cursor:hand; cursor:pointer;\" src=\"" . $this->get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\"></embed>";
4240
                }
4241
            }
4242
            else
4243
            {
4244
                $embed .= "<script type='text/javascript'>embed_quicktime('$type', '$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$placeholder', '$loop');</script>";
4245
            }
4246
        }
4247
        // Windows Media
4248
        elseif ($handler === 'wmedia')
4249
        {
4250
            $height += 45;
4251
            if ($native)
4252
            {
4253
                $embed .= "<embed type=\"application/x-mplayer2\" src=\"" . $this->get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\"></embed>";
4254
            }
4255
            else
4256
            {
4257
                $embed .= "<script type='text/javascript'>embed_wmedia('$width', '$height', '" . $this->get_link() . "');</script>";
4258
            }
4259
        }
4260
        // Everything else
4261
        else $embed .= '<a href="' . $this->get_link() . '" class="' . $altclass . '">' . $alt . '</a>';
4262
        return $embed;
4263
    }
4264
    
4265
    public function get_real_type($find_handler = false)
4266
    {
4267
        // Mime-types by handler.
4268
        $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash
4269
        $types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player
4270
        $types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime
4271
        $types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media
4272
        $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3
4273
        if ($this->get_type() !== null)
4274
        {
4275
            $type = strtolower($this->type);
4276
        }
4277
        else
4278
        {
4279
            $type = null;
4280
        }
4281
        // If we encounter an unsupported mime-type, check the file extension and guess intelligently.
4282
        if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3)))
4283
        {
4284
            switch (strtolower($this->get_extension()))
4285
            {
4286
                // Audio mime-types
4287
                case 'aac':
4288
                case 'adts':
4289
                    $type = 'audio/acc';
4290
                    break;
4291
                case 'aif':
4292
                case 'aifc':
4293
                case 'aiff':
4294
                case 'cdda':
4295
                    $type = 'audio/aiff';
4296
                    break;
4297
                case 'bwf':
4298
                    $type = 'audio/wav';
4299
                    break;
4300
                case 'kar':
4301
                case 'mid':
4302
                case 'midi':
4303
                case 'smf':
4304
                    $type = 'audio/midi';
4305
                    break;
4306
                case 'm4a':
4307
                    $type = 'audio/x-m4a';
4308
                    break;
4309
                case 'mp3':
4310
                case 'swa':
4311
                    $type = 'audio/mp3';
4312
                    break;
4313
                case 'wav':
4314
                    $type = 'audio/wav';
4315
                    break;
4316
                case 'wax':
4317
                    $type = 'audio/x-ms-wax';
4318
                    break;
4319
                case 'wma':
4320
                    $type = 'audio/x-ms-wma';
4321
                    break;
4322
                // Video mime-types
4323
                case '3gp':
4324
                case '3gpp':
4325
                    $type = 'video/3gpp';
4326
                    break;
4327
                case '3g2':
4328
                case '3gp2':
4329
                    $type = 'video/3gpp2';
4330
                    break;
4331
                case 'asf':
4332
                    $type = 'video/x-ms-asf';
4333
                    break;
4334
                case 'flv':
4335
                    $type = 'video/x-flv';
4336
                    break;
4337
                case 'm1a':
4338
                case 'm1s':
4339
                case 'm1v':
4340
                case 'm15':
4341
                case 'm75':
4342
                case 'mp2':
4343
                case 'mpa':
4344
                case 'mpeg':
4345
                case 'mpg':
4346
                case 'mpm':
4347
                case 'mpv':
4348
                    $type = 'video/mpeg';
4349
                    break;
4350
                case 'm4v':
4351
                    $type = 'video/x-m4v';
4352
                    break;
4353
                case 'mov':
4354
                case 'qt':
4355
                    $type = 'video/quicktime';
4356
                    break;
4357
                case 'mp4':
4358
                case 'mpg4':
4359
                    $type = 'video/mp4';
4360
                    break;
4361
                case 'sdv':
4362
                    $type = 'video/sd-video';
4363
                    break;
4364
                case 'wm':
4365
                    $type = 'video/x-ms-wm';
4366
                    break;
4367
                case 'wmv':
4368
                    $type = 'video/x-ms-wmv';
4369
                    break;
4370
                case 'wvx':
4371
                    $type = 'video/x-ms-wvx';
4372
                    break;
4373
                // Flash mime-types
4374
                case 'spl':
4375
                    $type = 'application/futuresplash';
4376
                    break;
4377
                case 'swf':
4378
                    $type = 'application/x-shockwave-flash';
4379
                    break;
4380
            }
4381
        }
4382
        if ($find_handler)
4383
        {
4384
            if (in_array($type, $types_flash))
4385
            {
4386
                return 'flash';
4387
            }
4388
            elseif (in_array($type, $types_fmedia))
4389
            {
4390
                return 'fmedia';
4391
            }
4392
            elseif (in_array($type, $types_quicktime))
4393
            {
4394
                return 'quicktime';
4395
            }
4396
            elseif (in_array($type, $types_wmedia))
4397
            {
4398
                return 'wmedia';
4399
            }
4400
            elseif (in_array($type, $types_mp3))
4401
            {
4402
                return 'mp3';
4403
            }
4404
            else
4405
            {
4406
                return null;
4407
            }
4408
        }
4409
        else
4410
        {
4411
            return $type;
4412
        }
4413
    }
4414
}
4415
class SimplePie_Exception extends Exception
4416
{
4417
}
4418
class SimplePie_File
4419
{
4420
    var $url;
4421
    var $useragent;
4422
    var $success = true;
4423
    var $headers = array();
4424
    var $body;
4425
    var $status_code;
4426
    var $redirects = 0;
4427
    var $error;
4428
    var $method = SIMPLEPIE_FILE_SOURCE_NONE;
4429
    public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false)
4430
    {
4431
        if (class_exists('idna_convert'))
4432
        {
4433
            $idn = new idna_convert();
4434
            $parsed = SimplePie_Misc::parse_url($url);
4435
            $url = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
4436
        }
4437
        $this->url = $url;
4438
        $this->useragent = $useragent;
4439
        if (preg_match('/^http(s)?:\/\//i', $url))
4440
        {
4441
            if ($useragent === null)
4442
            {
4443
                $useragent = ini_get('user_agent');
4444
                $this->useragent = $useragent;
4445
            }
4446
            if (!is_array($headers))
4447
            {
4448
                $headers = array();
4449
            }
4450
            if (!$force_fsockopen && function_exists('curl_exec'))
4451
            {
4452
                $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL;
4453
                $fp = curl_init();
4454
                $headers2 = array();
4455
                foreach ($headers as $key => $value)
4456
                {
4457
                    $headers2[] = "$key: $value";
4458
                }
4459
                if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>='))
4460
                {
4461
                    curl_setopt($fp, CURLOPT_ENCODING, '');
4462
                }
4463
                curl_setopt($fp, CURLOPT_URL, $url);
4464
                curl_setopt($fp, CURLOPT_HEADER, 1);
4465
                curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1);
4466
                curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
4467
                curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
4468
                curl_setopt($fp, CURLOPT_REFERER, $url);
4469
                curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
4470
                curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
4471
                if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>='))
4472
                {
4473
                    curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1);
4474
                    curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects);
4475
                }
4476
                $this->headers = curl_exec($fp);
4477
                if (curl_errno($fp) === 23 || curl_errno($fp) === 61)
4478
                {
4479
                    curl_setopt($fp, CURLOPT_ENCODING, 'none');
4480
                    $this->headers = curl_exec($fp);
4481
                }
4482
                if (curl_errno($fp))
4483
                {
4484
                    $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);
4485
                    $this->success = false;
4486
                }
4487
                else
4488
                {
4489
                    $info = curl_getinfo($fp);
4490
                    curl_close($fp);
4491
                    $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1);
4492
                    $this->headers = array_pop($this->headers);
4493
                    $parser = new SimplePie_HTTP_Parser($this->headers);
4494
                    if ($parser->parse())
4495
                    {
4496
                        $this->headers = $parser->headers;
4497
                        $this->body = $parser->body;
4498
                        $this->status_code = $parser->status_code;
4499
                        if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
4500
4501
                        {
4502
                            $this->redirects++;
4503
                            $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
4504
                            return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
4505
                        }
4506
                    }
4507
                }
4508
            }
4509
            else
4510
            {
4511
                $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN;
4512
                $url_parts = parse_url($url);
4513
                $socket_host = $url_parts['host'];
4514
                if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https')
4515
                {
4516
                    $socket_host = "ssl://$url_parts[host]";
4517
                    $url_parts['port'] = 443;
4518
                }
4519
                if (!isset($url_parts['port']))
4520
                {
4521
                    $url_parts['port'] = 80;
4522
                }
4523
                $fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout);
4524
                if (!$fp)
4525
                {
4526
                    $this->error = 'fsockopen error: ' . $errstr;
4527
                    $this->success = false;
4528
                }
4529
                else
4530
                {
4531
                    stream_set_timeout($fp, $timeout);
4532
                    if (isset($url_parts['path']))
4533
                    {
4534
                        if (isset($url_parts['query']))
4535
                        {
4536
                            $get = "$url_parts[path]?$url_parts[query]";
4537
                        }
4538
                        else
4539
                        {
4540
                            $get = $url_parts['path'];
4541
                        }
4542
                    }
4543
                    else
4544
                    {
4545
                        $get = '/';
4546
                    }
4547
                    $out = "GET $get HTTP/1.1\r\n";
4548
                    $out .= "Host: $url_parts[host]\r\n";
4549
                    $out .= "User-Agent: $useragent\r\n";
4550
                    if (extension_loaded('zlib'))
4551
                    {
4552
                        $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n";
4553
                    }
4554
                    if (isset($url_parts['user']) && isset($url_parts['pass']))
4555
                    {
4556
                        $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n";
4557
                    }
4558
                    foreach ($headers as $key => $value)
4559
                    {
4560
                        $out .= "$key: $value\r\n";
4561
                    }
4562
                    $out .= "Connection: Close\r\n\r\n";
4563
                    fwrite($fp, $out);
4564
                    $info = stream_get_meta_data($fp);
4565
                    $this->headers = '';
4566
                    while (!$info['eof'] && !$info['timed_out'])
4567
                    {
4568
                        $this->headers .= fread($fp, 1160);
4569
                        $info = stream_get_meta_data($fp);
4570
                    }
4571
                    if (!$info['timed_out'])
4572
                    {
4573
                        $parser = new SimplePie_HTTP_Parser($this->headers);
4574
                        if ($parser->parse())
4575
                        {
4576
                            $this->headers = $parser->headers;
4577
                            $this->body = $parser->body;
4578
                            $this->status_code = $parser->status_code;
4579
                            if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects)
4580
                            {
4581
                                $this->redirects++;
4582
                                $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url);
4583
                                return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen);
4584
                            }
4585
                            if (isset($this->headers['content-encoding']))
4586
                            {
4587
                                // Hey, we act dumb elsewhere, so let's do that here too
4588
                                switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20")))
4589
                                {
4590
                                    case 'gzip':
4591
                                    case 'x-gzip':
4592
                                        $decoder = new SimplePie_gzdecode($this->body);
4593
                                        if (!$decoder->parse())
4594
                                        {
4595
                                            $this->error = 'Unable to decode HTTP "gzip" stream';
4596
                                            $this->success = false;
4597
                                        }
4598
                                        else
4599
                                        {
4600
                                            $this->body = $decoder->data;
4601
                                        }
4602
                                        break;
4603
                                    case 'deflate':
4604
                                        if (($decompressed = gzinflate($this->body)) !== false)
4605
                                        {
4606
                                            $this->body = $decompressed;
4607
                                        }
4608
                                        else if (($decompressed = gzuncompress($this->body)) !== false)
4609
                                        {
4610
                                            $this->body = $decompressed;
4611
                                        }
4612
                                        else if (function_exists('gzdecode') && ($decompressed = gzdecode($this->body)) !== false)
4613
                                        {
4614
                                            $this->body = $decompressed;
4615
                                        }
4616
                                        else
4617
                                        {
4618
                                            $this->error = 'Unable to decode HTTP "deflate" stream';
4619
                                            $this->success = false;
4620
                                        }
4621
                                        break;
4622
                                    default:
4623
                                        $this->error = 'Unknown content coding';
4624
                                        $this->success = false;
4625
                                }
4626
                            }
4627
                        }
4628
                    }
4629
                    else
4630
                    {
4631
                        $this->error = 'fsocket timed out';
4632
                        $this->success = false;
4633
                    }
4634
                    fclose($fp);
4635
                }
4636
            }
4637
        }
4638
        else
4639
        {
4640
            $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS;
4641
            if (!$this->body = file_get_contents($url))
4642
            {
4643
                $this->error = 'file_get_contents could not read the file';
4644
                $this->success = false;
4645
            }
4646
        }
4647
    }
4648
}
4649
class SimplePie_gzdecode
4650
{
4651
    
4652
    var $compressed_data;
4653
    
4654
    var $compressed_size;
4655
    
4656
    var $min_compressed_size = 18;
4657
    
4658
    var $position = 0;
4659
    
4660
    var $flags;
4661
    
4662
    var $data;
4663
    
4664
    var $MTIME;
4665
    
4666
    var $XFL;
4667
    
4668
    var $OS;
4669
    
4670
    var $SI1;
4671
    
4672
    var $SI2;
4673
    
4674
    var $extra_field;
4675
    
4676
    var $filename;
4677
    
4678
    var $comment;
4679
    
4680
    public function __set($name, $value)
4681
    {
4682
        trigger_error("Cannot write property $name", E_USER_ERROR);
4683
    }
4684
    
4685
    public function __construct($data)
4686
    {
4687
        $this->compressed_data = $data;
4688
        $this->compressed_size = strlen($data);
4689
    }
4690
    
4691
    public function parse()
4692
    {
4693
        if ($this->compressed_size >= $this->min_compressed_size)
4694
        {
4695
            // Check ID1, ID2, and CM
4696
            if (substr($this->compressed_data, 0, 3) !== "\x1F\x8B\x08")
4697
            {
4698
                return false;
4699
            }
4700
            // Get the FLG (FLaGs)
4701
            $this->flags = ord($this->compressed_data[3]);
4702
            // FLG bits above (1 << 4) are reserved
4703
            if ($this->flags > 0x1F)
4704
            {
4705
                return false;
4706
            }
4707
            // Advance the pointer after the above
4708
            $this->position += 4;
4709
            // MTIME
4710
            $mtime = substr($this->compressed_data, $this->position, 4);
4711
            // Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness
4712
            if (current(unpack('S', "\x00\x01")) === 1)
4713
            {
4714
                $mtime = strrev($mtime);
4715
            }
4716
            $this->MTIME = current(unpack('l', $mtime));
4717
            $this->position += 4;
4718
            // Get the XFL (eXtra FLags)
4719
            $this->XFL = ord($this->compressed_data[$this->position++]);
4720
            // Get the OS (Operating System)
4721
            $this->OS = ord($this->compressed_data[$this->position++]);
4722
            // Parse the FEXTRA
4723
            if ($this->flags & 4)
4724
            {
4725
                // Read subfield IDs
4726
                $this->SI1 = $this->compressed_data[$this->position++];
4727
                $this->SI2 = $this->compressed_data[$this->position++];
4728
                // SI2 set to zero is reserved for future use
4729
                if ($this->SI2 === "\x00")
4730
                {
4731
                    return false;
4732
                }
4733
                // Get the length of the extra field
4734
                $len = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
4735
                $this->position += 2;
4736
                // Check the length of the string is still valid
4737
                $this->min_compressed_size += $len + 4;
4738
                if ($this->compressed_size >= $this->min_compressed_size)
4739
                {
4740
                    // Set the extra field to the given data
4741
                    $this->extra_field = substr($this->compressed_data, $this->position, $len);
4742
                    $this->position += $len;
4743
                }
4744
                else
4745
                {
4746
                    return false;
4747
                }
4748
            }
4749
            // Parse the FNAME
4750
            if ($this->flags & 8)
4751
            {
4752
                // Get the length of the filename
4753
                $len = strcspn($this->compressed_data, "\x00", $this->position);
4754
                // Check the length of the string is still valid
4755
                $this->min_compressed_size += $len + 1;
4756
                if ($this->compressed_size >= $this->min_compressed_size)
4757
                {
4758
                    // Set the original filename to the given string
4759
                    $this->filename = substr($this->compressed_data, $this->position, $len);
4760
                    $this->position += $len + 1;
4761
                }
4762
                else
4763
                {
4764
                    return false;
4765
                }
4766
            }
4767
            // Parse the FCOMMENT
4768
            if ($this->flags & 16)
4769
            {
4770
                // Get the length of the comment
4771
                $len = strcspn($this->compressed_data, "\x00", $this->position);
4772
                // Check the length of the string is still valid
4773
                $this->min_compressed_size += $len + 1;
4774
                if ($this->compressed_size >= $this->min_compressed_size)
4775
                {
4776
                    // Set the original comment to the given string
4777
                    $this->comment = substr($this->compressed_data, $this->position, $len);
4778
                    $this->position += $len + 1;
4779
                }
4780
                else
4781
                {
4782
                    return false;
4783
                }
4784
            }
4785
            // Parse the FHCRC
4786
            if ($this->flags & 2)
4787
            {
4788
                // Check the length of the string is still valid
4789
                $this->min_compressed_size += $len + 2;
4790
                if ($this->compressed_size >= $this->min_compressed_size)
4791
                {
4792
                    // Read the CRC
4793
                    $crc = current(unpack('v', substr($this->compressed_data, $this->position, 2)));
4794
                    // Check the CRC matches
4795
                    if ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc)
4796
                    {
4797
                        $this->position += 2;
4798
                    }
4799
                    else
4800
                    {
4801
                        return false;
4802
                    }
4803
                }
4804
                else
4805
                {
4806
                    return false;
4807
                }
4808
            }
4809
            // Decompress the actual data
4810
            if (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false)
4811
            {
4812
                return false;
4813
            }
4814
            else
4815
            {
4816
                $this->position = $this->compressed_size - 8;
4817
            }
4818
            // Check CRC of data
4819
            $crc = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
4820
            $this->position += 4;
4821
            /*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc))
4822
            {
4823
                return false;
4824
            }*/
4825
            // Check ISIZE of data
4826
            $isize = current(unpack('V', substr($this->compressed_data, $this->position, 4)));
4827
            $this->position += 4;
4828
            if (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize))
4829
            {
4830
                return false;
4831
            }
4832
            // Wow, against all odds, we've actually got a valid gzip string
4833
            return true;
4834
        }
4835
        else
4836
        {
4837
            return false;
4838
        }
4839
    }
4840
}
4841
class SimplePie_HTTP_Parser
4842
{
4843
    
4844
    public $http_version = 0.0;
4845
    
4846
    public $status_code = 0;
4847
    
4848
    public $reason = '';
4849
    
4850
    public $headers = array();
4851
    
4852
    public $body = '';
4853
    
4854
    protected $state = 'http_version';
4855
    
4856
    protected $data = '';
4857
    
4858
    protected $data_length = 0;
4859
    
4860
    protected $position = 0;
4861
    
4862
    protected $name = '';
4863
    
4864
    protected $value = '';
4865
    
4866
    public function __construct($data)
4867
    {
4868
        $this->data = $data;
4869
        $this->data_length = strlen($this->data);
4870
    }
4871
    
4872
    public function parse()
4873
    {
4874
        while ($this->state && $this->state !== 'emit' && $this->has_data())
4875
        {
4876
            $state = $this->state;
4877
            $this->$state();
4878
        }
4879
        $this->data = '';
4880
        if ($this->state === 'emit' || $this->state === 'body')
4881
        {
4882
            return true;
4883
        }
4884
        else
4885
        {
4886
            $this->http_version = '';
4887
            $this->status_code = '';
4888
            $this->reason = '';
4889
            $this->headers = array();
4890
            $this->body = '';
4891
            return false;
4892
        }
4893
    }
4894
    
4895
    protected function has_data()
4896
    {
4897
        return (bool) ($this->position < $this->data_length);
4898
    }
4899
    
4900
    protected function is_linear_whitespace()
4901
    {
4902
        return (bool) ($this->data[$this->position] === "\x09"
4903
            || $this->data[$this->position] === "\x20"
4904
            || ($this->data[$this->position] === "\x0A"
4905
                && isset($this->data[$this->position + 1])
4906
                && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20")));
4907
    }
4908
    
4909
    protected function http_version()
4910
    {
4911
        if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/')
4912
        {
4913
            $len = strspn($this->data, '0123456789.', 5);
4914
            $this->http_version = substr($this->data, 5, $len);
4915
            $this->position += 5 + $len;
4916
            if (substr_count($this->http_version, '.') <= 1)
4917
            {
4918
                $this->http_version = (float) $this->http_version;
4919
                $this->position += strspn($this->data, "\x09\x20", $this->position);
4920
                $this->state = 'status';
4921
            }
4922
            else
4923
            {
4924
                $this->state = false;
4925
            }
4926
        }
4927
        else
4928
        {
4929
            $this->state = false;
4930
        }
4931
    }
4932
    
4933
    protected function status()
4934
    {
4935
        if ($len = strspn($this->data, '0123456789', $this->position))
4936
        {
4937
            $this->status_code = (int) substr($this->data, $this->position, $len);
4938
            $this->position += $len;
4939
            $this->state = 'reason';
4940
        }
4941
        else
4942
        {
4943
            $this->state = false;
4944
        }
4945
    }
4946
    
4947
    protected function reason()
4948
    {
4949
        $len = strcspn($this->data, "\x0A", $this->position);
4950
        $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20");
4951
        $this->position += $len + 1;
4952
        $this->state = 'new_line';
4953
    }
4954
    
4955
    protected function new_line()
4956
    {
4957
        $this->value = trim($this->value, "\x0D\x20");
4958
        if ($this->name !== '' && $this->value !== '')
4959
        {
4960
            $this->name = strtolower($this->name);
4961
            // We should only use the last Content-Type header. c.f. issue #1
4962
            if (isset($this->headers[$this->name]) && $this->name !== 'content-type')
4963
            {
4964
                $this->headers[$this->name] .= ', ' . $this->value;
4965
            }
4966
            else
4967
            {
4968
                $this->headers[$this->name] = $this->value;
4969
            }
4970
        }
4971
        $this->name = '';
4972
        $this->value = '';
4973
        if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A")
4974
        {
4975
            $this->position += 2;
4976
            $this->state = 'body';
4977
        }
4978
        elseif ($this->data[$this->position] === "\x0A")
4979
        {
4980
            $this->position++;
4981
            $this->state = 'body';
4982
        }
4983
        else
4984
        {
4985
            $this->state = 'name';
4986
        }
4987
    }
4988
    
4989
    protected function name()
4990
    {
4991
        $len = strcspn($this->data, "\x0A:", $this->position);
4992
        if (isset($this->data[$this->position + $len]))
4993
        {
4994
            if ($this->data[$this->position + $len] === "\x0A")
4995
            {
4996
                $this->position += $len;
4997
                $this->state = 'new_line';
4998
            }
4999
            else
5000
            {
5001
                $this->name = substr($this->data, $this->position, $len);
5002
                $this->position += $len + 1;
5003
                $this->state = 'value';
5004
            }
5005
        }
5006
        else
5007
        {
5008
            $this->state = false;
5009
        }
5010
    }
5011
    
5012
    protected function linear_whitespace()
5013
    {
5014
        do
5015
        {
5016
            if (substr($this->data, $this->position, 2) === "\x0D\x0A")
5017
            {
5018
                $this->position += 2;
5019
            }
5020
            elseif ($this->data[$this->position] === "\x0A")
5021
            {
5022
                $this->position++;
5023
            }
5024
            $this->position += strspn($this->data, "\x09\x20", $this->position);
5025
        } while ($this->has_data() && $this->is_linear_whitespace());
5026
        $this->value .= "\x20";
5027
    }
5028
    
5029
    protected function value()
5030
    {
5031
        if ($this->is_linear_whitespace())
5032
        {
5033
            $this->linear_whitespace();
5034
        }
5035
        else
5036
        {
5037
            switch ($this->data[$this->position])
5038
            {
5039
                case '"':
5040
                    // Workaround for ETags: we have to include the quotes as
5041
                    // part of the tag.
5042
                    if (strtolower($this->name) === 'etag')
5043
                    {
5044
                        $this->value .= '"';
5045
                        $this->position++;
5046
                        $this->state = 'value_char';
5047
                        break;
5048
                    }
5049
                    $this->position++;
5050
                    $this->state = 'quote';
5051
                    break;
5052
                case "\x0A":
5053
                    $this->position++;
5054
                    $this->state = 'new_line';
5055
                    break;
5056
                default:
5057
                    $this->state = 'value_char';
5058
                    break;
5059
            }
5060
        }
5061
    }
5062
    
5063
    protected function value_char()
5064
    {
5065
        $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position);
5066
        $this->value .= substr($this->data, $this->position, $len);
5067
        $this->position += $len;
5068
        $this->state = 'value';
5069
    }
5070
    
5071
    protected function quote()
5072
    {
5073
        if ($this->is_linear_whitespace())
5074
        {
5075
            $this->linear_whitespace();
5076
        }
5077
        else
5078
        {
5079
            switch ($this->data[$this->position])
5080
            {
5081
                case '"':
5082
                    $this->position++;
5083
                    $this->state = 'value';
5084
                    break;
5085
                case "\x0A":
5086
                    $this->position++;
5087
                    $this->state = 'new_line';
5088
                    break;
5089
                case '\\':
5090
                    $this->position++;
5091
                    $this->state = 'quote_escaped';
5092
                    break;
5093
                default:
5094
                    $this->state = 'quote_char';
5095
                    break;
5096
            }
5097
        }
5098
    }
5099
    
5100
    protected function quote_char()
5101
    {
5102
        $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position);
5103
        $this->value .= substr($this->data, $this->position, $len);
5104
        $this->position += $len;
5105
        $this->state = 'value';
5106
    }
5107
    
5108
    protected function quote_escaped()
5109
    {
5110
        $this->value .= $this->data[$this->position];
5111
        $this->position++;
5112
        $this->state = 'quote';
5113
    }
5114
    
5115
    protected function body()
5116
    {
5117
        $this->body = substr($this->data, $this->position);
5118
        if (!empty($this->headers['transfer-encoding']))
5119
        {
5120
            unset($this->headers['transfer-encoding']);
5121
            $this->state = 'chunked';
5122
        }
5123
        else
5124
        {
5125
            $this->state = 'emit';
5126
        }
5127
    }
5128
    
5129
    protected function chunked()
5130
    {
5131
        if (!preg_match('/^([0-9a-f]+)[^\r\n]*\r\n/i', trim($this->body)))
5132
        {
5133
            $this->state = 'emit';
5134
            return;
5135
        }
5136
        $decoded = '';
5137
        $encoded = $this->body;
5138
        while (true)
5139
        {
5140
            $is_chunked = (bool) preg_match( '/^([0-9a-f]+)[^\r\n]*\r\n/i', $encoded, $matches );
5141
            if (!$is_chunked)
5142
            {
5143
                // Looks like it's not chunked after all
5144
                $this->state = 'emit';
5145
                return;
5146
            }
5147
            $length = hexdec(trim($matches[1]));
5148
            if ($length === 0)
5149
            {
5150
                // Ignore trailer headers
5151
                $this->state = 'emit';
5152
                $this->body = $decoded;
5153
                return;
5154
            }
5155
            $chunk_length = strlen($matches[0]);
5156
            $decoded .= $part = substr($encoded, $chunk_length, $length);
5157
            $encoded = substr($encoded, $chunk_length + $length + 2);
5158
            if (trim($encoded) === '0' || empty($encoded))
5159
            {
5160
                $this->state = 'emit';
5161
                $this->body = $decoded;
5162
                return;
5163
            }
5164
        }
5165
    }
5166
}
5167
class SimplePie_IRI
5168
{
5169
    
5170
    protected $scheme = null;
5171
    
5172
    protected $iuserinfo = null;
5173
    
5174
    protected $ihost = null;
5175
    
5176
    protected $port = null;
5177
    
5178
    protected $ipath = '';
5179
    
5180
    protected $iquery = null;
5181
    
5182
    protected $ifragment = null;
5183
    
5184
    protected $normalization = array(
5185
        'acap' => array(
5186
            'port' => 674
5187
        ),
5188
        'dict' => array(
5189
            'port' => 2628
5190
        ),
5191
        'file' => array(
5192
            'ihost' => 'localhost'
5193
        ),
5194
        'http' => array(
5195
            'port' => 80,
5196
            'ipath' => '/'
5197
        ),
5198
        'https' => array(
5199
            'port' => 443,
5200
            'ipath' => '/'
5201
        ),
5202
    );
5203
    
5204
    public function __toString()
5205
    {
5206
        return $this->get_iri();
5207
    }
5208
    
5209
    public function __set($name, $value)
5210
    {
5211
        if (method_exists($this, 'set_' . $name))
5212
        {
5213
            call_user_func(array($this, 'set_' . $name), $value);
5214
        }
5215
        elseif (
5216
               $name === 'iauthority'
5217
            || $name === 'iuserinfo'
5218
            || $name === 'ihost'
5219
            || $name === 'ipath'
5220
            || $name === 'iquery'
5221
            || $name === 'ifragment'
5222
        )
5223
        {
5224
            call_user_func(array($this, 'set_' . substr($name, 1)), $value);
5225
        }
5226
    }
5227
    
5228
    public function __get($name)
5229
    {
5230
        // isset() returns false for null, we don't want to do that
5231
        // Also why we use array_key_exists below instead of isset()
5232
        $props = get_object_vars($this);
5233
        if (
5234
            $name === 'iri' ||
5235
            $name === 'uri' ||
5236
            $name === 'iauthority' ||
5237
            $name === 'authority'
5238
        )
5239
        {
5240
            $return = $this->{"get_$name"}();
5241
        }
5242
        elseif (array_key_exists($name, $props))
5243
        {
5244
            $return = $this->$name;
5245
        }
5246
        // host -> ihost
5247
        elseif (($prop = 'i' . $name) && array_key_exists($prop, $props))
5248
        {
5249
            $name = $prop;
5250
            $return = $this->$prop;
5251
        }
5252
        // ischeme -> scheme
5253
        elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props))
5254
        {
5255
            $name = $prop;
5256
            $return = $this->$prop;
5257
        }
5258
        else
5259
        {
5260
            trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE);
5261
            $return = null;
5262
        }
5263
        if ($return === null && isset($this->normalization[$this->scheme][$name]))
5264
        {
5265
            return $this->normalization[$this->scheme][$name];
5266
        }
5267
        else
5268
        {
5269
            return $return;
5270
        }
5271
    }
5272
    
5273
    public function __isset($name)
5274
    {
5275
        if (method_exists($this, 'get_' . $name) || isset($this->$name))
5276
        {
5277
            return true;
5278
        }
5279
        else
5280
        {
5281
            return false;
5282
        }
5283
    }
5284
    
5285
    public function __unset($name)
5286
    {
5287
        if (method_exists($this, 'set_' . $name))
5288
        {
5289
            call_user_func(array($this, 'set_' . $name), '');
5290
        }
5291
    }
5292
    
5293
    public function __construct($iri = null)
5294
    {
5295
        $this->set_iri($iri);
5296
    }
5297
    
5298
    public static function absolutize($base, $relative)
5299
    {
5300
        if (!($relative instanceof SimplePie_IRI))
5301
        {
5302
            $relative = new SimplePie_IRI($relative);
5303
        }
5304
        if (!$relative->is_valid())
5305
        {
5306
            return false;
5307
        }
5308
        elseif ($relative->scheme !== null)
5309
        {
5310
            return clone $relative;
5311
        }
5312
        else
5313
        {
5314
            if (!($base instanceof SimplePie_IRI))
5315
            {
5316
                $base = new SimplePie_IRI($base);
5317
            }
5318
            if ($base->scheme !== null && $base->is_valid())
5319
            {
5320
                if ($relative->get_iri() !== '')
5321
                {
5322
                    if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null)
5323
                    {
5324
                        $target = clone $relative;
5325
                        $target->scheme = $base->scheme;
5326
                    }
5327
                    else
5328
                    {
5329
                        $target = new SimplePie_IRI;
5330
                        $target->scheme = $base->scheme;
5331
                        $target->iuserinfo = $base->iuserinfo;
5332
                        $target->ihost = $base->ihost;
5333
                        $target->port = $base->port;
5334
                        if ($relative->ipath !== '')
5335
                        {
5336
                            if ($relative->ipath[0] === '/')
5337
                            {
5338
                                $target->ipath = $relative->ipath;
5339
                            }
5340
                            elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '')
5341
                            {
5342
                                $target->ipath = '/' . $relative->ipath;
5343
                            }
5344
                            elseif (($last_segment = strrpos($base->ipath, '/')) !== false)
5345
                            {
5346
                                $target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath;
5347
                            }
5348
                            else
5349
                            {
5350
                                $target->ipath = $relative->ipath;
5351
                            }
5352
                            $target->ipath = $target->remove_dot_segments($target->ipath);
5353
                            $target->iquery = $relative->iquery;
5354
                        }
5355
                        else
5356
                        {
5357
                            $target->ipath = $base->ipath;
5358
                            if ($relative->iquery !== null)
5359
                            {
5360
                                $target->iquery = $relative->iquery;
5361
                            }
5362
                            elseif ($base->iquery !== null)
5363
                            {
5364
                                $target->iquery = $base->iquery;
5365
                            }
5366
                        }
5367
                        $target->ifragment = $relative->ifragment;
5368
                    }
5369
                }
5370
                else
5371
                {
5372
                    $target = clone $base;
5373
                    $target->ifragment = null;
5374
                }
5375
                $target->scheme_normalization();
5376
                return $target;
5377
            }
5378
            else
5379
            {
5380
                return false;
5381
            }
5382
        }
5383
    }
5384
    
5385
    protected function parse_iri($iri)
5386
    {
5387
        $iri = trim($iri, "\x20\x09\x0A\x0C\x0D");
5388
        if (preg_match('/^((?P<scheme>[^:\/?#]+):)?(\/\/(?P<authority>[^\/?#]*))?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?$/', $iri, $match))
5389
        {
5390
            if ($match[1] === '')
5391
            {
5392
                $match['scheme'] = null;
5393
            }
5394
            if (!isset($match[3]) || $match[3] === '')
5395
            {
5396
                $match['authority'] = null;
5397
            }
5398
            if (!isset($match[5]))
5399
            {
5400
                $match['path'] = '';
5401
            }
5402
            if (!isset($match[6]) || $match[6] === '')
5403
            {
5404
                $match['query'] = null;
5405
            }
5406
            if (!isset($match[8]) || $match[8] === '')
5407
            {
5408
                $match['fragment'] = null;
5409
            }
5410
            return $match;
5411
        }
5412
        else
5413
        {
5414
            // This can occur when a paragraph is accidentally parsed as a URI
5415
            return false;
5416
        }
5417
    }
5418
    
5419
    protected function remove_dot_segments($input)
5420
    {
5421
        $output = '';
5422
        while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..')
5423
        {
5424
            // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise,
5425
            if (strpos($input, '../') === 0)
5426
            {
5427
                $input = substr($input, 3);
5428
            }
5429
            elseif (strpos($input, './') === 0)
5430
            {
5431
                $input = substr($input, 2);
5432
            }
5433
            // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise,
5434
            elseif (strpos($input, '/./') === 0)
5435
            {
5436
                $input = substr($input, 2);
5437
            }
5438
            elseif ($input === '/.')
5439
            {
5440
                $input = '/';
5441
            }
5442
            // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise,
5443
            elseif (strpos($input, '/../') === 0)
5444
            {
5445
                $input = substr($input, 3);
5446
                $output = substr_replace($output, '', strrpos($output, '/'));
5447
            }
5448
            elseif ($input === '/..')
5449
            {
5450
                $input = '/';
5451
                $output = substr_replace($output, '', strrpos($output, '/'));
5452
            }
5453
            // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise,
5454
            elseif ($input === '.' || $input === '..')
5455
            {
5456
                $input = '';
5457
            }
5458
            // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer
5459
            elseif (($pos = strpos($input, '/', 1)) !== false)
5460
            {
5461
                $output .= substr($input, 0, $pos);
5462
                $input = substr_replace($input, '', 0, $pos);
5463
            }
5464
            else
5465
            {
5466
                $output .= $input;
5467
                $input = '';
5468
            }
5469
        }
5470
        return $output . $input;
5471
    }
5472
    
5473
    protected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false)
5474
    {
5475
        // Normalize as many pct-encoded sections as possible
5476
        $string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array($this, 'remove_iunreserved_percent_encoded'), $string);
5477
        // Replace invalid percent characters
5478
        $string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string);
5479
        // Add unreserved and % to $extra_chars (the latter is safe because all
5480
        // pct-encoded sections are now valid).
5481
        $extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%';
5482
        // Now replace any bytes that aren't allowed with their pct-encoded versions
5483
        $position = 0;
5484
        $strlen = strlen($string);
5485
        while (($position += strspn($string, $extra_chars, $position)) < $strlen)
5486
        {
5487
            $value = ord($string[$position]);
5488
            // Start position
5489
            $start = $position;
5490
            // By default we are valid
5491
            $valid = true;
5492
            // No one byte sequences are valid due to the while.
5493
            // Two byte sequence:
5494
            if (($value & 0xE0) === 0xC0)
5495
            {
5496
                $character = ($value & 0x1F) << 6;
5497
                $length = 2;
5498
                $remaining = 1;
5499
            }
5500
            // Three byte sequence:
5501
            elseif (($value & 0xF0) === 0xE0)
5502
            {
5503
                $character = ($value & 0x0F) << 12;
5504
                $length = 3;
5505
                $remaining = 2;
5506
            }
5507
            // Four byte sequence:
5508
            elseif (($value & 0xF8) === 0xF0)
5509
            {
5510
                $character = ($value & 0x07) << 18;
5511
                $length = 4;
5512
                $remaining = 3;
5513
            }
5514
            // Invalid byte:
5515
            else
5516
            {
5517
                $valid = false;
5518
                $length = 1;
5519
                $remaining = 0;
5520
            }
5521
            if ($remaining)
5522
            {
5523
                if ($position + $length <= $strlen)
5524
                {
5525
                    for ($position++; $remaining; $position++)
5526
                    {
5527
                        $value = ord($string[$position]);
5528
                        // Check that the byte is valid, then add it to the character:
5529
                        if (($value & 0xC0) === 0x80)
5530
                        {
5531
                            $character |= ($value & 0x3F) << (--$remaining * 6);
5532
                        }
5533
                        // If it is invalid, count the sequence as invalid and reprocess the current byte:
5534
                        else
5535
                        {
5536
                            $valid = false;
5537
                            $position--;
5538
5539
                            break;
5540
                        }
5541
                    }
5542
                }
5543
                else
5544
                {
5545
                    $position = $strlen - 1;
5546
                    $valid = false;
5547
                }
5548
            }
5549
            // Percent encode anything invalid or not in ucschar
5550
            if (
5551
                // Invalid sequences
5552
                !$valid
5553
                // Non-shortest form sequences are invalid
5554
                || $length > 1 && $character <= 0x7F
5555
                || $length > 2 && $character <= 0x7FF
5556
                || $length > 3 && $character <= 0xFFFF
5557
                // Outside of range of ucschar codepoints
5558
                // Noncharacters
5559
                || ($character & 0xFFFE) === 0xFFFE
5560
                || $character >= 0xFDD0 && $character <= 0xFDEF
5561
                || (
5562
                    // Everything else not in ucschar
5563
                       $character > 0xD7FF && $character < 0xF900
5564
                    || $character < 0xA0
5565
                    || $character > 0xEFFFD
5566
                )
5567
                && (
5568
                    // Everything not in iprivate, if it applies
5569
                       !$iprivate
5570
                    || $character < 0xE000
5571
                    || $character > 0x10FFFD
5572
                )
5573
            )
5574
            {
5575
                // If we were a character, pretend we weren't, but rather an error.
5576
                if ($valid)
5577
                    $position--;
5578
                for ($j = $start; $j <= $position; $j++)
5579
                {
5580
                    $string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1);
5581
                    $j += 2;
5582
                    $position += 2;
5583
                    $strlen += 2;
5584
                }
5585
            }
5586
        }
5587
        return $string;
5588
    }
5589
    
5590
    protected function remove_iunreserved_percent_encoded($match)
5591
    {
5592
        // As we just have valid percent encoded sequences we can just explode
5593
        // and ignore the first member of the returned array (an empty string).
5594
        $bytes = explode('%', $match[0]);
5595
        // Initialize the new string (this is what will be returned) and that
5596
        // there are no bytes remaining in the current sequence (unsurprising
5597
        // at the first byte!).
5598
        $string = '';
5599
        $remaining = 0;
5600
        // Loop over each and every byte, and set $value to its value
5601
        for ($i = 1, $len = count($bytes); $i < $len; $i++)
5602
        {
5603
            $value = hexdec($bytes[$i]);
5604
            // If we're the first byte of sequence:
5605
            if (!$remaining)
5606
            {
5607
                // Start position
5608
                $start = $i;
5609
                // By default we are valid
5610
                $valid = true;
5611
                // One byte sequence:
5612
                if ($value <= 0x7F)
5613
                {
5614
                    $character = $value;
5615
                    $length = 1;
5616
                }
5617
                // Two byte sequence:
5618
                elseif (($value & 0xE0) === 0xC0)
5619
                {
5620
                    $character = ($value & 0x1F) << 6;
5621
                    $length = 2;
5622
                    $remaining = 1;
5623
                }
5624
                // Three byte sequence:
5625
                elseif (($value & 0xF0) === 0xE0)
5626
                {
5627
                    $character = ($value & 0x0F) << 12;
5628
                    $length = 3;
5629
                    $remaining = 2;
5630
                }
5631
                // Four byte sequence:
5632
                elseif (($value & 0xF8) === 0xF0)
5633
                {
5634
                    $character = ($value & 0x07) << 18;
5635
                    $length = 4;
5636
                    $remaining = 3;
5637
                }
5638
                // Invalid byte:
5639
                else
5640
                {
5641
                    $valid = false;
5642
                    $remaining = 0;
5643
                }
5644
            }
5645
            // Continuation byte:
5646
            else
5647
            {
5648
                // Check that the byte is valid, then add it to the character:
5649
                if (($value & 0xC0) === 0x80)
5650
                {
5651
                    $remaining--;
5652
                    $character |= ($value & 0x3F) << ($remaining * 6);
5653
                }
5654
                // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence:
5655
                else
5656
                {
5657
                    $valid = false;
5658
                    $remaining = 0;
5659
                    $i--;
5660
                }
5661
            }
5662
            // If we've reached the end of the current byte sequence, append it to Unicode::$data
5663
            if (!$remaining)
5664
            {
5665
                // Percent encode anything invalid or not in iunreserved
5666
                if (
5667
                    // Invalid sequences
5668
                    !$valid
5669
                    // Non-shortest form sequences are invalid
5670
                    || $length > 1 && $character <= 0x7F
5671
                    || $length > 2 && $character <= 0x7FF
5672
                    || $length > 3 && $character <= 0xFFFF
5673
                    // Outside of range of iunreserved codepoints
5674
                    || $character < 0x2D
5675
                    || $character > 0xEFFFD
5676
                    // Noncharacters
5677
                    || ($character & 0xFFFE) === 0xFFFE
5678
                    || $character >= 0xFDD0 && $character <= 0xFDEF
5679
                    // Everything else not in iunreserved (this is all BMP)
5680
                    || $character === 0x2F
5681
                    || $character > 0x39 && $character < 0x41
5682
                    || $character > 0x5A && $character < 0x61
5683
                    || $character > 0x7A && $character < 0x7E
5684
                    || $character > 0x7E && $character < 0xA0
5685
                    || $character > 0xD7FF && $character < 0xF900
5686
                )
5687
                {
5688
                    for ($j = $start; $j <= $i; $j++)
5689
                    {
5690
                        $string .= '%' . strtoupper($bytes[$j]);
5691
                    }
5692
                }
5693
                else
5694
                {
5695
                    for ($j = $start; $j <= $i; $j++)
5696
                    {
5697
                        $string .= chr(hexdec($bytes[$j]));
5698
                    }
5699
                }
5700
            }
5701
        }
5702
        // If we have any bytes left over they are invalid (i.e., we are
5703
        // mid-way through a multi-byte sequence)
5704
        if ($remaining)
5705
        {
5706
            for ($j = $start; $j < $len; $j++)
5707
            {
5708
                $string .= '%' . strtoupper($bytes[$j]);
5709
            }
5710
        }
5711
        return $string;
5712
    }
5713
    protected function scheme_normalization()
5714
    {
5715
        if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo'])
5716
        {
5717
            $this->iuserinfo = null;
5718
        }
5719
        if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost'])
5720
        {
5721
            $this->ihost = null;
5722
        }
5723
        if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port'])
5724
        {
5725
            $this->port = null;
5726
        }
5727
        if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath'])
5728
        {
5729
            $this->ipath = '';
5730
        }
5731
        if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery'])
5732
        {
5733
            $this->iquery = null;
5734
        }
5735
        if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment'])
5736
        {
5737
            $this->ifragment = null;
5738
        }
5739
    }
5740
    
5741
    public function is_valid()
5742
    {
5743
        $isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null;
5744
        if ($this->ipath !== '' &&
5745
            (
5746
                $isauthority && (
5747
                    $this->ipath[0] !== '/' ||
5748
                    substr($this->ipath, 0, 2) === '//'
5749
                ) ||
5750
                (
5751
                    $this->scheme === null &&
5752
                    !$isauthority &&
5753
                    strpos($this->ipath, ':') !== false &&
5754
                    (strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/'))
5755
                )
5756
            )
5757
        )
5758
        {
5759
            return false;
5760
        }
5761
        return true;
5762
    }
5763
    
5764
    public function set_iri($iri)
5765
    {
5766
        static $cache;
5767
        if (!$cache)
5768
        {
5769
            $cache = array();
5770
        }
5771
        if ($iri === null)
5772
        {
5773
            return true;
5774
        }
5775
        elseif (isset($cache[$iri]))
5776
        {
5777
            list($this->scheme,
5778
                 $this->iuserinfo,
5779
                 $this->ihost,
5780
                 $this->port,
5781
                 $this->ipath,
5782
                 $this->iquery,
5783
                 $this->ifragment,
5784
                 $return) = $cache[$iri];
5785
            return $return;
5786
        }
5787
        else
5788
        {
5789
            $parsed = $this->parse_iri((string) $iri);
5790
            if (!$parsed)
5791
            {
5792
                return false;
5793
            }
5794
            $return = $this->set_scheme($parsed['scheme'])
5795
                && $this->set_authority($parsed['authority'])
5796
                && $this->set_path($parsed['path'])
5797
                && $this->set_query($parsed['query'])
5798
                && $this->set_fragment($parsed['fragment']);
5799
            $cache[$iri] = array($this->scheme,
5800
                                 $this->iuserinfo,
5801
                                 $this->ihost,
5802
                                 $this->port,
5803
                                 $this->ipath,
5804
                                 $this->iquery,
5805
                                 $this->ifragment,
5806
                                 $return);
5807
            return $return;
5808
        }
5809
    }
5810
    
5811
    public function set_scheme($scheme)
5812
    {
5813
        if ($scheme === null)
5814
        {
5815
            $this->scheme = null;
5816
        }
5817
        elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme))
5818
        {
5819
            $this->scheme = null;
5820
            return false;
5821
        }
5822
        else
5823
        {
5824
            $this->scheme = strtolower($scheme);
5825
        }
5826
        return true;
5827
    }
5828
    
5829
    public function set_authority($authority)
5830
    {
5831
        static $cache;
5832
        if (!$cache)
5833
            $cache = array();
5834
        if ($authority === null)
5835
        {
5836
            $this->iuserinfo = null;
5837
            $this->ihost = null;
5838
            $this->port = null;
5839
            return true;
5840
        }
5841
        elseif (isset($cache[$authority]))
5842
        {
5843
            list($this->iuserinfo,
5844
                 $this->ihost,
5845
                 $this->port,
5846
                 $return) = $cache[$authority];
5847
            return $return;
5848
        }
5849
        else
5850
        {
5851
            $remaining = $authority;
5852
            if (($iuserinfo_end = strrpos($remaining, '@')) !== false)
5853
            {
5854
                $iuserinfo = substr($remaining, 0, $iuserinfo_end);
5855
                $remaining = substr($remaining, $iuserinfo_end + 1);
5856
            }
5857
            else
5858
            {
5859
                $iuserinfo = null;
5860
            }
5861
            if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false)
5862
            {
5863
                if (($port = substr($remaining, $port_start + 1)) === false)
5864
                {
5865
                    $port = null;
5866
                }
5867
                $remaining = substr($remaining, 0, $port_start);
5868
            }
5869
            else
5870
            {
5871
                $port = null;
5872
            }
5873
            $return = $this->set_userinfo($iuserinfo) &&
5874
                      $this->set_host($remaining) &&
5875
                      $this->set_port($port);
5876
            $cache[$authority] = array($this->iuserinfo,
5877
                                       $this->ihost,
5878
                                       $this->port,
5879
                                       $return);
5880
            return $return;
5881
        }
5882
    }
5883
    
5884
    public function set_userinfo($iuserinfo)
5885
    {
5886
        if ($iuserinfo === null)
5887
        {
5888
            $this->iuserinfo = null;
5889
        }
5890
        else
5891
        {
5892
            $this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:');
5893
            $this->scheme_normalization();
5894
        }
5895
        return true;
5896
    }
5897
    
5898
    public function set_host($ihost)
5899
    {
5900
        if ($ihost === null)
5901
        {
5902
            $this->ihost = null;
5903
            return true;
5904
        }
5905
        elseif (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']')
5906
        {
5907
            if (SimplePie_Net_IPv6::check_ipv6(substr($ihost, 1, -1)))
5908
            {
5909
                $this->ihost = '[' . SimplePie_Net_IPv6::compress(substr($ihost, 1, -1)) . ']';
5910
            }
5911
            else
5912
            {
5913
                $this->ihost = null;
5914
                return false;
5915
            }
5916
        }
5917
        else
5918
        {
5919
            $ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;=');
5920
            // Lowercase, but ignore pct-encoded sections (as they should
5921
            // remain uppercase). This must be done after the previous step
5922
            // as that can add unescaped characters.
5923
            $position = 0;
5924
            $strlen = strlen($ihost);
5925
            while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen)
5926
            {
5927
                if ($ihost[$position] === '%')
5928
                {
5929
                    $position += 3;
5930
                }
5931
                else
5932
                {
5933
                    $ihost[$position] = strtolower($ihost[$position]);
5934
                    $position++;
5935
                }
5936
            }
5937
            $this->ihost = $ihost;
5938
        }
5939
        $this->scheme_normalization();
5940
        return true;
5941
    }
5942
    
5943
    public function set_port($port)
5944
    {
5945
        if ($port === null)
5946
        {
5947
            $this->port = null;
5948
            return true;
5949
        }
5950
        elseif (strspn($port, '0123456789') === strlen($port))
5951
        {
5952
            $this->port = (int) $port;
5953
            $this->scheme_normalization();
5954
            return true;
5955
        }
5956
        else
5957
        {
5958
            $this->port = null;
5959
            return false;
5960
        }
5961
    }
5962
    
5963
    public function set_path($ipath)
5964
    {
5965
        static $cache;
5966
        if (!$cache)
5967
        {
5968
            $cache = array();
5969
        }
5970
        $ipath = (string) $ipath;
5971
        if (isset($cache[$ipath]))
5972
        {
5973
            $this->ipath = $cache[$ipath][(int) ($this->scheme !== null)];
5974
        }
5975
        else
5976
        {
5977
            $valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/');
5978
            $removed = $this->remove_dot_segments($valid);
5979
            $cache[$ipath] = array($valid, $removed);
5980
            $this->ipath =  ($this->scheme !== null) ? $removed : $valid;
5981
        }
5982
        $this->scheme_normalization();
5983
        return true;
5984
    }
5985
    
5986
    public function set_query($iquery)
5987
    {
5988
        if ($iquery === null)
5989
        {
5990
            $this->iquery = null;
5991
        }
5992
        else
5993
        {
5994
            $this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true);
5995
            $this->scheme_normalization();
5996
        }
5997
        return true;
5998
    }
5999
    
6000
    public function set_fragment($ifragment)
6001
    {
6002
        if ($ifragment === null)
6003
        {
6004
            $this->ifragment = null;
6005
        }
6006
        else
6007
        {
6008
            $this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?');
6009
            $this->scheme_normalization();
6010
        }
6011
        return true;
6012
    }
6013
    
6014
    public function to_uri($string)
6015
    {
6016
        static $non_ascii;
6017
        if (!$non_ascii)
6018
        {
6019
            $non_ascii = implode('', range("\x80", "\xFF"));
6020
        }
6021
        $position = 0;
6022
        $strlen = strlen($string);
6023
        while (($position += strcspn($string, $non_ascii, $position)) < $strlen)
6024
        {
6025
            $string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1);
6026
            $position += 3;
6027
            $strlen += 2;
6028
        }
6029
        return $string;
6030
    }
6031
    
6032
    public function get_iri()
6033
    {
6034
        if (!$this->is_valid())
6035
        {
6036
            return false;
6037
        }
6038
        $iri = '';
6039
        if ($this->scheme !== null)
6040
        {
6041
            $iri .= $this->scheme . ':';
6042
        }
6043
        if (($iauthority = $this->get_iauthority()) !== null)
6044
        {
6045
            $iri .= '//' . $iauthority;
6046
        }
6047
        if ($this->ipath !== '')
6048
        {
6049
            $iri .= $this->ipath;
6050
        }
6051
        elseif (!empty($this->normalization[$this->scheme]['ipath']) && $iauthority !== null && $iauthority !== '')
6052
        {
6053
            $iri .= $this->normalization[$this->scheme]['ipath'];
6054
        }
6055
        if ($this->iquery !== null)
6056
        {
6057
            $iri .= '?' . $this->iquery;
6058
        }
6059
        if ($this->ifragment !== null)
6060
        {
6061
            $iri .= '#' . $this->ifragment;
6062
        }
6063
        return $iri;
6064
    }
6065
    
6066
    public function get_uri()
6067
    {
6068
        return $this->to_uri($this->get_iri());
6069
    }
6070
    
6071
    protected function get_iauthority()
6072
    {
6073
        if ($this->iuserinfo !== null || $this->ihost !== null || $this->port !== null)
6074
        {
6075
            $iauthority = '';
6076
            if ($this->iuserinfo !== null)
6077
            {
6078
                $iauthority .= $this->iuserinfo . '@';
6079
            }
6080
            if ($this->ihost !== null)
6081
            {
6082
                $iauthority .= $this->ihost;
6083
            }
6084
            if ($this->port !== null)
6085
            {
6086
                $iauthority .= ':' . $this->port;
6087
            }
6088
            return $iauthority;
6089
        }
6090
        else
6091
        {
6092
            return null;
6093
        }
6094
    }
6095
    
6096
    protected function get_authority()
6097
    {
6098
        $iauthority = $this->get_iauthority();
6099
        if (is_string($iauthority))
6100
            return $this->to_uri($iauthority);
6101
        else
6102
            return $iauthority;
6103
    }
6104
}
6105
class SimplePie_Item
6106
{
6107
    
6108
    var $feed;
6109
    
6110
    var $data = array();
6111
    
6112
    protected $registry;
6113
    
6114
    public function __construct($feed, $data)
6115
    {
6116
        $this->feed = $feed;
6117
        $this->data = $data;
6118
    }
6119
    
6120
    public function set_registry(SimplePie_Registry $registry)
6121
    {
6122
        $this->registry = $registry;
6123
    }
6124
    
6125
    public function __toString()
6126
    {
6127
        return md5(serialize($this->data));
6128
    }
6129
    
6130
    public function __destruct()
6131
    {
6132
        if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
6133
        {
6134
            unset($this->feed);
6135
        }
6136
    }
6137
    
6138
    public function get_item_tags($namespace, $tag)
6139
    {
6140
        if (isset($this->data['child'][$namespace][$tag]))
6141
        {
6142
            return $this->data['child'][$namespace][$tag];
6143
        }
6144
        else
6145
        {
6146
            return null;
6147
        }
6148
    }
6149
    
6150
    public function get_base($element = array())
6151
    {
6152
        return $this->feed->get_base($element);
6153
    }
6154
    
6155
    public function sanitize($data, $type, $base = '')
6156
    {
6157
        return $this->feed->sanitize($data, $type, $base);
6158
    }
6159
    
6160
    public function get_feed()
6161
    {
6162
        return $this->feed;
6163
    }
6164
    
6165
    public function get_id($hash = false)
6166
    {
6167
        if (!$hash)
6168
        {
6169
            if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id'))
6170
            {
6171
                return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6172
            }
6173
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id'))
6174
            {
6175
                return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6176
            }
6177
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
6178
            {
6179
                return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6180
            }
6181
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier'))
6182
            {
6183
                return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6184
            }
6185
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier'))
6186
            {
6187
                return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6188
            }
6189
            elseif (isset($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about']))
6190
            {
6191
                return $this->sanitize($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'], SIMPLEPIE_CONSTRUCT_TEXT);
6192
            }
6193
            elseif (($return = $this->get_permalink()) !== null)
6194
            {
6195
                return $return;
6196
            }
6197
            elseif (($return = $this->get_title()) !== null)
6198
            {
6199
                return $return;
6200
            }
6201
        }
6202
        if ($this->get_permalink() !== null || $this->get_title() !== null)
6203
        {
6204
            return md5($this->get_permalink() . $this->get_title());
6205
        }
6206
        else
6207
        {
6208
            return md5(serialize($this->data));
6209
        }
6210
    }
6211
    
6212
    public function get_title()
6213
    {
6214
        if (!isset($this->data['title']))
6215
        {
6216
            if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
6217
            {
6218
                $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
6219
            }
6220
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
6221
            {
6222
                $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
6223
            }
6224
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
6225
            {
6226
                $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
6227
            }
6228
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
6229
            {
6230
                $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
6231
            }
6232
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
6233
            {
6234
                $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
6235
            }
6236
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
6237
            {
6238
                $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6239
            }
6240
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
6241
            {
6242
                $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6243
            }
6244
            else
6245
            {
6246
                $this->data['title'] = null;
6247
            }
6248
        }
6249
        return $this->data['title'];
6250
    }
6251
    
6252
    public function get_description($description_only = false)
6253
    {
6254
        if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary'))
6255
        {
6256
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
6257
        }
6258
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary'))
6259
        {
6260
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
6261
        }
6262
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
6263
        {
6264
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
6265
        }
6266
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
6267
        {
6268
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
6269
        }
6270
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
6271
        {
6272
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6273
        }
6274
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
6275
        {
6276
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6277
        }
6278
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
6279
        {
6280
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
6281
        }
6282
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
6283
        {
6284
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6285
        }
6286
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
6287
        {
6288
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
6289
        }
6290
        elseif (!$description_only)
6291
        {
6292
            return $this->get_content(true);
6293
        }
6294
        else
6295
        {
6296
            return null;
6297
        }
6298
    }
6299
    
6300
    public function get_content($content_only = false)
6301
    {
6302
        if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content'))
6303
        {
6304
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_content_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
6305
        }
6306
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content'))
6307
        {
6308
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
6309
        }
6310
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded'))
6311
        {
6312
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
6313
        }
6314
        elseif (!$content_only)
6315
        {
6316
            return $this->get_description(true);
6317
        }
6318
        else
6319
        {
6320
            return null;
6321
        }
6322
    }
6323
    
6324
    public function get_category($key = 0)
6325
    {
6326
        $categories = $this->get_categories();
6327
        if (isset($categories[$key]))
6328
        {
6329
            return $categories[$key];
6330
        }
6331
        else
6332
        {
6333
            return null;
6334
        }
6335
    }
6336
    
6337
    public function get_categories()
6338
    {
6339
        $categories = array();
6340
        foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
6341
        {
6342
            $term = null;
6343
            $scheme = null;
6344
            $label = null;
6345
            if (isset($category['attribs']['']['term']))
6346
            {
6347
                $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
6348
            }
6349
            if (isset($category['attribs']['']['scheme']))
6350
            {
6351
                $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
6352
            }
6353
            if (isset($category['attribs']['']['label']))
6354
            {
6355
                $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
6356
            }
6357
            $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
6358
        }
6359
        foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
6360
        {
6361
            // This is really the label, but keep this as the term also for BC.
6362
            // Label will also work on retrieving because that falls back to term.
6363
            $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6364
            if (isset($category['attribs']['']['domain']))
6365
            {
6366
                $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
6367
            }
6368
            else
6369
            {
6370
                $scheme = null;
6371
            }
6372
            $categories[] = $this->registry->create('Category', array($term, $scheme, null));
6373
        }
6374
        foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
6375
        {
6376
            $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
6377
        }
6378
        foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
6379
        {
6380
            $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
6381
        }
6382
        if (!empty($categories))
6383
        {
6384
            return array_unique($categories);
6385
        }
6386
        else
6387
        {
6388
            return null;
6389
        }
6390
    }
6391
    
6392
    public function get_author($key = 0)
6393
    {
6394
        $authors = $this->get_authors();
6395
        if (isset($authors[$key]))
6396
        {
6397
            return $authors[$key];
6398
        }
6399
        else
6400
        {
6401
            return null;
6402
        }
6403
    }
6404
    
6405
    public function get_contributor($key = 0)
6406
    {
6407
        $contributors = $this->get_contributors();
6408
        if (isset($contributors[$key]))
6409
        {
6410
            return $contributors[$key];
6411
        }
6412
        else
6413
        {
6414
            return null;
6415
        }
6416
    }
6417
    
6418
    public function get_contributors()
6419
    {
6420
        $contributors = array();
6421
        foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
6422
        {
6423
            $name = null;
6424
            $uri = null;
6425
            $email = null;
6426
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
6427
            {
6428
                $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6429
            }
6430
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
6431
            {
6432
                $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
6433
            }
6434
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
6435
            {
6436
                $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6437
            }
6438
            if ($name !== null || $email !== null || $uri !== null)
6439
            {
6440
                $contributors[] = $this->registry->create('Author', array($name, $uri, $email));
6441
            }
6442
        }
6443
        foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
6444
        {
6445
            $name = null;
6446
            $url = null;
6447
            $email = null;
6448
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
6449
            {
6450
                $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6451
            }
6452
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
6453
            {
6454
                $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
6455
            }
6456
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
6457
            {
6458
                $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6459
            }
6460
            if ($name !== null || $email !== null || $url !== null)
6461
            {
6462
                $contributors[] = $this->registry->create('Author', array($name, $url, $email));
6463
            }
6464
        }
6465
        if (!empty($contributors))
6466
        {
6467
            return array_unique($contributors);
6468
        }
6469
        else
6470
        {
6471
            return null;
6472
        }
6473
    }
6474
    
6475
    public function get_authors()
6476
    {
6477
        $authors = array();
6478
        foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
6479
        {
6480
            $name = null;
6481
            $uri = null;
6482
            $email = null;
6483
            if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
6484
            {
6485
                $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6486
            }
6487
            if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
6488
            {
6489
                $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
6490
            }
6491
            if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
6492
            {
6493
                $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6494
            }
6495
            if ($name !== null || $email !== null || $uri !== null)
6496
            {
6497
                $authors[] = $this->registry->create('Author', array($name, $uri, $email));
6498
            }
6499
        }
6500
        if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
6501
        {
6502
            $name = null;
6503
            $url = null;
6504
            $email = null;
6505
            if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
6506
            {
6507
                $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6508
            }
6509
            if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
6510
            {
6511
                $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
6512
            }
6513
            if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
6514
            {
6515
                $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6516
            }
6517
            if ($name !== null || $email !== null || $url !== null)
6518
            {
6519
                $authors[] = $this->registry->create('Author', array($name, $url, $email));
6520
            }
6521
        }
6522
        if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author'))
6523
        {
6524
            $authors[] = $this->registry->create('Author', array(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)));
6525
        }
6526
        foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
6527
        {
6528
            $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
6529
        }
6530
        foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
6531
        {
6532
            $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
6533
        }
6534
        foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
6535
        {
6536
            $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
6537
        }
6538
        if (!empty($authors))
6539
        {
6540
            return array_unique($authors);
6541
        }
6542
        elseif (($source = $this->get_source()) && ($authors = $source->get_authors()))
6543
        {
6544
            return $authors;
6545
        }
6546
        elseif ($authors = $this->feed->get_authors())
6547
        {
6548
            return $authors;
6549
        }
6550
        else
6551
        {
6552
            return null;
6553
        }
6554
    }
6555
    
6556
    public function get_copyright()
6557
    {
6558
        if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
6559
        {
6560
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
6561
        }
6562
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
6563
        {
6564
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6565
        }
6566
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
6567
        {
6568
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6569
        }
6570
        else
6571
        {
6572
            return null;
6573
        }
6574
    }
6575
    
6576
    public function get_date($date_format = 'j F Y, g:i a')
6577
    {
6578
        if (!isset($this->data['date']))
6579
        {
6580
            if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published'))
6581
            {
6582
                $this->data['date']['raw'] = $return[0]['data'];
6583
            }
6584
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
6585
            {
6586
                $this->data['date']['raw'] = $return[0]['data'];
6587
            }
6588
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
6589
            {
6590
                $this->data['date']['raw'] = $return[0]['data'];
6591
            }
6592
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
6593
            {
6594
                $this->data['date']['raw'] = $return[0]['data'];
6595
            }
6596
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
6597
            {
6598
                $this->data['date']['raw'] = $return[0]['data'];
6599
            }
6600
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate'))
6601
            {
6602
                $this->data['date']['raw'] = $return[0]['data'];
6603
            }
6604
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
6605
            {
6606
                $this->data['date']['raw'] = $return[0]['data'];
6607
            }
6608
            elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
6609
            {
6610
                $this->data['date']['raw'] = $return[0]['data'];
6611
            }
6612
            if (!empty($this->data['date']['raw']))
6613
            {
6614
                $parser = $this->registry->call('Parse_Date', 'get');
6615
                $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']);
6616
            }
6617
            else
6618
            {
6619
                $this->data['date'] = null;
6620
            }
6621
        }
6622
        if ($this->data['date'])
6623
        {
6624
            $date_format = (string) $date_format;
6625
            switch ($date_format)
6626
            {
6627
                case '':
6628
                    return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);
6629
                case 'U':
6630
                    return $this->data['date']['parsed'];
6631
                default:
6632
                    return date($date_format, $this->data['date']['parsed']);
6633
            }
6634
        }
6635
        else
6636
        {
6637
            return null;
6638
        }
6639
    }
6640
    
6641
    public function get_updated_date($date_format = 'j F Y, g:i a')
6642
    {
6643
        if (!isset($this->data['updated']))
6644
        {
6645
            if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
6646
            {
6647
                $this->data['updated']['raw'] = $return[0]['data'];
6648
            }
6649
            if (!empty($this->data['updated']['raw']))
6650
            {
6651
                $parser = $this->registry->call('Parse_Date', 'get');
6652
                $this->data['updated']['parsed'] = $parser->parse($this->data['date']['raw']);
6653
            }
6654
            else
6655
            {
6656
                $this->data['updated'] = null;
6657
            }
6658
        }
6659
        if ($this->data['updated'])
6660
        {
6661
            $date_format = (string) $date_format;
6662
            switch ($date_format)
6663
            {
6664
                case '':
6665
                    return $this->sanitize($this->data['updated']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);
6666
                case 'U':
6667
                    return $this->data['updated']['parsed'];
6668
                default:
6669
                    return date($date_format, $this->data['updated']['parsed']);
6670
            }
6671
        }
6672
        else
6673
        {
6674
            return null;
6675
        }
6676
    }
6677
    
6678
    public function get_local_date($date_format = '%c')
6679
    {
6680
        if (!$date_format)
6681
        {
6682
            return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
6683
        }
6684
        elseif (($date = $this->get_date('U')) !== null && $date !== false)
6685
        {
6686
            return strftime($date_format, $date);
6687
        }
6688
        else
6689
        {
6690
            return null;
6691
        }
6692
    }
6693
    
6694
    public function get_gmdate($date_format = 'j F Y, g:i a')
6695
    {
6696
        $date = $this->get_date('U');
6697
        if ($date === null)
6698
        {
6699
            return null;
6700
        }
6701
        return gmdate($date_format, $date);
6702
    }
6703
    
6704
    public function get_updated_gmdate($date_format = 'j F Y, g:i a')
6705
    {
6706
        $date = $this->get_updated_date('U');
6707
        if ($date === null)
6708
        {
6709
            return null;
6710
        }
6711
        return gmdate($date_format, $date);
6712
    }
6713
    
6714
    public function get_permalink()
6715
    {
6716
        $link = $this->get_link();
6717
        $enclosure = $this->get_enclosure(0);
6718
        if ($link !== null)
6719
        {
6720
            return $link;
6721
        }
6722
        elseif ($enclosure !== null)
6723
        {
6724
            return $enclosure->get_link();
6725
        }
6726
        else
6727
        {
6728
            return null;
6729
        }
6730
    }
6731
    
6732
    public function get_link($key = 0, $rel = 'alternate')
6733
    {
6734
        $links = $this->get_links($rel);
6735
        if ($links[$key] !== null)
6736
        {
6737
            return $links[$key];
6738
        }
6739
        else
6740
        {
6741
            return null;
6742
        }
6743
    }
6744
    
6745
    public function get_links($rel = 'alternate')
6746
    {
6747
        if (!isset($this->data['links']))
6748
        {
6749
            $this->data['links'] = array();
6750
            foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
6751
            {
6752
                if (isset($link['attribs']['']['href']))
6753
                {
6754
                    $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
6755
                    $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
6756
                }
6757
            }
6758
            foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
6759
            {
6760
                if (isset($link['attribs']['']['href']))
6761
                {
6762
                    $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
6763
                    $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
6764
                }
6765
            }
6766
            if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
6767
            {
6768
                $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
6769
            }
6770
            if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
6771
            {
6772
                $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
6773
            }
6774
            if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
6775
            {
6776
                $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
6777
            }
6778
            if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
6779
            {
6780
                if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true')
6781
                {
6782
                    $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
6783
                }
6784
            }
6785
            $keys = array_keys($this->data['links']);
6786
            foreach ($keys as $key)
6787
            {
6788
                if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))
6789
                {
6790
                    if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
6791
                    {
6792
                        $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
6793
                        $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
6794
                    }
6795
                    else
6796
                    {
6797
                        $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
6798
                    }
6799
                }
6800
                elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
6801
                {
6802
                    $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
6803
                }
6804
                $this->data['links'][$key] = array_unique($this->data['links'][$key]);
6805
            }
6806
        }
6807
        if (isset($this->data['links'][$rel]))
6808
        {
6809
            return $this->data['links'][$rel];
6810
        }
6811
        else
6812
        {
6813
            return null;
6814
        }
6815
    }
6816
    
6817
    public function get_enclosure($key = 0, $prefer = null)
6818
    {
6819
        $enclosures = $this->get_enclosures();
6820
        if (isset($enclosures[$key]))
6821
        {
6822
            return $enclosures[$key];
6823
        }
6824
        else
6825
        {
6826
            return null;
6827
        }
6828
    }
6829
    
6830
    public function get_enclosures()
6831
    {
6832
        if (!isset($this->data['enclosures']))
6833
        {
6834
            $this->data['enclosures'] = array();
6835
            // Elements
6836
            $captions_parent = null;
6837
            $categories_parent = null;
6838
            $copyrights_parent = null;
6839
            $credits_parent = null;
6840
            $description_parent = null;
6841
            $duration_parent = null;
6842
            $hashes_parent = null;
6843
            $keywords_parent = null;
6844
            $player_parent = null;
6845
            $ratings_parent = null;
6846
            $restrictions_parent = null;
6847
            $thumbnails_parent = null;
6848
            $title_parent = null;
6849
            // Let's do the channel and item-level ones first, and just re-use them if we need to.
6850
            $parent = $this->get_feed();
6851
            // CAPTIONS
6852
            if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
6853
            {
6854
                foreach ($captions as $caption)
6855
                {
6856
                    $caption_type = null;
6857
                    $caption_lang = null;
6858
                    $caption_startTime = null;
6859
                    $caption_endTime = null;
6860
                    $caption_text = null;
6861
                    if (isset($caption['attribs']['']['type']))
6862
                    {
6863
                        $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
6864
                    }
6865
                    if (isset($caption['attribs']['']['lang']))
6866
                    {
6867
                        $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
6868
                    }
6869
                    if (isset($caption['attribs']['']['start']))
6870
                    {
6871
                        $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
6872
                    }
6873
                    if (isset($caption['attribs']['']['end']))
6874
                    {
6875
                        $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
6876
                    }
6877
                    if (isset($caption['data']))
6878
                    {
6879
                        $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6880
                    }
6881
                    $captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
6882
                }
6883
            }
6884
            elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
6885
            {
6886
                foreach ($captions as $caption)
6887
                {
6888
                    $caption_type = null;
6889
                    $caption_lang = null;
6890
                    $caption_startTime = null;
6891
                    $caption_endTime = null;
6892
                    $caption_text = null;
6893
                    if (isset($caption['attribs']['']['type']))
6894
                    {
6895
                        $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
6896
                    }
6897
                    if (isset($caption['attribs']['']['lang']))
6898
                    {
6899
                        $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
6900
                    }
6901
                    if (isset($caption['attribs']['']['start']))
6902
                    {
6903
                        $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
6904
                    }
6905
                    if (isset($caption['attribs']['']['end']))
6906
                    {
6907
                        $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
6908
                    }
6909
                    if (isset($caption['data']))
6910
                    {
6911
                        $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6912
                    }
6913
                    $captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
6914
                }
6915
            }
6916
            if (is_array($captions_parent))
6917
            {
6918
                $captions_parent = array_values(array_unique($captions_parent));
6919
            }
6920
            // CATEGORIES
6921
            foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
6922
            {
6923
                $term = null;
6924
                $scheme = null;
6925
                $label = null;
6926
                if (isset($category['data']))
6927
                {
6928
                    $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6929
                }
6930
                if (isset($category['attribs']['']['scheme']))
6931
                {
6932
                    $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
6933
                }
6934
                else
6935
                {
6936
                    $scheme = 'http://search.yahoo.com/mrss/category_schema';
6937
                }
6938
                if (isset($category['attribs']['']['label']))
6939
                {
6940
                    $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
6941
                }
6942
                $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
6943
            }
6944
            foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
6945
            {
6946
                $term = null;
6947
                $scheme = null;
6948
                $label = null;
6949
                if (isset($category['data']))
6950
                {
6951
                    $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
6952
                }
6953
                if (isset($category['attribs']['']['scheme']))
6954
                {
6955
                    $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
6956
                }
6957
                else
6958
                {
6959
                    $scheme = 'http://search.yahoo.com/mrss/category_schema';
6960
                }
6961
                if (isset($category['attribs']['']['label']))
6962
                {
6963
                    $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
6964
                }
6965
                $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
6966
            }
6967
            foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category)
6968
            {
6969
                $term = null;
6970
                $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
6971
                $label = null;
6972
                if (isset($category['attribs']['']['text']))
6973
                {
6974
                    $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
6975
                }
6976
                $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
6977
                if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category']))
6978
                {
6979
                    foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory)
6980
                    {
6981
                        if (isset($subcategory['attribs']['']['text']))
6982
                        {
6983
                            $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
6984
                        }
6985
                        $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label));
6986
                    }
6987
                }
6988
            }
6989
            if (is_array($categories_parent))
6990
            {
6991
                $categories_parent = array_values(array_unique($categories_parent));
6992
            }
6993
            // COPYRIGHT
6994
            if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
6995
            {
6996
                $copyright_url = null;
6997
                $copyright_label = null;
6998
                if (isset($copyright[0]['attribs']['']['url']))
6999
                {
7000
                    $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
7001
                }
7002
                if (isset($copyright[0]['data']))
7003
                {
7004
                    $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7005
                }
7006
                $copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
7007
            }
7008
            elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
7009
            {
7010
                $copyright_url = null;
7011
                $copyright_label = null;
7012
                if (isset($copyright[0]['attribs']['']['url']))
7013
                {
7014
                    $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
7015
                }
7016
                if (isset($copyright[0]['data']))
7017
                {
7018
                    $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7019
                }
7020
                $copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
7021
            }
7022
            // CREDITS
7023
            if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
7024
            {
7025
                foreach ($credits as $credit)
7026
                {
7027
                    $credit_role = null;
7028
                    $credit_scheme = null;
7029
                    $credit_name = null;
7030
                    if (isset($credit['attribs']['']['role']))
7031
                    {
7032
                        $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
7033
                    }
7034
                    if (isset($credit['attribs']['']['scheme']))
7035
                    {
7036
                        $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
7037
                    }
7038
                    else
7039
                    {
7040
                        $credit_scheme = 'urn:ebu';
7041
                    }
7042
                    if (isset($credit['data']))
7043
                    {
7044
                        $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7045
                    }
7046
                    $credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
7047
                }
7048
            }
7049
            elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
7050
            {
7051
                foreach ($credits as $credit)
7052
                {
7053
                    $credit_role = null;
7054
                    $credit_scheme = null;
7055
                    $credit_name = null;
7056
                    if (isset($credit['attribs']['']['role']))
7057
                    {
7058
                        $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
7059
                    }
7060
                    if (isset($credit['attribs']['']['scheme']))
7061
                    {
7062
                        $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
7063
                    }
7064
                    else
7065
                    {
7066
                        $credit_scheme = 'urn:ebu';
7067
                    }
7068
                    if (isset($credit['data']))
7069
                    {
7070
                        $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7071
                    }
7072
                    $credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
7073
                }
7074
            }
7075
            if (is_array($credits_parent))
7076
            {
7077
                $credits_parent = array_values(array_unique($credits_parent));
7078
            }
7079
            // DESCRIPTION
7080
            if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
7081
            {
7082
                if (isset($description_parent[0]['data']))
7083
                {
7084
                    $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7085
                }
7086
            }
7087
            elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
7088
            {
7089
                if (isset($description_parent[0]['data']))
7090
                {
7091
                    $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7092
                }
7093
            }
7094
            // DURATION
7095
            if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration'))
7096
            {
7097
                $seconds = null;
7098
                $minutes = null;
7099
                $hours = null;
7100
                if (isset($duration_parent[0]['data']))
7101
                {
7102
                    $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
7103
                    if (sizeof($temp) > 0)
7104
                    {
7105
                        $seconds = (int) array_pop($temp);
7106
                    }
7107
                    if (sizeof($temp) > 0)
7108
                    {
7109
                        $minutes = (int) array_pop($temp);
7110
                        $seconds += $minutes * 60;
7111
                    }
7112
                    if (sizeof($temp) > 0)
7113
                    {
7114
                        $hours = (int) array_pop($temp);
7115
                        $seconds += $hours * 3600;
7116
                    }
7117
                    unset($temp);
7118
                    $duration_parent = $seconds;
7119
                }
7120
            }
7121
            // HASHES
7122
            if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
7123
            {
7124
                foreach ($hashes_iterator as $hash)
7125
                {
7126
                    $value = null;
7127
                    $algo = null;
7128
                    if (isset($hash['data']))
7129
                    {
7130
                        $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7131
                    }
7132
                    if (isset($hash['attribs']['']['algo']))
7133
                    {
7134
                        $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
7135
                    }
7136
                    else
7137
                    {
7138
                        $algo = 'md5';
7139
                    }
7140
                    $hashes_parent[] = $algo.':'.$value;
7141
                }
7142
            }
7143
            elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
7144
            {
7145
                foreach ($hashes_iterator as $hash)
7146
                {
7147
                    $value = null;
7148
                    $algo = null;
7149
                    if (isset($hash['data']))
7150
                    {
7151
                        $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7152
                    }
7153
                    if (isset($hash['attribs']['']['algo']))
7154
                    {
7155
                        $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
7156
                    }
7157
                    else
7158
                    {
7159
                        $algo = 'md5';
7160
                    }
7161
                    $hashes_parent[] = $algo.':'.$value;
7162
                }
7163
            }
7164
            if (is_array($hashes_parent))
7165
            {
7166
                $hashes_parent = array_values(array_unique($hashes_parent));
7167
            }
7168
            // KEYWORDS
7169
            if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
7170
            {
7171
                if (isset($keywords[0]['data']))
7172
                {
7173
                    $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
7174
                    foreach ($temp as $word)
7175
                    {
7176
                        $keywords_parent[] = trim($word);
7177
                    }
7178
                }
7179
                unset($temp);
7180
            }
7181
            elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
7182
            {
7183
                if (isset($keywords[0]['data']))
7184
                {
7185
                    $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
7186
                    foreach ($temp as $word)
7187
                    {
7188
                        $keywords_parent[] = trim($word);
7189
                    }
7190
                }
7191
                unset($temp);
7192
            }
7193
            elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
7194
            {
7195
                if (isset($keywords[0]['data']))
7196
                {
7197
                    $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
7198
                    foreach ($temp as $word)
7199
                    {
7200
                        $keywords_parent[] = trim($word);
7201
                    }
7202
                }
7203
                unset($temp);
7204
            }
7205
            elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
7206
            {
7207
                if (isset($keywords[0]['data']))
7208
                {
7209
                    $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
7210
                    foreach ($temp as $word)
7211
                    {
7212
                        $keywords_parent[] = trim($word);
7213
                    }
7214
                }
7215
                unset($temp);
7216
            }
7217
            if (is_array($keywords_parent))
7218
            {
7219
                $keywords_parent = array_values(array_unique($keywords_parent));
7220
            }
7221
            // PLAYER
7222
            if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
7223
            {
7224
                if (isset($player_parent[0]['attribs']['']['url']))
7225
                {
7226
                    $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
7227
                }
7228
            }
7229
            elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
7230
            {
7231
                if (isset($player_parent[0]['attribs']['']['url']))
7232
                {
7233
                    $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
7234
                }
7235
            }
7236
            // RATINGS
7237
            if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
7238
            {
7239
                foreach ($ratings as $rating)
7240
                {
7241
                    $rating_scheme = null;
7242
                    $rating_value = null;
7243
                    if (isset($rating['attribs']['']['scheme']))
7244
                    {
7245
                        $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
7246
                    }
7247
                    else
7248
                    {
7249
                        $rating_scheme = 'urn:simple';
7250
                    }
7251
                    if (isset($rating['data']))
7252
                    {
7253
                        $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7254
                    }
7255
                    $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
7256
                }
7257
            }
7258
            elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
7259
            {
7260
                foreach ($ratings as $rating)
7261
                {
7262
                    $rating_scheme = 'urn:itunes';
7263
                    $rating_value = null;
7264
                    if (isset($rating['data']))
7265
                    {
7266
                        $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7267
                    }
7268
                    $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
7269
                }
7270
            }
7271
            elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
7272
            {
7273
                foreach ($ratings as $rating)
7274
                {
7275
                    $rating_scheme = null;
7276
                    $rating_value = null;
7277
                    if (isset($rating['attribs']['']['scheme']))
7278
                    {
7279
                        $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
7280
                    }
7281
                    else
7282
                    {
7283
                        $rating_scheme = 'urn:simple';
7284
                    }
7285
                    if (isset($rating['data']))
7286
                    {
7287
                        $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7288
                    }
7289
                    $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
7290
                }
7291
            }
7292
            elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
7293
            {
7294
                foreach ($ratings as $rating)
7295
                {
7296
                    $rating_scheme = 'urn:itunes';
7297
                    $rating_value = null;
7298
                    if (isset($rating['data']))
7299
                    {
7300
                        $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7301
                    }
7302
                    $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
7303
                }
7304
            }
7305
            if (is_array($ratings_parent))
7306
            {
7307
                $ratings_parent = array_values(array_unique($ratings_parent));
7308
            }
7309
            // RESTRICTIONS
7310
            if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
7311
            {
7312
                foreach ($restrictions as $restriction)
7313
                {
7314
                    $restriction_relationship = null;
7315
                    $restriction_type = null;
7316
                    $restriction_value = null;
7317
                    if (isset($restriction['attribs']['']['relationship']))
7318
                    {
7319
                        $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
7320
                    }
7321
                    if (isset($restriction['attribs']['']['type']))
7322
                    {
7323
                        $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
7324
                    }
7325
                    if (isset($restriction['data']))
7326
                    {
7327
                        $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7328
                    }
7329
                    $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
7330
                }
7331
            }
7332
            elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
7333
            {
7334
                foreach ($restrictions as $restriction)
7335
                {
7336
                    $restriction_relationship = 'allow';
7337
                    $restriction_type = null;
7338
                    $restriction_value = 'itunes';
7339
                    if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
7340
                    {
7341
                        $restriction_relationship = 'deny';
7342
                    }
7343
                    $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
7344
                }
7345
            }
7346
            elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
7347
            {
7348
                foreach ($restrictions as $restriction)
7349
                {
7350
                    $restriction_relationship = null;
7351
                    $restriction_type = null;
7352
                    $restriction_value = null;
7353
                    if (isset($restriction['attribs']['']['relationship']))
7354
                    {
7355
                        $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
7356
                    }
7357
                    if (isset($restriction['attribs']['']['type']))
7358
                    {
7359
                        $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
7360
                    }
7361
                    if (isset($restriction['data']))
7362
                    {
7363
                        $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7364
                    }
7365
                    $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
7366
                }
7367
            }
7368
            elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
7369
            {
7370
                foreach ($restrictions as $restriction)
7371
                {
7372
                    $restriction_relationship = 'allow';
7373
                    $restriction_type = null;
7374
                    $restriction_value = 'itunes';
7375
                    if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
7376
                    {
7377
                        $restriction_relationship = 'deny';
7378
                    }
7379
                    $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
7380
                }
7381
            }
7382
            if (is_array($restrictions_parent))
7383
            {
7384
                $restrictions_parent = array_values(array_unique($restrictions_parent));
7385
            }
7386
            else
7387
            {
7388
                $restrictions_parent = array(new SimplePie_Restriction('allow', null, 'default'));
7389
            }
7390
            // THUMBNAILS
7391
            if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
7392
            {
7393
                foreach ($thumbnails as $thumbnail)
7394
                {
7395
                    if (isset($thumbnail['attribs']['']['url']))
7396
                    {
7397
                        $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
7398
                    }
7399
                }
7400
            }
7401
            elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
7402
            {
7403
                foreach ($thumbnails as $thumbnail)
7404
                {
7405
                    if (isset($thumbnail['attribs']['']['url']))
7406
                    {
7407
                        $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
7408
                    }
7409
                }
7410
            }
7411
            // TITLES
7412
            if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
7413
            {
7414
                if (isset($title_parent[0]['data']))
7415
                {
7416
                    $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7417
                }
7418
            }
7419
            elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
7420
            {
7421
                if (isset($title_parent[0]['data']))
7422
                {
7423
                    $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7424
                }
7425
            }
7426
            // Clear the memory
7427
            unset($parent);
7428
            // Attributes
7429
            $bitrate = null;
7430
            $channels = null;
7431
            $duration = null;
7432
            $expression = null;
7433
            $framerate = null;
7434
            $height = null;
7435
            $javascript = null;
7436
            $lang = null;
7437
            $length = null;
7438
            $medium = null;
7439
            $samplingrate = null;
7440
            $type = null;
7441
            $url = null;
7442
            $width = null;
7443
            // Elements
7444
            $captions = null;
7445
            $categories = null;
7446
            $copyrights = null;
7447
            $credits = null;
7448
            $description = null;
7449
            $hashes = null;
7450
            $keywords = null;
7451
            $player = null;
7452
            $ratings = null;
7453
            $restrictions = null;
7454
            $thumbnails = null;
7455
            $title = null;
7456
            // If we have media:group tags, loop through them.
7457
            foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
7458
            {
7459
                if(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
7460
                {
7461
                    // If we have media:content tags, loop through them.
7462
                    foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
7463
                    {
7464
                        if (isset($content['attribs']['']['url']))
7465
                        {
7466
                            // Attributes
7467
                            $bitrate = null;
7468
                            $channels = null;
7469
                            $duration = null;
7470
                            $expression = null;
7471
                            $framerate = null;
7472
                            $height = null;
7473
                            $javascript = null;
7474
                            $lang = null;
7475
                            $length = null;
7476
                            $medium = null;
7477
                            $samplingrate = null;
7478
                            $type = null;
7479
                            $url = null;
7480
                            $width = null;
7481
                            // Elements
7482
                            $captions = null;
7483
                            $categories = null;
7484
                            $copyrights = null;
7485
                            $credits = null;
7486
                            $description = null;
7487
                            $hashes = null;
7488
                            $keywords = null;
7489
                            $player = null;
7490
                            $ratings = null;
7491
                            $restrictions = null;
7492
                            $thumbnails = null;
7493
                            $title = null;
7494
                            // Start checking the attributes of media:content
7495
                            if (isset($content['attribs']['']['bitrate']))
7496
                            {
7497
                                $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
7498
                            }
7499
                            if (isset($content['attribs']['']['channels']))
7500
                            {
7501
                                $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
7502
                            }
7503
                            if (isset($content['attribs']['']['duration']))
7504
                            {
7505
                                $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
7506
                            }
7507
                            else
7508
                            {
7509
                                $duration = $duration_parent;
7510
                            }
7511
                            if (isset($content['attribs']['']['expression']))
7512
                            {
7513
                                $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
7514
                            }
7515
                            if (isset($content['attribs']['']['framerate']))
7516
                            {
7517
                                $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
7518
                            }
7519
                            if (isset($content['attribs']['']['height']))
7520
                            {
7521
                                $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
7522
                            }
7523
                            if (isset($content['attribs']['']['lang']))
7524
                            {
7525
                                $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
7526
                            }
7527
                            if (isset($content['attribs']['']['fileSize']))
7528
                            {
7529
                                $length = ceil($content['attribs']['']['fileSize']);
7530
                            }
7531
                            if (isset($content['attribs']['']['medium']))
7532
                            {
7533
                                $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
7534
                            }
7535
                            if (isset($content['attribs']['']['samplingrate']))
7536
                            {
7537
                                $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
7538
                            }
7539
                            if (isset($content['attribs']['']['type']))
7540
                            {
7541
                                $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
7542
                            }
7543
                            if (isset($content['attribs']['']['width']))
7544
                            {
7545
                                $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
7546
                            }
7547
                            $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
7548
                            // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
7549
                            // CAPTIONS
7550
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
7551
                            {
7552
                                foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
7553
                                {
7554
                                    $caption_type = null;
7555
                                    $caption_lang = null;
7556
                                    $caption_startTime = null;
7557
                                    $caption_endTime = null;
7558
                                    $caption_text = null;
7559
                                    if (isset($caption['attribs']['']['type']))
7560
                                    {
7561
                                        $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
7562
                                    }
7563
                                    if (isset($caption['attribs']['']['lang']))
7564
                                    {
7565
                                        $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
7566
                                    }
7567
                                    if (isset($caption['attribs']['']['start']))
7568
                                    {
7569
                                        $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
7570
                                    }
7571
                                    if (isset($caption['attribs']['']['end']))
7572
                                    {
7573
                                        $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
7574
                                    }
7575
                                    if (isset($caption['data']))
7576
                                    {
7577
                                        $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7578
                                    }
7579
                                    $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
7580
                                }
7581
                                if (is_array($captions))
7582
                                {
7583
                                    $captions = array_values(array_unique($captions));
7584
                                }
7585
                            }
7586
                            elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
7587
                            {
7588
                                foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
7589
                                {
7590
                                    $caption_type = null;
7591
                                    $caption_lang = null;
7592
                                    $caption_startTime = null;
7593
                                    $caption_endTime = null;
7594
                                    $caption_text = null;
7595
                                    if (isset($caption['attribs']['']['type']))
7596
                                    {
7597
                                        $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
7598
                                    }
7599
                                    if (isset($caption['attribs']['']['lang']))
7600
                                    {
7601
                                        $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
7602
                                    }
7603
                                    if (isset($caption['attribs']['']['start']))
7604
                                    {
7605
                                        $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
7606
                                    }
7607
                                    if (isset($caption['attribs']['']['end']))
7608
                                    {
7609
                                        $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
7610
                                    }
7611
                                    if (isset($caption['data']))
7612
                                    {
7613
                                        $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7614
                                    }
7615
                                    $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
7616
                                }
7617
                                if (is_array($captions))
7618
                                {
7619
                                    $captions = array_values(array_unique($captions));
7620
                                }
7621
                            }
7622
                            else
7623
                            {
7624
                                $captions = $captions_parent;
7625
                            }
7626
                            // CATEGORIES
7627
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
7628
                            {
7629
                                foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
7630
                                {
7631
                                    $term = null;
7632
                                    $scheme = null;
7633
                                    $label = null;
7634
                                    if (isset($category['data']))
7635
                                    {
7636
                                        $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7637
                                    }
7638
                                    if (isset($category['attribs']['']['scheme']))
7639
                                    {
7640
                                        $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
7641
                                    }
7642
                                    else
7643
                                    {
7644
                                        $scheme = 'http://search.yahoo.com/mrss/category_schema';
7645
                                    }
7646
                                    if (isset($category['attribs']['']['label']))
7647
                                    {
7648
                                        $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
7649
                                    }
7650
                                    $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
7651
                                }
7652
                            }
7653
                            if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
7654
                            {
7655
                                foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
7656
                                {
7657
                                    $term = null;
7658
                                    $scheme = null;
7659
                                    $label = null;
7660
                                    if (isset($category['data']))
7661
                                    {
7662
                                        $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7663
                                    }
7664
                                    if (isset($category['attribs']['']['scheme']))
7665
                                    {
7666
                                        $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
7667
                                    }
7668
                                    else
7669
                                    {
7670
                                        $scheme = 'http://search.yahoo.com/mrss/category_schema';
7671
                                    }
7672
                                    if (isset($category['attribs']['']['label']))
7673
                                    {
7674
                                        $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
7675
                                    }
7676
                                    $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
7677
                                }
7678
                            }
7679
                            if (is_array($categories) && is_array($categories_parent))
7680
                            {
7681
                                $categories = array_values(array_unique(array_merge($categories, $categories_parent)));
7682
                            }
7683
                            elseif (is_array($categories))
7684
                            {
7685
                                $categories = array_values(array_unique($categories));
7686
                            }
7687
                            elseif (is_array($categories_parent))
7688
                            {
7689
                                $categories = array_values(array_unique($categories_parent));
7690
                            }
7691
                            // COPYRIGHTS
7692
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
7693
                            {
7694
                                $copyright_url = null;
7695
                                $copyright_label = null;
7696
                                if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
7697
                                {
7698
                                    $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
7699
                                }
7700
                                if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
7701
                                {
7702
                                    $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7703
                                }
7704
                                $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
7705
                            }
7706
                            elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
7707
                            {
7708
                                $copyright_url = null;
7709
                                $copyright_label = null;
7710
                                if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
7711
                                {
7712
                                    $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
7713
                                }
7714
                                if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
7715
                                {
7716
                                    $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7717
                                }
7718
                                $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
7719
                            }
7720
                            else
7721
                            {
7722
                                $copyrights = $copyrights_parent;
7723
                            }
7724
                            // CREDITS
7725
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
7726
                            {
7727
                                foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
7728
                                {
7729
                                    $credit_role = null;
7730
                                    $credit_scheme = null;
7731
                                    $credit_name = null;
7732
                                    if (isset($credit['attribs']['']['role']))
7733
                                    {
7734
                                        $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
7735
                                    }
7736
                                    if (isset($credit['attribs']['']['scheme']))
7737
                                    {
7738
                                        $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
7739
                                    }
7740
                                    else
7741
                                    {
7742
                                        $credit_scheme = 'urn:ebu';
7743
                                    }
7744
                                    if (isset($credit['data']))
7745
                                    {
7746
                                        $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7747
                                    }
7748
                                    $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
7749
                                }
7750
                                if (is_array($credits))
7751
                                {
7752
                                    $credits = array_values(array_unique($credits));
7753
                                }
7754
                            }
7755
                            elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
7756
                            {
7757
                                foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
7758
                                {
7759
                                    $credit_role = null;
7760
                                    $credit_scheme = null;
7761
                                    $credit_name = null;
7762
                                    if (isset($credit['attribs']['']['role']))
7763
                                    {
7764
                                        $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
7765
                                    }
7766
                                    if (isset($credit['attribs']['']['scheme']))
7767
                                    {
7768
                                        $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
7769
                                    }
7770
                                    else
7771
                                    {
7772
                                        $credit_scheme = 'urn:ebu';
7773
                                    }
7774
                                    if (isset($credit['data']))
7775
                                    {
7776
                                        $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7777
                                    }
7778
                                    $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
7779
                                }
7780
                                if (is_array($credits))
7781
                                {
7782
                                    $credits = array_values(array_unique($credits));
7783
                                }
7784
                            }
7785
                            else
7786
                            {
7787
                                $credits = $credits_parent;
7788
                            }
7789
                            // DESCRIPTION
7790
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
7791
                            {
7792
                                $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7793
                            }
7794
                            elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
7795
                            {
7796
                                $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7797
                            }
7798
                            else
7799
                            {
7800
                                $description = $description_parent;
7801
                            }
7802
                            // HASHES
7803
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
7804
                            {
7805
                                foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
7806
                                {
7807
                                    $value = null;
7808
                                    $algo = null;
7809
                                    if (isset($hash['data']))
7810
                                    {
7811
                                        $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7812
                                    }
7813
                                    if (isset($hash['attribs']['']['algo']))
7814
                                    {
7815
                                        $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
7816
                                    }
7817
                                    else
7818
                                    {
7819
                                        $algo = 'md5';
7820
                                    }
7821
                                    $hashes[] = $algo.':'.$value;
7822
                                }
7823
                                if (is_array($hashes))
7824
                                {
7825
                                    $hashes = array_values(array_unique($hashes));
7826
                                }
7827
                            }
7828
                            elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
7829
                            {
7830
                                foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
7831
                                {
7832
                                    $value = null;
7833
                                    $algo = null;
7834
                                    if (isset($hash['data']))
7835
                                    {
7836
                                        $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7837
                                    }
7838
                                    if (isset($hash['attribs']['']['algo']))
7839
                                    {
7840
                                        $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
7841
                                    }
7842
                                    else
7843
                                    {
7844
                                        $algo = 'md5';
7845
                                    }
7846
                                    $hashes[] = $algo.':'.$value;
7847
                                }
7848
                                if (is_array($hashes))
7849
                                {
7850
                                    $hashes = array_values(array_unique($hashes));
7851
                                }
7852
                            }
7853
                            else
7854
                            {
7855
                                $hashes = $hashes_parent;
7856
                            }
7857
                            // KEYWORDS
7858
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
7859
                            {
7860
                                if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
7861
                                {
7862
                                    $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
7863
                                    foreach ($temp as $word)
7864
                                    {
7865
                                        $keywords[] = trim($word);
7866
                                    }
7867
                                    unset($temp);
7868
                                }
7869
                                if (is_array($keywords))
7870
                                {
7871
                                    $keywords = array_values(array_unique($keywords));
7872
                                }
7873
                            }
7874
                            elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
7875
                            {
7876
                                if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
7877
                                {
7878
                                    $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
7879
                                    foreach ($temp as $word)
7880
                                    {
7881
                                        $keywords[] = trim($word);
7882
                                    }
7883
                                    unset($temp);
7884
                                }
7885
                                if (is_array($keywords))
7886
                                {
7887
                                    $keywords = array_values(array_unique($keywords));
7888
                                }
7889
                            }
7890
                            else
7891
                            {
7892
                                $keywords = $keywords_parent;
7893
                            }
7894
                            // PLAYER
7895
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
7896
                            {
7897
                                $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
7898
                            }
7899
                            elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
7900
                            {
7901
                                $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
7902
                            }
7903
                            else
7904
                            {
7905
                                $player = $player_parent;
7906
                            }
7907
                            // RATINGS
7908
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
7909
                            {
7910
                                foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
7911
                                {
7912
                                    $rating_scheme = null;
7913
                                    $rating_value = null;
7914
                                    if (isset($rating['attribs']['']['scheme']))
7915
                                    {
7916
                                        $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
7917
                                    }
7918
                                    else
7919
                                    {
7920
                                        $rating_scheme = 'urn:simple';
7921
                                    }
7922
                                    if (isset($rating['data']))
7923
                                    {
7924
                                        $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7925
                                    }
7926
                                    $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
7927
                                }
7928
                                if (is_array($ratings))
7929
                                {
7930
                                    $ratings = array_values(array_unique($ratings));
7931
                                }
7932
                            }
7933
                            elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
7934
                            {
7935
                                foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
7936
                                {
7937
                                    $rating_scheme = null;
7938
                                    $rating_value = null;
7939
                                    if (isset($rating['attribs']['']['scheme']))
7940
                                    {
7941
                                        $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
7942
                                    }
7943
                                    else
7944
                                    {
7945
                                        $rating_scheme = 'urn:simple';
7946
                                    }
7947
                                    if (isset($rating['data']))
7948
                                    {
7949
                                        $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7950
                                    }
7951
                                    $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
7952
                                }
7953
                                if (is_array($ratings))
7954
                                {
7955
                                    $ratings = array_values(array_unique($ratings));
7956
                                }
7957
                            }
7958
                            else
7959
                            {
7960
                                $ratings = $ratings_parent;
7961
                            }
7962
                            // RESTRICTIONS
7963
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
7964
                            {
7965
                                foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
7966
                                {
7967
                                    $restriction_relationship = null;
7968
                                    $restriction_type = null;
7969
                                    $restriction_value = null;
7970
                                    if (isset($restriction['attribs']['']['relationship']))
7971
                                    {
7972
                                        $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
7973
                                    }
7974
                                    if (isset($restriction['attribs']['']['type']))
7975
                                    {
7976
                                        $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
7977
                                    }
7978
                                    if (isset($restriction['data']))
7979
                                    {
7980
                                        $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
7981
                                    }
7982
                                    $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
7983
                                }
7984
                                if (is_array($restrictions))
7985
                                {
7986
                                    $restrictions = array_values(array_unique($restrictions));
7987
                                }
7988
                            }
7989
                            elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
7990
                            {
7991
                                foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
7992
                                {
7993
                                    $restriction_relationship = null;
7994
                                    $restriction_type = null;
7995
                                    $restriction_value = null;
7996
                                    if (isset($restriction['attribs']['']['relationship']))
7997
                                    {
7998
                                        $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
7999
                                    }
8000
                                    if (isset($restriction['attribs']['']['type']))
8001
                                    {
8002
                                        $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
8003
                                    }
8004
                                    if (isset($restriction['data']))
8005
                                    {
8006
                                        $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
8007
                                    }
8008
                                    $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
8009
                                }
8010
                                if (is_array($restrictions))
8011
                                {
8012
                                    $restrictions = array_values(array_unique($restrictions));
8013
                                }
8014
                            }
8015
                            else
8016
                            {
8017
                                $restrictions = $restrictions_parent;
8018
                            }
8019
                            // THUMBNAILS
8020
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
8021
                            {
8022
                                foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
8023
                                {
8024
                                    $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
8025
                                }
8026
                                if (is_array($thumbnails))
8027
                                {
8028
                                    $thumbnails = array_values(array_unique($thumbnails));
8029
                                }
8030
                            }
8031
                            elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
8032
                            {
8033
                                foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
8034
                                {
8035
                                    $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
8036
                                }
8037
                                if (is_array($thumbnails))
8038
                                {
8039
                                    $thumbnails = array_values(array_unique($thumbnails));
8040
                                }
8041
                            }
8042
                            else
8043
                            {
8044
                                $thumbnails = $thumbnails_parent;
8045
                            }
8046
                            // TITLES
8047
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
8048
                            {
8049
                                $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
8050
                            }
8051
                            elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
8052
                            {
8053
                                $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
8054
                            }
8055
                            else
8056
                            {
8057
                                $title = $title_parent;
8058
                            }
8059
                            $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width));
8060
                        }
8061
                    }
8062
                }
8063
            }
8064
            // If we have standalone media:content tags, loop through them.
8065
            if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
8066
            {
8067
                foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
8068
                {
8069
                    if (isset($content['attribs']['']['url']) || isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
8070
                    {
8071
                        // Attributes
8072
                        $bitrate = null;
8073
                        $channels = null;
8074
                        $duration = null;
8075
                        $expression = null;
8076
                        $framerate = null;
8077
                        $height = null;
8078
                        $javascript = null;
8079
                        $lang = null;
8080
                        $length = null;
8081
                        $medium = null;
8082
                        $samplingrate = null;
8083
                        $type = null;
8084
                        $url = null;
8085
                        $width = null;
8086
                        // Elements
8087
                        $captions = null;
8088
                        $categories = null;
8089
                        $copyrights = null;
8090
                        $credits = null;
8091
                        $description = null;
8092
                        $hashes = null;
8093
                        $keywords = null;
8094
                        $player = null;
8095
                        $ratings = null;
8096
                        $restrictions = null;
8097
                        $thumbnails = null;
8098
                        $title = null;
8099
                        // Start checking the attributes of media:content
8100
                        if (isset($content['attribs']['']['bitrate']))
8101
                        {
8102
                            $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
8103
                        }
8104
                        if (isset($content['attribs']['']['channels']))
8105
                        {
8106
                            $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
8107
                        }
8108
                        if (isset($content['attribs']['']['duration']))
8109
                        {
8110
                            $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
8111
                        }
8112
                        else
8113
                        {
8114
                            $duration = $duration_parent;
8115
                        }
8116
                        if (isset($content['attribs']['']['expression']))
8117
                        {
8118
                            $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
8119
                        }
8120
                        if (isset($content['attribs']['']['framerate']))
8121
                        {
8122
                            $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
8123
                        }
8124
                        if (isset($content['attribs']['']['height']))
8125
                        {
8126
                            $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
8127
                        }
8128
                        if (isset($content['attribs']['']['lang']))
8129
                        {
8130
                            $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
8131
                        }
8132
                        if (isset($content['attribs']['']['fileSize']))
8133
                        {
8134
                            $length = ceil($content['attribs']['']['fileSize']);
8135
                        }
8136
                        if (isset($content['attribs']['']['medium']))
8137
                        {
8138
                            $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
8139
                        }
8140
                        if (isset($content['attribs']['']['samplingrate']))
8141
                        {
8142
                            $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
8143
                        }
8144
                        if (isset($content['attribs']['']['type']))
8145
                        {
8146
                            $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
8147
                        }
8148
                        if (isset($content['attribs']['']['width']))
8149
                        {
8150
                            $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
8151
                        }
8152
                        if (isset($content['attribs']['']['url']))
8153
                        {
8154
                            $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
8155
                        }
8156
                        // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
8157
                        // CAPTIONS
8158
                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
8159
                        {
8160
                            foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
8161
                            {
8162
                                $caption_type = null;
8163
                                $caption_lang = null;
8164
                                $caption_startTime = null;
8165
                                $caption_endTime = null;
8166
                                $caption_text = null;
8167
                                if (isset($caption['attribs']['']['type']))
8168
                                {
8169
                                    $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
8170
                                }
8171
                                if (isset($caption['attribs']['']['lang']))
8172
                                {
8173
                                    $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
8174
                                }
8175
                                if (isset($caption['attribs']['']['start']))
8176
                                {
8177
                                    $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
8178
                                }
8179
                                if (isset($caption['attribs']['']['end']))
8180
                                {
8181
                                    $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
8182
                                }
8183
                                if (isset($caption['data']))
8184
                                {
8185
                                    $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
8186
                                }
8187
                                $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text));
8188
                            }
8189
                            if (is_array($captions))
8190
                            {
8191
                                $captions = array_values(array_unique($captions));
8192
                            }
8193
                        }
8194
                        else
8195
                        {
8196
                            $captions = $captions_parent;
8197
                        }
8198
                        // CATEGORIES
8199
                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
8200
                        {
8201
                            foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
8202
                            {
8203
                                $term = null;
8204
                                $scheme = null;
8205
                                $label = null;
8206
                                if (isset($category['data']))
8207
                                {
8208
                                    $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
8209
                                }
8210
                                if (isset($category['attribs']['']['scheme']))
8211
                                {
8212
                                    $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
8213
                                }
8214
                                else
8215
                                {
8216
                                    $scheme = 'http://search.yahoo.com/mrss/category_schema';
8217
                                }
8218
                                if (isset($category['attribs']['']['label']))
8219
                                {
8220
                                    $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
8221
                                }
8222
                                $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
8223
                            }
8224
                        }
8225
                        if (is_array($categories) && is_array($categories_parent))
8226
                        {
8227
                            $categories = array_values(array_unique(array_merge($categories, $categories_parent)));
8228
                        }
8229
                        elseif (is_array($categories))
8230
                        {
8231
                            $categories = array_values(array_unique($categories));
8232
                        }
8233
                        elseif (is_array($categories_parent))
8234
                        {
8235
                            $categories = array_values(array_unique($categories_parent));
8236
                        }
8237
                        else
8238
                        {
8239
                            $categories = null;
8240
                        }
8241
                        // COPYRIGHTS
8242
                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
8243
                        {
8244
                            $copyright_url = null;
8245
                            $copyright_label = null;
8246
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
8247
                            {
8248
                                $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
8249
                            }
8250
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
8251
                            {
8252
                                $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
8253
                            }
8254
                            $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label));
8255
                        }
8256
                        else
8257
                        {
8258
                            $copyrights = $copyrights_parent;
8259
                        }
8260
                        // CREDITS
8261
                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
8262
                        {
8263
                            foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
8264
                            {
8265
                                $credit_role = null;
8266
                                $credit_scheme = null;
8267
                                $credit_name = null;
8268
                                if (isset($credit['attribs']['']['role']))
8269
                                {
8270
                                    $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
8271
                                }
8272
                                if (isset($credit['attribs']['']['scheme']))
8273
                                {
8274
                                    $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
8275
                                }
8276
                                else
8277
                                {
8278
                                    $credit_scheme = 'urn:ebu';
8279
                                }
8280
                                if (isset($credit['data']))
8281
                                {
8282
                                    $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
8283
                                }
8284
                                $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name));
8285
                            }
8286
                            if (is_array($credits))
8287
                            {
8288
                                $credits = array_values(array_unique($credits));
8289
                            }
8290
                        }
8291
                        else
8292
                        {
8293
                            $credits = $credits_parent;
8294
                        }
8295
                        // DESCRIPTION
8296
                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
8297
                        {
8298
                            $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
8299
                        }
8300
                        else
8301
                        {
8302
                            $description = $description_parent;
8303
                        }
8304
                        // HASHES
8305
                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
8306
                        {
8307
                            foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
8308
                            {
8309
                                $value = null;
8310
                                $algo = null;
8311
                                if (isset($hash['data']))
8312
                                {
8313
                                    $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
8314
                                }
8315
                                if (isset($hash['attribs']['']['algo']))
8316
                                {
8317
                                    $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
8318
                                }
8319
                                else
8320
                                {
8321
                                    $algo = 'md5';
8322
                                }
8323
                                $hashes[] = $algo.':'.$value;
8324
                            }
8325
                            if (is_array($hashes))
8326
                            {
8327
                                $hashes = array_values(array_unique($hashes));
8328
                            }
8329
                        }
8330
                        else
8331
                        {
8332
                            $hashes = $hashes_parent;
8333
                        }
8334
                        // KEYWORDS
8335
                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
8336
                        {
8337
                            if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
8338
                            {
8339
                                $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
8340
                                foreach ($temp as $word)
8341
                                {
8342
                                    $keywords[] = trim($word);
8343
                                }
8344
                                unset($temp);
8345
                            }
8346
                            if (is_array($keywords))
8347
                            {
8348
                                $keywords = array_values(array_unique($keywords));
8349
                            }
8350
                        }
8351
                        else
8352
                        {
8353
                            $keywords = $keywords_parent;
8354
                        }
8355
                        // PLAYER
8356
                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
8357
                        {
8358
                            $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
8359
                        }
8360
                        else
8361
                        {
8362
                            $player = $player_parent;
8363
                        }
8364
                        // RATINGS
8365
                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
8366
                        {
8367
                            foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
8368
                            {
8369
                                $rating_scheme = null;
8370
                                $rating_value = null;
8371
                                if (isset($rating['attribs']['']['scheme']))
8372
                                {
8373
                                    $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
8374
                                }
8375
                                else
8376
                                {
8377
                                    $rating_scheme = 'urn:simple';
8378
                                }
8379
                                if (isset($rating['data']))
8380
                                {
8381
                                    $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
8382
                                }
8383
                                $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value));
8384
                            }
8385
                            if (is_array($ratings))
8386
                            {
8387
                                $ratings = array_values(array_unique($ratings));
8388
                            }
8389
                        }
8390
                        else
8391
                        {
8392
                            $ratings = $ratings_parent;
8393
                        }
8394
                        // RESTRICTIONS
8395
                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction']))
8396
                        {
8397
                            foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction)
8398
                            {
8399
                                $restriction_relationship = null;
8400
                                $restriction_type = null;
8401
                                $restriction_value = null;
8402
                                if (isset($restriction['attribs']['']['relationship']))
8403
                                {
8404
                                    $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
8405
                                }
8406
                                if (isset($restriction['attribs']['']['type']))
8407
                                {
8408
                                    $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
8409
                                }
8410
                                if (isset($restriction['data']))
8411
                                {
8412
                                    $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
8413
                                }
8414
                                $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value));
8415
                            }
8416
                            if (is_array($restrictions))
8417
                            {
8418
                                $restrictions = array_values(array_unique($restrictions));
8419
                            }
8420
                        }
8421
                        else
8422
                        {
8423
                            $restrictions = $restrictions_parent;
8424
                        }
8425
                        // THUMBNAILS
8426
                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail']))
8427
                        {
8428
                            foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail)
8429
                            {
8430
                                $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
8431
                            }
8432
                            if (is_array($thumbnails))
8433
                            {
8434
                                $thumbnails = array_values(array_unique($thumbnails));
8435
                            }
8436
                        }
8437
                        else
8438
                        {
8439
                            $thumbnails = $thumbnails_parent;
8440
                        }
8441
                        // TITLES
8442
                        if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title']))
8443
                        {
8444
                            $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
8445
                        }
8446
                        else
8447
                        {
8448
                            $title = $title_parent;
8449
                        }
8450
                        $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width));
8451
                    }
8452
                }
8453
            }
8454
            foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
8455
            {
8456
                if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')
8457
                {
8458
                    // Attributes
8459
                    $bitrate = null;
8460
                    $channels = null;
8461
                    $duration = null;
8462
                    $expression = null;
8463
                    $framerate = null;
8464
                    $height = null;
8465
                    $javascript = null;
8466
                    $lang = null;
8467
                    $length = null;
8468
                    $medium = null;
8469
                    $samplingrate = null;
8470
                    $type = null;
8471
                    $url = null;
8472
                    $width = null;
8473
                    $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
8474
                    if (isset($link['attribs']['']['type']))
8475
                    {
8476
                        $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
8477
                    }
8478
                    if (isset($link['attribs']['']['length']))
8479
                    {
8480
                        $length = ceil($link['attribs']['']['length']);
8481
                    }
8482
                    // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
8483
                    $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
8484
                }
8485
            }
8486
            foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
8487
            {
8488
                if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure')
8489
                {
8490
                    // Attributes
8491
                    $bitrate = null;
8492
                    $channels = null;
8493
                    $duration = null;
8494
                    $expression = null;
8495
                    $framerate = null;
8496
                    $height = null;
8497
                    $javascript = null;
8498
                    $lang = null;
8499
                    $length = null;
8500
                    $medium = null;
8501
                    $samplingrate = null;
8502
                    $type = null;
8503
                    $url = null;
8504
                    $width = null;
8505
                    $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
8506
                    if (isset($link['attribs']['']['type']))
8507
                    {
8508
                        $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
8509
                    }
8510
                    if (isset($link['attribs']['']['length']))
8511
                    {
8512
                        $length = ceil($link['attribs']['']['length']);
8513
                    }
8514
                    // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
8515
                    $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
8516
                }
8517
            }
8518
            if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure'))
8519
            {
8520
                if (isset($enclosure[0]['attribs']['']['url']))
8521
                {
8522
                    // Attributes
8523
                    $bitrate = null;
8524
                    $channels = null;
8525
                    $duration = null;
8526
                    $expression = null;
8527
                    $framerate = null;
8528
                    $height = null;
8529
                    $javascript = null;
8530
                    $lang = null;
8531
                    $length = null;
8532
                    $medium = null;
8533
                    $samplingrate = null;
8534
                    $type = null;
8535
                    $url = null;
8536
                    $width = null;
8537
                    $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));
8538
                    if (isset($enclosure[0]['attribs']['']['type']))
8539
                    {
8540
                        $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
8541
                    }
8542
                    if (isset($enclosure[0]['attribs']['']['length']))
8543
                    {
8544
                        $length = ceil($enclosure[0]['attribs']['']['length']);
8545
                    }
8546
                    // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
8547
                    $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
8548
                }
8549
            }
8550
            if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width))
8551
            {
8552
                // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
8553
                $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width));
8554
            }
8555
            $this->data['enclosures'] = array_values(array_unique($this->data['enclosures']));
8556
        }
8557
        if (!empty($this->data['enclosures']))
8558
        {
8559
            return $this->data['enclosures'];
8560
        }
8561
        else
8562
        {
8563
            return null;
8564
        }
8565
    }
8566
    
8567
    public function get_latitude()
8568
    {
8569
        if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
8570
        {
8571
            return (float) $return[0]['data'];
8572
        }
8573
        elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
8574
        {
8575
            return (float) $match[1];
8576
        }
8577
        else
8578
        {
8579
            return null;
8580
        }
8581
    }
8582
    
8583
    public function get_longitude()
8584
    {
8585
        if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
8586
        {
8587
            return (float) $return[0]['data'];
8588
        }
8589
        elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
8590
        {
8591
            return (float) $return[0]['data'];
8592
        }
8593
        elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
8594
        {
8595
            return (float) $match[2];
8596
        }
8597
        else
8598
        {
8599
            return null;
8600
        }
8601
    }
8602
    
8603
    public function get_source()
8604
    {
8605
        if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source'))
8606
        {
8607
            return $this->registry->create('Source', array($this, $return[0]));
8608
        }
8609
        else
8610
        {
8611
            return null;
8612
        }
8613
    }
8614
}
8615
class SimplePie_Locator
8616
{
8617
    var $useragent;
8618
    var $timeout;
8619
    var $file;
8620
    var $local = array();
8621
    var $elsewhere = array();
8622
    var $cached_entities = array();
8623
    var $http_base;
8624
    var $base;
8625
    var $base_location = 0;
8626
    var $checked_feeds = 0;
8627
    var $max_checked_feeds = 10;
8628
    protected $registry;
8629
    public function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10)
8630
    {
8631
        $this->file = $file;
8632
        $this->useragent = $useragent;
8633
        $this->timeout = $timeout;
8634
        $this->max_checked_feeds = $max_checked_feeds;
8635
        if (class_exists('DOMDocument'))
8636
        {
8637
            $this->dom = new DOMDocument();
8638
            set_error_handler(array('SimplePie_Misc', 'silence_errors'));
8639
            $this->dom->loadHTML($this->file->body);
8640
            restore_error_handler();
8641
        }
8642
        else
8643
        {
8644
            $this->dom = null;
8645
        }
8646
    }
8647
    public function set_registry(SimplePie_Registry $registry)
8648
    {
8649
        $this->registry = $registry;
8650
    }
8651
    public function find($type = SIMPLEPIE_LOCATOR_ALL, &$working)
8652
    {
8653
        if ($this->is_feed($this->file))
8654
        {
8655
            return $this->file;
8656
        }
8657
        if ($this->file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
8658
        {
8659
            $sniffer = $this->registry->create('Content_Type_Sniffer', array($this->file));
8660
            if ($sniffer->get_type() !== 'text/html')
8661
            {
8662
                return null;
8663
            }
8664
        }
8665
        if ($type & ~SIMPLEPIE_LOCATOR_NONE)
8666
        {
8667
            $this->get_base();
8668
        }
8669
        if ($type & SIMPLEPIE_LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery())
8670
        {
8671
            return $working[0];
8672
        }
8673
        if ($type & (SIMPLEPIE_LOCATOR_LOCAL_EXTENSION | SIMPLEPIE_LOCATOR_LOCAL_BODY | SIMPLEPIE_LOCATOR_REMOTE_EXTENSION | SIMPLEPIE_LOCATOR_REMOTE_BODY) && $this->get_links())
8674
        {
8675
            if ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local))
8676
            {
8677
                return $working;
8678
            }
8679
            if ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local))
8680
            {
8681
                return $working;
8682
            }
8683
            if ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere))
8684
            {
8685
                return $working;
8686
            }
8687
            if ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere))
8688
            {
8689
                return $working;
8690
            }
8691
        }
8692
        return null;
8693
    }
8694
    public function is_feed($file)
8695
    {
8696
        if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE)
8697
        {
8698
            $sniffer = $this->registry->create('Content_Type_Sniffer', array($file));
8699
            $sniffed = $sniffer->get_type();
8700
            if (in_array($sniffed, array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml')))
8701
            {
8702
                return true;
8703
            }
8704
            else
8705
            {
8706
                return false;
8707
            }
8708
        }
8709
        elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL)
8710
        {
8711
            return true;
8712
        }
8713
        else
8714
        {
8715
            return false;
8716
        }
8717
    }
8718
    public function get_base()
8719
    {
8720
        if ($this->dom === null)
8721
        {
8722
            throw new SimplePie_Exception('DOMDocument not found, unable to use locator');
8723
        }
8724
        $this->http_base = $this->file->url;
8725
        $this->base = $this->http_base;
8726
        $elements = $this->dom->getElementsByTagName('base');
8727
        foreach ($elements as $element)
8728
        {
8729
            if ($element->hasAttribute('href'))
8730
            {
8731
                $base = $this->registry->call('Misc', 'absolutize_url', array(trim($element->getAttribute('href')), $this->http_base));
8732
                if ($base === false)
8733
                {
8734
                    continue;
8735
                }
8736
                $this->base = $base;
8737
                $this->base_location = method_exists($element, 'getLineNo') ? $element->getLineNo() : 0;
8738
                break;
8739
            }
8740
        }
8741
    }
8742
    public function autodiscovery()
8743
    {
8744
        $done = array();
8745
        $feeds = array();
8746
        $feeds = array_merge($feeds, $this->search_elements_by_tag('link', $done, $feeds));
8747
        $feeds = array_merge($feeds, $this->search_elements_by_tag('a', $done, $feeds));
8748
        $feeds = array_merge($feeds, $this->search_elements_by_tag('area', $done, $feeds));
8749
        if (!empty($feeds))
8750
        {
8751
            return array_values($feeds);
8752
        }
8753
        else
8754
        {
8755
            return null;
8756
        }
8757
    }
8758
    protected function search_elements_by_tag($name, &$done, $feeds)
8759
    {
8760
        if ($this->dom === null)
8761
        {
8762
            throw new SimplePie_Exception('DOMDocument not found, unable to use locator');
8763
        }
8764
        $links = $this->dom->getElementsByTagName($name);
8765
        foreach ($links as $link)
8766
        {
8767
            if ($this->checked_feeds === $this->max_checked_feeds)
8768
            {
8769
                break;
8770
            }
8771
            if ($link->hasAttribute('href') && $link->hasAttribute('rel'))
8772
            {
8773
                $rel = array_unique($this->registry->call('Misc', 'space_seperated_tokens', array(strtolower($link->getAttribute('rel')))));
8774
                $line = method_exists($link, 'getLineNo') ? $link->getLineNo() : 1;
8775
                if ($this->base_location < $line)
8776
                {
8777
                    $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base));
8778
                }
8779
                else
8780
                {
8781
                    $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base));
8782
                }
8783
                if ($href === false)
8784
                {
8785
                    continue;
8786
                }
8787
                if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !in_array('stylesheet', $rel) && $link->hasAttribute('type') && in_array(strtolower($this->registry->call('Misc', 'parse_mime', array($link->getAttribute('type')))), array('application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href]))
8788
                {
8789
                    $this->checked_feeds++;
8790
                    $headers = array(
8791
                        'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
8792
                    );
8793
                    $feed = $this->registry->create('File', array($href, $this->timeout, 5, $headers, $this->useragent));
8794
                    if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
8795
                    {
8796
                        $feeds[$href] = $feed;
8797
                    }
8798
                }
8799
                $done[] = $href;
8800
            }
8801
        }
8802
        return $feeds;
8803
    }
8804
    public function get_links()
8805
    {
8806
        if ($this->dom === null)
8807
        {
8808
            throw new SimplePie_Exception('DOMDocument not found, unable to use locator');
8809
        }
8810
        $links = $this->dom->getElementsByTagName('a');
8811
        foreach ($links as $link)
8812
        {
8813
            if ($link->hasAttribute('href'))
8814
            {
8815
                $href = trim($link->getAttribute('href'));
8816
                $parsed = $this->registry->call('Misc', 'parse_url', array($href));
8817
                if ($parsed['scheme'] === '' || preg_match('/^(http(s)|feed)?$/i', $parsed['scheme']))
8818
                {
8819
                    if ($this->base_location < $link->getLineNo())
8820
                    {
8821
                        $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base));
8822
                    }
8823
                    else
8824
                    {
8825
                        $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base));
8826
                    }
8827
                    if ($href === false)
8828
                    {
8829
                        continue;
8830
                    }
8831
                    $current = $this->registry->call('Misc', 'parse_url', array($this->file->url));
8832
                    if ($parsed['authority'] === '' || $parsed['authority'] === $current['authority'])
8833
                    {
8834
                        $this->local[] = $href;
8835
                    }
8836
                    else
8837
                    {
8838
                        $this->elsewhere[] = $href;
8839
                    }
8840
                }
8841
            }
8842
        }
8843
        $this->local = array_unique($this->local);
8844
        $this->elsewhere = array_unique($this->elsewhere);
8845
        if (!empty($this->local) || !empty($this->elsewhere))
8846
        {
8847
            return true;
8848
        }
8849
        return null;
8850
    }
8851
    public function extension(&$array)
8852
    {
8853
        foreach ($array as $key => $value)
8854
        {
8855
            if ($this->checked_feeds === $this->max_checked_feeds)
8856
            {
8857
                break;
8858
            }
8859
            if (in_array(strtolower(strrchr($value, '.')), array('.rss', '.rdf', '.atom', '.xml')))
8860
            {
8861
                $this->checked_feeds++;
8862
                $headers = array(
8863
                    'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
8864
                );
8865
                $feed = $this->registry->create('File', array($value, $this->timeout, 5, $headers, $this->useragent));
8866
                if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
8867
                {
8868
                    return $feed;
8869
                }
8870
                else
8871
                {
8872
                    unset($array[$key]);
8873
                }
8874
            }
8875
        }
8876
        return null;
8877
    }
8878
    public function body(&$array)
8879
    {
8880
        foreach ($array as $key => $value)
8881
        {
8882
            if ($this->checked_feeds === $this->max_checked_feeds)
8883
            {
8884
                break;
8885
            }
8886
            if (preg_match('/(rss|rdf|atom|xml)/i', $value))
8887
            {
8888
                $this->checked_feeds++;
8889
                $headers = array(
8890
                    'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
8891
                );
8892
                $feed = $this->registry->create('File', array($value, $this->timeout, 5, null, $this->useragent));
8893
                if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed))
8894
                {
8895
                    return $feed;
8896
                }
8897
                else
8898
                {
8899
                    unset($array[$key]);
8900
                }
8901
            }
8902
        }
8903
        return null;
8904
    }
8905
}
8906
class SimplePie_Misc
8907
{
8908
    public static function time_hms($seconds)
8909
    {
8910
        $time = '';
8911
        $hours = floor($seconds / 3600);
8912
        $remainder = $seconds % 3600;
8913
        if ($hours > 0)
8914
        {
8915
            $time .= $hours.':';
8916
        }
8917
        $minutes = floor($remainder / 60);
8918
        $seconds = $remainder % 60;
8919
        if ($minutes < 10 && $hours > 0)
8920
        {
8921
            $minutes = '0' . $minutes;
8922
        }
8923
        if ($seconds < 10)
8924
        {
8925
            $seconds = '0' . $seconds;
8926
        }
8927
        $time .= $minutes.':';
8928
        $time .= $seconds;
8929
        return $time;
8930
    }
8931
    public static function absolutize_url($relative, $base)
8932
    {
8933
        $iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative);
8934
        if ($iri === false)
8935
        {
8936
            return false;
8937
        }
8938
        return $iri->get_uri();
8939
    }
8940
    
8941
    public static function get_element($realname, $string)
8942
    {
8943
        $return = array();
8944
        $name = preg_quote($realname, '/');
8945
        if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE))
8946
        {
8947
            for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++)
8948
            {
8949
                $return[$i]['tag'] = $realname;
8950
                $return[$i]['full'] = $matches[$i][0][0];
8951
                $return[$i]['offset'] = $matches[$i][0][1];
8952
                if (strlen($matches[$i][3][0]) <= 2)
8953
                {
8954
                    $return[$i]['self_closing'] = true;
8955
                }
8956
                else
8957
                {
8958
                    $return[$i]['self_closing'] = false;
8959
                    $return[$i]['content'] = $matches[$i][4][0];
8960
                }
8961
                $return[$i]['attribs'] = array();
8962
                if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER))
8963
                {
8964
                    for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++)
8965
                    {
8966
                        if (count($attribs[$j]) === 2)
8967
                        {
8968
                            $attribs[$j][2] = $attribs[$j][1];
8969
                        }
8970
                        $return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j]), 'UTF-8');
8971
                    }
8972
                }
8973
            }
8974
        }
8975
        return $return;
8976
    }
8977
    public static function element_implode($element)
8978
    {
8979
        $full = "<$element[tag]";
8980
        foreach ($element['attribs'] as $key => $value)
8981
        {
8982
            $key = strtolower($key);
8983
            $full .= " $key=\"" . htmlspecialchars($value['data']) . '"';
8984
        }
8985
        if ($element['self_closing'])
8986
        {
8987
            $full .= ' />';
8988
        }
8989
        else
8990
        {
8991
            $full .= ">$element[content]</$element[tag]>";
8992
        }
8993
        return $full;
8994
    }
8995
    public static function error($message, $level, $file, $line)
8996
    {
8997
        if ((ini_get('error_reporting') & $level) > 0)
8998
        {
8999
            switch ($level)
9000
            {
9001
                case E_USER_ERROR:
9002
                    $note = 'PHP Error';
9003
                    break;
9004
                case E_USER_WARNING:
9005
                    $note = 'PHP Warning';
9006
                    break;
9007
                case E_USER_NOTICE:
9008
                    $note = 'PHP Notice';
9009
                    break;
9010
                default:
9011
                    $note = 'Unknown Error';
9012
                    break;
9013
            }
9014
            $log_error = true;
9015
            if (!function_exists('error_log'))
9016
            {
9017
                $log_error = false;
9018
            }
9019
            $log_file = @ini_get('error_log');
9020
            if (!empty($log_file) && ('syslog' !== $log_file) && !@is_writable($log_file))
9021
            {
9022
                $log_error = false;
9023
            }
9024
            if ($log_error)
9025
            {
9026
                @error_log("$note: $message in $file on line $line", 0);
9027
            }
9028
        }
9029
        return $message;
9030
    }
9031
    public static function fix_protocol($url, $http = 1)
9032
    {
9033
        $url = SimplePie_Misc::normalize_url($url);
9034
        $parsed = SimplePie_Misc::parse_url($url);
9035
        if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https')
9036
        {
9037
            return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http);
9038
        }
9039
        if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url))
9040
        {
9041
            return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http);
9042
        }
9043
        if ($http === 2 && $parsed['scheme'] !== '')
9044
        {
9045
            return "feed:$url";
9046
        }
9047
        elseif ($http === 3 && strtolower($parsed['scheme']) === 'http')
9048
        {
9049
            return substr_replace($url, 'podcast', 0, 4);
9050
        }
9051
        elseif ($http === 4 && strtolower($parsed['scheme']) === 'http')
9052
        {
9053
            return substr_replace($url, 'itpc', 0, 4);
9054
        }
9055
        else
9056
        {
9057
            return $url;
9058
        }
9059
    }
9060
    public static function parse_url($url)
9061
    {
9062
        $iri = new SimplePie_IRI($url);
9063
        return array(
9064
            'scheme' => (string) $iri->scheme,
9065
            'authority' => (string) $iri->authority,
9066
            'path' => (string) $iri->path,
9067
            'query' => (string) $iri->query,
9068
            'fragment' => (string) $iri->fragment
9069
        );
9070
    }
9071
    public static function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '')
9072
    {
9073
        $iri = new SimplePie_IRI('');
9074
        $iri->scheme = $scheme;
9075
        $iri->authority = $authority;
9076
        $iri->path = $path;
9077
        $iri->query = $query;
9078
        $iri->fragment = $fragment;
9079
        return $iri->get_uri();
9080
    }
9081
    public static function normalize_url($url)
9082
    {
9083
        $iri = new SimplePie_IRI($url);
9084
        return $iri->get_uri();
9085
    }
9086
    public static function percent_encoding_normalization($match)
9087
    {
9088
        $integer = hexdec($match[1]);
9089
        if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E)
9090
        {
9091
            return chr($integer);
9092
        }
9093
        else
9094
        {
9095
            return strtoupper($match[0]);
9096
        }
9097
    }
9098
    
9099
    public static function windows_1252_to_utf8($string)
9100
    {
9101
        static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF");
9102
        return strtr($string, $convert_table);
9103
    }
9104
    
9105
    public static function change_encoding($data, $input, $output)
9106
    {
9107
        $input = SimplePie_Misc::encoding($input);
9108
        $output = SimplePie_Misc::encoding($output);
9109
        // We fail to fail on non US-ASCII bytes
9110
        if ($input === 'US-ASCII')
9111
        {
9112
            static $non_ascii_octects = '';
9113
            if (!$non_ascii_octects)
9114
            {
9115
                for ($i = 0x80; $i <= 0xFF; $i++)
9116
                {
9117
                    $non_ascii_octects .= chr($i);
9118
                }
9119
            }
9120
            $data = substr($data, 0, strcspn($data, $non_ascii_octects));
9121
        }
9122
        // This is first, as behaviour of this is completely predictable
9123
        if ($input === 'windows-1252' && $output === 'UTF-8')
9124
        {
9125
            return SimplePie_Misc::windows_1252_to_utf8($data);
9126
        }
9127
        // This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported).
9128
        elseif (function_exists('mb_convert_encoding') && ($return = SimplePie_Misc::change_encoding_mbstring($data, $input, $output)))
9129
        {
9130
            return $return;
9131
         }
9132
        // This is last, as behaviour of this varies with OS userland and PHP version
9133
        elseif (function_exists('iconv') && ($return = SimplePie_Misc::change_encoding_iconv($data, $input, $output)))
9134
        {
9135
            return $return;
9136
        }
9137
        // If we can't do anything, just fail
9138
        else
9139
        {
9140
            return false;
9141
        }
9142
    }
9143
    protected static function change_encoding_mbstring($data, $input, $output)
9144
    {
9145
        if ($input === 'windows-949')
9146
        {
9147
            $input = 'EUC-KR';
9148
        }
9149
        if ($output === 'windows-949')
9150
        {
9151
            $output = 'EUC-KR';
9152
        }
9153
        if ($input === 'Windows-31J')
9154
        {
9155
            $input = 'SJIS';
9156
        }
9157
        if ($output === 'Windows-31J')
9158
        {
9159
            $output = 'SJIS';
9160
        }
9161
        // Check that the encoding is supported
9162
        if (@mb_convert_encoding("\x80", 'UTF-16BE', $input) === "\x00\x80")
9163
        {
9164
            return false;
9165
        }
9166
        if (!in_array($input, mb_list_encodings()))
9167
        {
9168
            return false;
9169
        }
9170
        // Let's do some conversion
9171
        if ($return = @mb_convert_encoding($data, $output, $input))
9172
        {
9173
            return $return;
9174
        }
9175
        return false;
9176
    }
9177
    protected static function change_encoding_iconv($data, $input, $output)
9178
    {
9179
        return @iconv($input, $output, $data);
9180
    }
9181
    
9182
    public static function encoding($charset)
9183
    {
9184
        // Normalization from UTS #22
9185
        switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset)))
9186
        {
9187
            case 'adobestandardencoding':
9188
            case 'csadobestandardencoding':
9189
                return 'Adobe-Standard-Encoding';
9190
            case 'adobesymbolencoding':
9191
            case 'cshppsmath':
9192
                return 'Adobe-Symbol-Encoding';
9193
            case 'ami1251':
9194
            case 'amiga1251':
9195
                return 'Amiga-1251';
9196
            case 'ansix31101983':
9197
            case 'csat5001983':
9198
            case 'csiso99naplps':
9199
            case 'isoir99':
9200
            case 'naplps':
9201
                return 'ANSI_X3.110-1983';
9202
            case 'arabic7':
9203
            case 'asmo449':
9204
            case 'csiso89asmo449':
9205
            case 'iso9036':
9206
            case 'isoir89':
9207
                return 'ASMO_449';
9208
            case 'big5':
9209
            case 'csbig5':
9210
                return 'Big5';
9211
            case 'big5hkscs':
9212
                return 'Big5-HKSCS';
9213
            case 'bocu1':
9214
            case 'csbocu1':
9215
                return 'BOCU-1';
9216
            case 'brf':
9217
            case 'csbrf':
9218
                return 'BRF';
9219
            case 'bs4730':
9220
            case 'csiso4unitedkingdom':
9221
            case 'gb':
9222
            case 'iso646gb':
9223
            case 'isoir4':
9224
            case 'uk':
9225
                return 'BS_4730';
9226
            case 'bsviewdata':
9227
            case 'csiso47bsviewdata':
9228
            case 'isoir47':
9229
                return 'BS_viewdata';
9230
            case 'cesu8':
9231
            case 'cscesu8':
9232
                return 'CESU-8';
9233
            case 'ca':
9234
            case 'csa71':
9235
            case 'csaz243419851':
9236
            case 'csiso121canadian1':
9237
            case 'iso646ca':
9238
            case 'isoir121':
9239
                return 'CSA_Z243.4-1985-1';
9240
            case 'csa72':
9241
            case 'csaz243419852':
9242
            case 'csiso122canadian2':
9243
            case 'iso646ca2':
9244
            case 'isoir122':
9245
                return 'CSA_Z243.4-1985-2';
9246
            case 'csaz24341985gr':
9247
            case 'csiso123csaz24341985gr':
9248
            case 'isoir123':
9249
                return 'CSA_Z243.4-1985-gr';
9250
            case 'csiso139csn369103':
9251
            case 'csn369103':
9252
            case 'isoir139':
9253
                return 'CSN_369103';
9254
            case 'csdecmcs':
9255
            case 'dec':
9256
            case 'decmcs':
9257
                return 'DEC-MCS';
9258
            case 'csiso21german':
9259
            case 'de':
9260
            case 'din66003':
9261
            case 'iso646de':
9262
            case 'isoir21':
9263
                return 'DIN_66003';
9264
            case 'csdkus':
9265
            case 'dkus':
9266
                return 'dk-us';
9267
            case 'csiso646danish':
9268
            case 'dk':
9269
            case 'ds2089':
9270
            case 'iso646dk':
9271
                return 'DS_2089';
9272
            case 'csibmebcdicatde':
9273
            case 'ebcdicatde':
9274
                return 'EBCDIC-AT-DE';
9275
            case 'csebcdicatdea':
9276
            case 'ebcdicatdea':
9277
                return 'EBCDIC-AT-DE-A';
9278
            case 'csebcdiccafr':
9279
            case 'ebcdiccafr':
9280
                return 'EBCDIC-CA-FR';
9281
            case 'csebcdicdkno':
9282
            case 'ebcdicdkno':
9283
                return 'EBCDIC-DK-NO';
9284
            case 'csebcdicdknoa':
9285
            case 'ebcdicdknoa':
9286
                return 'EBCDIC-DK-NO-A';
9287
            case 'csebcdices':
9288
            case 'ebcdices':
9289
                return 'EBCDIC-ES';
9290
            case 'csebcdicesa':
9291
            case 'ebcdicesa':
9292
                return 'EBCDIC-ES-A';
9293
            case 'csebcdicess':
9294
            case 'ebcdicess':
9295
                return 'EBCDIC-ES-S';
9296
            case 'csebcdicfise':
9297
            case 'ebcdicfise':
9298
                return 'EBCDIC-FI-SE';
9299
            case 'csebcdicfisea':
9300
            case 'ebcdicfisea':
9301
                return 'EBCDIC-FI-SE-A';
9302
            case 'csebcdicfr':
9303
            case 'ebcdicfr':
9304
                return 'EBCDIC-FR';
9305
            case 'csebcdicit':
9306
            case 'ebcdicit':
9307
                return 'EBCDIC-IT';
9308
            case 'csebcdicpt':
9309
            case 'ebcdicpt':
9310
                return 'EBCDIC-PT';
9311
            case 'csebcdicuk':
9312
            case 'ebcdicuk':
9313
                return 'EBCDIC-UK';
9314
            case 'csebcdicus':
9315
            case 'ebcdicus':
9316
                return 'EBCDIC-US';
9317
            case 'csiso111ecmacyrillic':
9318
            case 'ecmacyrillic':
9319
            case 'isoir111':
9320
            case 'koi8e':
9321
                return 'ECMA-cyrillic';
9322
            case 'csiso17spanish':
9323
            case 'es':
9324
            case 'iso646es':
9325
            case 'isoir17':
9326
                return 'ES';
9327
            case 'csiso85spanish2':
9328
            case 'es2':
9329
            case 'iso646es2':
9330
            case 'isoir85':
9331
                return 'ES2';
9332
            case 'cseucpkdfmtjapanese':
9333
            case 'eucjp':
9334
            case 'extendedunixcodepackedformatforjapanese':
9335
                return 'EUC-JP';
9336
            case 'cseucfixwidjapanese':
9337
            case 'extendedunixcodefixedwidthforjapanese':
9338
                return 'Extended_UNIX_Code_Fixed_Width_for_Japanese';
9339
            case 'gb18030':
9340
                return 'GB18030';
9341
            case 'chinese':
9342
            case 'cp936':
9343
            case 'csgb2312':
9344
            case 'csiso58gb231280':
9345
            case 'gb2312':
9346
            case 'gb231280':
9347
            case 'gbk':
9348
            case 'isoir58':
9349
            case 'ms936':
9350
            case 'windows936':
9351
                return 'GBK';
9352
            case 'cn':
9353
            case 'csiso57gb1988':
9354
            case 'gb198880':
9355
            case 'iso646cn':
9356
            case 'isoir57':
9357
                return 'GB_1988-80';
9358
            case 'csiso153gost1976874':
9359
            case 'gost1976874':
9360
            case 'isoir153':
9361
            case 'stsev35888':
9362
                return 'GOST_19768-74';
9363
            case 'csiso150':
9364
            case 'csiso150greekccitt':
9365
            case 'greekccitt':
9366
            case 'isoir150':
9367
                return 'greek-ccitt';
9368
            case 'csiso88greek7':
9369
            case 'greek7':
9370
            case 'isoir88':
9371
                return 'greek7';
9372
            case 'csiso18greek7old':
9373
            case 'greek7old':
9374
            case 'isoir18':
9375
                return 'greek7-old';
9376
            case 'cshpdesktop':
9377
            case 'hpdesktop':
9378
                return 'HP-DeskTop';
9379
            case 'cshplegal':
9380
            case 'hplegal':
9381
                return 'HP-Legal';
9382
            case 'cshpmath8':
9383
            case 'hpmath8':
9384
                return 'HP-Math8';
9385
            case 'cshppifont':
9386
            case 'hppifont':
9387
                return 'HP-Pi-font';
9388
            case 'cshproman8':
9389
            case 'hproman8':
9390
            case 'r8':
9391
            case 'roman8':
9392
                return 'hp-roman8';
9393
            case 'hzgb2312':
9394
                return 'HZ-GB-2312';
9395
            case 'csibmsymbols':
9396
            case 'ibmsymbols':
9397
                return 'IBM-Symbols';
9398
            case 'csibmthai':
9399
            case 'ibmthai':
9400
                return 'IBM-Thai';
9401
            case 'cp37':
9402
            case 'csibm37':
9403
            case 'ebcdiccpca':
9404
            case 'ebcdiccpnl':
9405
            case 'ebcdiccpus':
9406
            case 'ebcdiccpwt':
9407
            case 'ibm37':
9408
                return 'IBM037';
9409
            case 'cp38':
9410
            case 'csibm38':
9411
            case 'ebcdicint':
9412
            case 'ibm38':
9413
                return 'IBM038';
9414
            case 'cp273':
9415
            case 'csibm273':
9416
            case 'ibm273':
9417
                return 'IBM273';
9418
            case 'cp274':
9419
            case 'csibm274':
9420
            case 'ebcdicbe':
9421
            case 'ibm274':
9422
                return 'IBM274';
9423
            case 'cp275':
9424
            case 'csibm275':
9425
            case 'ebcdicbr':
9426
            case 'ibm275':
9427
                return 'IBM275';
9428
            case 'csibm277':
9429
            case 'ebcdiccpdk':
9430
            case 'ebcdiccpno':
9431
            case 'ibm277':
9432
                return 'IBM277';
9433
            case 'cp278':
9434
            case 'csibm278':
9435
            case 'ebcdiccpfi':
9436
            case 'ebcdiccpse':
9437
            case 'ibm278':
9438
                return 'IBM278';
9439
            case 'cp280':
9440
            case 'csibm280':
9441
            case 'ebcdiccpit':
9442
            case 'ibm280':
9443
                return 'IBM280';
9444
            case 'cp281':
9445
            case 'csibm281':
9446
            case 'ebcdicjpe':
9447
            case 'ibm281':
9448
                return 'IBM281';
9449
            case 'cp284':
9450
            case 'csibm284':
9451
            case 'ebcdiccpes':
9452
            case 'ibm284':
9453
                return 'IBM284';
9454
            case 'cp285':
9455
            case 'csibm285':
9456
            case 'ebcdiccpgb':
9457
            case 'ibm285':
9458
                return 'IBM285';
9459
            case 'cp290':
9460
            case 'csibm290':
9461
            case 'ebcdicjpkana':
9462
            case 'ibm290':
9463
                return 'IBM290';
9464
            case 'cp297':
9465
            case 'csibm297':
9466
            case 'ebcdiccpfr':
9467
            case 'ibm297':
9468
                return 'IBM297';
9469
            case 'cp420':
9470
            case 'csibm420':
9471
            case 'ebcdiccpar1':
9472
            case 'ibm420':
9473
                return 'IBM420';
9474
            case 'cp423':
9475
            case 'csibm423':
9476
            case 'ebcdiccpgr':
9477
            case 'ibm423':
9478
                return 'IBM423';
9479
            case 'cp424':
9480
            case 'csibm424':
9481
            case 'ebcdiccphe':
9482
            case 'ibm424':
9483
                return 'IBM424';
9484
            case '437':
9485
            case 'cp437':
9486
            case 'cspc8codepage437':
9487
            case 'ibm437':
9488
                return 'IBM437';
9489
            case 'cp500':
9490
            case 'csibm500':
9491
            case 'ebcdiccpbe':
9492
            case 'ebcdiccpch':
9493
            case 'ibm500':
9494
                return 'IBM500';
9495
            case 'cp775':
9496
            case 'cspc775baltic':
9497
            case 'ibm775':
9498
                return 'IBM775';
9499
            case '850':
9500
            case 'cp850':
9501
            case 'cspc850multilingual':
9502
            case 'ibm850':
9503
                return 'IBM850';
9504
            case '851':
9505
            case 'cp851':
9506
            case 'csibm851':
9507
            case 'ibm851':
9508
                return 'IBM851';
9509
            case '852':
9510
            case 'cp852':
9511
            case 'cspcp852':
9512
            case 'ibm852':
9513
                return 'IBM852';
9514
            case '855':
9515
            case 'cp855':
9516
            case 'csibm855':
9517
            case 'ibm855':
9518
                return 'IBM855';
9519
            case '857':
9520
            case 'cp857':
9521
            case 'csibm857':
9522
            case 'ibm857':
9523
                return 'IBM857';
9524
            case 'ccsid858':
9525
            case 'cp858':
9526
            case 'ibm858':
9527
            case 'pcmultilingual850euro':
9528
                return 'IBM00858';
9529
            case '860':
9530
            case 'cp860':
9531
            case 'csibm860':
9532
            case 'ibm860':
9533
                return 'IBM860';
9534
            case '861':
9535
            case 'cp861':
9536
            case 'cpis':
9537
            case 'csibm861':
9538
            case 'ibm861':
9539
                return 'IBM861';
9540
            case '862':
9541
            case 'cp862':
9542
            case 'cspc862latinhebrew':
9543
            case 'ibm862':
9544
                return 'IBM862';
9545
            case '863':
9546
            case 'cp863':
9547
            case 'csibm863':
9548
            case 'ibm863':
9549
                return 'IBM863';
9550
            case 'cp864':
9551
            case 'csibm864':
9552
            case 'ibm864':
9553
                return 'IBM864';
9554
            case '865':
9555
            case 'cp865':
9556
            case 'csibm865':
9557
            case 'ibm865':
9558
                return 'IBM865';
9559
            case '866':
9560
            case 'cp866':
9561
            case 'csibm866':
9562
            case 'ibm866':
9563
                return 'IBM866';
9564
            case 'cp868':
9565
            case 'cpar':
9566
            case 'csibm868':
9567
            case 'ibm868':
9568
                return 'IBM868';
9569
            case '869':
9570
            case 'cp869':
9571
            case 'cpgr':
9572
            case 'csibm869':
9573
            case 'ibm869':
9574
                return 'IBM869';
9575
            case 'cp870':
9576
            case 'csibm870':
9577
            case 'ebcdiccproece':
9578
            case 'ebcdiccpyu':
9579
            case 'ibm870':
9580
                return 'IBM870';
9581
            case 'cp871':
9582
            case 'csibm871':
9583
            case 'ebcdiccpis':
9584
            case 'ibm871':
9585
                return 'IBM871';
9586
            case 'cp880':
9587
            case 'csibm880':
9588
            case 'ebcdiccyrillic':
9589
            case 'ibm880':
9590
                return 'IBM880';
9591
            case 'cp891':
9592
            case 'csibm891':
9593
            case 'ibm891':
9594
                return 'IBM891';
9595
            case 'cp903':
9596
            case 'csibm903':
9597
            case 'ibm903':
9598
                return 'IBM903';
9599
            case '904':
9600
            case 'cp904':
9601
            case 'csibbm904':
9602
            case 'ibm904':
9603
                return 'IBM904';
9604
            case 'cp905':
9605
            case 'csibm905':
9606
            case 'ebcdiccptr':
9607
            case 'ibm905':
9608
                return 'IBM905';
9609
            case 'cp918':
9610
            case 'csibm918':
9611
            case 'ebcdiccpar2':
9612
            case 'ibm918':
9613
                return 'IBM918';
9614
            case 'ccsid924':
9615
            case 'cp924':
9616
            case 'ebcdiclatin9euro':
9617
            case 'ibm924':
9618
                return 'IBM00924';
9619
            case 'cp1026':
9620
            case 'csibm1026':
9621
            case 'ibm1026':
9622
                return 'IBM1026';
9623
            case 'ibm1047':
9624
                return 'IBM1047';
9625
            case 'ccsid1140':
9626
            case 'cp1140':
9627
            case 'ebcdicus37euro':
9628
            case 'ibm1140':
9629
                return 'IBM01140';
9630
            case 'ccsid1141':
9631
            case 'cp1141':
9632
            case 'ebcdicde273euro':
9633
            case 'ibm1141':
9634
                return 'IBM01141';
9635
            case 'ccsid1142':
9636
            case 'cp1142':
9637
            case 'ebcdicdk277euro':
9638
            case 'ebcdicno277euro':
9639
            case 'ibm1142':
9640
                return 'IBM01142';
9641
            case 'ccsid1143':
9642
            case 'cp1143':
9643
            case 'ebcdicfi278euro':
9644
            case 'ebcdicse278euro':
9645
            case 'ibm1143':
9646
                return 'IBM01143';
9647
            case 'ccsid1144':
9648
            case 'cp1144':
9649
            case 'ebcdicit280euro':
9650
            case 'ibm1144':
9651
                return 'IBM01144';
9652
            case 'ccsid1145':
9653
            case 'cp1145':
9654
            case 'ebcdices284euro':
9655
            case 'ibm1145':
9656
                return 'IBM01145';
9657
            case 'ccsid1146':
9658
            case 'cp1146':
9659
            case 'ebcdicgb285euro':
9660
            case 'ibm1146':
9661
                return 'IBM01146';
9662
            case 'ccsid1147':
9663
            case 'cp1147':
9664
            case 'ebcdicfr297euro':
9665
            case 'ibm1147':
9666
                return 'IBM01147';
9667
            case 'ccsid1148':
9668
            case 'cp1148':
9669
            case 'ebcdicinternational500euro':
9670
            case 'ibm1148':
9671
                return 'IBM01148';
9672
            case 'ccsid1149':
9673
            case 'cp1149':
9674
            case 'ebcdicis871euro':
9675
            case 'ibm1149':
9676
                return 'IBM01149';
9677
            case 'csiso143iecp271':
9678
            case 'iecp271':
9679
            case 'isoir143':
9680
                return 'IEC_P27-1';
9681
            case 'csiso49inis':
9682
            case 'inis':
9683
            case 'isoir49':
9684
                return 'INIS';
9685
            case 'csiso50inis8':
9686
            case 'inis8':
9687
            case 'isoir50':
9688
                return 'INIS-8';
9689
            case 'csiso51iniscyrillic':
9690
            case 'iniscyrillic':
9691
            case 'isoir51':
9692
                return 'INIS-cyrillic';
9693
            case 'csinvariant':
9694
            case 'invariant':
9695
                return 'INVARIANT';
9696
            case 'iso2022cn':
9697
                return 'ISO-2022-CN';
9698
            case 'iso2022cnext':
9699
                return 'ISO-2022-CN-EXT';
9700
            case 'csiso2022jp':
9701
            case 'iso2022jp':
9702
                return 'ISO-2022-JP';
9703
            case 'csiso2022jp2':
9704
            case 'iso2022jp2':
9705
                return 'ISO-2022-JP-2';
9706
            case 'csiso2022kr':
9707
            case 'iso2022kr':
9708
                return 'ISO-2022-KR';
9709
            case 'cswindows30latin1':
9710
            case 'iso88591windows30latin1':
9711
                return 'ISO-8859-1-Windows-3.0-Latin-1';
9712
            case 'cswindows31latin1':
9713
            case 'iso88591windows31latin1':
9714
                return 'ISO-8859-1-Windows-3.1-Latin-1';
9715
            case 'csisolatin2':
9716
            case 'iso88592':
9717
            case 'iso885921987':
9718
            case 'isoir101':
9719
            case 'l2':
9720
            case 'latin2':
9721
                return 'ISO-8859-2';
9722
            case 'cswindows31latin2':
9723
            case 'iso88592windowslatin2':
9724
                return 'ISO-8859-2-Windows-Latin-2';
9725
            case 'csisolatin3':
9726
            case 'iso88593':
9727
            case 'iso885931988':
9728
            case 'isoir109':
9729
            case 'l3':
9730
            case 'latin3':
9731
                return 'ISO-8859-3';
9732
            case 'csisolatin4':
9733
            case 'iso88594':
9734
            case 'iso885941988':
9735
            case 'isoir110':
9736
            case 'l4':
9737
            case 'latin4':
9738
                return 'ISO-8859-4';
9739
            case 'csisolatincyrillic':
9740
            case 'cyrillic':
9741
            case 'iso88595':
9742
            case 'iso885951988':
9743
            case 'isoir144':
9744
                return 'ISO-8859-5';
9745
            case 'arabic':
9746
            case 'asmo708':
9747
            case 'csisolatinarabic':
9748
            case 'ecma114':
9749
            case 'iso88596':
9750
            case 'iso885961987':
9751
            case 'isoir127':
9752
                return 'ISO-8859-6';
9753
            case 'csiso88596e':
9754
            case 'iso88596e':
9755
                return 'ISO-8859-6-E';
9756
            case 'csiso88596i':
9757
            case 'iso88596i':
9758
                return 'ISO-8859-6-I';
9759
            case 'csisolatingreek':
9760
            case 'ecma118':
9761
            case 'elot928':
9762
            case 'greek':
9763
            case 'greek8':
9764
            case 'iso88597':
9765
            case 'iso885971987':
9766
            case 'isoir126':
9767
                return 'ISO-8859-7';
9768
            case 'csisolatinhebrew':
9769
            case 'hebrew':
9770
            case 'iso88598':
9771
            case 'iso885981988':
9772
            case 'isoir138':
9773
                return 'ISO-8859-8';
9774
            case 'csiso88598e':
9775
            case 'iso88598e':
9776
                return 'ISO-8859-8-E';
9777
            case 'csiso88598i':
9778
            case 'iso88598i':
9779
                return 'ISO-8859-8-I';
9780
            case 'cswindows31latin5':
9781
            case 'iso88599windowslatin5':
9782
                return 'ISO-8859-9-Windows-Latin-5';
9783
            case 'csisolatin6':
9784
            case 'iso885910':
9785
            case 'iso8859101992':
9786
            case 'isoir157':
9787
            case 'l6':
9788
            case 'latin6':
9789
                return 'ISO-8859-10';
9790
            case 'iso885913':
9791
                return 'ISO-8859-13';
9792
            case 'iso885914':
9793
            case 'iso8859141998':
9794
            case 'isoceltic':
9795
            case 'isoir199':
9796
            case 'l8':
9797
            case 'latin8':
9798
                return 'ISO-8859-14';
9799
            case 'iso885915':
9800
            case 'latin9':
9801
                return 'ISO-8859-15';
9802
            case 'iso885916':
9803
            case 'iso8859162001':
9804
            case 'isoir226':
9805
            case 'l10':
9806
            case 'latin10':
9807
                return 'ISO-8859-16';
9808
            case 'iso10646j1':
9809
                return 'ISO-10646-J-1';
9810
            case 'csunicode':
9811
            case 'iso10646ucs2':
9812
                return 'ISO-10646-UCS-2';
9813
            case 'csucs4':
9814
            case 'iso10646ucs4':
9815
                return 'ISO-10646-UCS-4';
9816
            case 'csunicodeascii':
9817
            case 'iso10646ucsbasic':
9818
                return 'ISO-10646-UCS-Basic';
9819
            case 'csunicodelatin1':
9820
            case 'iso10646':
9821
            case 'iso10646unicodelatin1':
9822
                return 'ISO-10646-Unicode-Latin1';
9823
            case 'csiso10646utf1':
9824
            case 'iso10646utf1':
9825
                return 'ISO-10646-UTF-1';
9826
            case 'csiso115481':
9827
            case 'iso115481':
9828
            case 'isotr115481':
9829
                return 'ISO-11548-1';
9830
            case 'csiso90':
9831
            case 'isoir90':
9832
                return 'iso-ir-90';
9833
            case 'csunicodeibm1261':
9834
            case 'isounicodeibm1261':
9835
                return 'ISO-Unicode-IBM-1261';
9836
            case 'csunicodeibm1264':
9837
            case 'isounicodeibm1264':
9838
                return 'ISO-Unicode-IBM-1264';
9839
            case 'csunicodeibm1265':
9840
            case 'isounicodeibm1265':
9841
                return 'ISO-Unicode-IBM-1265';
9842
            case 'csunicodeibm1268':
9843
            case 'isounicodeibm1268':
9844
                return 'ISO-Unicode-IBM-1268';
9845
            case 'csunicodeibm1276':
9846
            case 'isounicodeibm1276':
9847
                return 'ISO-Unicode-IBM-1276';
9848
            case 'csiso646basic1983':
9849
            case 'iso646basic1983':
9850
            case 'ref':
9851
                return 'ISO_646.basic:1983';
9852
            case 'csiso2intlrefversion':
9853
            case 'irv':
9854
            case 'iso646irv1983':
9855
            case 'isoir2':
9856
                return 'ISO_646.irv:1983';
9857
            case 'csiso2033':
9858
            case 'e13b':
9859
            case 'iso20331983':
9860
            case 'isoir98':
9861
                return 'ISO_2033-1983';
9862
            case 'csiso5427cyrillic':
9863
            case 'iso5427':
9864
            case 'isoir37':
9865
                return 'ISO_5427';
9866
            case 'iso5427cyrillic1981':
9867
            case 'iso54271981':
9868
            case 'isoir54':
9869
                return 'ISO_5427:1981';
9870
            case 'csiso5428greek':
9871
            case 'iso54281980':
9872
            case 'isoir55':
9873
                return 'ISO_5428:1980';
9874
            case 'csiso6937add':
9875
            case 'iso6937225':
9876
            case 'isoir152':
9877
                return 'ISO_6937-2-25';
9878
            case 'csisotextcomm':
9879
            case 'iso69372add':
9880
            case 'isoir142':
9881
                return 'ISO_6937-2-add';
9882
            case 'csiso8859supp':
9883
            case 'iso8859supp':
9884
            case 'isoir154':
9885
            case 'latin125':
9886
                return 'ISO_8859-supp';
9887
            case 'csiso10367box':
9888
            case 'iso10367box':
9889
            case 'isoir155':
9890
                return 'ISO_10367-box';
9891
            case 'csiso15italian':
9892
            case 'iso646it':
9893
            case 'isoir15':
9894
            case 'it':
9895
                return 'IT';
9896
            case 'csiso13jisc6220jp':
9897
            case 'isoir13':
9898
            case 'jisc62201969':
9899
            case 'jisc62201969jp':
9900
            case 'katakana':
9901
            case 'x2017':
9902
                return 'JIS_C6220-1969-jp';
9903
            case 'csiso14jisc6220ro':
9904
            case 'iso646jp':
9905
            case 'isoir14':
9906
            case 'jisc62201969ro':
9907
            case 'jp':
9908
                return 'JIS_C6220-1969-ro';
9909
            case 'csiso42jisc62261978':
9910
            case 'isoir42':
9911
            case 'jisc62261978':
9912
                return 'JIS_C6226-1978';
9913
            case 'csiso87jisx208':
9914
            case 'isoir87':
9915
            case 'jisc62261983':
9916
            case 'jisx2081983':
9917
            case 'x208':
9918
                return 'JIS_C6226-1983';
9919
            case 'csiso91jisc62291984a':
9920
            case 'isoir91':
9921
            case 'jisc62291984a':
9922
            case 'jpocra':
9923
                return 'JIS_C6229-1984-a';
9924
            case 'csiso92jisc62991984b':
9925
            case 'iso646jpocrb':
9926
            case 'isoir92':
9927
            case 'jisc62291984b':
9928
            case 'jpocrb':
9929
                return 'JIS_C6229-1984-b';
9930
            case 'csiso93jis62291984badd':
9931
            case 'isoir93':
9932
            case 'jisc62291984badd':
9933
            case 'jpocrbadd':
9934
                return 'JIS_C6229-1984-b-add';
9935
            case 'csiso94jis62291984hand':
9936
            case 'isoir94':
9937
            case 'jisc62291984hand':
9938
            case 'jpocrhand':
9939
                return 'JIS_C6229-1984-hand';
9940
            case 'csiso95jis62291984handadd':
9941
            case 'isoir95':
9942
            case 'jisc62291984handadd':
9943
            case 'jpocrhandadd':
9944
                return 'JIS_C6229-1984-hand-add';
9945
            case 'csiso96jisc62291984kana':
9946
            case 'isoir96':
9947
            case 'jisc62291984kana':
9948
                return 'JIS_C6229-1984-kana';
9949
            case 'csjisencoding':
9950
            case 'jisencoding':
9951
                return 'JIS_Encoding';
9952
            case 'cshalfwidthkatakana':
9953
            case 'jisx201':
9954
            case 'x201':
9955
                return 'JIS_X0201';
9956
            case 'csiso159jisx2121990':
9957
            case 'isoir159':
9958
            case 'jisx2121990':
9959
            case 'x212':
9960
                return 'JIS_X0212-1990';
9961
            case 'csiso141jusib1002':
9962
            case 'iso646yu':
9963
            case 'isoir141':
9964
            case 'js':
9965
            case 'jusib1002':
9966
            case 'yu':
9967
                return 'JUS_I.B1.002';
9968
            case 'csiso147macedonian':
9969
            case 'isoir147':
9970
            case 'jusib1003mac':
9971
            case 'macedonian':
9972
                return 'JUS_I.B1.003-mac';
9973
            case 'csiso146serbian':
9974
            case 'isoir146':
9975
            case 'jusib1003serb':
9976
            case 'serbian':
9977
                return 'JUS_I.B1.003-serb';
9978
            case 'koi7switched':
9979
                return 'KOI7-switched';
9980
            case 'cskoi8r':
9981
            case 'koi8r':
9982
                return 'KOI8-R';
9983
            case 'koi8u':
9984
                return 'KOI8-U';
9985
            case 'csksc5636':
9986
            case 'iso646kr':
9987
            case 'ksc5636':
9988
                return 'KSC5636';
9989
            case 'cskz1048':
9990
            case 'kz1048':
9991
            case 'rk1048':
9992
            case 'strk10482002':
9993
                return 'KZ-1048';
9994
            case 'csiso19latingreek':
9995
            case 'isoir19':
9996
            case 'latingreek':
9997
                return 'latin-greek';
9998
            case 'csiso27latingreek1':
9999
            case 'isoir27':
10000
            case 'latingreek1':
10001
                return 'Latin-greek-1';
10002
            case 'csiso158lap':
10003
            case 'isoir158':
10004
            case 'lap':
10005
            case 'latinlap':
10006
                return 'latin-lap';
10007
            case 'csmacintosh':
10008
            case 'mac':
10009
            case 'macintosh':
10010
                return 'macintosh';
10011
            case 'csmicrosoftpublishing':
10012
            case 'microsoftpublishing':
10013
                return 'Microsoft-Publishing';
10014
            case 'csmnem':
10015
            case 'mnem':
10016
                return 'MNEM';
10017
            case 'csmnemonic':
10018
            case 'mnemonic':
10019
                return 'MNEMONIC';
10020
            case 'csiso86hungarian':
10021
            case 'hu':
10022
            case 'iso646hu':
10023
            case 'isoir86':
10024
            case 'msz77953':
10025
                return 'MSZ_7795.3';
10026
            case 'csnatsdano':
10027
            case 'isoir91':
10028
            case 'natsdano':
10029
                return 'NATS-DANO';
10030
            case 'csnatsdanoadd':
10031
            case 'isoir92':
10032
            case 'natsdanoadd':
10033
                return 'NATS-DANO-ADD';
10034
            case 'csnatssefi':
10035
            case 'isoir81':
10036
            case 'natssefi':
10037
                return 'NATS-SEFI';
10038
            case 'csnatssefiadd':
10039
            case 'isoir82':
10040
            case 'natssefiadd':
10041
                return 'NATS-SEFI-ADD';
10042
            case 'csiso151cuba':
10043
            case 'cuba':
10044
            case 'iso646cu':
10045
            case 'isoir151':
10046
            case 'ncnc1081':
10047
                return 'NC_NC00-10:81';
10048
            case 'csiso69french':
10049
            case 'fr':
10050
            case 'iso646fr':
10051
            case 'isoir69':
10052
            case 'nfz62010':
10053
                return 'NF_Z_62-010';
10054
            case 'csiso25french':
10055
            case 'iso646fr1':
10056
            case 'isoir25':
10057
            case 'nfz620101973':
10058
                return 'NF_Z_62-010_(1973)';
10059
            case 'csiso60danishnorwegian':
10060
            case 'csiso60norwegian1':
10061
            case 'iso646no':
10062
            case 'isoir60':
10063
            case 'no':
10064
            case 'ns45511':
10065
                return 'NS_4551-1';
10066
            case 'csiso61norwegian2':
10067
            case 'iso646no2':
10068
            case 'isoir61':
10069
            case 'no2':
10070
            case 'ns45512':
10071
                return 'NS_4551-2';
10072
            case 'osdebcdicdf3irv':
10073
                return 'OSD_EBCDIC_DF03_IRV';
10074
            case 'osdebcdicdf41':
10075
                return 'OSD_EBCDIC_DF04_1';
10076
            case 'osdebcdicdf415':
10077
                return 'OSD_EBCDIC_DF04_15';
10078
            case 'cspc8danishnorwegian':
10079
            case 'pc8danishnorwegian':
10080
                return 'PC8-Danish-Norwegian';
10081
            case 'cspc8turkish':
10082
            case 'pc8turkish':
10083
                return 'PC8-Turkish';
10084
            case 'csiso16portuguese':
10085
            case 'iso646pt':
10086
            case 'isoir16':
10087
            case 'pt':
10088
                return 'PT';
10089
            case 'csiso84portuguese2':
10090
            case 'iso646pt2':
10091
            case 'isoir84':
10092
            case 'pt2':
10093
                return 'PT2';
10094
            case 'cp154':
10095
            case 'csptcp154':
10096
            case 'cyrillicasian':
10097
            case 'pt154':
10098
            case 'ptcp154':
10099
                return 'PTCP154';
10100
            case 'scsu':
10101
                return 'SCSU';
10102
            case 'csiso10swedish':
10103
            case 'fi':
10104
            case 'iso646fi':
10105
            case 'iso646se':
10106
            case 'isoir10':
10107
            case 'se':
10108
            case 'sen850200b':
10109
                return 'SEN_850200_B';
10110
            case 'csiso11swedishfornames':
10111
            case 'iso646se2':
10112
            case 'isoir11':
10113
            case 'se2':
10114
            case 'sen850200c':
10115
                return 'SEN_850200_C';
10116
            case 'csiso102t617bit':
10117
            case 'isoir102':
10118
            case 't617bit':
10119
                return 'T.61-7bit';
10120
            case 'csiso103t618bit':
10121
            case 'isoir103':
10122
            case 't61':
10123
            case 't618bit':
10124
                return 'T.61-8bit';
10125
            case 'csiso128t101g2':
10126
            case 'isoir128':
10127
            case 't101g2':
10128
                return 'T.101-G2';
10129
            case 'cstscii':
10130
            case 'tscii':
10131
                return 'TSCII';
10132
            case 'csunicode11':
10133
            case 'unicode11':
10134
                return 'UNICODE-1-1';
10135
            case 'csunicode11utf7':
10136
            case 'unicode11utf7':
10137
                return 'UNICODE-1-1-UTF-7';
10138
            case 'csunknown8bit':
10139
            case 'unknown8bit':
10140
                return 'UNKNOWN-8BIT';
10141
            case 'ansix341968':
10142
            case 'ansix341986':
10143
            case 'ascii':
10144
            case 'cp367':
10145
            case 'csascii':
10146
            case 'ibm367':
10147
            case 'iso646irv1991':
10148
            case 'iso646us':
10149
            case 'isoir6':
10150
            case 'us':
10151
            case 'usascii':
10152
                return 'US-ASCII';
10153
            case 'csusdk':
10154
            case 'usdk':
10155
                return 'us-dk';
10156
            case 'utf7':
10157
                return 'UTF-7';
10158
            case 'utf8':
10159
                return 'UTF-8';
10160
            case 'utf16':
10161
                return 'UTF-16';
10162
            case 'utf16be':
10163
                return 'UTF-16BE';
10164
            case 'utf16le':
10165
                return 'UTF-16LE';
10166
            case 'utf32':
10167
                return 'UTF-32';
10168
            case 'utf32be':
10169
                return 'UTF-32BE';
10170
            case 'utf32le':
10171
                return 'UTF-32LE';
10172
            case 'csventurainternational':
10173
            case 'venturainternational':
10174
                return 'Ventura-International';
10175
            case 'csventuramath':
10176
            case 'venturamath':
10177
                return 'Ventura-Math';
10178
            case 'csventuraus':
10179
            case 'venturaus':
10180
                return 'Ventura-US';
10181
            case 'csiso70videotexsupp1':
10182
            case 'isoir70':
10183
            case 'videotexsuppl':
10184
                return 'videotex-suppl';
10185
            case 'csviqr':
10186
            case 'viqr':
10187
                return 'VIQR';
10188
            case 'csviscii':
10189
            case 'viscii':
10190
                return 'VISCII';
10191
            case 'csshiftjis':
10192
            case 'cswindows31j':
10193
            case 'mskanji':
10194
            case 'shiftjis':
10195
            case 'windows31j':
10196
                return 'Windows-31J';
10197
            case 'iso885911':
10198
            case 'tis620':
10199
                return 'windows-874';
10200
            case 'cseuckr':
10201
            case 'csksc56011987':
10202
            case 'euckr':
10203
            case 'isoir149':
10204
            case 'korean':
10205
            case 'ksc5601':
10206
            case 'ksc56011987':
10207
            case 'ksc56011989':
10208
            case 'windows949':
10209
                return 'windows-949';
10210
            case 'windows1250':
10211
                return 'windows-1250';
10212
            case 'windows1251':
10213
                return 'windows-1251';
10214
            case 'cp819':
10215
            case 'csisolatin1':
10216
            case 'ibm819':
10217
            case 'iso88591':
10218
            case 'iso885911987':
10219
            case 'isoir100':
10220
            case 'l1':
10221
            case 'latin1':
10222
            case 'windows1252':
10223
                return 'windows-1252';
10224
            case 'windows1253':
10225
                return 'windows-1253';
10226
            case 'csisolatin5':
10227
            case 'iso88599':
10228
            case 'iso885991989':
10229
            case 'isoir148':
10230
            case 'l5':
10231
            case 'latin5':
10232
            case 'windows1254':
10233
                return 'windows-1254';
10234
            case 'windows1255':
10235
                return 'windows-1255';
10236
            case 'windows1256':
10237
                return 'windows-1256';
10238
            case 'windows1257':
10239
                return 'windows-1257';
10240
            case 'windows1258':
10241
                return 'windows-1258';
10242
            default:
10243
                return $charset;
10244
        }
10245
    }
10246
    public static function get_curl_version()
10247
    {
10248
        if (is_array($curl = curl_version()))
10249
        {
10250
            $curl = $curl['version'];
10251
        }
10252
        elseif (substr($curl, 0, 5) === 'curl/')
10253
        {
10254
            $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5));
10255
        }
10256
        elseif (substr($curl, 0, 8) === 'libcurl/')
10257
        {
10258
            $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8));
10259
        }
10260
        else
10261
        {
10262
            $curl = 0;
10263
        }
10264
        return $curl;
10265
    }
10266
    
10267
    public static function strip_comments($data)
10268
    {
10269
        $output = '';
10270
        while (($start = strpos($data, '<!--')) !== false)
10271
        {
10272
            $output .= substr($data, 0, $start);
10273
            if (($end = strpos($data, '-->', $start)) !== false)
10274
            {
10275
                $data = substr_replace($data, '', 0, $end + 3);
10276
            }
10277
            else
10278
            {
10279
                $data = '';
10280
            }
10281
        }
10282
        return $output . $data;
10283
    }
10284
    public static function parse_date($dt)
10285
    {
10286
        $parser = SimplePie_Parse_Date::get();
10287
        return $parser->parse($dt);
10288
    }
10289
    
10290
    public static function entities_decode($data)
10291
    {
10292
        $decoder = new SimplePie_Decode_HTML_Entities($data);
10293
        return $decoder->parse();
10294
    }
10295
    
10296
    public static function uncomment_rfc822($string)
10297
    {
10298
        $string = (string) $string;
10299
        $position = 0;
10300
        $length = strlen($string);
10301
        $depth = 0;
10302
        $output = '';
10303
        while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
10304
        {
10305
            $output .= substr($string, $position, $pos - $position);
10306
            $position = $pos + 1;
10307
            if ($string[$pos - 1] !== '\\')
10308
            {
10309
                $depth++;
10310
                while ($depth && $position < $length)
10311
                {
10312
                    $position += strcspn($string, '()', $position);
10313
                    if ($string[$position - 1] === '\\')
10314
                    {
10315
                        $position++;
10316
                        continue;
10317
                    }
10318
                    elseif (isset($string[$position]))
10319
                    {
10320
                        switch ($string[$position])
10321
                        {
10322
                            case '(':
10323
                                $depth++;
10324
                                break;
10325
                            case ')':
10326
                                $depth--;
10327
                                break;
10328
                        }
10329
                        $position++;
10330
                    }
10331
                    else
10332
                    {
10333
                        break;
10334
                    }
10335
                }
10336
            }
10337
            else
10338
            {
10339
                $output .= '(';
10340
            }
10341
        }
10342
        $output .= substr($string, $position);
10343
        return $output;
10344
    }
10345
    public static function parse_mime($mime)
10346
    {
10347
        if (($pos = strpos($mime, ';')) === false)
10348
        {
10349
            return trim($mime);
10350
        }
10351
        else
10352
        {
10353
            return trim(substr($mime, 0, $pos));
10354
        }
10355
    }
10356
    public static function atom_03_construct_type($attribs)
10357
    {
10358
        if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64'))
10359
        {
10360
            $mode = SIMPLEPIE_CONSTRUCT_BASE64;
10361
        }
10362
        else
10363
        {
10364
            $mode = SIMPLEPIE_CONSTRUCT_NONE;
10365
        }
10366
        if (isset($attribs['']['type']))
10367
        {
10368
            switch (strtolower(trim($attribs['']['type'])))
10369
            {
10370
                case 'text':
10371
                case 'text/plain':
10372
                    return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
10373
                case 'html':
10374
                case 'text/html':
10375
                    return SIMPLEPIE_CONSTRUCT_HTML | $mode;
10376
                case 'xhtml':
10377
                case 'application/xhtml+xml':
10378
                    return SIMPLEPIE_CONSTRUCT_XHTML | $mode;
10379
                default:
10380
                    return SIMPLEPIE_CONSTRUCT_NONE | $mode;
10381
            }
10382
        }
10383
        else
10384
        {
10385
            return SIMPLEPIE_CONSTRUCT_TEXT | $mode;
10386
        }
10387
    }
10388
    public static function atom_10_construct_type($attribs)
10389
    {
10390
        if (isset($attribs['']['type']))
10391
        {
10392
            switch (strtolower(trim($attribs['']['type'])))
10393
            {
10394
                case 'text':
10395
                    return SIMPLEPIE_CONSTRUCT_TEXT;
10396
                case 'html':
10397
                    return SIMPLEPIE_CONSTRUCT_HTML;
10398
                case 'xhtml':
10399
                    return SIMPLEPIE_CONSTRUCT_XHTML;
10400
                default:
10401
                    return SIMPLEPIE_CONSTRUCT_NONE;
10402
            }
10403
        }
10404
        return SIMPLEPIE_CONSTRUCT_TEXT;
10405
    }
10406
    public static function atom_10_content_construct_type($attribs)
10407
    {
10408
        if (isset($attribs['']['type']))
10409
        {
10410
            $type = strtolower(trim($attribs['']['type']));
10411
            switch ($type)
10412
            {
10413
                case 'text':
10414
                    return SIMPLEPIE_CONSTRUCT_TEXT;
10415
                case 'html':
10416
                    return SIMPLEPIE_CONSTRUCT_HTML;
10417
                case 'xhtml':
10418
                    return SIMPLEPIE_CONSTRUCT_XHTML;
10419
            }
10420
            if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/')
10421
            {
10422
                return SIMPLEPIE_CONSTRUCT_NONE;
10423
            }
10424
            else
10425
            {
10426
                return SIMPLEPIE_CONSTRUCT_BASE64;
10427
            }
10428
        }
10429
        else
10430
        {
10431
            return SIMPLEPIE_CONSTRUCT_TEXT;
10432
        }
10433
    }
10434
    public static function is_isegment_nz_nc($string)
10435
    {
10436
        return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string);
10437
    }
10438
    public static function space_seperated_tokens($string)
10439
    {
10440
        $space_characters = "\x20\x09\x0A\x0B\x0C\x0D";
10441
        $string_length = strlen($string);
10442
        $position = strspn($string, $space_characters);
10443
        $tokens = array();
10444
        while ($position < $string_length)
10445
        {
10446
            $len = strcspn($string, $space_characters, $position);
10447
            $tokens[] = substr($string, $position, $len);
10448
            $position += $len;
10449
            $position += strspn($string, $space_characters, $position);
10450
        }
10451
        return $tokens;
10452
    }
10453
    
10454
    public static function codepoint_to_utf8($codepoint)
10455
    {
10456
        $codepoint = (int) $codepoint;
10457
        if ($codepoint < 0)
10458
        {
10459
            return false;
10460
        }
10461
        else if ($codepoint <= 0x7f)
10462
        {
10463
            return chr($codepoint);
10464
        }
10465
        else if ($codepoint <= 0x7ff)
10466
        {
10467
            return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f));
10468
        }
10469
        else if ($codepoint <= 0xffff)
10470
        {
10471
            return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
10472
        }
10473
        else if ($codepoint <= 0x10ffff)
10474
        {
10475
            return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f));
10476
        }
10477
        else
10478
        {
10479
            // U+FFFD REPLACEMENT CHARACTER
10480
            return "\xEF\xBF\xBD";
10481
        }
10482
    }
10483
    
10484
    public static function parse_str($str)
10485
    {
10486
        $return = array();
10487
        $str = explode('&', $str);
10488
        foreach ($str as $section)
10489
        {
10490
            if (strpos($section, '=') !== false)
10491
            {
10492
                list($name, $value) = explode('=', $section, 2);
10493
                $return[urldecode($name)][] = urldecode($value);
10494
            }
10495
            else
10496
            {
10497
                $return[urldecode($section)][] = null;
10498
            }
10499
        }
10500
        return $return;
10501
    }
10502
    
10503
    public static function xml_encoding($data, $registry)
10504
    {
10505
        // UTF-32 Big Endian BOM
10506
        if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
10507
        {
10508
            $encoding[] = 'UTF-32BE';
10509
        }
10510
        // UTF-32 Little Endian BOM
10511
        elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
10512
        {
10513
            $encoding[] = 'UTF-32LE';
10514
        }
10515
        // UTF-16 Big Endian BOM
10516
        elseif (substr($data, 0, 2) === "\xFE\xFF")
10517
        {
10518
            $encoding[] = 'UTF-16BE';
10519
        }
10520
        // UTF-16 Little Endian BOM
10521
        elseif (substr($data, 0, 2) === "\xFF\xFE")
10522
        {
10523
            $encoding[] = 'UTF-16LE';
10524
        }
10525
        // UTF-8 BOM
10526
        elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
10527
        {
10528
            $encoding[] = 'UTF-8';
10529
        }
10530
        // UTF-32 Big Endian Without BOM
10531
        elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C")
10532
        {
10533
            if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E"))
10534
            {
10535
                $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8')));
10536
                if ($parser->parse())
10537
                {
10538
                    $encoding[] = $parser->encoding;
10539
                }
10540
            }
10541
            $encoding[] = 'UTF-32BE';
10542
        }
10543
        // UTF-32 Little Endian Without BOM
10544
        elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00")
10545
        {
10546
            if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00"))
10547
            {
10548
                $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8')));
10549
                if ($parser->parse())
10550
                {
10551
                    $encoding[] = $parser->encoding;
10552
                }
10553
            }
10554
            $encoding[] = 'UTF-32LE';
10555
        }
10556
        // UTF-16 Big Endian Without BOM
10557
        elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C")
10558
        {
10559
            if ($pos = strpos($data, "\x00\x3F\x00\x3E"))
10560
            {
10561
                $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8')));
10562
                if ($parser->parse())
10563
                {
10564
                    $encoding[] = $parser->encoding;
10565
                }
10566
            }
10567
            $encoding[] = 'UTF-16BE';
10568
        }
10569
        // UTF-16 Little Endian Without BOM
10570
        elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00")
10571
        {
10572
            if ($pos = strpos($data, "\x3F\x00\x3E\x00"))
10573
            {
10574
                $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8')));
10575
                if ($parser->parse())
10576
                {
10577
                    $encoding[] = $parser->encoding;
10578
                }
10579
            }
10580
            $encoding[] = 'UTF-16LE';
10581
        }
10582
        // US-ASCII (or superset)
10583
        elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C")
10584
        {
10585
            if ($pos = strpos($data, "\x3F\x3E"))
10586
            {
10587
                $parser = $registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));
10588
                if ($parser->parse())
10589
                {
10590
                    $encoding[] = $parser->encoding;
10591
                }
10592
            }
10593
            $encoding[] = 'UTF-8';
10594
        }
10595
        // Fallback to UTF-8
10596
        else
10597
        {
10598
            $encoding[] = 'UTF-8';
10599
        }
10600
        return $encoding;
10601
    }
10602
    public static function output_javascript()
10603
    {
10604
        if (function_exists('ob_gzhandler'))
10605
        {
10606
            ob_start('ob_gzhandler');
10607
        }
10608
        header('Content-type: text/javascript; charset: UTF-8');
10609
        header('Cache-Control: must-revalidate');
10610
        header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days
10611
        ?>
10612
function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) {
10613
    if (placeholder != '') {
10614
        document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="../../../miax/crssfeed/scr/simplepie/'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
10615
    }
10616
    else {
10617
        document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="../../../miax/crssfeed/scr/simplepie/'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>');
10618
    }
10619
}
10620
function embed_flash(bgcolor, width, height, link, loop, type) {
10621
    document.writeln('<embed src="../../../miax/crssfeed/scr/simplepie/'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>');
10622
}
10623
function embed_flv(width, height, link, placeholder, loop, player) {
10624
    document.writeln('<embed src="../../../miax/crssfeed/scr/simplepie/'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>');
10625
}
10626
function embed_wmedia(width, height, link) {
10627
    document.writeln('<embed type="application/x-mplayer2" src="../../../miax/crssfeed/scr/simplepie/'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>');
10628
}
10629
        <?php
10630
    }
10631
    
10632
    public static function get_build()
10633
    {
10634
        $root = dirname(dirname(__FILE__));
10635
        if (file_exists($root . '/.git/index'))
10636
        {
10637
            return filemtime($root . '/.git/index');
10638
        }
10639
        elseif (file_exists($root . '/SimplePie'))
10640
        {
10641
            $time = 0;
10642
            foreach (glob($root . '/SimplePie/*.php') as $file)
10643
            {
10644
                if (($mtime = filemtime($file)) > $time)
10645
                {
10646
                    $time = $mtime;
10647
                }
10648
            }
10649
            return $time;
10650
        }
10651
        elseif (file_exists(dirname(__FILE__) . '/Core.php'))
10652
        {
10653
            return filemtime(dirname(__FILE__) . '/Core.php');
10654
        }
10655
        else
10656
        {
10657
            return filemtime(__FILE__);
10658
        }
10659
    }
10660
    
10661
    public static function debug(&$sp)
10662
    {
10663
        $info = 'SimplePie ' . SIMPLEPIE_VERSION . ' Build ' . SIMPLEPIE_BUILD . "\n";
10664
        $info .= 'PHP ' . PHP_VERSION . "\n";
10665
        if ($sp->error() !== null)
10666
        {
10667
            $info .= 'Error occurred: ' . $sp->error() . "\n";
10668
        }
10669
        else
10670
        {
10671
            $info .= "No error found.\n";
10672
        }
10673
        $info .= "Extensions:\n";
10674
        $extensions = array('pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml');
10675
        foreach ($extensions as $ext)
10676
        {
10677
            if (extension_loaded($ext))
10678
            {
10679
                $info .= "    $ext loaded\n";
10680
                switch ($ext)
10681
                {
10682
                    case 'pcre':
10683
                        $info .= '      Version ' . PCRE_VERSION . "\n";
10684
                        break;
10685
                    case 'curl':
10686
                        $version = curl_version();
10687
                        $info .= '      Version ' . $version['version'] . "\n";
10688
                        break;
10689
                    case 'mbstring':
10690
                        $info .= '      Overloading: ' . mb_get_info('func_overload') . "\n";
10691
                        break;
10692
                    case 'iconv':
10693
                        $info .= '      Version ' . ICONV_VERSION . "\n";
10694
                        break;
10695
                    case 'xml':
10696
                        $info .= '      Version ' . LIBXML_DOTTED_VERSION . "\n";
10697
                        break;
10698
                }
10699
            }
10700
            else
10701
            {
10702
                $info .= "    $ext not loaded\n";
10703
            }
10704
        }
10705
        return $info;
10706
    }
10707
    public static function silence_errors($num, $str)
10708
    {
10709
        // No-op
10710
    }
10711
}
10712
class SimplePie_Net_IPv6
10713
{
10714
    
10715
    public static function uncompress($ip)
10716
    {
10717
        $c1 = -1;
10718
        $c2 = -1;
10719
        if (substr_count($ip, '::') === 1)
10720
        {
10721
            list($ip1, $ip2) = explode('::', $ip);
10722
            if ($ip1 === '')
10723
            {
10724
                $c1 = -1;
10725
            }
10726
            else
10727
            {
10728
                $c1 = substr_count($ip1, ':');
10729
            }
10730
            if ($ip2 === '')
10731
            {
10732
                $c2 = -1;
10733
            }
10734
            else
10735
            {
10736
                $c2 = substr_count($ip2, ':');
10737
            }
10738
            if (strpos($ip2, '.') !== false)
10739
            {
10740
                $c2++;
10741
            }
10742
            // ::
10743
            if ($c1 === -1 && $c2 === -1)
10744
            {
10745
                $ip = '0:0:0:0:0:0:0:0';
10746
            }
10747
            // ::xxx
10748
            else if ($c1 === -1)
10749
            {
10750
                $fill = str_repeat('0:', 7 - $c2);
10751
                $ip = str_replace('::', $fill, $ip);
10752
            }
10753
            // xxx::
10754
            else if ($c2 === -1)
10755
            {
10756
                $fill = str_repeat(':0', 7 - $c1);
10757
                $ip = str_replace('::', $fill, $ip);
10758
            }
10759
            // xxx::xxx
10760
            else
10761
            {
10762
                $fill = ':' . str_repeat('0:', 6 - $c2 - $c1);
10763
                $ip = str_replace('::', $fill, $ip);
10764
            }
10765
        }
10766
        return $ip;
10767
    }
10768
    
10769
    public static function compress($ip)
10770
    {
10771
        // Prepare the IP to be compressed
10772
        $ip = self::uncompress($ip);
10773
        $ip_parts = self::split_v6_v4($ip);
10774
        // Replace all leading zeros
10775
        $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]);
10776
        // Find bunches of zeros
10777
        if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE))
10778
        {
10779
            $max = 0;
10780
            $pos = null;
10781
            foreach ($matches[0] as $match)
10782
            {
10783
                if (strlen($match[0]) > $max)
10784
                {
10785
                    $max = strlen($match[0]);
10786
                    $pos = $match[1];
10787
                }
10788
            }
10789
            $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max);
10790
        }
10791
        if ($ip_parts[1] !== '')
10792
        {
10793
            return implode(':', $ip_parts);
10794
        }
10795
        else
10796
        {
10797
            return $ip_parts[0];
10798
        }
10799
    }
10800
    
10801
    private static function split_v6_v4($ip)
10802
    {
10803
        if (strpos($ip, '.') !== false)
10804
        {
10805
            $pos = strrpos($ip, ':');
10806
            $ipv6_part = substr($ip, 0, $pos);
10807
            $ipv4_part = substr($ip, $pos + 1);
10808
            return array($ipv6_part, $ipv4_part);
10809
        }
10810
        else
10811
        {
10812
            return array($ip, '');
10813
        }
10814
    }
10815
    
10816
    public static function check_ipv6($ip)
10817
    {
10818
        $ip = self::uncompress($ip);
10819
        list($ipv6, $ipv4) = self::split_v6_v4($ip);
10820
        $ipv6 = explode(':', $ipv6);
10821
        $ipv4 = explode('.', $ipv4);
10822
        if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4)
10823
        {
10824
            foreach ($ipv6 as $ipv6_part)
10825
            {
10826
                // The section can't be empty
10827
                if ($ipv6_part === '')
10828
                    return false;
10829
                // Nor can it be over four characters
10830
                if (strlen($ipv6_part) > 4)
10831
                    return false;
10832
                // Remove leading zeros (this is safe because of the above)
10833
                $ipv6_part = ltrim($ipv6_part, '0');
10834
                if ($ipv6_part === '')
10835
                    $ipv6_part = '0';
10836
                // Check the value is valid
10837
                $value = hexdec($ipv6_part);
10838
                if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF)
10839
                    return false;
10840
            }
10841
            if (count($ipv4) === 4)
10842
            {
10843
                foreach ($ipv4 as $ipv4_part)
10844
                {
10845
                    $value = (int) $ipv4_part;
10846
                    if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF)
10847
                        return false;
10848
                }
10849
            }
10850
            return true;
10851
        }
10852
        else
10853
        {
10854
            return false;
10855
        }
10856
    }
10857
    
10858
    public static function checkIPv6($ip)
10859
    {
10860
        return self::check_ipv6($ip);
10861
    }
10862
}
10863
class SimplePie_Parse_Date
10864
{
10865
    
10866
    var $date;
10867
    
10868
    var $day = array(
10869
        // English
10870
        'mon' => 1,
10871
        'monday' => 1,
10872
        'tue' => 2,
10873
        'tuesday' => 2,
10874
        'wed' => 3,
10875
        'wednesday' => 3,
10876
        'thu' => 4,
10877
        'thursday' => 4,
10878
        'fri' => 5,
10879
        'friday' => 5,
10880
        'sat' => 6,
10881
        'saturday' => 6,
10882
        'sun' => 7,
10883
        'sunday' => 7,
10884
        // Dutch
10885
        'maandag' => 1,
10886
        'dinsdag' => 2,
10887
        'woensdag' => 3,
10888
        'donderdag' => 4,
10889
        'vrijdag' => 5,
10890
        'zaterdag' => 6,
10891
        'zondag' => 7,
10892
        // French
10893
        'lundi' => 1,
10894
        'mardi' => 2,
10895
        'mercredi' => 3,
10896
        'jeudi' => 4,
10897
        'vendredi' => 5,
10898
        'samedi' => 6,
10899
        'dimanche' => 7,
10900
        // German
10901
        'montag' => 1,
10902
        'dienstag' => 2,
10903
        'mittwoch' => 3,
10904
        'donnerstag' => 4,
10905
        'freitag' => 5,
10906
        'samstag' => 6,
10907
        'sonnabend' => 6,
10908
        'sonntag' => 7,
10909
        // Italian
10910
        'lunedì' => 1,
10911
        'martedì' => 2,
10912
        'mercoledì' => 3,
10913
        'giovedì' => 4,
10914
        'venerdì' => 5,
10915
        'sabato' => 6,
10916
        'domenica' => 7,
10917
        // Spanish
10918
        'lunes' => 1,
10919
        'martes' => 2,
10920
        'miércoles' => 3,
10921
        'jueves' => 4,
10922
        'viernes' => 5,
10923
        'sábado' => 6,
10924
        'domingo' => 7,
10925
        // Finnish
10926
        'maanantai' => 1,
10927
        'tiistai' => 2,
10928
        'keskiviikko' => 3,
10929
        'torstai' => 4,
10930
        'perjantai' => 5,
10931
        'lauantai' => 6,
10932
        'sunnuntai' => 7,
10933
        // Hungarian
10934
        'hétfő' => 1,
10935
        'kedd' => 2,
10936
        'szerda' => 3,
10937
        'csütörtok' => 4,
10938
        'péntek' => 5,
10939
        'szombat' => 6,
10940
        'vasárnap' => 7,
10941
        // Greek
10942
        'Δευ' => 1,
10943
        'Τρι' => 2,
10944
        'Τετ' => 3,
10945
        'Πεμ' => 4,
10946
        'Παρ' => 5,
10947
        'Σαβ' => 6,
10948
        'Κυρ' => 7,
10949
    );
10950
    
10951
    var $month = array(
10952
        // English
10953
        'jan' => 1,
10954
        'january' => 1,
10955
        'feb' => 2,
10956
        'february' => 2,
10957
        'mar' => 3,
10958
        'march' => 3,
10959
        'apr' => 4,
10960
        'april' => 4,
10961
        'may' => 5,
10962
        // No long form of May
10963
        'jun' => 6,
10964
        'june' => 6,
10965
        'jul' => 7,
10966
        'july' => 7,
10967
        'aug' => 8,
10968
        'august' => 8,
10969
        'sep' => 9,
10970
        'september' => 8,
10971
        'oct' => 10,
10972
        'october' => 10,
10973
        'nov' => 11,
10974
        'november' => 11,
10975
        'dec' => 12,
10976
        'december' => 12,
10977
        // Dutch
10978
        'januari' => 1,
10979
        'februari' => 2,
10980
        'maart' => 3,
10981
        'april' => 4,
10982
        'mei' => 5,
10983
        'juni' => 6,
10984
        'juli' => 7,
10985
        'augustus' => 8,
10986
        'september' => 9,
10987
        'oktober' => 10,
10988
        'november' => 11,
10989
        'december' => 12,
10990
        // French
10991
        'janvier' => 1,
10992
        'février' => 2,
10993
        'mars' => 3,
10994
        'avril' => 4,
10995
        'mai' => 5,
10996
        'juin' => 6,
10997
        'juillet' => 7,
10998
        'août' => 8,
10999
        'septembre' => 9,
11000
        'octobre' => 10,
11001
        'novembre' => 11,
11002
        'décembre' => 12,
11003
        // German
11004
        'januar' => 1,
11005
        'februar' => 2,
11006
        'märz' => 3,
11007
        'april' => 4,
11008
        'mai' => 5,
11009
        'juni' => 6,
11010
        'juli' => 7,
11011
        'august' => 8,
11012
        'september' => 9,
11013
        'oktober' => 10,
11014
        'november' => 11,
11015
        'dezember' => 12,
11016
        // Italian
11017
        'gennaio' => 1,
11018
        'febbraio' => 2,
11019
        'marzo' => 3,
11020
        'aprile' => 4,
11021
        'maggio' => 5,
11022
        'giugno' => 6,
11023
        'luglio' => 7,
11024
        'agosto' => 8,
11025
        'settembre' => 9,
11026
        'ottobre' => 10,
11027
        'novembre' => 11,
11028
        'dicembre' => 12,
11029
        // Spanish
11030
        'enero' => 1,
11031
        'febrero' => 2,
11032
        'marzo' => 3,
11033
        'abril' => 4,
11034
        'mayo' => 5,
11035
        'junio' => 6,
11036
        'julio' => 7,
11037
        'agosto' => 8,
11038
        'septiembre' => 9,
11039
        'setiembre' => 9,
11040
        'octubre' => 10,
11041
        'noviembre' => 11,
11042
        'diciembre' => 12,
11043
        // Finnish
11044
        'tammikuu' => 1,
11045
        'helmikuu' => 2,
11046
        'maaliskuu' => 3,
11047
        'huhtikuu' => 4,
11048
        'toukokuu' => 5,
11049
        'kesäkuu' => 6,
11050
        'heinäkuu' => 7,
11051
        'elokuu' => 8,
11052
        'suuskuu' => 9,
11053
        'lokakuu' => 10,
11054
        'marras' => 11,
11055
        'joulukuu' => 12,
11056
        // Hungarian
11057
        'január' => 1,
11058
        'február' => 2,
11059
        'március' => 3,
11060
        'április' => 4,
11061
        'május' => 5,
11062
        'június' => 6,
11063
        'július' => 7,
11064
        'augusztus' => 8,
11065
        'szeptember' => 9,
11066
        'október' => 10,
11067
        'november' => 11,
11068
        'december' => 12,
11069
        // Greek
11070
        'Ιαν' => 1,
11071
        'Φεβ' => 2,
11072
        'Μάώ' => 3,
11073
        'Μαώ' => 3,
11074
        'Απρ' => 4,
11075
        'Μάι' => 5,
11076
        'Μαϊ' => 5,
11077
        'Μαι' => 5,
11078
        'Ιούν' => 6,
11079
        'Ιον' => 6,
11080
        'Ιούλ' => 7,
11081
        'Ιολ' => 7,
11082
        'Αύγ' => 8,
11083
        'Αυγ' => 8,
11084
        'Σεπ' => 9,
11085
        'Οκτ' => 10,
11086
        'Νοέ' => 11,
11087
        'Δεκ' => 12,
11088
    );
11089
    
11090
    var $timezone = array(
11091
        'ACDT' => 37800,
11092
        'ACIT' => 28800,
11093
        'ACST' => 34200,
11094
        'ACT' => -18000,
11095
        'ACWDT' => 35100,
11096
        'ACWST' => 31500,
11097
        'AEDT' => 39600,
11098
        'AEST' => 36000,
11099
        'AFT' => 16200,
11100
        'AKDT' => -28800,
11101
        'AKST' => -32400,
11102
        'AMDT' => 18000,
11103
        'AMT' => -14400,
11104
        'ANAST' => 46800,
11105
        'ANAT' => 43200,
11106
        'ART' => -10800,
11107
        'AZOST' => -3600,
11108
        'AZST' => 18000,
11109
        'AZT' => 14400,
11110
        'BIOT' => 21600,
11111
        'BIT' => -43200,
11112
        'BOT' => -14400,
11113
        'BRST' => -7200,
11114
        'BRT' => -10800,
11115
        'BST' => 3600,
11116
        'BTT' => 21600,
11117
        'CAST' => 18000,
11118
        'CAT' => 7200,
11119
        'CCT' => 23400,
11120
        'CDT' => -18000,
11121
        'CEDT' => 7200,
11122
        'CET' => 3600,
11123
        'CGST' => -7200,
11124
        'CGT' => -10800,
11125
        'CHADT' => 49500,
11126
        'CHAST' => 45900,
11127
        'CIST' => -28800,
11128
        'CKT' => -36000,
11129
        'CLDT' => -10800,
11130
        'CLST' => -14400,
11131
        'COT' => -18000,
11132
        'CST' => -21600,
11133
        'CVT' => -3600,
11134
        'CXT' => 25200,
11135
        'DAVT' => 25200,
11136
        'DTAT' => 36000,
11137
        'EADT' => -18000,
11138
        'EAST' => -21600,
11139
        'EAT' => 10800,
11140
        'ECT' => -18000,
11141
        'EDT' => -14400,
11142
        'EEST' => 10800,
11143
        'EET' => 7200,
11144
        'EGT' => -3600,
11145
        'EKST' => 21600,
11146
        'EST' => -18000,
11147
        'FJT' => 43200,
11148
        'FKDT' => -10800,
11149
        'FKST' => -14400,
11150
        'FNT' => -7200,
11151
        'GALT' => -21600,
11152
        'GEDT' => 14400,
11153
        'GEST' => 10800,
11154
        'GFT' => -10800,
11155
        'GILT' => 43200,
11156
        'GIT' => -32400,
11157
        'GST' => 14400,
11158
        'GST' => -7200,
11159
        'GYT' => -14400,
11160
        'HAA' => -10800,
11161
        'HAC' => -18000,
11162
        'HADT' => -32400,
11163
        'HAE' => -14400,
11164
        'HAP' => -25200,
11165
        'HAR' => -21600,
11166
        'HAST' => -36000,
11167
        'HAT' => -9000,
11168
        'HAY' => -28800,
11169
        'HKST' => 28800,
11170
        'HMT' => 18000,
11171
        'HNA' => -14400,
11172
        'HNC' => -21600,
11173
        'HNE' => -18000,
11174
        'HNP' => -28800,
11175
        'HNR' => -25200,
11176
        'HNT' => -12600,
11177
        'HNY' => -32400,
11178
        'IRDT' => 16200,
11179
        'IRKST' => 32400,
11180
        'IRKT' => 28800,
11181
        'IRST' => 12600,
11182
        'JFDT' => -10800,
11183
        'JFST' => -14400,
11184
        'JST' => 32400,
11185
        'KGST' => 21600,
11186
        'KGT' => 18000,
11187
        'KOST' => 39600,
11188
        'KOVST' => 28800,
11189
        'KOVT' => 25200,
11190
        'KRAST' => 28800,
11191
        'KRAT' => 25200,
11192
        'KST' => 32400,
11193
        'LHDT' => 39600,
11194
        'LHST' => 37800,
11195
        'LINT' => 50400,
11196
        'LKT' => 21600,
11197
        'MAGST' => 43200,
11198
        'MAGT' => 39600,
11199
        'MAWT' => 21600,
11200
        'MDT' => -21600,
11201
        'MESZ' => 7200,
11202
        'MEZ' => 3600,
11203
        'MHT' => 43200,
11204
        'MIT' => -34200,
11205
        'MNST' => 32400,
11206
        'MSDT' => 14400,
11207
        'MSST' => 10800,
11208
        'MST' => -25200,
11209
        'MUT' => 14400,
11210
        'MVT' => 18000,
11211
        'MYT' => 28800,
11212
        'NCT' => 39600,
11213
        'NDT' => -9000,
11214
        'NFT' => 41400,
11215
        'NMIT' => 36000,
11216
        'NOVST' => 25200,
11217
        'NOVT' => 21600,
11218
        'NPT' => 20700,
11219
        'NRT' => 43200,
11220
        'NST' => -12600,
11221
        'NUT' => -39600,
11222
        'NZDT' => 46800,
11223
        'NZST' => 43200,
11224
        'OMSST' => 25200,
11225
        'OMST' => 21600,
11226
        'PDT' => -25200,
11227
        'PET' => -18000,
11228
        'PETST' => 46800,
11229
        'PETT' => 43200,
11230
        'PGT' => 36000,
11231
        'PHOT' => 46800,
11232
        'PHT' => 28800,
11233
        'PKT' => 18000,
11234
        'PMDT' => -7200,
11235
        'PMST' => -10800,
11236
        'PONT' => 39600,
11237
        'PST' => -28800,
11238
        'PWT' => 32400,
11239
        'PYST' => -10800,
11240
        'PYT' => -14400,
11241
        'RET' => 14400,
11242
        'ROTT' => -10800,
11243
        'SAMST' => 18000,
11244
        'SAMT' => 14400,
11245
        'SAST' => 7200,
11246
        'SBT' => 39600,
11247
        'SCDT' => 46800,
11248
        'SCST' => 43200,
11249
        'SCT' => 14400,
11250
        'SEST' => 3600,
11251
        'SGT' => 28800,
11252
        'SIT' => 28800,
11253
        'SRT' => -10800,
11254
        'SST' => -39600,
11255
        'SYST' => 10800,
11256
        'SYT' => 7200,
11257
        'TFT' => 18000,
11258
        'THAT' => -36000,
11259
        'TJT' => 18000,
11260
        'TKT' => -36000,
11261
        'TMT' => 18000,
11262
        'TOT' => 46800,
11263
        'TPT' => 32400,
11264
        'TRUT' => 36000,
11265
        'TVT' => 43200,
11266
        'TWT' => 28800,
11267
        'UYST' => -7200,
11268
        'UYT' => -10800,
11269
        'UZT' => 18000,
11270
        'VET' => -14400,
11271
        'VLAST' => 39600,
11272
        'VLAT' => 36000,
11273
        'VOST' => 21600,
11274
        'VUT' => 39600,
11275
        'WAST' => 7200,
11276
        'WAT' => 3600,
11277
        'WDT' => 32400,
11278
        'WEST' => 3600,
11279
        'WFT' => 43200,
11280
        'WIB' => 25200,
11281
        'WIT' => 32400,
11282
        'WITA' => 28800,
11283
        'WKST' => 18000,
11284
        'WST' => 28800,
11285
        'YAKST' => 36000,
11286
        'YAKT' => 32400,
11287
        'YAPT' => 36000,
11288
        'YEKST' => 21600,
11289
        'YEKT' => 18000,
11290
    );
11291
    
11292
    var $day_pcre;
11293
    
11294
    var $month_pcre;
11295
    
11296
    var $built_in = array();
11297
    
11298
    var $user = array();
11299
    
11300
    public function __construct()
11301
    {
11302
        $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')';
11303
        $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')';
11304
        static $cache;
11305
        if (!isset($cache[get_class($this)]))
11306
        {
11307
            $all_methods = get_class_methods($this);
11308
            foreach ($all_methods as $method)
11309
            {
11310
                if (strtolower(substr($method, 0, 5)) === 'date_')
11311
                {
11312
                    $cache[get_class($this)][] = $method;
11313
                }
11314
            }
11315
        }
11316
        foreach ($cache[get_class($this)] as $method)
11317
        {
11318
            $this->built_in[] = $method;
11319
        }
11320
    }
11321
    
11322
    public static function get()
11323
    {
11324
        static $object;
11325
        if (!$object)
11326
        {
11327
            $object = new SimplePie_Parse_Date;
11328
        }
11329
        return $object;
11330
    }
11331
    
11332
    public function parse($date)
11333
    {
11334
        foreach ($this->user as $method)
11335
        {
11336
            if (($returned = call_user_func($method, $date)) !== false)
11337
            {
11338
                return $returned;
11339
            }
11340
        }
11341
        foreach ($this->built_in as $method)
11342
        {
11343
            if (($returned = call_user_func(array($this, $method), $date)) !== false)
11344
            {
11345
                return $returned;
11346
            }
11347
        }
11348
        return false;
11349
    }
11350
    
11351
    public function add_callback($callback)
11352
    {
11353
        if (is_callable($callback))
11354
        {
11355
            $this->user[] = $callback;
11356
        }
11357
        else
11358
        {
11359
            trigger_error('User-supplied function must be a valid callback', E_USER_WARNING);
11360
        }
11361
    }
11362
    
11363
    public function date_w3cdtf($date)
11364
    {
11365
        static $pcre;
11366
        if (!$pcre)
11367
        {
11368
            $year = '([0-9]{4})';
11369
            $month = $day = $hour = $minute = $second = '([0-9]{2})';
11370
            $decimal = '([0-9]*)';
11371
            $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))';
11372
            $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/';
11373
        }
11374
        if (preg_match($pcre, $date, $match))
11375
        {
11376
            /*
11377
            Capturing subpatterns:
11378
            1: Year
11379
            2: Month
11380
            3: Day
11381
            4: Hour
11382
            5: Minute
11383
            6: Second
11384
            7: Decimal fraction of a second
11385
            8: Zulu
11386
            9: Timezone ±
11387
            10: Timezone hours
11388
            11: Timezone minutes
11389
            */
11390
            // Fill in empty matches
11391
            for ($i = count($match); $i <= 3; $i++)
11392
            {
11393
                $match[$i] = '1';
11394
            }
11395
            for ($i = count($match); $i <= 7; $i++)
11396
            {
11397
                $match[$i] = '0';
11398
            }
11399
            // Numeric timezone
11400
            if (isset($match[9]) && $match[9] !== '')
11401
            {
11402
                $timezone = $match[10] * 3600;
11403
                $timezone += $match[11] * 60;
11404
                if ($match[9] === '-')
11405
                {
11406
                    $timezone = 0 - $timezone;
11407
                }
11408
            }
11409
            else
11410
            {
11411
                $timezone = 0;
11412
            }
11413
            // Convert the number of seconds to an integer, taking decimals into account
11414
            $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
11415
            return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
11416
        }
11417
        else
11418
        {
11419
            return false;
11420
        }
11421
    }
11422
    
11423
    public function remove_rfc2822_comments($string)
11424
    {
11425
        $string = (string) $string;
11426
        $position = 0;
11427
        $length = strlen($string);
11428
        $depth = 0;
11429
        $output = '';
11430
        while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
11431
        {
11432
            $output .= substr($string, $position, $pos - $position);
11433
            $position = $pos + 1;
11434
            if ($string[$pos - 1] !== '\\')
11435
            {
11436
                $depth++;
11437
                while ($depth && $position < $length)
11438
                {
11439
                    $position += strcspn($string, '()', $position);
11440
                    if ($string[$position - 1] === '\\')
11441
                    {
11442
                        $position++;
11443
                        continue;
11444
                    }
11445
                    elseif (isset($string[$position]))
11446
                    {
11447
                        switch ($string[$position])
11448
                        {
11449
                            case '(':
11450
                                $depth++;
11451
                                break;
11452
                            case ')':
11453
                                $depth--;
11454
                                break;
11455
                        }
11456
                        $position++;
11457
                    }
11458
                    else
11459
                    {
11460
                        break;
11461
                    }
11462
                }
11463
            }
11464
            else
11465
            {
11466
                $output .= '(';
11467
            }
11468
        }
11469
        $output .= substr($string, $position);
11470
        return $output;
11471
    }
11472
    
11473
    public function date_rfc2822($date)
11474
    {
11475
        static $pcre;
11476
        if (!$pcre)
11477
        {
11478
            $wsp = '[\x09\x20]';
11479
            $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)';
11480
            $optional_fws = $fws . '?';
11481
            $day_name = $this->day_pcre;
11482
            $month = $this->month_pcre;
11483
            $day = '([0-9]{1,2})';
11484
            $hour = $minute = $second = '([0-9]{2})';
11485
            $year = '([0-9]{2,4})';
11486
            $num_zone = '([+\-])([0-9]{2})([0-9]{2})';
11487
            $character_zone = '([A-Z]{1,5})';
11488
            $zone = '(?:' . $num_zone . '|' . $character_zone . ')';
11489
            $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i';
11490
        }
11491
        if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))
11492
        {
11493
            /*
11494
            Capturing subpatterns:
11495
            1: Day name
11496
            2: Day
11497
            3: Month
11498
            4: Year
11499
            5: Hour
11500
            6: Minute
11501
            7: Second
11502
            8: Timezone ±
11503
            9: Timezone hours
11504
            10: Timezone minutes
11505
            11: Alphabetic timezone
11506
            */
11507
            // Find the month number
11508
            $month = $this->month[strtolower($match[3])];
11509
            // Numeric timezone
11510
            if ($match[8] !== '')
11511
            {
11512
                $timezone = $match[9] * 3600;
11513
                $timezone += $match[10] * 60;
11514
                if ($match[8] === '-')
11515
                {
11516
                    $timezone = 0 - $timezone;
11517
                }
11518
            }
11519
            // Character timezone
11520
            elseif (isset($this->timezone[strtoupper($match[11])]))
11521
            {
11522
                $timezone = $this->timezone[strtoupper($match[11])];
11523
            }
11524
            // Assume everything else to be -0000
11525
            else
11526
            {
11527
                $timezone = 0;
11528
            }
11529
            // Deal with 2/3 digit years
11530
            if ($match[4] < 50)
11531
            {
11532
                $match[4] += 2000;
11533
            }
11534
            elseif ($match[4] < 1000)
11535
            {
11536
                $match[4] += 1900;
11537
            }
11538
            // Second is optional, if it is empty set it to zero
11539
            if ($match[7] !== '')
11540
            {
11541
                $second = $match[7];
11542
            }
11543
            else
11544
            {
11545
                $second = 0;
11546
            }
11547
            return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;
11548
        }
11549
        else
11550
        {
11551
            return false;
11552
        }
11553
    }
11554
    
11555
    public function date_rfc850($date)
11556
    {
11557
        static $pcre;
11558
        if (!$pcre)
11559
        {
11560
            $space = '[\x09\x20]+';
11561
            $day_name = $this->day_pcre;
11562
            $month = $this->month_pcre;
11563
            $day = '([0-9]{1,2})';
11564
            $year = $hour = $minute = $second = '([0-9]{2})';
11565
            $zone = '([A-Z]{1,5})';
11566
            $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i';
11567
        }
11568
        if (preg_match($pcre, $date, $match))
11569
        {
11570
            /*
11571
            Capturing subpatterns:
11572
            1: Day name
11573
            2: Day
11574
            3: Month
11575
            4: Year
11576
            5: Hour
11577
            6: Minute
11578
            7: Second
11579
            8: Timezone
11580
            */
11581
            // Month
11582
            $month = $this->month[strtolower($match[3])];
11583
            // Character timezone
11584
            if (isset($this->timezone[strtoupper($match[8])]))
11585
            {
11586
                $timezone = $this->timezone[strtoupper($match[8])];
11587
            }
11588
            // Assume everything else to be -0000
11589
            else
11590
            {
11591
                $timezone = 0;
11592
            }
11593
            // Deal with 2 digit year
11594
            if ($match[4] < 50)
11595
            {
11596
                $match[4] += 2000;
11597
            }
11598
            else
11599
            {
11600
                $match[4] += 1900;
11601
            }
11602
            return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;
11603
        }
11604
        else
11605
        {
11606
            return false;
11607
        }
11608
    }
11609
    
11610
    public function date_asctime($date)
11611
    {
11612
        static $pcre;
11613
        if (!$pcre)
11614
        {
11615
            $space = '[\x09\x20]+';
11616
            $wday_name = $this->day_pcre;
11617
            $mon_name = $this->month_pcre;
11618
            $day = '([0-9]{1,2})';
11619
            $hour = $sec = $min = '([0-9]{2})';
11620
            $year = '([0-9]{4})';
11621
            $terminator = '\x0A?\x00?';
11622
            $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';
11623
        }
11624
        if (preg_match($pcre, $date, $match))
11625
        {
11626
            /*
11627
            Capturing subpatterns:
11628
            1: Day name
11629
            2: Month
11630
            3: Day
11631
            4: Hour
11632
            5: Minute
11633
            6: Second
11634
            7: Year
11635
            */
11636
            $month = $this->month[strtolower($match[2])];
11637
            return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);
11638
        }
11639
        else
11640
        {
11641
            return false;
11642
        }
11643
    }
11644
    
11645
    public function date_strtotime($date)
11646
    {
11647
        $strtotime = strtotime($date);
11648
        if ($strtotime === -1 || $strtotime === false)
11649
        {
11650
            return false;
11651
        }
11652
        else
11653
        {
11654
            return $strtotime;
11655
        }
11656
    }
11657
}
11658
class SimplePie_Parser
11659
{
11660
    var $error_code;
11661
    var $error_string;
11662
    var $current_line;
11663
    var $current_column;
11664
    var $current_byte;
11665
    var $separator = ' ';
11666
    var $namespace = array('');
11667
    var $element = array('');
11668
    var $xml_base = array('');
11669
    var $xml_base_explicit = array(false);
11670
    var $xml_lang = array('');
11671
    var $data = array();
11672
    var $datas = array(array());
11673
    var $current_xhtml_construct = -1;
11674
    var $encoding;
11675
    protected $registry;
11676
    public function set_registry(SimplePie_Registry $registry)
11677
    {
11678
        $this->registry = $registry;
11679
    }
11680
    public function parse(&$data, $encoding)
11681
    {
11682
        // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character
11683
        if (strtoupper($encoding) === 'US-ASCII')
11684
        {
11685
            $this->encoding = 'UTF-8';
11686
        }
11687
        else
11688
        {
11689
            $this->encoding = $encoding;
11690
        }
11691
        // Strip BOM:
11692
        // UTF-32 Big Endian BOM
11693
        if (substr($data, 0, 4) === "\x00\x00\xFE\xFF")
11694
        {
11695
            $data = substr($data, 4);
11696
        }
11697
        // UTF-32 Little Endian BOM
11698
        elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00")
11699
        {
11700
            $data = substr($data, 4);
11701
        }
11702
        // UTF-16 Big Endian BOM
11703
        elseif (substr($data, 0, 2) === "\xFE\xFF")
11704
        {
11705
            $data = substr($data, 2);
11706
        }
11707
        // UTF-16 Little Endian BOM
11708
        elseif (substr($data, 0, 2) === "\xFF\xFE")
11709
        {
11710
            $data = substr($data, 2);
11711
        }
11712
        // UTF-8 BOM
11713
        elseif (substr($data, 0, 3) === "\xEF\xBB\xBF")
11714
        {
11715
            $data = substr($data, 3);
11716
        }
11717
        if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false)
11718
        {
11719
            $declaration = $this->registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5)));
11720
            if ($declaration->parse())
11721
            {
11722
                $data = substr($data, $pos + 2);
11723
                $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' . $data;
11724
            }
11725
            else
11726
            {
11727
                $this->error_string = 'SimplePie bug! Please report this!';
11728
                return false;
11729
            }
11730
        }
11731
        $return = true;
11732
        static $xml_is_sane = null;
11733
        if ($xml_is_sane === null)
11734
        {
11735
            $parser_check = xml_parser_create();
11736
            xml_parse_into_struct($parser_check, '<foo>&amp;</foo>', $values);
11737
            xml_parser_free($parser_check);
11738
            $xml_is_sane = isset($values[0]['value']);
11739
        }
11740
        // Create the parser
11741
        if ($xml_is_sane)
11742
        {
11743
            $xml = xml_parser_create_ns($this->encoding, $this->separator);
11744
            xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1);
11745
            xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0);
11746
            xml_set_object($xml, $this);
11747
            xml_set_character_data_handler($xml, 'cdata');
11748
            xml_set_element_handler($xml, 'tag_open', 'tag_close');
11749
            // Parse!
11750
            if (!xml_parse($xml, $data, true))
11751
            {
11752
                $this->error_code = xml_get_error_code($xml);
11753
                $this->error_string = xml_error_string($this->error_code);
11754
                $return = false;
11755
            }
11756
            $this->current_line = xml_get_current_line_number($xml);
11757
            $this->current_column = xml_get_current_column_number($xml);
11758
            $this->current_byte = xml_get_current_byte_index($xml);
11759
            xml_parser_free($xml);
11760
            return $return;
11761
        }
11762
        else
11763
        {
11764
            libxml_clear_errors();
11765
            $xml = new XMLReader();
11766
            $xml->xml($data);
11767
            while (@$xml->read())
11768
            {
11769
                switch ($xml->nodeType)
11770
                {
11771
                    case constant('XMLReader::END_ELEMENT'):
11772
                        if ($xml->namespaceURI !== '')
11773
                        {
11774
                            $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
11775
                        }
11776
                        else
11777
                        {
11778
                            $tagName = $xml->localName;
11779
                        }
11780
                        $this->tag_close(null, $tagName);
11781
                        break;
11782
                    case constant('XMLReader::ELEMENT'):
11783
                        $empty = $xml->isEmptyElement;
11784
                        if ($xml->namespaceURI !== '')
11785
                        {
11786
                            $tagName = $xml->namespaceURI . $this->separator . $xml->localName;
11787
                        }
11788
                        else
11789
                        {
11790
                            $tagName = $xml->localName;
11791
                        }
11792
                        $attributes = array();
11793
                        while ($xml->moveToNextAttribute())
11794
                        {
11795
                            if ($xml->namespaceURI !== '')
11796
                            {
11797
                                $attrName = $xml->namespaceURI . $this->separator . $xml->localName;
11798
                            }
11799
                            else
11800
                            {
11801
                                $attrName = $xml->localName;
11802
                            }
11803
                            $attributes[$attrName] = $xml->value;
11804
                        }
11805
                        $this->tag_open(null, $tagName, $attributes);
11806
                        if ($empty)
11807
                        {
11808
                            $this->tag_close(null, $tagName);
11809
                        }
11810
                        break;
11811
                    case constant('XMLReader::TEXT'):
11812
                    case constant('XMLReader::CDATA'):
11813
                        $this->cdata(null, $xml->value);
11814
                        break;
11815
                }
11816
            }
11817
            if ($error = libxml_get_last_error())
11818
            {
11819
                $this->error_code = $error->code;
11820
                $this->error_string = $error->message;
11821
                $this->current_line = $error->line;
11822
                $this->current_column = $error->column;
11823
                return false;
11824
            }
11825
            else
11826
            {
11827
                return true;
11828
            }
11829
        }
11830
    }
11831
    public function get_error_code()
11832
    {
11833
        return $this->error_code;
11834
    }
11835
    public function get_error_string()
11836
    {
11837
        return $this->error_string;
11838
    }
11839
    public function get_current_line()
11840
    {
11841
        return $this->current_line;
11842
    }
11843
    public function get_current_column()
11844
    {
11845
        return $this->current_column;
11846
    }
11847
    public function get_current_byte()
11848
    {
11849
        return $this->current_byte;
11850
    }
11851
    public function get_data()
11852
    {
11853
        return $this->data;
11854
    }
11855
    public function tag_open($parser, $tag, $attributes)
11856
    {
11857
        list($this->namespace[], $this->element[]) = $this->split_ns($tag);
11858
        $attribs = array();
11859
        foreach ($attributes as $name => $value)
11860
        {
11861
            list($attrib_namespace, $attribute) = $this->split_ns($name);
11862
            $attribs[$attrib_namespace][$attribute] = $value;
11863
        }
11864
        if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['base']))
11865
        {
11866
            $base = $this->registry->call('Misc', 'absolutize_url', array($attribs[SIMPLEPIE_NAMESPACE_XML]['base'], end($this->xml_base)));
11867
            if ($base !== false)
11868
            {
11869
                $this->xml_base[] = $base;
11870
                $this->xml_base_explicit[] = true;
11871
            }
11872
        }
11873
        else
11874
        {
11875
            $this->xml_base[] = end($this->xml_base);
11876
            $this->xml_base_explicit[] = end($this->xml_base_explicit);
11877
        }
11878
        if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['lang']))
11879
        {
11880
            $this->xml_lang[] = $attribs[SIMPLEPIE_NAMESPACE_XML]['lang'];
11881
        }
11882
        else
11883
        {
11884
            $this->xml_lang[] = end($this->xml_lang);
11885
        }
11886
        if ($this->current_xhtml_construct >= 0)
11887
        {
11888
            $this->current_xhtml_construct++;
11889
            if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML)
11890
            {
11891
                $this->data['data'] .= '<' . end($this->element);
11892
                if (isset($attribs['']))
11893
                {
11894
                    foreach ($attribs[''] as $name => $value)
11895
                    {
11896
                        $this->data['data'] .= ' ' . $name . '="' . htmlspecialchars($value, ENT_COMPAT, $this->encoding) . '"';
11897
                    }
11898
                }
11899
                $this->data['data'] .= '>';
11900
            }
11901
        }
11902
        else
11903
        {
11904
            $this->datas[] =& $this->data;
11905
            $this->data =& $this->data['child'][end($this->namespace)][end($this->element)][];
11906
            $this->data = array('data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang));
11907
            if ((end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] === 'xml')
11908
            || (end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] === 'xhtml')
11909
            || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_20 && in_array(end($this->element), array('title')))
11910
            || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_090 && in_array(end($this->element), array('title')))
11911
            || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_10 && in_array(end($this->element), array('title'))))
11912
            {
11913
                $this->current_xhtml_construct = 0;
11914
            }
11915
        }
11916
    }
11917
    public function cdata($parser, $cdata)
11918
    {
11919
        if ($this->current_xhtml_construct >= 0)
11920
        {
11921
            $this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding);
11922
        }
11923
        else
11924
        {
11925
            $this->data['data'] .= $cdata;
11926
        }
11927
    }
11928
    public function tag_close($parser, $tag)
11929
    {
11930
        if ($this->current_xhtml_construct >= 0)
11931
        {
11932
            $this->current_xhtml_construct--;
11933
            if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param')))
11934
            {
11935
                $this->data['data'] .= '</' . end($this->element) . '>';
11936
            }
11937
        }
11938
        if ($this->current_xhtml_construct === -1)
11939
        {
11940
            $this->data =& $this->datas[count($this->datas) - 1];
11941
            array_pop($this->datas);
11942
        }
11943
        array_pop($this->element);
11944
        array_pop($this->namespace);
11945
        array_pop($this->xml_base);
11946
        array_pop($this->xml_base_explicit);
11947
        array_pop($this->xml_lang);
11948
    }
11949
    public function split_ns($string)
11950
    {
11951
        static $cache = array();
11952
        if (!isset($cache[$string]))
11953
        {
11954
            if ($pos = strpos($string, $this->separator))
11955
            {
11956
                static $separator_length;
11957
                if (!$separator_length)
11958
                {
11959
                    $separator_length = strlen($this->separator);
11960
                }
11961
                $namespace = substr($string, 0, $pos);
11962
                $local_name = substr($string, $pos + $separator_length);
11963
                if (strtolower($namespace) === SIMPLEPIE_NAMESPACE_ITUNES)
11964
                {
11965
                    $namespace = SIMPLEPIE_NAMESPACE_ITUNES;
11966
                }
11967
                // Normalize the Media RSS namespaces
11968
                if ($namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG ||
11969
                    $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2 ||
11970
                    $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3 ||
11971
                    $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4 ||
11972
                    $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5 )
11973
                {
11974
                    $namespace = SIMPLEPIE_NAMESPACE_MEDIARSS;
11975
                }
11976
                $cache[$string] = array($namespace, $local_name);
11977
            }
11978
            else
11979
            {
11980
                $cache[$string] = array('', $string);
11981
            }
11982
        }
11983
        return $cache[$string];
11984
    }
11985
}
11986
class SimplePie_Rating
11987
{
11988
    
11989
    var $scheme;
11990
    
11991
    var $value;
11992
    
11993
    public function __construct($scheme = null, $value = null)
11994
    {
11995
        $this->scheme = $scheme;
11996
        $this->value = $value;
11997
    }
11998
    
11999
    public function __toString()
12000
    {
12001
        // There is no $this->data here
12002
        return md5(serialize($this));
12003
    }
12004
    
12005
    public function get_scheme()
12006
    {
12007
        if ($this->scheme !== null)
12008
        {
12009
            return $this->scheme;
12010
        }
12011
        else
12012
        {
12013
            return null;
12014
        }
12015
    }
12016
    
12017
    public function get_value()
12018
    {
12019
        if ($this->value !== null)
12020
        {
12021
            return $this->value;
12022
        }
12023
        else
12024
        {
12025
            return null;
12026
        }
12027
    }
12028
}
12029
class SimplePie_Registry
12030
{
12031
    
12032
    protected $default = array(
12033
        'Cache' => 'SimplePie_Cache',
12034
        'Locator' => 'SimplePie_Locator',
12035
        'Parser' => 'SimplePie_Parser',
12036
        'File' => 'SimplePie_File',
12037
        'Sanitize' => 'SimplePie_Sanitize',
12038
        'Item' => 'SimplePie_Item',
12039
        'Author' => 'SimplePie_Author',
12040
        'Category' => 'SimplePie_Category',
12041
        'Enclosure' => 'SimplePie_Enclosure',
12042
        'Caption' => 'SimplePie_Caption',
12043
        'Copyright' => 'SimplePie_Copyright',
12044
        'Credit' => 'SimplePie_Credit',
12045
        'Rating' => 'SimplePie_Rating',
12046
        'Restriction' => 'SimplePie_Restriction',
12047
        'Content_Type_Sniffer' => 'SimplePie_Content_Type_Sniffer',
12048
        'Source' => 'SimplePie_Source',
12049
        'Misc' => 'SimplePie_Misc',
12050
        'XML_Declaration_Parser' => 'SimplePie_XML_Declaration_Parser',
12051
        'Parse_Date' => 'SimplePie_Parse_Date',
12052
    );
12053
    
12054
    protected $classes = array();
12055
    
12056
    protected $legacy = array();
12057
    
12058
    public function __construct() { }
12059
    
12060
    public function register($type, $class, $legacy = false)
12061
    {
12062
        if (!is_subclass_of($class, $this->default[$type]))
12063
        {
12064
            return false;
12065
        }
12066
        $this->classes[$type] = $class;
12067
        if ($legacy)
12068
        {
12069
            $this->legacy[] = $class;
12070
        }
12071
        return true;
12072
    }
12073
    
12074
    public function get_class($type)
12075
    {
12076
        if (!empty($this->classes[$type]))
12077
        {
12078
            return $this->classes[$type];
12079
        }
12080
        if (!empty($this->default[$type]))
12081
        {
12082
            return $this->default[$type];
12083
        }
12084
        return null;
12085
    }
12086
    
12087
    public function &create($type, $parameters = array())
12088
    {
12089
        $class = $this->get_class($type);
12090
        if (in_array($class, $this->legacy))
12091
        {
12092
            switch ($type)
12093
            {
12094
                case 'locator':
12095
                    // Legacy: file, timeout, useragent, file_class, max_checked_feeds, content_type_sniffer_class
12096
                    // Specified: file, timeout, useragent, max_checked_feeds
12097
                    $replacement = array($this->get_class('file'), $parameters[3], $this->get_class('content_type_sniffer'));
12098
                    array_splice($parameters, 3, 1, $replacement);
12099
                    break;
12100
            }
12101
        }
12102
        if (!method_exists($class, '__construct'))
12103
        {
12104
            $instance = new $class;
12105
        }
12106
        else
12107
        {
12108
            $reflector = new ReflectionClass($class);
12109
            $instance = $reflector->newInstanceArgs($parameters);
12110
        }
12111
        if (method_exists($instance, 'set_registry'))
12112
        {
12113
            $instance->set_registry($this);
12114
        }
12115
        return $instance;
12116
    }
12117
    
12118
    public function &call($type, $method, $parameters = array())
12119
    {
12120
        $class = $this->get_class($type);
12121
        if (in_array($class, $this->legacy))
12122
        {
12123
            switch ($type)
12124
            {
12125
                case 'Cache':
12126
                    // For backwards compatibility with old non-static
12127
                    // Cache::create() methods
12128
                    if ($method === 'get_handler')
12129
                    {
12130
                        $result = @call_user_func_array(array($class, 'create'), $parameters);
12131
                        return $result;
12132
                    }
12133
                    break;
12134
            }
12135
        }
12136
        $result = call_user_func_array(array($class, $method), $parameters);
12137
        return $result;
12138
    }
12139
}
12140
class SimplePie_Restriction
12141
{
12142
    
12143
    var $relationship;
12144
    
12145
    var $type;
12146
    
12147
    var $value;
12148
    
12149
    public function __construct($relationship = null, $type = null, $value = null)
12150
    {
12151
        $this->relationship = $relationship;
12152
        $this->type = $type;
12153
        $this->value = $value;
12154
    }
12155
    
12156
    public function __toString()
12157
    {
12158
        // There is no $this->data here
12159
        return md5(serialize($this));
12160
    }
12161
    
12162
    public function get_relationship()
12163
    {
12164
        if ($this->relationship !== null)
12165
        {
12166
            return $this->relationship;
12167
        }
12168
        else
12169
        {
12170
            return null;
12171
        }
12172
    }
12173
    
12174
    public function get_type()
12175
    {
12176
        if ($this->type !== null)
12177
        {
12178
            return $this->type;
12179
        }
12180
        else
12181
        {
12182
            return null;
12183
        }
12184
    }
12185
    
12186
    public function get_value()
12187
    {
12188
        if ($this->value !== null)
12189
        {
12190
            return $this->value;
12191
        }
12192
        else
12193
        {
12194
            return null;
12195
        }
12196
    }
12197
}
12198
class SimplePie_Sanitize
12199
{
12200
    // Private vars
12201
    var $base;
12202
    // Options
12203
    var $remove_div = true;
12204
    var $image_handler = '';
12205
    var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
12206
    var $encode_instead_of_strip = false;
12207
    var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
12208
    var $strip_comments = false;
12209
    var $output_encoding = 'UTF-8';
12210
    var $enable_cache = true;
12211
    var $cache_location = './cache';
12212
    var $cache_name_function = 'md5';
12213
    var $timeout = 10;
12214
    var $useragent = '';
12215
    var $force_fsockopen = false;
12216
    var $replace_url_attributes = null;
12217
    public function __construct()
12218
    {
12219
        // Set defaults
12220
        $this->set_url_replacements(null);
12221
    }
12222
    public function remove_div($enable = true)
12223
    {
12224
        $this->remove_div = (bool) $enable;
12225
    }
12226
    public function set_image_handler($page = false)
12227
    {
12228
        if ($page)
12229
        {
12230
            $this->image_handler = (string) $page;
12231
        }
12232
        else
12233
        {
12234
            $this->image_handler = false;
12235
        }
12236
    }
12237
    public function set_registry(SimplePie_Registry $registry)
12238
    {
12239
        $this->registry = $registry;
12240
    }
12241
    public function pass_cache_data($enable_cache = true, $cache_location = './cache', $cache_name_function = 'md5', $cache_class = 'SimplePie_Cache')
12242
    {
12243
        if (isset($enable_cache))
12244
        {
12245
            $this->enable_cache = (bool) $enable_cache;
12246
        }
12247
        if ($cache_location)
12248
        {
12249
            $this->cache_location = (string) $cache_location;
12250
        }
12251
        if ($cache_name_function)
12252
        {
12253
            $this->cache_name_function = (string) $cache_name_function;
12254
        }
12255
    }
12256
    public function pass_file_data($file_class = 'SimplePie_File', $timeout = 10, $useragent = '', $force_fsockopen = false)
12257
    {
12258
        if ($timeout)
12259
        {
12260
            $this->timeout = (string) $timeout;
12261
        }
12262
        if ($useragent)
12263
        {
12264
            $this->useragent = (string) $useragent;
12265
        }
12266
        if ($force_fsockopen)
12267
        {
12268
            $this->force_fsockopen = (string) $force_fsockopen;
12269
        }
12270
    }
12271
    public function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'))
12272
    {
12273
        if ($tags)
12274
        {
12275
            if (is_array($tags))
12276
            {
12277
                $this->strip_htmltags = $tags;
12278
            }
12279
            else
12280
            {
12281
                $this->strip_htmltags = explode(',', $tags);
12282
            }
12283
        }
12284
        else
12285
        {
12286
            $this->strip_htmltags = false;
12287
        }
12288
    }
12289
    public function encode_instead_of_strip($encode = false)
12290
    {
12291
        $this->encode_instead_of_strip = (bool) $encode;
12292
    }
12293
    public function strip_attributes($attribs = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'))
12294
    {
12295
        if ($attribs)
12296
        {
12297
            if (is_array($attribs))
12298
            {
12299
                $this->strip_attributes = $attribs;
12300
            }
12301
            else
12302
            {
12303
                $this->strip_attributes = explode(',', $attribs);
12304
            }
12305
        }
12306
        else
12307
        {
12308
            $this->strip_attributes = false;
12309
        }
12310
    }
12311
    public function strip_comments($strip = false)
12312
    {
12313
        $this->strip_comments = (bool) $strip;
12314
    }
12315
    public function set_output_encoding($encoding = 'UTF-8')
12316
    {
12317
        $this->output_encoding = (string) $encoding;
12318
    }
12319
    
12320
    public function set_url_replacements($element_attribute = null)
12321
    {
12322
        if ($element_attribute === null)
12323
        {
12324
            $element_attribute = array(
12325
                'a' => 'href',
12326
                'area' => 'href',
12327
                'blockquote' => 'cite',
12328
                'del' => 'cite',
12329
                'form' => 'action',
12330
                'img' => array(
12331
                    'longdesc',
12332
                    'src'
12333
                ),
12334
                'input' => 'src',
12335
                'ins' => 'cite',
12336
                'q' => 'cite'
12337
            );
12338
        }
12339
        $this->replace_url_attributes = (array) $element_attribute;
12340
    }
12341
    public function sanitize($data, $type, $base = '')
12342
    {
12343
        $data = trim($data);
12344
        if ($data !== '' || $type & SIMPLEPIE_CONSTRUCT_IRI)
12345
        {
12346
            if ($type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML)
12347
            {
12348
                if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data))
12349
                {
12350
                    $type |= SIMPLEPIE_CONSTRUCT_HTML;
12351
                }
12352
                else
12353
                {
12354
                    $type |= SIMPLEPIE_CONSTRUCT_TEXT;
12355
                }
12356
            }
12357
            if ($type & SIMPLEPIE_CONSTRUCT_BASE64)
12358
            {
12359
                $data = base64_decode($data);
12360
            }
12361
            if ($type & (SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML))
12362
            {
12363
                $document = new DOMDocument();
12364
                $document->encoding = 'UTF-8';
12365
                $data = $this->preprocess($data, $type);
12366
                set_error_handler(array('SimplePie_Misc', 'silence_errors'));
12367
                $document->loadHTML($data);
12368
                restore_error_handler();
12369
                // Strip comments
12370
                if ($this->strip_comments)
12371
                {
12372
                    $xpath = new DOMXPath($document);
12373
                    $comments = $xpath->query('//comment()');
12374
                    foreach ($comments as $comment)
12375
                    {
12376
                        $comment->parentNode->removeChild($comment);
12377
                    }
12378
                }
12379
                // Strip out HTML tags and attributes that might cause various security problems.
12380
                // Based on recommendations by Mark Pilgrim at:
12381
                // http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely
12382
                if ($this->strip_htmltags)
12383
                {
12384
                    foreach ($this->strip_htmltags as $tag)
12385
                    {
12386
                        $this->strip_tag($tag, $document, $type);
12387
                    }
12388
                }
12389
                if ($this->strip_attributes)
12390
                {
12391
                    foreach ($this->strip_attributes as $attrib)
12392
                    {
12393
                        $this->strip_attr($attrib, $document);
12394
                    }
12395
                }
12396
                // Replace relative URLs
12397
                $this->base = $base;
12398
                foreach ($this->replace_url_attributes as $element => $attributes)
12399
                {
12400
                    $this->replace_urls($document, $element, $attributes);
12401
                }
12402
                // If image handling (caching, etc.) is enabled, cache and rewrite all the image tags.
12403
                if (isset($this->image_handler) && ((string) $this->image_handler) !== '' && $this->enable_cache)
12404
                {
12405
                    $images = $document->getElementsByTagName('img');
12406
                    foreach ($images as $img)
12407
                    {
12408
                        if ($img->hasAttribute('src'))
12409
                        {
12410
                            $image_url = call_user_func($this->cache_name_function, $img->getAttribute('src'));
12411
                            $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, $image_url, 'spi'));
12412
                            if ($cache->load())
12413
                            {
12414
                                $img->setAttribute('src', $this->image_handler . $image_url);
12415
                            }
12416
                            else
12417
                            {
12418
                                $file = $this->registry->create('File', array($img['attribs']['src']['data'], $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen));
12419
                                $headers = $file->headers;
12420
                                if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
12421
                                {
12422
                                    if ($cache->save(array('headers' => $file->headers, 'body' => $file->body)))
12423
                                    {
12424
                                        $img->setAttribute('src', $this->image_handler . $image_url);
12425
                                    }
12426
                                    else
12427
                                    {
12428
                                        trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
12429
                                    }
12430
                                }
12431
                            }
12432
                        }
12433
                    }
12434
                }
12435
                // Remove the DOCTYPE
12436
                // Seems to cause segfaulting if we don't do this
12437
                if ($document->firstChild instanceof DOMDocumentType)
12438
                {
12439
                    $document->removeChild($document->firstChild);
12440
                }
12441
                // Move everything from the body to the root
12442
                $real_body = $document->getElementsByTagName('body')->item(0)->childNodes->item(0);
12443
                $document->replaceChild($real_body, $document->firstChild);
12444
                // Finally, convert to a HTML string
12445
                $data = trim($document->saveHTML());
12446
                if ($this->remove_div)
12447
                {
12448
                    $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '', $data);
12449
                    $data = preg_replace('/<\/div>$/', '', $data);
12450
                }
12451
                else
12452
                {
12453
                    $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '<div>', $data);
12454
                }
12455
            }
12456
            if ($type & SIMPLEPIE_CONSTRUCT_IRI)
12457
            {
12458
                $absolute = $this->registry->call('Misc', 'absolutize_url', array($data, $base));
12459
                if ($absolute !== false)
12460
                {
12461
                    $data = $absolute;
12462
                }
12463
            }
12464
            if ($type & (SIMPLEPIE_CONSTRUCT_TEXT | SIMPLEPIE_CONSTRUCT_IRI))
12465
            {
12466
                $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8');
12467
            }
12468
            if ($this->output_encoding !== 'UTF-8')
12469
            {
12470
                $data = $this->registry->call('Misc', 'change_encoding', array($data, 'UTF-8', $this->output_encoding));
12471
            }
12472
        }
12473
        return $data;
12474
    }
12475
    protected function preprocess($html, $type)
12476
    {
12477
        $ret = '';
12478
        if ($type & ~SIMPLEPIE_CONSTRUCT_XHTML)
12479
        {
12480
            // Atom XHTML constructs are wrapped with a div by default
12481
            // Note: No protection if $html contains a stray </div>!
12482
            $html = '<div>' . $html . '</div>';
12483
            $ret .= '<!DOCTYPE html>';
12484
            $content_type = 'text/html';
12485
        }
12486
        else
12487
        {
12488
            $ret .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
12489
            $content_type = 'application/xhtml+xml';
12490
        }
12491
        $ret .= '<html><head>';
12492
        $ret .= '<meta http-equiv="Content-Type" content="' . $content_type . '; charset=utf-8" />';
12493
        $ret .= '</head><body>' . $html . '</body></html>';
12494
        return $ret;
12495
    }
12496
    public function replace_urls($document, $tag, $attributes)
12497
    {
12498
        if (!is_array($attributes))
12499
        {
12500
            $attributes = array($attributes);
12501
        }
12502
        if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags))
12503
        {
12504
            $elements = $document->getElementsByTagName($tag);
12505
            foreach ($elements as $element)
12506
            {
12507
                foreach ($attributes as $attribute)
12508
                {
12509
                    if ($element->hasAttribute($attribute))
12510
                    {
12511
                        $value = $this->registry->call('Misc', 'absolutize_url', array($element->getAttribute($attribute), $this->base));
12512
                        if ($value !== false)
12513
                        {
12514
                            $element->setAttribute($attribute, $value);
12515
                        }
12516
                    }
12517
                }
12518
            }
12519
        }
12520
    }
12521
    public function do_strip_htmltags($match)
12522
    {
12523
        if ($this->encode_instead_of_strip)
12524
        {
12525
            if (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))
12526
            {
12527
                $match[1] = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8');
12528
                $match[2] = htmlspecialchars($match[2], ENT_COMPAT, 'UTF-8');
12529
                return "&lt;$match[1]$match[2]&gt;$match[3]&lt;/$match[1]&gt;";
12530
            }
12531
            else
12532
            {
12533
                return htmlspecialchars($match[0], ENT_COMPAT, 'UTF-8');
12534
            }
12535
        }
12536
        elseif (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style')))
12537
        {
12538
            return $match[4];
12539
        }
12540
        else
12541
        {
12542
            return '';
12543
        }
12544
    }
12545
    protected function strip_tag($tag, $document, $type)
12546
    {
12547
        $xpath = new DOMXPath($document);
12548
        $elements = $xpath->query('body//' . $tag);
12549
        if ($this->encode_instead_of_strip)
12550
        {
12551
            foreach ($elements as $element)
12552
            {
12553
                $fragment = $document->createDocumentFragment();
12554
                // For elements which aren't script or style, include the tag itself
12555
                if (!in_array($tag, array('script', 'style')))
12556
                {
12557
                    $text = '<' . $tag;
12558
                    if ($element->hasAttributes())
12559
                    {
12560
                        $attrs = array();
12561
                        foreach ($element->attributes as $name => $attr)
12562
                        {
12563
                            $value = $attr->value;
12564
                            // In XHTML, empty values should never exist, so we repeat the value
12565
                            if (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_XHTML))
12566
                            {
12567
                                $value = $name;
12568
                            }
12569
                            // For HTML, empty is fine
12570
                            elseif (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_HTML))
12571
                            {
12572
                                $attrs[] = $name;
12573
                                continue;
12574
                            }
12575
                            // Standard attribute text
12576
                            $attrs[] = $name . '="' . $attr->value . '"';
12577
                        }
12578
                        $text .= ' ' . implode(' ', $attrs);
12579
                    }
12580
                    $text .= '>';
12581
                    $fragment->appendChild(new DOMText($text));
12582
                }
12583
                $number = $element->childNodes->length;
12584
                for ($i = $number; $i > 0; $i--)
12585
                {
12586
                    $child = $element->childNodes->item(0);
12587
                    $fragment->appendChild($child);
12588
                }
12589
                if (!in_array($tag, array('script', 'style')))
12590
                {
12591
                    $fragment->appendChild(new DOMText('</' . $tag . '>'));
12592
                }
12593
                $element->parentNode->replaceChild($fragment, $element);
12594
            }
12595
            return;
12596
        }
12597
        elseif (in_array($tag, array('script', 'style')))
12598
        {
12599
            foreach ($elements as $element)
12600
            {
12601
                $element->parentNode->removeChild($element);
12602
            }
12603
            return;
12604
        }
12605
        else
12606
        {
12607
            foreach ($elements as $element)
12608
            {
12609
                $fragment = $document->createDocumentFragment();
12610
                $number = $element->childNodes->length;
12611
                for ($i = $number; $i > 0; $i--)
12612
                {
12613
                    $child = $element->childNodes->item(0);
12614
                    $fragment->appendChild($child);
12615
                }
12616
                $element->parentNode->replaceChild($fragment, $element);
12617
            }
12618
        }
12619
    }
12620
    protected function strip_attr($attrib, $document)
12621
    {
12622
        $xpath = new DOMXPath($document);
12623
        $elements = $xpath->query('//*[@' . $attrib . ']');
12624
        foreach ($elements as $element)
12625
        {
12626
            $element->removeAttribute($attrib);
12627
        }
12628
    }
12629
}
12630
class SimplePie_Source
12631
{
12632
    var $item;
12633
    var $data = array();
12634
    protected $registry;
12635
    public function __construct($item, $data)
12636
    {
12637
        $this->item = $item;
12638
        $this->data = $data;
12639
    }
12640
    public function set_registry(SimplePie_Registry $registry)
12641
    {
12642
        $this->registry = $registry;
12643
    }
12644
    public function __toString()
12645
    {
12646
        return md5(serialize($this->data));
12647
    }
12648
    public function get_source_tags($namespace, $tag)
12649
    {
12650
        if (isset($this->data['child'][$namespace][$tag]))
12651
        {
12652
            return $this->data['child'][$namespace][$tag];
12653
        }
12654
        else
12655
        {
12656
            return null;
12657
        }
12658
    }
12659
    public function get_base($element = array())
12660
    {
12661
        return $this->item->get_base($element);
12662
    }
12663
    public function sanitize($data, $type, $base = '')
12664
    {
12665
        return $this->item->sanitize($data, $type, $base);
12666
    }
12667
    public function get_item()
12668
    {
12669
        return $this->item;
12670
    }
12671
    public function get_title()
12672
    {
12673
        if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
12674
        {
12675
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
12676
        }
12677
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
12678
        {
12679
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
12680
        }
12681
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
12682
        {
12683
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
12684
        }
12685
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
12686
        {
12687
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
12688
        }
12689
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
12690
        {
12691
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
12692
        }
12693
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
12694
        {
12695
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
12696
        }
12697
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
12698
        {
12699
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
12700
        }
12701
        else
12702
        {
12703
            return null;
12704
        }
12705
    }
12706
    public function get_category($key = 0)
12707
    {
12708
        $categories = $this->get_categories();
12709
        if (isset($categories[$key]))
12710
        {
12711
            return $categories[$key];
12712
        }
12713
        else
12714
        {
12715
            return null;
12716
        }
12717
    }
12718
    public function get_categories()
12719
    {
12720
        $categories = array();
12721
        foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
12722
        {
12723
            $term = null;
12724
            $scheme = null;
12725
            $label = null;
12726
            if (isset($category['attribs']['']['term']))
12727
            {
12728
                $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
12729
            }
12730
            if (isset($category['attribs']['']['scheme']))
12731
            {
12732
                $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
12733
            }
12734
            if (isset($category['attribs']['']['label']))
12735
            {
12736
                $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
12737
            }
12738
            $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
12739
        }
12740
        foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
12741
        {
12742
            // This is really the label, but keep this as the term also for BC.
12743
            // Label will also work on retrieving because that falls back to term.
12744
            $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
12745
            if (isset($category['attribs']['']['domain']))
12746
            {
12747
                $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
12748
            }
12749
            else
12750
            {
12751
                $scheme = null;
12752
            }
12753
            $categories[] = $this->registry->create('Category', array($term, $scheme, null));
12754
        }
12755
        foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
12756
        {
12757
            $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
12758
        }
12759
        foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
12760
        {
12761
            $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
12762
        }
12763
        if (!empty($categories))
12764
        {
12765
            return array_unique($categories);
12766
        }
12767
        else
12768
        {
12769
            return null;
12770
        }
12771
    }
12772
    public function get_author($key = 0)
12773
    {
12774
        $authors = $this->get_authors();
12775
        if (isset($authors[$key]))
12776
        {
12777
            return $authors[$key];
12778
        }
12779
        else
12780
        {
12781
            return null;
12782
        }
12783
    }
12784
    public function get_authors()
12785
    {
12786
        $authors = array();
12787
        foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
12788
        {
12789
            $name = null;
12790
            $uri = null;
12791
            $email = null;
12792
            if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
12793
            {
12794
                $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
12795
            }
12796
            if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
12797
            {
12798
                $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
12799
            }
12800
            if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
12801
            {
12802
                $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
12803
            }
12804
            if ($name !== null || $email !== null || $uri !== null)
12805
            {
12806
                $authors[] = $this->registry->create('Author', array($name, $uri, $email));
12807
            }
12808
        }
12809
        if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
12810
        {
12811
            $name = null;
12812
            $url = null;
12813
            $email = null;
12814
            if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
12815
            {
12816
                $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
12817
            }
12818
            if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
12819
            {
12820
                $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
12821
            }
12822
            if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
12823
            {
12824
                $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
12825
            }
12826
            if ($name !== null || $email !== null || $url !== null)
12827
            {
12828
                $authors[] = $this->registry->create('Author', array($name, $url, $email));
12829
            }
12830
        }
12831
        foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
12832
        {
12833
            $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
12834
        }
12835
        foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
12836
        {
12837
            $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
12838
        }
12839
        foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
12840
        {
12841
            $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
12842
        }
12843
        if (!empty($authors))
12844
        {
12845
            return array_unique($authors);
12846
        }
12847
        else
12848
        {
12849
            return null;
12850
        }
12851
    }
12852
    public function get_contributor($key = 0)
12853
    {
12854
        $contributors = $this->get_contributors();
12855
        if (isset($contributors[$key]))
12856
        {
12857
            return $contributors[$key];
12858
        }
12859
        else
12860
        {
12861
            return null;
12862
        }
12863
    }
12864
    public function get_contributors()
12865
    {
12866
        $contributors = array();
12867
        foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
12868
        {
12869
            $name = null;
12870
            $uri = null;
12871
            $email = null;
12872
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
12873
            {
12874
                $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
12875
            }
12876
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
12877
            {
12878
                $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
12879
            }
12880
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
12881
            {
12882
                $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
12883
            }
12884
            if ($name !== null || $email !== null || $uri !== null)
12885
            {
12886
                $contributors[] = $this->registry->create('Author', array($name, $uri, $email));
12887
            }
12888
        }
12889
        foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
12890
        {
12891
            $name = null;
12892
            $url = null;
12893
            $email = null;
12894
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
12895
            {
12896
                $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
12897
            }
12898
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
12899
            {
12900
                $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
12901
            }
12902
            if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
12903
            {
12904
                $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
12905
            }
12906
            if ($name !== null || $email !== null || $url !== null)
12907
            {
12908
                $contributors[] = $this->registry->create('Author', array($name, $url, $email));
12909
            }
12910
        }
12911
        if (!empty($contributors))
12912
        {
12913
            return array_unique($contributors);
12914
        }
12915
        else
12916
        {
12917
            return null;
12918
        }
12919
    }
12920
    public function get_link($key = 0, $rel = 'alternate')
12921
    {
12922
        $links = $this->get_links($rel);
12923
        if (isset($links[$key]))
12924
        {
12925
            return $links[$key];
12926
        }
12927
        else
12928
        {
12929
            return null;
12930
        }
12931
    }
12932
    
12933
    public function get_permalink()
12934
    {
12935
        return $this->get_link(0);
12936
    }
12937
    public function get_links($rel = 'alternate')
12938
    {
12939
        if (!isset($this->data['links']))
12940
        {
12941
            $this->data['links'] = array();
12942
            if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link'))
12943
            {
12944
                foreach ($links as $link)
12945
                {
12946
                    if (isset($link['attribs']['']['href']))
12947
                    {
12948
                        $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
12949
                        $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
12950
                    }
12951
                }
12952
            }
12953
            if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link'))
12954
            {
12955
                foreach ($links as $link)
12956
                {
12957
                    if (isset($link['attribs']['']['href']))
12958
                    {
12959
                        $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
12960
                        $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
12961
                    }
12962
                }
12963
            }
12964
            if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
12965
            {
12966
                $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
12967
            }
12968
            if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
12969
            {
12970
                $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
12971
            }
12972
            if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
12973
            {
12974
                $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
12975
            }
12976
            $keys = array_keys($this->data['links']);
12977
            foreach ($keys as $key)
12978
            {
12979
                if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))
12980
                {
12981
                    if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
12982
                    {
12983
                        $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
12984
                        $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
12985
                    }
12986
                    else
12987
                    {
12988
                        $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
12989
                    }
12990
                }
12991
                elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
12992
                {
12993
                    $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
12994
                }
12995
                $this->data['links'][$key] = array_unique($this->data['links'][$key]);
12996
            }
12997
        }
12998
        if (isset($this->data['links'][$rel]))
12999
        {
13000
            return $this->data['links'][$rel];
13001
        }
13002
        else
13003
        {
13004
            return null;
13005
        }
13006
    }
13007
    public function get_description()
13008
    {
13009
        if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
13010
        {
13011
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
13012
        }
13013
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
13014
        {
13015
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
13016
        }
13017
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
13018
        {
13019
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
13020
        }
13021
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
13022
        {
13023
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
13024
        }
13025
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
13026
        {
13027
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
13028
        }
13029
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
13030
        {
13031
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
13032
        }
13033
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
13034
        {
13035
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
13036
        }
13037
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
13038
        {
13039
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
13040
        }
13041
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
13042
        {
13043
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
13044
        }
13045
        else
13046
        {
13047
            return null;
13048
        }
13049
    }
13050
    public function get_copyright()
13051
    {
13052
        if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
13053
        {
13054
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
13055
        }
13056
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
13057
        {
13058
            return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
13059
        }
13060
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright'))
13061
        {
13062
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
13063
        }
13064
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
13065
        {
13066
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
13067
        }
13068
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
13069
        {
13070
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
13071
        }
13072
        else
13073
        {
13074
            return null;
13075
        }
13076
    }
13077
    public function get_language()
13078
    {
13079
        if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language'))
13080
        {
13081
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
13082
        }
13083
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language'))
13084
        {
13085
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
13086
        }
13087
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language'))
13088
        {
13089
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
13090
        }
13091
        elseif (isset($this->data['xml_lang']))
13092
        {
13093
            return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT);
13094
        }
13095
        else
13096
        {
13097
            return null;
13098
        }
13099
    }
13100
    public function get_latitude()
13101
    {
13102
        if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
13103
        {
13104
            return (float) $return[0]['data'];
13105
        }
13106
        elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
13107
        {
13108
            return (float) $match[1];
13109
        }
13110
        else
13111
        {
13112
            return null;
13113
        }
13114
    }
13115
    public function get_longitude()
13116
    {
13117
        if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
13118
        {
13119
            return (float) $return[0]['data'];
13120
        }
13121
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon'))
13122
        {
13123
            return (float) $return[0]['data'];
13124
        }
13125
        elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match))
13126
        {
13127
            return (float) $match[2];
13128
        }
13129
        else
13130
        {
13131
            return null;
13132
        }
13133
    }
13134
    public function get_image_url()
13135
    {
13136
        if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
13137
        {
13138
            return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI);
13139
        }
13140
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo'))
13141
        {
13142
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
13143
        }
13144
        elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
13145
        {
13146
            return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
13147
        }
13148
        else
13149
        {
13150
            return null;
13151
        }
13152
    }
13153
}
13154
class SimplePie_XML_Declaration_Parser
13155
{
13156
    
13157
    var $version = '1.0';
13158
    
13159
    var $encoding = 'UTF-8';
13160
    
13161
    var $standalone = false;
13162
    
13163
    var $state = 'before_version_name';
13164
    
13165
    var $data = '';
13166
    
13167
    var $data_length = 0;
13168
    
13169
    var $position = 0;
13170
    
13171
    public function __construct($data)
13172
    {
13173
        $this->data = $data;
13174
        $this->data_length = strlen($this->data);
13175
    }
13176
    
13177
    public function parse()
13178
    {
13179
        while ($this->state && $this->state !== 'emit' && $this->has_data())
13180
        {
13181
            $state = $this->state;
13182
            $this->$state();
13183
        }
13184
        $this->data = '';
13185
        if ($this->state === 'emit')
13186
        {
13187
            return true;
13188
        }
13189
        else
13190
        {
13191
            $this->version = '';
13192
            $this->encoding = '';
13193
            $this->standalone = '';
13194
            return false;
13195
        }
13196
    }
13197
    
13198
    public function has_data()
13199
    {
13200
        return (bool) ($this->position < $this->data_length);
13201
    }
13202
    
13203
    public function skip_whitespace()
13204
    {
13205
        $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position);
13206
        $this->position += $whitespace;
13207
        return $whitespace;
13208
    }
13209
    
13210
    public function get_value()
13211
    {
13212
        $quote = substr($this->data, $this->position, 1);
13213
        if ($quote === '"' || $quote === "'")
13214
        {
13215
            $this->position++;
13216
            $len = strcspn($this->data, $quote, $this->position);
13217
            if ($this->has_data())
13218
            {
13219
                $value = substr($this->data, $this->position, $len);
13220
                $this->position += $len + 1;
13221
                return $value;
13222
            }
13223
        }
13224
        return false;
13225
    }
13226
    public function before_version_name()
13227
    {
13228
        if ($this->skip_whitespace())
13229
        {
13230
            $this->state = 'version_name';
13231
        }
13232
        else
13233
        {
13234
            $this->state = false;
13235
        }
13236
    }
13237
    public function version_name()
13238
    {
13239
        if (substr($this->data, $this->position, 7) === 'version')
13240
        {
13241
            $this->position += 7;
13242
            $this->skip_whitespace();
13243
            $this->state = 'version_equals';
13244
        }
13245
        else
13246
        {
13247
            $this->state = false;
13248
        }
13249
    }
13250
    public function version_equals()
13251
    {
13252
        if (substr($this->data, $this->position, 1) === '=')
13253
        {
13254
            $this->position++;
13255
            $this->skip_whitespace();
13256
            $this->state = 'version_value';
13257
        }
13258
        else
13259
        {
13260
            $this->state = false;
13261
        }
13262
    }
13263
    public function version_value()
13264
    {
13265
        if ($this->version = $this->get_value())
13266
        {
13267
            $this->skip_whitespace();
13268
            if ($this->has_data())
13269
            {
13270
                $this->state = 'encoding_name';
13271
            }
13272
            else
13273
            {
13274
                $this->state = 'emit';
13275
            }
13276
        }
13277
        else
13278
        {
13279
            $this->state = false;
13280
        }
13281
    }
13282
    public function encoding_name()
13283
    {
13284
        if (substr($this->data, $this->position, 8) === 'encoding')
13285
        {
13286
            $this->position += 8;
13287
            $this->skip_whitespace();
13288
            $this->state = 'encoding_equals';
13289
        }
13290
        else
13291
        {
13292
            $this->state = 'standalone_name';
13293
        }
13294
    }
13295
    public function encoding_equals()
13296
    {
13297
        if (substr($this->data, $this->position, 1) === '=')
13298
        {
13299
            $this->position++;
13300
            $this->skip_whitespace();
13301
            $this->state = 'encoding_value';
13302
        }
13303
        else
13304
        {
13305
            $this->state = false;
13306
        }
13307
    }
13308
    public function encoding_value()
13309
    {
13310
        if ($this->encoding = $this->get_value())
13311
        {
13312
            $this->skip_whitespace();
13313
            if ($this->has_data())
13314
            {
13315
                $this->state = 'standalone_name';
13316
            }
13317
            else
13318
            {
13319
                $this->state = 'emit';
13320
            }
13321
        }
13322
        else
13323
        {
13324
            $this->state = false;
13325
        }
13326
    }
13327
    public function standalone_name()
13328
    {
13329
        if (substr($this->data, $this->position, 10) === 'standalone')
13330
        {
13331
            $this->position += 10;
13332
            $this->skip_whitespace();
13333
            $this->state = 'standalone_equals';
13334
        }
13335
        else
13336
        {
13337
            $this->state = false;
13338
        }
13339
    }
13340
    public function standalone_equals()
13341
    {
13342
        if (substr($this->data, $this->position, 1) === '=')
13343
        {
13344
            $this->position++;
13345
            $this->skip_whitespace();
13346
            $this->state = 'standalone_value';
13347
        }
13348
        else
13349
        {
13350
            $this->state = false;
13351
        }
13352
    }
13353
    public function standalone_value()
13354
    {
13355
        if ($standalone = $this->get_value())
13356
        {
13357
            switch ($standalone)
13358
            {
13359
                case 'yes':
13360
                    $this->standalone = true;
13361
                    break;
13362
                case 'no':
13363
                    $this->standalone = false;
13364
                    break;
13365
                default:
13366
                    $this->state = false;
13367
                    return;
13368
            }
13369
            $this->skip_whitespace();
13370
            if ($this->has_data())
13371
            {
13372
                $this->state = false;
13373
            }
13374
            else
13375
            {
13376
                $this->state = 'emit';
13377
            }
13378
        }
13379
        else
13380
        {
13381
            $this->state = false;
13382
        }
13383
    }
13384
}