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