Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.

Differences Between: [Versions 310 and 311] [Versions 311 and 401] [Versions 311 and 402] [Versions 311 and 403] [Versions 39 and 311]

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