wp/wp-includes/SimplePie/Enclosure.php
changeset 0 d970ebf37754
child 16 a86126ab1dd4
equal deleted inserted replaced
-1:000000000000 0:d970ebf37754
       
     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