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