]>
Commit | Line | Data |
---|---|---|
ec397236 NL |
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 | * | |
42c80841 | 8 | * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors |
ec397236 NL |
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 | |
42c80841 NL |
36 | * @version 1.3.1 |
37 | * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue | |
ec397236 NL |
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 | |
ec397236 NL |
43 | */ |
44 | ||
42c80841 NL |
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 | */ | |
ec397236 NL |
55 | class SimplePie_Enclosure |
56 | { | |
42c80841 NL |
57 | /** |
58 | * @var string | |
59 | * @see get_bitrate() | |
60 | */ | |
ec397236 | 61 | var $bitrate; |
42c80841 NL |
62 | |
63 | /** | |
64 | * @var array | |
65 | * @see get_captions() | |
66 | */ | |
ec397236 | 67 | var $captions; |
42c80841 NL |
68 | |
69 | /** | |
70 | * @var array | |
71 | * @see get_categories() | |
72 | */ | |
ec397236 | 73 | var $categories; |
42c80841 NL |
74 | |
75 | /** | |
76 | * @var int | |
77 | * @see get_channels() | |
78 | */ | |
ec397236 | 79 | var $channels; |
42c80841 NL |
80 | |
81 | /** | |
82 | * @var SimplePie_Copyright | |
83 | * @see get_copyright() | |
84 | */ | |
ec397236 | 85 | var $copyright; |
42c80841 NL |
86 | |
87 | /** | |
88 | * @var array | |
89 | * @see get_credits() | |
90 | */ | |
ec397236 | 91 | var $credits; |
42c80841 NL |
92 | |
93 | /** | |
94 | * @var string | |
95 | * @see get_description() | |
96 | */ | |
ec397236 | 97 | var $description; |
42c80841 NL |
98 | |
99 | /** | |
100 | * @var int | |
101 | * @see get_duration() | |
102 | */ | |
ec397236 | 103 | var $duration; |
42c80841 NL |
104 | |
105 | /** | |
106 | * @var string | |
107 | * @see get_expression() | |
108 | */ | |
ec397236 | 109 | var $expression; |
42c80841 NL |
110 | |
111 | /** | |
112 | * @var string | |
113 | * @see get_framerate() | |
114 | */ | |
ec397236 | 115 | var $framerate; |
42c80841 NL |
116 | |
117 | /** | |
118 | * @var string | |
119 | * @see get_handler() | |
120 | */ | |
ec397236 | 121 | var $handler; |
42c80841 NL |
122 | |
123 | /** | |
124 | * @var array | |
125 | * @see get_hashes() | |
126 | */ | |
ec397236 | 127 | var $hashes; |
42c80841 NL |
128 | |
129 | /** | |
130 | * @var string | |
131 | * @see get_height() | |
132 | */ | |
ec397236 | 133 | var $height; |
42c80841 NL |
134 | |
135 | /** | |
136 | * @deprecated | |
137 | * @var null | |
138 | */ | |
ec397236 | 139 | var $javascript; |
42c80841 NL |
140 | |
141 | /** | |
142 | * @var array | |
143 | * @see get_keywords() | |
144 | */ | |
ec397236 | 145 | var $keywords; |
42c80841 NL |
146 | |
147 | /** | |
148 | * @var string | |
149 | * @see get_language() | |
150 | */ | |
ec397236 | 151 | var $lang; |
42c80841 NL |
152 | |
153 | /** | |
154 | * @var string | |
155 | * @see get_length() | |
156 | */ | |
ec397236 | 157 | var $length; |
42c80841 NL |
158 | |
159 | /** | |
160 | * @var string | |
161 | * @see get_link() | |
162 | */ | |
ec397236 | 163 | var $link; |
42c80841 NL |
164 | |
165 | /** | |
166 | * @var string | |
167 | * @see get_medium() | |
168 | */ | |
ec397236 | 169 | var $medium; |
42c80841 NL |
170 | |
171 | /** | |
172 | * @var string | |
173 | * @see get_player() | |
174 | */ | |
ec397236 | 175 | var $player; |
42c80841 NL |
176 | |
177 | /** | |
178 | * @var array | |
179 | * @see get_ratings() | |
180 | */ | |
ec397236 | 181 | var $ratings; |
42c80841 NL |
182 | |
183 | /** | |
184 | * @var array | |
185 | * @see get_restrictions() | |
186 | */ | |
ec397236 | 187 | var $restrictions; |
42c80841 NL |
188 | |
189 | /** | |
190 | * @var string | |
191 | * @see get_sampling_rate() | |
192 | */ | |
ec397236 | 193 | var $samplingrate; |
42c80841 NL |
194 | |
195 | /** | |
196 | * @var array | |
197 | * @see get_thumbnails() | |
198 | */ | |
ec397236 | 199 | var $thumbnails; |
42c80841 NL |
200 | |
201 | /** | |
202 | * @var string | |
203 | * @see get_title() | |
204 | */ | |
ec397236 | 205 | var $title; |
42c80841 NL |
206 | |
207 | /** | |
208 | * @var string | |
209 | * @see get_type() | |
210 | */ | |
ec397236 | 211 | var $type; |
42c80841 NL |
212 | |
213 | /** | |
214 | * @var string | |
215 | * @see get_width() | |
216 | */ | |
ec397236 NL |
217 | var $width; |
218 | ||
42c80841 NL |
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 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
264 | /** |
265 | * String-ified version | |
266 | * | |
267 | * @return string | |
268 | */ | |
ec397236 NL |
269 | public function __toString() |
270 | { | |
271 | // There is no $this->data here | |
272 | return md5(serialize($this)); | |
273 | } | |
274 | ||
42c80841 NL |
275 | /** |
276 | * Get the bitrate | |
277 | * | |
278 | * @return string|null | |
279 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
292 | /** |
293 | * Get a single caption | |
294 | * | |
295 | * @param int $key | |
296 | * @return SimplePie_Caption|null | |
297 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
311 | /** |
312 | * Get all captions | |
313 | * | |
314 | * @return array|null Array of {@see SimplePie_Caption} objects | |
315 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
328 | /** |
329 | * Get a single category | |
330 | * | |
331 | * @param int $key | |
332 | * @return SimplePie_Category|null | |
333 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
347 | /** |
348 | * Get all categories | |
349 | * | |
350 | * @return array|null Array of {@see SimplePie_Category} objects | |
351 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
364 | /** |
365 | * Get the number of audio channels | |
366 | * | |
367 | * @return int|null | |
368 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
381 | /** |
382 | * Get the copyright information | |
383 | * | |
384 | * @return SimplePie_Copyright|null | |
385 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
398 | /** |
399 | * Get a single credit | |
400 | * | |
401 | * @param int $key | |
402 | * @return SimplePie_Credit|null | |
403 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
417 | /** |
418 | * Get all credits | |
419 | * | |
420 | * @return array|null Array of {@see SimplePie_Credit} objects | |
421 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
434 | /** |
435 | * Get the description of the enclosure | |
436 | * | |
437 | * @return string|null | |
438 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
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 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
477 | /** |
478 | * Get the expression | |
479 | * | |
480 | * @return string Probably one of 'sample', 'full', 'nonstop', 'clip'. Defaults to 'full' | |
481 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
494 | /** |
495 | * Get the file extension | |
496 | * | |
497 | * @return string|null | |
498 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
512 | /** |
513 | * Get the framerate (in frames-per-second) | |
514 | * | |
515 | * @return string|null | |
516 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
529 | /** |
530 | * Get the preferred handler | |
531 | * | |
532 | * @return string|null One of 'flash', 'fmedia', 'quicktime', 'wmedia', 'mp3' | |
533 | */ | |
ec397236 NL |
534 | public function get_handler() |
535 | { | |
536 | return $this->get_real_type(true); | |
537 | } | |
538 | ||
42c80841 NL |
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 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
559 | /** |
560 | * Get all credits | |
561 | * | |
562 | * @return array|null Array of strings, see {@see get_hash()} | |
563 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
576 | /** |
577 | * Get the height | |
578 | * | |
579 | * @return string|null | |
580 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
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 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
611 | /** |
612 | * Get a single keyword | |
613 | * | |
614 | * @param int $key | |
615 | * @return string|null | |
616 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
630 | /** |
631 | * Get all keywords | |
632 | * | |
633 | * @return array|null Array of strings | |
634 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
647 | /** |
648 | * Get length | |
649 | * | |
650 | * @return float Length in bytes | |
651 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
664 | /** |
665 | * Get the URL | |
666 | * | |
667 | * @return string|null | |
668 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
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 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
699 | /** |
700 | * Get the player URL | |
701 | * | |
702 | * Typically the same as {@see get_permalink()} | |
703 | * @return string|null Player URL | |
704 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
717 | /** |
718 | * Get a single rating | |
719 | * | |
720 | * @param int $key | |
721 | * @return SimplePie_Rating|null | |
722 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
736 | /** |
737 | * Get all ratings | |
738 | * | |
739 | * @return array|null Array of {@see SimplePie_Rating} objects | |
740 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
753 | /** |
754 | * Get a single restriction | |
755 | * | |
756 | * @param int $key | |
757 | * @return SimplePie_Restriction|null | |
758 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
772 | /** |
773 | * Get all restrictions | |
774 | * | |
775 | * @return array|null Array of {@see SimplePie_Restriction} objects | |
776 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
789 | /** |
790 | * Get the sampling rate (in kHz) | |
791 | * | |
792 | * @return string|null | |
793 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
806 | /** |
807 | * Get the file size (in MiB) | |
808 | * | |
809 | * @return float|null File size in mebibytes (1048 bytes) | |
810 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
824 | /** |
825 | * Get a single thumbnail | |
826 | * | |
827 | * @param int $key | |
828 | * @return string|null Thumbnail URL | |
829 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
843 | /** |
844 | * Get all thumbnails | |
845 | * | |
846 | * @return array|null Array of thumbnail URLs | |
847 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
860 | /** |
861 | * Get the title | |
862 | * | |
863 | * @return string|null | |
864 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
877 | /** |
878 | * Get mimetype of the enclosure | |
879 | * | |
880 | * @see get_real_type() | |
881 | * @return string|null MIME type | |
882 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
895 | /** |
896 | * Get the width | |
897 | * | |
898 | * @return string|null | |
899 | */ | |
ec397236 NL |
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 | ||
42c80841 NL |
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 | */ | |
ec397236 NL |
920 | public function native_embed($options='') |
921 | { | |
922 | return $this->embed($options, true); | |
923 | } | |
924 | ||
925 | /** | |
42c80841 NL |
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 | * | |
ec397236 | 965 | * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'. |
42c80841 NL |
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 | |
ec397236 NL |
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 | ||
ec397236 | 1124 | // Flash |
42c80841 | 1125 | if ($handler === 'flash') |
ec397236 NL |
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 | ||
42c80841 NL |
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 | */ | |
ec397236 NL |
1205 | public function get_real_type($find_handler = false) |
1206 | { | |
ec397236 NL |
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 |