1 <?php
   2 /**
   3  * SimplePie
   4  *
   5  * A PHP-Based RSS and Atom Feed Framework.
   6  * Takes the hard work out of managing a complete RSS/Atom solution.
   7  *
   8  * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
   9  * All rights reserved.
  10  *
  11  * Redistribution and use in source and binary forms, with or without modification, are
  12  * permitted provided that the following conditions are met:
  13  *
  14  *  * Redistributions of source code must retain the above copyright notice, this list of
  15  *    conditions and the following disclaimer.
  16  *
  17  *  * Redistributions in binary form must reproduce the above copyright notice, this list
  18  *    of conditions and the following disclaimer in the documentation and/or other materials
  19  *    provided with the distribution.
  20  *
  21  *  * Neither the name of the SimplePie Team nor the names of its contributors may be used
  22  *    to endorse or promote products derived from this software without specific prior
  23  *    written permission.
  24  *
  25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
  26  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  27  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
  28  * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  29  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  30  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  32  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  33  * POSSIBILITY OF SUCH DAMAGE.
  34  *
  35  * @package SimplePie
  36  * @version 1.3.1
  37  * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
  38  * @author Ryan Parman
  39  * @author Geoffrey Sneddon
  40  * @author Ryan McCue
  41  * @link http://simplepie.org/ SimplePie
  42  * @license http://www.opensource.org/licenses/bsd-license.php BSD License
  43  */
  44 
  45 /**
  46  * Handles everything related to enclosures (including Media RSS and iTunes RSS)
  47  *
  48  * Used by {@see SimplePie_Item::get_enclosure()} and {@see SimplePie_Item::get_enclosures()}
  49  *
  50  * This class can be overloaded with {@see SimplePie::set_enclosure_class()}
  51  *
  52  * @package SimplePie
  53  * @subpackage API
  54  */
  55 class SimplePie_Enclosure
  56 {
  57     /**
  58      * @var string
  59      * @see get_bitrate()
  60      */
  61     var $bitrate;
  62 
  63     /**
  64      * @var array
  65      * @see get_captions()
  66      */
  67     var $captions;
  68 
  69     /**
  70      * @var array
  71      * @see get_categories()
  72      */
  73     var $categories;
  74 
  75     /**
  76      * @var int
  77      * @see get_channels()
  78      */
  79     var $channels;
  80 
  81     /**
  82      * @var SimplePie_Copyright
  83      * @see get_copyright()
  84      */
  85     var $copyright;
  86 
  87     /**
  88      * @var array
  89      * @see get_credits()
  90      */
  91     var $credits;
  92 
  93     /**
  94      * @var string
  95      * @see get_description()
  96      */
  97     var $description;
  98 
  99     /**
 100      * @var int
 101      * @see get_duration()
 102      */
 103     var $duration;
 104 
 105     /**
 106      * @var string
 107      * @see get_expression()
 108      */
 109     var $expression;
 110 
 111     /**
 112      * @var string
 113      * @see get_framerate()
 114      */
 115     var $framerate;
 116 
 117     /**
 118      * @var string
 119      * @see get_handler()
 120      */
 121     var $handler;
 122 
 123     /**
 124      * @var array
 125      * @see get_hashes()
 126      */
 127     var $hashes;
 128 
 129     /**
 130      * @var string
 131      * @see get_height()
 132      */
 133     var $height;
 134 
 135     /**
 136      * @deprecated
 137      * @var null
 138      */
 139     var $javascript;
 140 
 141     /**
 142      * @var array
 143      * @see get_keywords()
 144      */
 145     var $keywords;
 146 
 147     /**
 148      * @var string
 149      * @see get_language()
 150      */
 151     var $lang;
 152 
 153     /**
 154      * @var string
 155      * @see get_length()
 156      */
 157     var $length;
 158 
 159     /**
 160      * @var string
 161      * @see get_link()
 162      */
 163     var $link;
 164 
 165     /**
 166      * @var string
 167      * @see get_medium()
 168      */
 169     var $medium;
 170 
 171     /**
 172      * @var string
 173      * @see get_player()
 174      */
 175     var $player;
 176 
 177     /**
 178      * @var array
 179      * @see get_ratings()
 180      */
 181     var $ratings;
 182 
 183     /**
 184      * @var array
 185      * @see get_restrictions()
 186      */
 187     var $restrictions;
 188 
 189     /**
 190      * @var string
 191      * @see get_sampling_rate()
 192      */
 193     var $samplingrate;
 194 
 195     /**
 196      * @var array
 197      * @see get_thumbnails()
 198      */
 199     var $thumbnails;
 200 
 201     /**
 202      * @var string
 203      * @see get_title()
 204      */
 205     var $title;
 206 
 207     /**
 208      * @var string
 209      * @see get_type()
 210      */
 211     var $type;
 212 
 213     /**
 214      * @var string
 215      * @see get_width()
 216      */
 217     var $width;
 218 
 219     /**
 220      * Constructor, used to input the data
 221      *
 222      * For documentation on all the parameters, see the corresponding
 223      * properties and their accessors
 224      *
 225      * @uses idna_convert If available, this will convert an IDN
 226      */
 227     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)
 228     {
 229         $this->bitrate = $bitrate;
 230         $this->captions = $captions;
 231         $this->categories = $categories;
 232         $this->channels = $channels;
 233         $this->copyright = $copyright;
 234         $this->credits = $credits;
 235         $this->description = $description;
 236         $this->duration = $duration;
 237         $this->expression = $expression;
 238         $this->framerate = $framerate;
 239         $this->hashes = $hashes;
 240         $this->height = $height;
 241         $this->keywords = $keywords;
 242         $this->lang = $lang;
 243         $this->length = $length;
 244         $this->link = $link;
 245         $this->medium = $medium;
 246         $this->player = $player;
 247         $this->ratings = $ratings;
 248         $this->restrictions = $restrictions;
 249         $this->samplingrate = $samplingrate;
 250         $this->thumbnails = $thumbnails;
 251         $this->title = $title;
 252         $this->type = $type;
 253         $this->width = $width;
 254 
 255         if (class_exists('idna_convert'))
 256         {
 257             $idn = new idna_convert();
 258             $parsed = SimplePie_Misc::parse_url($link);
 259             $this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']);
 260         }
 261         $this->handler = $this->get_handler(); // Needs to load last
 262     }
 263 
 264     /**
 265      * String-ified version
 266      *
 267      * @return string
 268      */
 269     public function __toString()
 270     {
 271         // There is no $this->data here
 272         return md5(serialize($this));
 273     }
 274 
 275     /**
 276      * Get the bitrate
 277      *
 278      * @return string|null
 279      */
 280     public function get_bitrate()
 281     {
 282         if ($this->bitrate !== null)
 283         {
 284             return $this->bitrate;
 285         }
 286         else
 287         {
 288             return null;
 289         }
 290     }
 291 
 292     /**
 293      * Get a single caption
 294      *
 295      * @param int $key
 296      * @return SimplePie_Caption|null
 297      */
 298     public function get_caption($key = 0)
 299     {
 300         $captions = $this->get_captions();
 301         if (isset($captions[$key]))
 302         {
 303             return $captions[$key];
 304         }
 305         else
 306         {
 307             return null;
 308         }
 309     }
 310 
 311     /**
 312      * Get all captions
 313      *
 314      * @return array|null Array of {@see SimplePie_Caption} objects
 315      */
 316     public function get_captions()
 317     {
 318         if ($this->captions !== null)
 319         {
 320             return $this->captions;
 321         }
 322         else
 323         {
 324             return null;
 325         }
 326     }
 327 
 328     /**
 329      * Get a single category
 330      *
 331      * @param int $key
 332      * @return SimplePie_Category|null
 333      */
 334     public function get_category($key = 0)
 335     {
 336         $categories = $this->get_categories();
 337         if (isset($categories[$key]))
 338         {
 339             return $categories[$key];
 340         }
 341         else
 342         {
 343             return null;
 344         }
 345     }
 346 
 347     /**
 348      * Get all categories
 349      *
 350      * @return array|null Array of {@see SimplePie_Category} objects
 351      */
 352     public function get_categories()
 353     {
 354         if ($this->categories !== null)
 355         {
 356             return $this->categories;
 357         }
 358         else
 359         {
 360             return null;
 361         }
 362     }
 363 
 364     /**
 365      * Get the number of audio channels
 366      *
 367      * @return int|null
 368      */
 369     public function get_channels()
 370     {
 371         if ($this->channels !== null)
 372         {
 373             return $this->channels;
 374         }
 375         else
 376         {
 377             return null;
 378         }
 379     }
 380 
 381     /**
 382      * Get the copyright information
 383      *
 384      * @return SimplePie_Copyright|null
 385      */
 386     public function get_copyright()
 387     {
 388         if ($this->copyright !== null)
 389         {
 390             return $this->copyright;
 391         }
 392         else
 393         {
 394             return null;
 395         }
 396     }
 397 
 398     /**
 399      * Get a single credit
 400      *
 401      * @param int $key
 402      * @return SimplePie_Credit|null
 403      */
 404     public function get_credit($key = 0)
 405     {
 406         $credits = $this->get_credits();
 407         if (isset($credits[$key]))
 408         {
 409             return $credits[$key];
 410         }
 411         else
 412         {
 413             return null;
 414         }
 415     }
 416 
 417     /**
 418      * Get all credits
 419      *
 420      * @return array|null Array of {@see SimplePie_Credit} objects
 421      */
 422     public function get_credits()
 423     {
 424         if ($this->credits !== null)
 425         {
 426             return $this->credits;
 427         }
 428         else
 429         {
 430             return null;
 431         }
 432     }
 433 
 434     /**
 435      * Get the description of the enclosure
 436      *
 437      * @return string|null
 438      */
 439     public function get_description()
 440     {
 441         if ($this->description !== null)
 442         {
 443             return $this->description;
 444         }
 445         else
 446         {
 447             return null;
 448         }
 449     }
 450 
 451     /**
 452      * Get the duration of the enclosure
 453      *
 454      * @param string $convert Convert seconds into hh:mm:ss
 455      * @return string|int|null 'hh:mm:ss' string if `$convert` was specified, otherwise integer (or null if none found)
 456      */
 457     public function get_duration($convert = false)
 458     {
 459         if ($this->duration !== null)
 460         {
 461             if ($convert)
 462             {
 463                 $time = SimplePie_Misc::time_hms($this->duration);
 464                 return $time;
 465             }
 466             else
 467             {
 468                 return $this->duration;
 469             }
 470         }
 471         else
 472         {
 473             return null;
 474         }
 475     }
 476 
 477     /**
 478      * Get the expression
 479      *
 480      * @return string Probably one of 'sample', 'full', 'nonstop', 'clip'. Defaults to 'full'
 481      */
 482     public function get_expression()
 483     {
 484         if ($this->expression !== null)
 485         {
 486             return $this->expression;
 487         }
 488         else
 489         {
 490             return 'full';
 491         }
 492     }
 493 
 494     /**
 495      * Get the file extension
 496      *
 497      * @return string|null
 498      */
 499     public function get_extension()
 500     {
 501         if ($this->link !== null)
 502         {
 503             $url = SimplePie_Misc::parse_url($this->link);
 504             if ($url['path'] !== '')
 505             {
 506                 return pathinfo($url['path'], PATHINFO_EXTENSION);
 507             }
 508         }
 509         return null;
 510     }
 511 
 512     /**
 513      * Get the framerate (in frames-per-second)
 514      *
 515      * @return string|null
 516      */
 517     public function get_framerate()
 518     {
 519         if ($this->framerate !== null)
 520         {
 521             return $this->framerate;
 522         }
 523         else
 524         {
 525             return null;
 526         }
 527     }
 528 
 529     /**
 530      * Get the preferred handler
 531      *
 532      * @return string|null One of 'flash', 'fmedia', 'quicktime', 'wmedia', 'mp3'
 533      */
 534     public function get_handler()
 535     {
 536         return $this->get_real_type(true);
 537     }
 538 
 539     /**
 540      * Get a single hash
 541      *
 542      * @link http://www.rssboard.org/media-rss#media-hash
 543      * @param int $key
 544      * @return string|null Hash as per `media:hash`, prefixed with "$algo:"
 545      */
 546     public function get_hash($key = 0)
 547     {
 548         $hashes = $this->get_hashes();
 549         if (isset($hashes[$key]))
 550         {
 551             return $hashes[$key];
 552         }
 553         else
 554         {
 555             return null;
 556         }
 557     }
 558 
 559     /**
 560      * Get all credits
 561      *
 562      * @return array|null Array of strings, see {@see get_hash()}
 563      */
 564     public function get_hashes()
 565     {
 566         if ($this->hashes !== null)
 567         {
 568             return $this->hashes;
 569         }
 570         else
 571         {
 572             return null;
 573         }
 574     }
 575 
 576     /**
 577      * Get the height
 578      *
 579      * @return string|null
 580      */
 581     public function get_height()
 582     {
 583         if ($this->height !== null)
 584         {
 585             return $this->height;
 586         }
 587         else
 588         {
 589             return null;
 590         }
 591     }
 592 
 593     /**
 594      * Get the language
 595      *
 596      * @link http://tools.ietf.org/html/rfc3066
 597      * @return string|null Language code as per RFC 3066
 598      */
 599     public function get_language()
 600     {
 601         if ($this->lang !== null)
 602         {
 603             return $this->lang;
 604         }
 605         else
 606         {
 607             return null;
 608         }
 609     }
 610 
 611     /**
 612      * Get a single keyword
 613      *
 614      * @param int $key
 615      * @return string|null
 616      */
 617     public function get_keyword($key = 0)
 618     {
 619         $keywords = $this->get_keywords();
 620         if (isset($keywords[$key]))
 621         {
 622             return $keywords[$key];
 623         }
 624         else
 625         {
 626             return null;
 627         }
 628     }
 629 
 630     /**
 631      * Get all keywords
 632      *
 633      * @return array|null Array of strings
 634      */
 635     public function get_keywords()
 636     {
 637         if ($this->keywords !== null)
 638         {
 639             return $this->keywords;
 640         }
 641         else
 642         {
 643             return null;
 644         }
 645     }
 646 
 647     /**
 648      * Get length
 649      *
 650      * @return float Length in bytes
 651      */
 652     public function get_length()
 653     {
 654         if ($this->length !== null)
 655         {
 656             return $this->length;
 657         }
 658         else
 659         {
 660             return null;
 661         }
 662     }
 663 
 664     /**
 665      * Get the URL
 666      *
 667      * @return string|null
 668      */
 669     public function get_link()
 670     {
 671         if ($this->link !== null)
 672         {
 673             return urldecode($this->link);
 674         }
 675         else
 676         {
 677             return null;
 678         }
 679     }
 680 
 681     /**
 682      * Get the medium
 683      *
 684      * @link http://www.rssboard.org/media-rss#media-content
 685      * @return string|null Should be one of 'image', 'audio', 'video', 'document', 'executable'
 686      */
 687     public function get_medium()
 688     {
 689         if ($this->medium !== null)
 690         {
 691             return $this->medium;
 692         }
 693         else
 694         {
 695             return null;
 696         }
 697     }
 698 
 699     /**
 700      * Get the player URL
 701      *
 702      * Typically the same as {@see get_permalink()}
 703      * @return string|null Player URL
 704      */
 705     public function get_player()
 706     {
 707         if ($this->player !== null)
 708         {
 709             return $this->player;
 710         }
 711         else
 712         {
 713             return null;
 714         }
 715     }
 716 
 717     /**
 718      * Get a single rating
 719      *
 720      * @param int $key
 721      * @return SimplePie_Rating|null
 722      */
 723     public function get_rating($key = 0)
 724     {
 725         $ratings = $this->get_ratings();
 726         if (isset($ratings[$key]))
 727         {
 728             return $ratings[$key];
 729         }
 730         else
 731         {
 732             return null;
 733         }
 734     }
 735 
 736     /**
 737      * Get all ratings
 738      *
 739      * @return array|null Array of {@see SimplePie_Rating} objects
 740      */
 741     public function get_ratings()
 742     {
 743         if ($this->ratings !== null)
 744         {
 745             return $this->ratings;
 746         }
 747         else
 748         {
 749             return null;
 750         }
 751     }
 752 
 753     /**
 754      * Get a single restriction
 755      *
 756      * @param int $key
 757      * @return SimplePie_Restriction|null
 758      */
 759     public function get_restriction($key = 0)
 760     {
 761         $restrictions = $this->get_restrictions();
 762         if (isset($restrictions[$key]))
 763         {
 764             return $restrictions[$key];
 765         }
 766         else
 767         {
 768             return null;
 769         }
 770     }
 771 
 772     /**
 773      * Get all restrictions
 774      *
 775      * @return array|null Array of {@see SimplePie_Restriction} objects
 776      */
 777     public function get_restrictions()
 778     {
 779         if ($this->restrictions !== null)
 780         {
 781             return $this->restrictions;
 782         }
 783         else
 784         {
 785             return null;
 786         }
 787     }
 788 
 789     /**
 790      * Get the sampling rate (in kHz)
 791      *
 792      * @return string|null
 793      */
 794     public function get_sampling_rate()
 795     {
 796         if ($this->samplingrate !== null)
 797         {
 798             return $this->samplingrate;
 799         }
 800         else
 801         {
 802             return null;
 803         }
 804     }
 805 
 806     /**
 807      * Get the file size (in MiB)
 808      *
 809      * @return float|null File size in mebibytes (1048 bytes)
 810      */
 811     public function get_size()
 812     {
 813         $length = $this->get_length();
 814         if ($length !== null)
 815         {
 816             return round($length/1048576, 2);
 817         }
 818         else
 819         {
 820             return null;
 821         }
 822     }
 823 
 824     /**
 825      * Get a single thumbnail
 826      *
 827      * @param int $key
 828      * @return string|null Thumbnail URL
 829      */
 830     public function get_thumbnail($key = 0)
 831     {
 832         $thumbnails = $this->get_thumbnails();
 833         if (isset($thumbnails[$key]))
 834         {
 835             return $thumbnails[$key];
 836         }
 837         else
 838         {
 839             return null;
 840         }
 841     }
 842 
 843     /**
 844      * Get all thumbnails
 845      *
 846      * @return array|null Array of thumbnail URLs
 847      */
 848     public function get_thumbnails()
 849     {
 850         if ($this->thumbnails !== null)
 851         {
 852             return $this->thumbnails;
 853         }
 854         else
 855         {
 856             return null;
 857         }
 858     }
 859 
 860     /**
 861      * Get the title
 862      *
 863      * @return string|null
 864      */
 865     public function get_title()
 866     {
 867         if ($this->title !== null)
 868         {
 869             return $this->title;
 870         }
 871         else
 872         {
 873             return null;
 874         }
 875     }
 876 
 877     /**
 878      * Get mimetype of the enclosure
 879      *
 880      * @see get_real_type()
 881      * @return string|null MIME type
 882      */
 883     public function get_type()
 884     {
 885         if ($this->type !== null)
 886         {
 887             return $this->type;
 888         }
 889         else
 890         {
 891             return null;
 892         }
 893     }
 894 
 895     /**
 896      * Get the width
 897      *
 898      * @return string|null
 899      */
 900     public function get_width()
 901     {
 902         if ($this->width !== null)
 903         {
 904             return $this->width;
 905         }
 906         else
 907         {
 908             return null;
 909         }
 910     }
 911 
 912     /**
 913      * Embed the enclosure using `<embed>`
 914      *
 915      * @deprecated Use the second parameter to {@see embed} instead
 916      *
 917      * @param array|string $options See first paramter to {@see embed}
 918      * @return string HTML string to output
 919      */
 920     public function native_embed($options='')
 921     {
 922         return $this->embed($options, true);
 923     }
 924 
 925     /**
 926      * Embed the enclosure using Javascript
 927      *
 928      * `$options` is an array or comma-separated key:value string, with the
 929      * following properties:
 930      *
 931      * - `alt` (string): Alternate content for when an end-user does not have
 932      *    the appropriate handler installed or when a file type is
 933      *    unsupported. Can be any text or HTML. Defaults to blank.
 934      * - `altclass` (string): If a file type is unsupported, the end-user will
 935      *    see the alt text (above) linked directly to the content. That link
 936      *    will have this value as its class name. Defaults to blank.
 937      * - `audio` (string): This is an image that should be used as a
 938      *    placeholder for audio files before they're loaded (QuickTime-only).
 939      *    Can be any relative or absolute URL. Defaults to blank.
 940      * - `bgcolor` (string): The background color for the media, if not
 941      *    already transparent. Defaults to `#ffffff`.
 942      * - `height` (integer): The height of the embedded media. Accepts any
 943      *    numeric pixel value (such as `360`) or `auto`. Defaults to `auto`,
 944      *    and it is recommended that you use this default.
 945      * - `loop` (boolean): Do you want the media to loop when its done?
 946      *    Defaults to `false`.
 947      * - `mediaplayer` (string): The location of the included
 948      *    `mediaplayer.swf` file. This allows for the playback of Flash Video
 949      *    (`.flv`) files, and is the default handler for non-Odeo MP3's.
 950      *    Defaults to blank.
 951      * - `video` (string): This is an image that should be used as a
 952      *    placeholder for video files before they're loaded (QuickTime-only).
 953      *    Can be any relative or absolute URL. Defaults to blank.
 954      * - `width` (integer): The width of the embedded media. Accepts any
 955      *    numeric pixel value (such as `480`) or `auto`. Defaults to `auto`,
 956      *    and it is recommended that you use this default.
 957      * - `widescreen` (boolean): Is the enclosure widescreen or standard?
 958      *    This applies only to video enclosures, and will automatically resize
 959      *    the content appropriately.  Defaults to `false`, implying 4:3 mode.
 960      *
 961      * Note: Non-widescreen (4:3) mode with `width` and `height` set to `auto`
 962      * will default to 480x360 video resolution.  Widescreen (16:9) mode with
 963      * `width` and `height` set to `auto` will default to 480x270 video resolution.
 964      *
 965      * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'.
 966      * @param array|string $options Comma-separated key:value list, or array
 967      * @param bool $native Use `<embed>`
 968      * @return string HTML string to output
 969      */
 970     public function embed($options = '', $native = false)
 971     {
 972         // Set up defaults
 973         $audio = '';
 974         $video = '';
 975         $alt = '';
 976         $altclass = '';
 977         $loop = 'false';
 978         $width = 'auto';
 979         $height = 'auto';
 980         $bgcolor = '#ffffff';
 981         $mediaplayer = '';
 982         $widescreen = false;
 983         $handler = $this->get_handler();
 984         $type = $this->get_real_type();
 985 
 986         // Process options and reassign values as necessary
 987         if (is_array($options))
 988         {
 989             extract($options);
 990         }
 991         else
 992         {
 993             $options = explode(',', $options);
 994             foreach($options as $option)
 995             {
 996                 $opt = explode(':', $option, 2);
 997                 if (isset($opt[0], $opt[1]))
 998                 {
 999                     $opt[0] = trim($opt[0]);
1000                     $opt[1] = trim($opt[1]);
1001                     switch ($opt[0])
1002                     {
1003                         case 'audio':
1004                             $audio = $opt[1];
1005                             break;
1006 
1007                         case 'video':
1008                             $video = $opt[1];
1009                             break;
1010 
1011                         case 'alt':
1012                             $alt = $opt[1];
1013                             break;
1014 
1015                         case 'altclass':
1016                             $altclass = $opt[1];
1017                             break;
1018 
1019                         case 'loop':
1020                             $loop = $opt[1];
1021                             break;
1022 
1023                         case 'width':
1024                             $width = $opt[1];
1025                             break;
1026 
1027                         case 'height':
1028                             $height = $opt[1];
1029                             break;
1030 
1031                         case 'bgcolor':
1032                             $bgcolor = $opt[1];
1033                             break;
1034 
1035                         case 'mediaplayer':
1036                             $mediaplayer = $opt[1];
1037                             break;
1038 
1039                         case 'widescreen':
1040                             $widescreen = $opt[1];
1041                             break;
1042                     }
1043                 }
1044             }
1045         }
1046 
1047         $mime = explode('/', $type, 2);
1048         $mime = $mime[0];
1049 
1050         // Process values for 'auto'
1051         if ($width === 'auto')
1052         {
1053             if ($mime === 'video')
1054             {
1055                 if ($height === 'auto')
1056                 {
1057                     $width = 480;
1058                 }
1059                 elseif ($widescreen)
1060                 {
1061                     $width = round((intval($height)/9)*16);
1062                 }
1063                 else
1064                 {
1065                     $width = round((intval($height)/3)*4);
1066                 }
1067             }
1068             else
1069             {
1070                 $width = '100%';
1071             }
1072         }
1073 
1074         if ($height === 'auto')
1075         {
1076             if ($mime === 'audio')
1077             {
1078                 $height = 0;
1079             }
1080             elseif ($mime === 'video')
1081             {
1082                 if ($width === 'auto')
1083                 {
1084                     if ($widescreen)
1085                     {
1086                         $height = 270;
1087                     }
1088                     else
1089                     {
1090                         $height = 360;
1091                     }
1092                 }
1093                 elseif ($widescreen)
1094                 {
1095                     $height = round((intval($width)/16)*9);
1096                 }
1097                 else
1098                 {
1099                     $height = round((intval($width)/4)*3);
1100                 }
1101             }
1102             else
1103             {
1104                 $height = 376;
1105             }
1106         }
1107         elseif ($mime === 'audio')
1108         {
1109             $height = 0;
1110         }
1111 
1112         // Set proper placeholder value
1113         if ($mime === 'audio')
1114         {
1115             $placeholder = $audio;
1116         }
1117         elseif ($mime === 'video')
1118         {
1119             $placeholder = $video;
1120         }
1121 
1122         $embed = '';
1123 
1124         // Flash
1125         if ($handler === 'flash')
1126         {
1127             if ($native)
1128             {
1129                 $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>";
1130             }
1131             else
1132             {
1133                 $embed .= "<script type='text/javascript'>embed_flash('$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$loop', '$type');</script>";
1134             }
1135         }
1136 
1137         // Flash Media Player file types.
1138         // Preferred handler for MP3 file types.
1139         elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== ''))
1140         {
1141             $height += 20;
1142             if ($native)
1143             {
1144                 $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>";
1145             }
1146             else
1147             {
1148                 $embed .= "<script type='text/javascript'>embed_flv('$width', '$height', '" . rawurlencode($this->get_link().'?file_extension=.'.$this->get_extension()) . "', '$placeholder', '$loop', '$mediaplayer');</script>";
1149             }
1150         }
1151 
1152         // QuickTime 7 file types.  Need to test with QuickTime 6.
1153         // Only handle MP3's if the Flash Media Player is not present.
1154         elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === ''))
1155         {
1156             $height += 16;
1157             if ($native)
1158             {
1159                 if ($placeholder !== '')
1160                 {
1161                     $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>";
1162                 }
1163                 else
1164                 {
1165                     $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>";
1166                 }
1167             }
1168             else
1169             {
1170                 $embed .= "<script type='text/javascript'>embed_quicktime('$type', '$bgcolor', '$width', '$height', '" . $this->get_link() . "', '$placeholder', '$loop');</script>";
1171             }
1172         }
1173 
1174         // Windows Media
1175         elseif ($handler === 'wmedia')
1176         {
1177             $height += 45;
1178             if ($native)
1179             {
1180                 $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>";
1181             }
1182             else
1183             {
1184                 $embed .= "<script type='text/javascript'>embed_wmedia('$width', '$height', '" . $this->get_link() . "');</script>";
1185             }
1186         }
1187 
1188         // Everything else
1189         else $embed .= '<a href="' . $this->get_link() . '" class="' . $altclass . '">' . $alt . '</a>';
1190 
1191         return $embed;
1192     }
1193 
1194     /**
1195      * Get the real media type
1196      *
1197      * Often, feeds lie to us, necessitating a bit of deeper inspection. This
1198      * converts types to their canonical representations based on the file
1199      * extension
1200      *
1201      * @see get_type()
1202      * @param bool $find_handler Internal use only, use {@see get_handler()} instead
1203      * @return string MIME type
1204      */
1205     public function get_real_type($find_handler = false)
1206     {
1207         // Mime-types by handler.
1208         $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash
1209         $types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player
1210         $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
1211         $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
1212         $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3
1213 
1214         if ($this->get_type() !== null)
1215         {
1216             $type = strtolower($this->type);
1217         }
1218         else
1219         {
1220             $type = null;
1221         }
1222 
1223         // If we encounter an unsupported mime-type, check the file extension and guess intelligently.
1224         if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3)))
1225         {
1226             switch (strtolower($this->get_extension()))
1227             {
1228                 // Audio mime-types
1229                 case 'aac':
1230                 case 'adts':
1231                     $type = 'audio/acc';
1232                     break;
1233 
1234                 case 'aif':
1235                 case 'aifc':
1236                 case 'aiff':
1237                 case 'cdda':
1238                     $type = 'audio/aiff';
1239                     break;
1240 
1241                 case 'bwf':
1242                     $type = 'audio/wav';
1243                     break;
1244 
1245                 case 'kar':
1246                 case 'mid':
1247                 case 'midi':
1248                 case 'smf':
1249                     $type = 'audio/midi';
1250                     break;
1251 
1252                 case 'm4a':
1253                     $type = 'audio/x-m4a';
1254                     break;
1255 
1256                 case 'mp3':
1257                 case 'swa':
1258                     $type = 'audio/mp3';
1259                     break;
1260 
1261                 case 'wav':
1262                     $type = 'audio/wav';
1263                     break;
1264 
1265                 case 'wax':
1266                     $type = 'audio/x-ms-wax';
1267                     break;
1268 
1269                 case 'wma':
1270                     $type = 'audio/x-ms-wma';
1271                     break;
1272 
1273                 // Video mime-types
1274                 case '3gp':
1275                 case '3gpp':
1276                     $type = 'video/3gpp';
1277                     break;
1278 
1279                 case '3g2':
1280                 case '3gp2':
1281                     $type = 'video/3gpp2';
1282                     break;
1283 
1284                 case 'asf':
1285                     $type = 'video/x-ms-asf';
1286                     break;
1287 
1288                 case 'flv':
1289                     $type = 'video/x-flv';
1290                     break;
1291 
1292                 case 'm1a':
1293                 case 'm1s':
1294                 case 'm1v':
1295                 case 'm15':
1296                 case 'm75':
1297                 case 'mp2':
1298                 case 'mpa':
1299                 case 'mpeg':
1300                 case 'mpg':
1301                 case 'mpm':
1302                 case 'mpv':
1303                     $type = 'video/mpeg';
1304                     break;
1305 
1306                 case 'm4v':
1307                     $type = 'video/x-m4v';
1308                     break;
1309 
1310                 case 'mov':
1311                 case 'qt':
1312                     $type = 'video/quicktime';
1313                     break;
1314 
1315                 case 'mp4':
1316                 case 'mpg4':
1317                     $type = 'video/mp4';
1318                     break;
1319 
1320                 case 'sdv':
1321                     $type = 'video/sd-video';
1322                     break;
1323 
1324                 case 'wm':
1325                     $type = 'video/x-ms-wm';
1326                     break;
1327 
1328                 case 'wmv':
1329                     $type = 'video/x-ms-wmv';
1330                     break;
1331 
1332                 case 'wvx':
1333                     $type = 'video/x-ms-wvx';
1334                     break;
1335 
1336                 // Flash mime-types
1337                 case 'spl':
1338                     $type = 'application/futuresplash';
1339                     break;
1340 
1341                 case 'swf':
1342                     $type = 'application/x-shockwave-flash';
1343                     break;
1344             }
1345         }
1346 
1347         if ($find_handler)
1348         {
1349             if (in_array($type, $types_flash))
1350             {
1351                 return 'flash';
1352             }
1353             elseif (in_array($type, $types_fmedia))
1354             {
1355                 return 'fmedia';
1356             }
1357             elseif (in_array($type, $types_quicktime))
1358             {
1359                 return 'quicktime';
1360             }
1361             elseif (in_array($type, $types_wmedia))
1362             {
1363                 return 'wmedia';
1364             }
1365             elseif (in_array($type, $types_mp3))
1366             {
1367                 return 'mp3';
1368             }
1369             else
1370             {
1371                 return null;
1372             }
1373         }
1374         else
1375         {
1376             return $type;
1377         }
1378     }
1379 }
1380 
1381