]> CyberLeo.Net >> Repos - Github/sugarcrm.git/blob - Zend/Gdata/YouTube/VideoEntry.php
Release 6.5.0
[Github/sugarcrm.git] / Zend / Gdata / YouTube / VideoEntry.php
1 <?php
2
3 /**
4  * Zend Framework
5  *
6  * LICENSE
7  *
8  * This source file is subject to the new BSD license that is bundled
9  * with this package in the file LICENSE.txt.
10  * It is also available through the world-wide-web at this URL:
11  * http://framework.zend.com/license/new-bsd
12  * If you did not receive a copy of the license and are unable to
13  * obtain it through the world-wide-web, please send an email
14  * to license@zend.com so we can send you a copy immediately.
15  *
16  * @category   Zend
17  * @package    Zend_Gdata
18  * @subpackage YouTube
19  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
20  * @license    http://framework.zend.com/license/new-bsd     New BSD License
21
22  */
23
24 /**
25  * @see Zend_Gdata_Extension_Comments
26  */
27 require_once 'Zend/Gdata/Extension/Comments.php';
28
29 /**
30  * @see Zend_Gdata_Extension_FeedLink
31  */
32 require_once 'Zend/Gdata/Extension/FeedLink.php';
33
34 /**
35  * @see Zend_Gdata_YouTube_MediaEntry
36  */
37 require_once 'Zend/Gdata/YouTube/MediaEntry.php';
38
39 /**
40  * @see Zend_Gdata_YouTube_Extension_MediaGroup
41  */
42 require_once 'Zend/Gdata/YouTube/Extension/MediaGroup.php';
43
44 /**
45  * @see Zend_Gdata_YouTube_Extension_NoEmbed
46  */
47 require_once 'Zend/Gdata/YouTube/Extension/NoEmbed.php';
48
49 /**
50  * @see Zend_Gdata_YouTube_Extension_Statistics
51  */
52 require_once 'Zend/Gdata/YouTube/Extension/Statistics.php';
53
54 /**
55  * @see Zend_Gdata_YouTube_Extension_Link
56  */
57 require_once 'Zend/Gdata/YouTube/Extension/Link.php';
58
59 /**
60  * @see Zend_Gdata_YouTube_Extension_Racy
61  */
62 require_once 'Zend/Gdata/YouTube/Extension/Racy.php';
63
64 /**
65  * @see Zend_Gdata_Extension_Rating
66  */
67 require_once 'Zend/Gdata/Extension/Rating.php';
68
69 /**
70  * @see Zend_Gdata_Geo_Extension_GeoRssWhere
71  */
72 require_once 'Zend/Gdata/Geo/Extension/GeoRssWhere.php';
73
74 /**
75  * @see Zend_Gdata_YouTube_Extension_Control
76  */
77 require_once 'Zend/Gdata/YouTube/Extension/Control.php';
78
79 /**
80  * @see Zend_Gdata_YouTube_Extension_Recorded
81  */
82 require_once 'Zend/Gdata/YouTube/Extension/Recorded.php';
83
84 /**
85  * @see Zend_Gdata_YouTube_Extension_Location
86  */
87 require_once 'Zend/Gdata/YouTube/Extension/Location.php';
88
89 /**
90  * Represents the YouTube video flavor of an Atom entry
91  *
92  * @category   Zend
93  * @package    Zend_Gdata
94  * @subpackage YouTube
95  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
96  * @license    http://framework.zend.com/license/new-bsd     New BSD License
97  */
98 class Zend_Gdata_YouTube_VideoEntry extends Zend_Gdata_YouTube_MediaEntry
99 {
100
101     const YOUTUBE_DEVELOPER_TAGS_SCHEMA = 'http://gdata.youtube.com/schemas/2007/developertags.cat';
102     const YOUTUBE_CATEGORY_SCHEMA = 'http://gdata.youtube.com/schemas/2007/categories.cat';
103     protected $_entryClassName = 'Zend_Gdata_YouTube_VideoEntry';
104
105     /**
106      * If null, the video can be embedded
107      *
108      * @var Zend_Gdata_YouTube_Extension_NoEmbed|null
109      */
110     protected $_noEmbed = null;
111
112     /**
113      * Specifies the statistics relating to the video.
114      *
115      * @var Zend_Gdata_YouTube_Extension_Statistics
116      */
117     protected $_statistics = null;
118
119     /**
120      * If not null, specifies that the video has racy content.
121      *
122      * @var Zend_Gdata_YouTube_Extension_Racy|null
123      */
124     protected $_racy = null;
125
126     /**
127      * If not null, specifies that the video is private.
128      *
129      * @var Zend_Gdata_YouTube_Extension_Private|null
130      */
131     protected $_private = null;
132
133     /**
134      * Specifies the video's rating.
135      *
136      * @var Zend_Gdata_Extension_Rating
137      */
138     protected $_rating = null;
139
140     /**
141      * Specifies the comments associated with a video.
142      *
143      * @var Zend_Gdata_Extensions_Comments
144      */
145     protected $_comments = null;
146
147     /**
148      * Nested feed links
149      *
150      * @var array
151      */
152     protected $_feedLink = array();
153
154     /**
155      * Geo location for the video
156      *
157      * @var Zend_Gdata_Geo_Extension_GeoRssWhere
158      */
159     protected $_where = null;
160
161     /**
162      * Recording date for the video
163      *
164      * @var Zend_Gdata_YouTube_Extension_Recorded|null
165      */
166     protected $_recorded = null;
167
168     /**
169      * Location informtion for the video
170      *
171      * @var Zend_Gdata_YouTube_Extension_Location|null
172      */
173     protected $_location = null;
174
175     /**
176      * Creates a Video entry, representing an individual video
177      *
178      * @param DOMElement $element (optional) DOMElement from which this
179      *          object should be constructed.
180      */
181     public function __construct($element = null)
182     {
183         $this->registerAllNamespaces(Zend_Gdata_YouTube::$namespaces);
184         parent::__construct($element);
185     }
186
187     /**
188      * Retrieves a DOMElement which corresponds to this element and all
189      * child properties.  This is used to build an entry back into a DOM
190      * and eventually XML text for sending to the server upon updates, or
191      * for application storage/persistence.
192      *
193      * @param DOMDocument $doc The DOMDocument used to construct DOMElements
194      * @return DOMElement The DOMElement representing this element and all
195      * child properties.
196      */
197     public function getDOM($doc = null, $majorVersion = 1, $minorVersion = null)
198     {
199         $element = parent::getDOM($doc, $majorVersion, $minorVersion);
200         if ($this->_noEmbed != null) {
201             $element->appendChild($this->_noEmbed->getDOM(
202                 $element->ownerDocument));
203         }
204         if ($this->_statistics != null) {
205             $element->appendChild($this->_statistics->getDOM(
206                 $element->ownerDocument));
207         }
208         if ($this->_racy != null) {
209             $element->appendChild($this->_racy->getDOM(
210                 $element->ownerDocument));
211         }
212         if ($this->_recorded != null) {
213             $element->appendChild($this->_recorded->getDOM(
214                 $element->ownerDocument));
215         }
216         if ($this->_location != null) {
217             $element->appendChild($this->_location->getDOM(
218                 $element->ownerDocument));
219         }
220         if ($this->_rating != null) {
221             $element->appendChild($this->_rating->getDOM(
222                 $element->ownerDocument));
223         }
224         if ($this->_comments != null) {
225             $element->appendChild($this->_comments->getDOM(
226                 $element->ownerDocument));
227         }
228         if ($this->_feedLink != null) {
229             foreach ($this->_feedLink as $feedLink) {
230                 $element->appendChild($feedLink->getDOM(
231                     $element->ownerDocument));
232             }
233         }
234         if ($this->_where != null) {
235            $element->appendChild($this->_where->getDOM(
236                 $element->ownerDocument));
237         }
238         return $element;
239     }
240
241     /**
242      * Creates individual Entry objects of the appropriate type and
243      * stores them in the $_entry array based upon DOM data.
244      *
245      * @param DOMNode $child The DOMNode to process
246      */
247     protected function takeChildFromDOM($child)
248     {
249         $absoluteNodeName = $child->namespaceURI . ':' . $child->localName;
250
251         switch ($absoluteNodeName) {
252         case $this->lookupNamespace('yt') . ':' . 'statistics':
253             $statistics = new Zend_Gdata_YouTube_Extension_Statistics();
254             $statistics->transferFromDOM($child);
255             $this->_statistics = $statistics;
256             break;
257         case $this->lookupNamespace('yt') . ':' . 'racy':
258             $racy = new Zend_Gdata_YouTube_Extension_Racy();
259             $racy->transferFromDOM($child);
260             $this->_racy = $racy;
261             break;
262         case $this->lookupNamespace('yt') . ':' . 'recorded':
263             $recorded = new Zend_Gdata_YouTube_Extension_Recorded();
264             $recorded->transferFromDOM($child);
265             $this->_recorded = $recorded;
266             break;
267         case $this->lookupNamespace('yt') . ':' . 'location':
268             $location = new Zend_Gdata_YouTube_Extension_Location();
269             $location->transferFromDOM($child);
270             $this->_location = $location;
271             break;
272         case $this->lookupNamespace('gd') . ':' . 'rating':
273             $rating = new Zend_Gdata_Extension_Rating();
274             $rating->transferFromDOM($child);
275             $this->_rating = $rating;
276             break;
277         case $this->lookupNamespace('gd') . ':' . 'comments':
278             $comments = new Zend_Gdata_Extension_Comments();
279             $comments->transferFromDOM($child);
280             $this->_comments = $comments;
281             break;
282         case $this->lookupNamespace('yt') . ':' . 'noembed':
283             $noEmbed = new Zend_Gdata_YouTube_Extension_NoEmbed();
284             $noEmbed->transferFromDOM($child);
285             $this->_noEmbed = $noEmbed;
286             break;
287         case $this->lookupNamespace('gd') . ':' . 'feedLink':
288             $feedLink = new Zend_Gdata_Extension_FeedLink();
289             $feedLink->transferFromDOM($child);
290             $this->_feedLink[] = $feedLink;
291             break;
292         case $this->lookupNamespace('georss') . ':' . 'where':
293             $where = new Zend_Gdata_Geo_Extension_GeoRssWhere();
294             $where->transferFromDOM($child);
295             $this->_where = $where;
296             break;
297         case $this->lookupNamespace('atom') . ':' . 'link';
298             $link = new Zend_Gdata_YouTube_Extension_Link();
299             $link->transferFromDOM($child);
300             $this->_link[] = $link;
301             break;
302         case $this->lookupNamespace('app') . ':' . 'control':
303             $control = new Zend_Gdata_YouTube_Extension_Control();
304             $control->transferFromDOM($child);
305             $this->_control = $control;
306             break;
307         default:
308             parent::takeChildFromDOM($child);
309             break;
310         }
311     }
312
313     /**
314      * Sets when the video was recorded.
315      *
316      * @param Zend_Gdata_YouTube_Extension_Recorded $recorded When the video was recorded
317      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
318      */
319     public function setRecorded($recorded = null)
320     {
321         $this->_recorded = $recorded;
322         return $this;
323     }
324
325     /**
326      * Gets the date that the video was recorded.
327      *
328      * @return Zend_Gdata_YouTube_Extension_Recorded|null
329      */
330     public function getRecorded()
331     {
332         return $this->_recorded;
333     }
334
335     /**
336      * Sets the location information.
337      *
338      * @param Zend_Gdata_YouTube_Extension_Location $location Where the video
339      *        was recorded
340      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
341      */
342     public function setLocation($location = null)
343     {
344         $this->_location = $location;
345         return $this;
346     }
347
348     /**
349      * Gets the location where the video was recorded.
350      *
351      * @return Zend_Gdata_YouTube_Extension_Location|null
352      */
353     public function getLocation()
354     {
355         return $this->_location;
356     }
357
358     /**
359      * If an instance of Zend_Gdata_YouTube_Extension_NoEmbed is passed in,
360      * the video cannot be embedded.  Otherwise, if null is passsed in, the
361      * video is able to be embedded.
362      *
363      * @param Zend_Gdata_YouTube_Extension_NoEmbed $noEmbed Whether or not the
364      *          video can be embedded.
365      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
366      */
367     public function setNoEmbed($noEmbed = null)
368     {
369         $this->_noEmbed = $noEmbed;
370         return $this;
371     }
372
373     /**
374      * If the return value is an instance of
375      * Zend_Gdata_YouTube_Extension_NoEmbed, this video cannot be embedded.
376      *
377      * @return Zend_Gdata_YouTube_Extension_NoEmbed|null Whether or not the video can be embedded
378      */
379     public function getNoEmbed()
380     {
381         return $this->_noEmbed;
382     }
383
384     /**
385      * Checks whether the video is embeddable.
386      *
387      * @return bool Returns true if the video is embeddable.
388      */
389     public function isVideoEmbeddable()
390     {
391         if ($this->getNoEmbed() == null) {
392             return true;
393         } else {
394             return false;
395         }
396     }
397
398     /**
399      * Sets the statistics relating to the video.
400      *
401      * @param Zend_Gdata_YouTube_Extension_Statistics $statistics The statistics relating to the video
402      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
403      */
404     public function setStatistics($statistics = null)
405     {
406         $this->_statistics = $statistics;
407         return $this;
408     }
409
410     /**
411      * Returns the statistics relating to the video.
412      *
413      * @return Zend_Gdata_YouTube_Extension_Statistics  The statistics relating to the video
414      */
415     public function getStatistics()
416     {
417         return $this->_statistics;
418     }
419
420     /**
421      * Specifies that the video has racy content.
422      *
423      * @param Zend_Gdata_YouTube_Extension_Racy $racy The racy flag object
424      * @throws Zend_Gdata_App_VersionException
425      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
426      */
427     public function setRacy($racy = null)
428     {
429         if ($this->getMajorProtocolVersion() == 2) {
430             require_once 'Zend/Gdata/App/VersionException.php';
431             throw new Zend_Gdata_App_VersionException(
432                 'Calling getRacy() on a YouTube VideoEntry is deprecated ' .
433                 'as of version 2 of the API.');
434         }
435
436         $this->_racy = $racy;
437         return $this;
438     }
439
440     /**
441      * Returns the racy flag object.
442      *
443      * @throws Zend_Gdata_App_VersionException
444      * @return Zend_Gdata_YouTube_Extension_Racy|null  The racy flag object
445      */
446     public function getRacy()
447     {
448         if ($this->getMajorProtocolVersion() == 2) {
449             require_once 'Zend/Gdata/App/VersionException.php';
450             throw new Zend_Gdata_App_VersionException(
451                 'Calling getRacy() on a YouTube VideoEntry is deprecated ' .
452                 'as of version 2 of the API.');
453         }
454         return $this->_racy;
455     }
456
457     /**
458      * Sets the rating relating to the video.
459      *
460      * @param Zend_Gdata_Extension_Rating $rating The rating relating to the video
461      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
462      */
463     public function setRating($rating = null)
464     {
465         $this->_rating = $rating;
466         return $this;
467     }
468
469     /**
470      * Returns the rating relating to the video.
471      *
472      * @return Zend_Gdata_Extension_Rating  The rating relating to the video
473      */
474     public function getRating()
475     {
476         return $this->_rating;
477     }
478
479     /**
480      * Sets the comments relating to the video.
481      *
482      * @param Zend_Gdata_Extension_Comments $comments The comments relating to the video
483      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
484      */
485     public function setComments($comments = null)
486     {
487         $this->_comments = $comments;
488         return $this;
489     }
490
491     /**
492      * Returns the comments relating to the video.
493      *
494      * @return Zend_Gdata_Extension_Comments  The comments relating to the video
495      */
496     public function getComments()
497     {
498         return $this->_comments;
499     }
500
501     /**
502      * Sets the array of embedded feeds related to the video
503      *
504      * @param array $feedLink The array of embedded feeds relating to the video
505      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
506      */
507     public function setFeedLink($feedLink = null)
508     {
509         $this->_feedLink = $feedLink;
510         return $this;
511     }
512
513     /**
514      * Get the feed link property for this entry.
515      *
516      * @see setFeedLink
517      * @param string $rel (optional) The rel value of the link to be found.
518      *          If null, the array of links is returned.
519      * @return mixed If $rel is specified, a Zend_Gdata_Extension_FeedLink
520      *          object corresponding to the requested rel value is returned
521      *          if found, or null if the requested value is not found. If
522      *          $rel is null or not specified, an array of all available
523      *          feed links for this entry is returned, or null if no feed
524      *          links are set.
525      */
526     public function getFeedLink($rel = null)
527     {
528         if ($rel == null) {
529             return $this->_feedLink;
530         } else {
531             foreach ($this->_feedLink as $feedLink) {
532                 if ($feedLink->rel == $rel) {
533                     return $feedLink;
534                 }
535             }
536             return null;
537         }
538     }
539
540     /**
541      * Returns the link element relating to video responses.
542      *
543      * @return Zend_Gdata_App_Extension_Link
544      */
545     public function getVideoResponsesLink()
546     {
547         return $this->getLink(Zend_Gdata_YouTube::VIDEO_RESPONSES_REL);
548     }
549
550     /**
551      * Returns the link element relating to video ratings.
552      *
553      * @return Zend_Gdata_App_Extension_Link
554      */
555     public function getVideoRatingsLink()
556     {
557         return $this->getLink(Zend_Gdata_YouTube::VIDEO_RATINGS_REL);
558     }
559
560     /**
561      * Returns the link element relating to video complaints.
562      *
563      * @return Zend_Gdata_App_Extension_Link
564      */
565     public function getVideoComplaintsLink()
566     {
567         return $this->getLink(Zend_Gdata_YouTube::VIDEO_COMPLAINTS_REL);
568     }
569
570     /**
571      * Gets the YouTube video ID based upon the atom:id value
572      *
573      * @return string The video ID
574      */
575     public function getVideoId()
576     {
577         if ($this->getMajorProtocolVersion() == 2) {
578             $videoId = $this->getMediaGroup()->getVideoId()->text;
579         } else {
580             $fullId = $this->getId()->getText();
581             $position = strrpos($fullId, '/');
582             if ($position === false) {
583                 require_once 'Zend/Gdata/App/Exception.php';
584                 throw new Zend_Gdata_App_Exception(
585                     'Slash not found in atom:id of ' . $fullId);
586             } else {
587                 $videoId = substr($fullId, $position + 1);
588             }
589         }
590         return $videoId;
591     }
592
593     /**
594      * Gets the date that the video was recorded.
595      *
596      * @return string|null The date that the video was recorded
597      */
598     public function getVideoRecorded()
599     {
600         $recorded = $this->getRecorded();
601         if ($recorded != null) {
602           return $recorded->getText();
603         } else {
604           return null;
605         }
606     }
607
608     /**
609      * Sets the date that the video was recorded.
610      *
611      * @param string $recorded The date that the video was recorded, in the
612      *          format of '2001-06-19'
613      */
614     public function setVideoRecorded($recorded)
615     {
616         $this->setRecorded(
617             new Zend_Gdata_YouTube_Extension_Recorded($recorded));
618         return $this;
619     }
620
621     /**
622      * Gets the georss:where element
623      *
624      * @return Zend_Gdata_Geo_Extension_GeoRssWhere
625      */
626     public function getWhere()
627     {
628         return $this->_where;
629     }
630
631     /**
632      * Sets the georss:where element
633      *
634      * @param Zend_Gdata_Geo_Extension_GeoRssWhere $value The georss:where class value
635      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
636      */
637     public function setWhere($value)
638     {
639         $this->_where = $value;
640         return $this;
641     }
642
643     /**
644      * Gets the title of the video as a string.  null is returned
645      * if the video title is not available.
646      *
647      * @return string|null The title of the video
648      */
649     public function getVideoTitle()
650     {
651         $this->ensureMediaGroupIsNotNull();
652         if ($this->getMediaGroup()->getTitle() != null) {
653             return $this->getMediaGroup()->getTitle()->getText();
654         } else {
655             return null;
656         }
657     }
658
659     /**
660      * Sets the title of the video as a string.
661      *
662      * @param string $title Title for the video
663      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
664      */
665     public function setVideoTitle($title)
666     {
667         $this->ensureMediaGroupIsNotNull();
668         $this->getMediaGroup()->setTitle(
669             new Zend_Gdata_Media_Extension_MediaTitle($title));
670         return $this;
671     }
672
673     /**
674      * Sets the description of the video as a string.
675      *
676      * @param string $description Description for the video
677      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
678      */
679     public function setVideoDescription($description)
680     {
681         $this->ensureMediaGroupIsNotNull();
682         $this->getMediaGroup()->setDescription(
683             new Zend_Gdata_Media_Extension_MediaDescription($description));
684         return $this;
685     }
686
687
688     /**
689      * Gets the description  of the video as a string.  null is returned
690      * if the video description is not available.
691      *
692      * @return string|null The description of the video
693      */
694     public function getVideoDescription()
695     {
696         $this->ensureMediaGroupIsNotNull();
697         if ($this->getMediaGroup()->getDescription() != null) {
698             return $this->getMediaGroup()->getDescription()->getText();
699         } else {
700             return null;
701         }
702     }
703
704     /**
705      * Gets the URL of the YouTube video watch page.  null is returned
706      * if the video watch page URL is not available.
707      *
708      * @return string|null The URL of the YouTube video watch page
709      */
710     public function getVideoWatchPageUrl()
711     {
712         $this->ensureMediaGroupIsNotNull();
713         if ($this->getMediaGroup()->getPlayer() != null &&
714              array_key_exists(0, $this->getMediaGroup()->getPlayer())) {
715             $players = $this->getMediaGroup()->getPlayer();
716             return $players[0]->getUrl();
717         } else {
718             return null;
719         }
720     }
721
722     /**
723      * Gets an array of the thumbnails representing the video.
724      * Each thumbnail is an element of the array, and is an
725      * array of the thumbnail properties - time, height, width,
726      * and url.  For convient usage inside a foreach loop, an
727      * empty array is returned if there are no thumbnails.
728      *
729      * @return array An array of video thumbnails.
730      */
731     public function getVideoThumbnails()
732     {
733         $this->ensureMediaGroupIsNotNull();
734         if ($this->getMediaGroup()->getThumbnail() != null) {
735
736             $thumbnailArray = array();
737
738             foreach ($this->getMediaGroup()->getThumbnail() as $thumbnailObj) {
739                 $thumbnail = array();
740                 $thumbnail['time'] = $thumbnailObj->time;
741                 $thumbnail['height'] = $thumbnailObj->height;
742                 $thumbnail['width'] = $thumbnailObj->width;
743                 $thumbnail['url'] = $thumbnailObj->url;
744                 $thumbnailArray[] = $thumbnail;
745             }
746             return $thumbnailArray;
747         } else {
748             return array();
749         }
750     }
751
752     /**
753      * Gets the URL of the flash player SWF.  null is returned if the
754      * duration value is not available.
755      *
756      * @return string|null The URL of the flash player SWF
757      */
758     public function getFlashPlayerUrl()
759     {
760         $this->ensureMediaGroupIsNotNull();
761         foreach ($this->getMediaGroup()->getContent() as $content) {
762                 if ($content->getType() === 'application/x-shockwave-flash') {
763                     return $content->getUrl();
764                 }
765             }
766         return null;
767     }
768
769     /**
770      * Gets the duration of the video, in seconds.  null is returned
771      * if the duration value is not available.
772      *
773      * @return string|null The duration of the video, in seconds.
774      */
775     public function getVideoDuration()
776     {
777         $this->ensureMediaGroupIsNotNull();
778         if ($this->getMediaGroup()->getDuration() != null) {
779             return $this->getMediaGroup()->getDuration()->getSeconds();
780         } else {
781             return null;
782         }
783     }
784
785     /**
786      * Checks whether the video is private.
787      *
788      * @return bool Return true if video is private
789      */
790     public function isVideoPrivate()
791     {
792         $this->ensureMediaGroupIsNotNull();
793         if ($this->getMediaGroup()->getPrivate() != null) {
794             return true;
795         } else {
796             return false;
797         }
798     }
799
800     /**
801      * Sets video to private.
802      *
803      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
804      */
805     public function setVideoPrivate()
806     {
807         $this->ensureMediaGroupIsNotNull();
808         $this->getMediaGroup()->setPrivate(new Zend_Gdata_YouTube_Extension_Private());
809         return $this;
810     }
811
812     /**
813      * Sets a private video to be public.
814      *
815      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
816      */
817     public function setVideoPublic()
818     {
819         $this->ensureMediaGroupIsNotNull();
820         $this->getMediaGroup()->private = null;
821         return $this;
822     }
823
824     /**
825      * Gets an array of the tags assigned to this video.  For convient
826      * usage inside a foreach loop, an empty array is returned when there
827      * are no tags assigned.
828      *
829      * @return array An array of the tags assigned to this video
830      */
831     public function getVideoTags()
832     {
833         $this->ensureMediaGroupIsNotNull();
834         if ($this->getMediaGroup()->getKeywords() != null) {
835
836             $keywords = $this->getMediaGroup()->getKeywords();
837             $keywordsString = $keywords->getText();
838             if (strlen(trim($keywordsString)) > 0) {
839                 return preg_split('/(, *)|,/', $keywordsString);
840             }
841         }
842         return array();
843     }
844
845     /**
846      * Sets the keyword tags for a video.
847      *
848      * @param mixed $tags Either a comma-separated string or an array
849      * of tags for the video
850      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
851      */
852     public function setVideoTags($tags)
853     {
854         $this->ensureMediaGroupIsNotNull();
855         $keywords = new Zend_Gdata_Media_Extension_MediaKeywords();
856         if (is_array($tags)) {
857             $tags = implode(', ', $tags);
858         }
859         $keywords->setText($tags);
860         $this->getMediaGroup()->setKeywords($keywords);
861         return $this;
862     }
863
864     /**
865      * Gets the number of views for this video.  null is returned if the
866      * number of views is not available.
867      *
868      * @return string|null The number of views for this video
869      */
870     public function getVideoViewCount()
871     {
872         if ($this->getStatistics() != null) {
873             return $this->getStatistics()->getViewCount();
874         } else {
875             return null;
876         }
877     }
878
879     /**
880      * Gets the location specified for this video, if available.  The location
881      * is returned as an array containing the keys 'longitude' and 'latitude'.
882      * null is returned if the location is not available.
883      *
884      * @return array|null The location specified for this video
885      */
886     public function getVideoGeoLocation()
887     {
888         if ($this->getWhere() != null &&
889             $this->getWhere()->getPoint() != null &&
890             ($position = $this->getWhere()->getPoint()->getPos()) != null) {
891
892             $positionString = $position->__toString();
893
894             if (strlen(trim($positionString)) > 0) {
895                 $positionArray = explode(' ', trim($positionString));
896                 if (count($positionArray) == 2) {
897                     $returnArray = array();
898                     $returnArray['latitude'] = $positionArray[0];
899                     $returnArray['longitude'] = $positionArray[1];
900                     return $returnArray;
901                 }
902             }
903         }
904         return null;
905     }
906
907     /**
908      * Gets the rating information for this video, if available.  The rating
909      * is returned as an array containing the keys 'average' and 'numRaters'.
910      * null is returned if the rating information is not available.
911      *
912      * @return array|null The rating information for this video
913      */
914     public function getVideoRatingInfo()
915     {
916         if ($this->getRating() != null) {
917             $returnArray = array();
918             $returnArray['average'] = $this->getRating()->getAverage();
919             $returnArray['numRaters'] = $this->getRating()->getNumRaters();
920             return $returnArray;
921         } else {
922             return null;
923         }
924     }
925
926     /**
927      * Gets the category of this video, if available.  The category is returned
928      * as a string. Valid categories are found at:
929      * http://gdata.youtube.com/schemas/2007/categories.cat
930      * If the category is not set, null is returned.
931      *
932      * @return string|null The category of this video
933      */
934     public function getVideoCategory()
935     {
936         $this->ensureMediaGroupIsNotNull();
937         $categories = $this->getMediaGroup()->getCategory();
938         if ($categories != null) {
939             foreach($categories as $category) {
940                 if ($category->getScheme() == self::YOUTUBE_CATEGORY_SCHEMA) {
941                     return $category->getText();
942                 }
943             }
944         }
945         return null;
946     }
947
948     /**
949      * Sets the category of the video as a string.
950      *
951      * @param string $category Categories for the video
952      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
953      */
954     public function setVideoCategory($category)
955     {
956         $this->ensureMediaGroupIsNotNull();
957         $this->getMediaGroup()->setCategory(array(new Zend_Gdata_Media_Extension_MediaCategory($category, self::YOUTUBE_CATEGORY_SCHEMA)));
958         return $this;
959     }
960
961     /**
962      * Gets the developer tags for the video, if available and if client is
963      * authenticated with a valid developerKey. The tags are returned
964      * as an array.
965      * If no tags are set, null is returned.
966      *
967      * @return array|null The developer tags for this video or null if none were set.
968      */
969     public function getVideoDeveloperTags()
970     {
971         $developerTags = null;
972         $this->ensureMediaGroupIsNotNull();
973
974         $categoryArray = $this->getMediaGroup()->getCategory();
975         if ($categoryArray != null) {
976             foreach ($categoryArray as $category) {
977                 if ($category instanceof Zend_Gdata_Media_Extension_MediaCategory) {
978                     if ($category->getScheme() == self::YOUTUBE_DEVELOPER_TAGS_SCHEMA) {
979                         $developerTags[] = $category->getText();
980                     }
981                 }
982             }
983             return $developerTags;
984         }
985         return null;
986     }
987
988     /**
989      * Adds a developer tag to array of tags for the video.
990      *
991      * @param string $developerTag DeveloperTag for the video
992      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
993      */
994     public function addVideoDeveloperTag($developerTag)
995     {
996         $this->ensureMediaGroupIsNotNull();
997         $newCategory = new Zend_Gdata_Media_Extension_MediaCategory($developerTag, self::YOUTUBE_DEVELOPER_TAGS_SCHEMA);
998
999         if ($this->getMediaGroup()->getCategory() == null) {
1000             $this->getMediaGroup()->setCategory($newCategory);
1001         } else {
1002             $categories = $this->getMediaGroup()->getCategory();
1003             $categories[] = $newCategory;
1004             $this->getMediaGroup()->setCategory($categories);
1005         }
1006         return $this;
1007     }
1008
1009     /**
1010      * Set multiple developer tags for the video as strings.
1011      *
1012      * @param array $developerTags Array of developerTag for the video
1013      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface
1014      */
1015     public function setVideoDeveloperTags($developerTags)
1016     {
1017         foreach($developerTags as $developerTag) {
1018             $this->addVideoDeveloperTag($developerTag);
1019         }
1020         return $this;
1021     }
1022
1023
1024     /**
1025      * Get the current publishing state of the video.
1026      *
1027      * @return Zend_Gdata_YouTube_Extension_State|null The publishing state of this video
1028      */
1029     public function getVideoState()
1030     {
1031         $control = $this->getControl();
1032         if ($control != null &&
1033             $control->getDraft() != null &&
1034             $control->getDraft()->getText() == 'yes') {
1035
1036             return $control->getState();
1037         }
1038         return null;
1039     }
1040
1041     /**
1042      * Get the VideoEntry's Zend_Gdata_YouTube_Extension_MediaGroup object.
1043      * If the mediaGroup does not exist, then set it.
1044      *
1045      * @return void
1046      */
1047     public function ensureMediaGroupIsNotNull()
1048     {
1049         if ($this->getMediagroup() == null) {
1050             $this->setMediagroup(new Zend_Gdata_YouTube_Extension_MediaGroup());
1051         }
1052     }
1053
1054     /**
1055      * Helper function to conveniently set a video's rating.
1056      *
1057      * @param integer $ratingValue A number representing the rating. Must
1058      *          be between 1 and 5 inclusive.
1059      * @throws Zend_Gdata_Exception
1060      * @return Zend_Gdata_YouTube_VideoEntry Provides a fluent interface.
1061      */
1062     public function setVideoRating($ratingValue)
1063     {
1064         if ($ratingValue < 1 || $ratingValue > 5) {
1065             require_once 'Zend/Gdata/App/InvalidArgumentException.php';
1066             throw new Zend_Gdata_App_InvalidArgumentException(
1067                 'Rating for video entry must be between 1 and 5 inclusive.');
1068         }
1069
1070          require_once 'Zend/Gdata/Extension/Rating.php';
1071          $rating = new Zend_Gdata_Extension_Rating(null, 1, 5, null,
1072             $ratingValue);
1073         $this->setRating($rating);
1074         return $this;
1075     }
1076
1077     /**
1078      * Retrieve the URL for a video's comment feed.
1079      *
1080      * @return string|null The URL if found, or null if not found.
1081      */
1082     public function getVideoCommentFeedUrl()
1083     {
1084         $commentsExtension = $this->getComments();
1085         $commentsFeedUrl = null;
1086         if ($commentsExtension) {
1087             $commentsFeedLink = $commentsExtension->getFeedLink();
1088             if ($commentsFeedLink) {
1089                 $commentsFeedUrl = $commentsFeedLink->getHref();
1090             }
1091         }
1092         return $commentsFeedUrl;
1093     }
1094
1095 }