SimplePie_Enclosure::__construct()   B
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 36
Code Lines 31

Duplication

Lines 6
Ratio 16.67 %

Importance

Changes 0
Metric Value
cc 2
eloc 31
nc 2
nop 26
dl 6
loc 36
rs 8.8571
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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)
0 ignored issues
show
Unused Code introduced by
The parameter $javascript is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
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 View Code Duplication
		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 View Code Duplication
	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)
0 ignored issues
show
Bug Best Practice introduced by
The expression $convert of type false|string is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
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
0 ignored issues
show
Documentation introduced by
Should the return type not be string|null?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
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 View Code Duplication
		if ($width === 'auto')
1052
		{
1053
			if ($mime === 'video')
1054
			{
1055
				if ($height === 'auto')
1056
				{
1057
					$width = 480;
1058
				}
1059
				elseif ($widescreen)
0 ignored issues
show
Bug Best Practice introduced by
The expression $widescreen of type string|false is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
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 View Code Duplication
			elseif ($mime === 'video')
1081
			{
1082
				if ($width === 'auto')
1083
				{
1084
					if ($widescreen)
0 ignored issues
show
Bug Best Practice introduced by
The expression $widescreen of type string|false is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
1085
					{
1086
						$height = 270;
1087
					}
1088
					else
1089
					{
1090
						$height = 360;
1091
					}
1092
				}
1093
				elseif ($widescreen)
0 ignored issues
show
Bug Best Practice introduced by
The expression $widescreen of type string|false is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== false instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
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 View Code Duplication
			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 View Code Duplication
			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 View Code Duplication
				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 View Code Duplication
			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
0 ignored issues
show
Documentation introduced by
Should the return type not be string|null?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
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