|
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 * @version $Id: YouTube.php 20096 2010-01-06 02:05:09Z bkarwin $ |
|
22 */ |
|
23 |
|
24 /** |
|
25 * @see Zend_Gdata_Media |
|
26 */ |
|
27 require_once 'Zend/Gdata/Media.php'; |
|
28 |
|
29 /** |
|
30 * @see Zend_Gdata_YouTube_VideoEntry |
|
31 */ |
|
32 require_once 'Zend/Gdata/YouTube/VideoEntry.php'; |
|
33 |
|
34 /** |
|
35 * @see Zend_Gdata_YouTube_VideoFeed |
|
36 */ |
|
37 require_once 'Zend/Gdata/YouTube/VideoFeed.php'; |
|
38 |
|
39 /** |
|
40 * @see Zend_Gdata_YouTube_CommentFeed |
|
41 */ |
|
42 require_once 'Zend/Gdata/YouTube/CommentFeed.php'; |
|
43 |
|
44 /** |
|
45 * @see Zend_Gdata_YouTube_PlaylistListFeed |
|
46 */ |
|
47 require_once 'Zend/Gdata/YouTube/PlaylistListFeed.php'; |
|
48 |
|
49 /** |
|
50 * @see Zend_Gdata_YouTube_SubscriptionFeed |
|
51 */ |
|
52 require_once 'Zend/Gdata/YouTube/SubscriptionFeed.php'; |
|
53 |
|
54 /** |
|
55 * @see Zend_Gdata_YouTube_ContactFeed |
|
56 */ |
|
57 require_once 'Zend/Gdata/YouTube/ContactFeed.php'; |
|
58 |
|
59 /** |
|
60 * @see Zend_Gdata_YouTube_PlaylistVideoFeed |
|
61 */ |
|
62 require_once 'Zend/Gdata/YouTube/PlaylistVideoFeed.php'; |
|
63 |
|
64 /** |
|
65 * @see Zend_Gdata_YouTube_ActivityFeed |
|
66 */ |
|
67 require_once 'Zend/Gdata/YouTube/ActivityFeed.php'; |
|
68 |
|
69 /** |
|
70 * @see Zend_Gdata_YouTube_InboxFeed |
|
71 */ |
|
72 require_once 'Zend/Gdata/YouTube/InboxFeed.php'; |
|
73 |
|
74 |
|
75 /** |
|
76 * Service class for interacting with the YouTube Data API. |
|
77 * @link http://code.google.com/apis/youtube/ |
|
78 * |
|
79 * @category Zend |
|
80 * @package Zend_Gdata |
|
81 * @subpackage YouTube |
|
82 * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) |
|
83 * @license http://framework.zend.com/license/new-bsd New BSD License |
|
84 */ |
|
85 class Zend_Gdata_YouTube extends Zend_Gdata_Media |
|
86 { |
|
87 |
|
88 const AUTH_SERVICE_NAME = 'youtube'; |
|
89 const CLIENTLOGIN_URL = 'https://www.google.com/youtube/accounts/ClientLogin'; |
|
90 |
|
91 const STANDARD_TOP_RATED_URI = 'http://gdata.youtube.com/feeds/api/standardfeeds/top_rated'; |
|
92 const STANDARD_MOST_VIEWED_URI = 'http://gdata.youtube.com/feeds/api/standardfeeds/most_viewed'; |
|
93 const STANDARD_RECENTLY_FEATURED_URI = 'http://gdata.youtube.com/feeds/api/standardfeeds/recently_featured'; |
|
94 const STANDARD_WATCH_ON_MOBILE_URI = 'http://gdata.youtube.com/feeds/api/standardfeeds/watch_on_mobile'; |
|
95 |
|
96 const STANDARD_TOP_RATED_URI_V2 = |
|
97 'http://gdata.youtube.com/feeds/api/standardfeeds/top_rated'; |
|
98 const STANDARD_MOST_VIEWED_URI_V2 = |
|
99 'http://gdata.youtube.com/feeds/api/standardfeeds/most_viewed'; |
|
100 const STANDARD_RECENTLY_FEATURED_URI_V2 = |
|
101 'http://gdata.youtube.com/feeds/api/standardfeeds/recently_featured'; |
|
102 const STANDARD_WATCH_ON_MOBILE_URI_V2 = |
|
103 'http://gdata.youtube.com/feeds/api/standardfeeds/watch_on_mobile'; |
|
104 |
|
105 const USER_URI = 'http://gdata.youtube.com/feeds/api/users'; |
|
106 const VIDEO_URI = 'http://gdata.youtube.com/feeds/api/videos'; |
|
107 const PLAYLIST_REL = 'http://gdata.youtube.com/schemas/2007#playlist'; |
|
108 const USER_UPLOADS_REL = 'http://gdata.youtube.com/schemas/2007#user.uploads'; |
|
109 const USER_PLAYLISTS_REL = 'http://gdata.youtube.com/schemas/2007#user.playlists'; |
|
110 const USER_SUBSCRIPTIONS_REL = 'http://gdata.youtube.com/schemas/2007#user.subscriptions'; |
|
111 const USER_CONTACTS_REL = 'http://gdata.youtube.com/schemas/2007#user.contacts'; |
|
112 const USER_FAVORITES_REL = 'http://gdata.youtube.com/schemas/2007#user.favorites'; |
|
113 const VIDEO_RESPONSES_REL = 'http://gdata.youtube.com/schemas/2007#video.responses'; |
|
114 const VIDEO_RATINGS_REL = 'http://gdata.youtube.com/schemas/2007#video.ratings'; |
|
115 const VIDEO_COMPLAINTS_REL = 'http://gdata.youtube.com/schemas/2007#video.complaints'; |
|
116 const ACTIVITY_FEED_URI = 'http://gdata.youtube.com/feeds/api/events'; |
|
117 const FRIEND_ACTIVITY_FEED_URI = |
|
118 'http://gdata.youtube.com/feeds/api/users/default/friendsactivity'; |
|
119 |
|
120 /** |
|
121 * The URI of the in-reply-to schema for comments in reply to |
|
122 * other comments. |
|
123 * |
|
124 * @var string |
|
125 */ |
|
126 const IN_REPLY_TO_SCHEME = |
|
127 'http://gdata.youtube.com/schemas/2007#in-reply-to'; |
|
128 |
|
129 /** |
|
130 * The URI of the inbox feed for the currently authenticated user. |
|
131 * |
|
132 * @var string |
|
133 */ |
|
134 const INBOX_FEED_URI = |
|
135 'http://gdata.youtube.com/feeds/api/users/default/inbox'; |
|
136 |
|
137 /** |
|
138 * The maximum number of users for which activity can be requested for, |
|
139 * as enforced by the API. |
|
140 * |
|
141 * @var integer |
|
142 */ |
|
143 const ACTIVITY_FEED_MAX_USERS = 20; |
|
144 |
|
145 /** |
|
146 * The suffix for a feed of favorites. |
|
147 * |
|
148 * @var string |
|
149 */ |
|
150 const FAVORITES_URI_SUFFIX = 'favorites'; |
|
151 |
|
152 /** |
|
153 * The suffix for the user's upload feed. |
|
154 * |
|
155 * @var string |
|
156 */ |
|
157 const UPLOADS_URI_SUFFIX = 'uploads'; |
|
158 |
|
159 /** |
|
160 * The suffix for a feed of video responses. |
|
161 * |
|
162 * @var string |
|
163 */ |
|
164 const RESPONSES_URI_SUFFIX = 'responses'; |
|
165 |
|
166 /** |
|
167 * The suffix for a feed of related videos. |
|
168 * |
|
169 * @var string |
|
170 */ |
|
171 const RELATED_URI_SUFFIX = 'related'; |
|
172 |
|
173 /** |
|
174 * The suffix for a feed of messages (inbox entries). |
|
175 * |
|
176 * @var string |
|
177 */ |
|
178 const INBOX_URI_SUFFIX = 'inbox'; |
|
179 |
|
180 /** |
|
181 * Namespaces used for Zend_Gdata_YouTube |
|
182 * |
|
183 * @var array |
|
184 */ |
|
185 public static $namespaces = array( |
|
186 array('yt', 'http://gdata.youtube.com/schemas/2007', 1, 0), |
|
187 array('georss', 'http://www.georss.org/georss', 1, 0), |
|
188 array('gml', 'http://www.opengis.net/gml', 1, 0), |
|
189 array('media', 'http://search.yahoo.com/mrss/', 1, 0) |
|
190 ); |
|
191 |
|
192 /** |
|
193 * Create Zend_Gdata_YouTube object |
|
194 * |
|
195 * @param Zend_Http_Client $client (optional) The HTTP client to use when |
|
196 * when communicating with the Google servers. |
|
197 * @param string $applicationId The identity of the app in the form of |
|
198 * Company-AppName-Version |
|
199 * @param string $clientId The clientId issued by the YouTube dashboard |
|
200 * @param string $developerKey The developerKey issued by the YouTube dashboard |
|
201 */ |
|
202 public function __construct($client = null, |
|
203 $applicationId = 'MyCompany-MyApp-1.0', $clientId = null, |
|
204 $developerKey = null) |
|
205 { |
|
206 $this->registerPackage('Zend_Gdata_YouTube'); |
|
207 $this->registerPackage('Zend_Gdata_YouTube_Extension'); |
|
208 $this->registerPackage('Zend_Gdata_Media'); |
|
209 $this->registerPackage('Zend_Gdata_Media_Extension'); |
|
210 |
|
211 // NOTE This constructor no longer calls the parent constructor |
|
212 $this->setHttpClient($client, $applicationId, $clientId, $developerKey); |
|
213 } |
|
214 |
|
215 /** |
|
216 * Set the Zend_Http_Client object used for communication |
|
217 * |
|
218 * @param Zend_Http_Client $client The client to use for communication |
|
219 * @throws Zend_Gdata_App_HttpException |
|
220 * @return Zend_Gdata_App Provides a fluent interface |
|
221 */ |
|
222 public function setHttpClient($client, |
|
223 $applicationId = 'MyCompany-MyApp-1.0', $clientId = null, |
|
224 $developerKey = null) |
|
225 { |
|
226 if ($client === null) { |
|
227 $client = new Zend_Http_Client(); |
|
228 } |
|
229 if (!$client instanceof Zend_Http_Client) { |
|
230 require_once 'Zend/Gdata/App/HttpException.php'; |
|
231 throw new Zend_Gdata_App_HttpException( |
|
232 'Argument is not an instance of Zend_Http_Client.'); |
|
233 } |
|
234 |
|
235 if ($clientId != null) { |
|
236 $client->setHeaders('X-GData-Client', $clientId); |
|
237 } |
|
238 |
|
239 if ($developerKey != null) { |
|
240 $client->setHeaders('X-GData-Key', 'key='. $developerKey); |
|
241 } |
|
242 |
|
243 return parent::setHttpClient($client, $applicationId); |
|
244 } |
|
245 |
|
246 /** |
|
247 * Retrieves a feed of videos. |
|
248 * |
|
249 * @param mixed $location (optional) The URL to query or a |
|
250 * Zend_Gdata_Query object from which a URL can be determined |
|
251 * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the |
|
252 * specified URL. |
|
253 */ |
|
254 public function getVideoFeed($location = null) |
|
255 { |
|
256 if ($location == null) { |
|
257 $uri = self::VIDEO_URI; |
|
258 } else if ($location instanceof Zend_Gdata_Query) { |
|
259 $uri = $location->getQueryUrl(); |
|
260 } else { |
|
261 $uri = $location; |
|
262 } |
|
263 return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); |
|
264 } |
|
265 |
|
266 /** |
|
267 * Retrieves a specific video entry. |
|
268 * |
|
269 * @param mixed $videoId The ID of the video to retrieve. |
|
270 * @param mixed $location (optional) The URL to query or a |
|
271 * Zend_Gdata_Query object from which a URL can be determined. |
|
272 * @param boolean $fullEntry (optional) Retrieve the full metadata for the |
|
273 * entry. Only possible if entry belongs to currently authenticated |
|
274 * user. An exception will be thrown otherwise. |
|
275 * @throws Zend_Gdata_App_HttpException |
|
276 * @return Zend_Gdata_YouTube_VideoEntry The video entry found at the |
|
277 * specified URL. |
|
278 */ |
|
279 public function getVideoEntry($videoId = null, $location = null, |
|
280 $fullEntry = false) |
|
281 { |
|
282 if ($videoId !== null) { |
|
283 if ($fullEntry) { |
|
284 return $this->getFullVideoEntry($videoId); |
|
285 } else { |
|
286 $uri = self::VIDEO_URI . "/" . $videoId; |
|
287 } |
|
288 } else if ($location instanceof Zend_Gdata_Query) { |
|
289 $uri = $location->getQueryUrl(); |
|
290 } else { |
|
291 $uri = $location; |
|
292 } |
|
293 return parent::getEntry($uri, 'Zend_Gdata_YouTube_VideoEntry'); |
|
294 } |
|
295 |
|
296 /** |
|
297 * Retrieves a video entry from the user's upload feed. |
|
298 * |
|
299 * @param mixed $videoID The ID of the video to retrieve. |
|
300 * @throws Zend_Gdata_App_HttpException |
|
301 * @return Zend_Gdata_YouTube_VideoEntry|null The video entry to be |
|
302 * retrieved, or null if it was not found or the user requesting it |
|
303 * did not have the appropriate permissions. |
|
304 */ |
|
305 public function getFullVideoEntry($videoId) |
|
306 { |
|
307 $uri = self::USER_URI . "/default/" . |
|
308 self::UPLOADS_URI_SUFFIX . "/$videoId"; |
|
309 return parent::getEntry($uri, 'Zend_Gdata_YouTube_VideoEntry'); |
|
310 } |
|
311 |
|
312 /** |
|
313 * Retrieves a feed of videos related to the specified video ID. |
|
314 * |
|
315 * @param string $videoId The videoId of interest |
|
316 * @param mixed $location (optional) The URL to query or a |
|
317 * Zend_Gdata_Query object from which a URL can be determined |
|
318 * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the |
|
319 * specified URL. |
|
320 */ |
|
321 public function getRelatedVideoFeed($videoId = null, $location = null) |
|
322 { |
|
323 if ($videoId !== null) { |
|
324 $uri = self::VIDEO_URI . "/" . $videoId . "/" . |
|
325 self::RELATED_URI_SUFFIX; |
|
326 } else if ($location instanceof Zend_Gdata_Query) { |
|
327 $uri = $location->getQueryUrl(); |
|
328 } else { |
|
329 $uri = $location; |
|
330 } |
|
331 return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); |
|
332 } |
|
333 |
|
334 /** |
|
335 * Retrieves a feed of video responses related to the specified video ID. |
|
336 * |
|
337 * @param string $videoId The videoId of interest |
|
338 * @param mixed $location (optional) The URL to query or a |
|
339 * Zend_Gdata_Query object from which a URL can be determined |
|
340 * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the |
|
341 * specified URL. |
|
342 */ |
|
343 public function getVideoResponseFeed($videoId = null, $location = null) |
|
344 { |
|
345 if ($videoId !== null) { |
|
346 $uri = self::VIDEO_URI . "/" . $videoId . "/" . |
|
347 self::RESPONSES_URI_SUFFIX; |
|
348 } else if ($location instanceof Zend_Gdata_Query) { |
|
349 $uri = $location->getQueryUrl(); |
|
350 } else { |
|
351 $uri = $location; |
|
352 } |
|
353 return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); |
|
354 } |
|
355 |
|
356 /** |
|
357 * Retrieves a feed of comments related to the specified video ID. |
|
358 * |
|
359 * @param string $videoId The videoId of interest |
|
360 * @param mixed $location (optional) The URL to query or a |
|
361 * Zend_Gdata_Query object from which a URL can be determined |
|
362 * @return Zend_Gdata_YouTube_CommentFeed The feed of videos found at the |
|
363 * specified URL. |
|
364 */ |
|
365 public function getVideoCommentFeed($videoId = null, $location = null) |
|
366 { |
|
367 if ($videoId !== null) { |
|
368 $uri = self::VIDEO_URI . "/" . $videoId . "/comments"; |
|
369 } else if ($location instanceof Zend_Gdata_Query) { |
|
370 $uri = $location->getQueryUrl(); |
|
371 } else { |
|
372 $uri = $location; |
|
373 } |
|
374 return parent::getFeed($uri, 'Zend_Gdata_YouTube_CommentFeed'); |
|
375 } |
|
376 |
|
377 /** |
|
378 * Retrieves a feed of comments related to the specified video ID. |
|
379 * |
|
380 * @param mixed $location (optional) The URL to query or a |
|
381 * Zend_Gdata_Query object from which a URL can be determined |
|
382 * @return Zend_Gdata_YouTube_CommentFeed The feed of videos found at the |
|
383 * specified URL. |
|
384 */ |
|
385 public function getTopRatedVideoFeed($location = null) |
|
386 { |
|
387 $standardFeedUri = self::STANDARD_TOP_RATED_URI; |
|
388 |
|
389 if ($this->getMajorProtocolVersion() == 2) { |
|
390 $standardFeedUri = self::STANDARD_TOP_RATED_URI_V2; |
|
391 } |
|
392 |
|
393 if ($location == null) { |
|
394 $uri = $standardFeedUri; |
|
395 } else if ($location instanceof Zend_Gdata_Query) { |
|
396 if ($location instanceof Zend_Gdata_YouTube_VideoQuery) { |
|
397 if (!isset($location->url)) { |
|
398 $location->setFeedType('top rated'); |
|
399 } |
|
400 } |
|
401 $uri = $location->getQueryUrl(); |
|
402 } else { |
|
403 $uri = $location; |
|
404 } |
|
405 return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); |
|
406 } |
|
407 |
|
408 |
|
409 /** |
|
410 * Retrieves a feed of the most viewed videos. |
|
411 * |
|
412 * @param mixed $location (optional) The URL to query or a |
|
413 * Zend_Gdata_Query object from which a URL can be determined |
|
414 * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the |
|
415 * specified URL. |
|
416 */ |
|
417 public function getMostViewedVideoFeed($location = null) |
|
418 { |
|
419 $standardFeedUri = self::STANDARD_MOST_VIEWED_URI; |
|
420 |
|
421 if ($this->getMajorProtocolVersion() == 2) { |
|
422 $standardFeedUri = self::STANDARD_MOST_VIEWED_URI_V2; |
|
423 } |
|
424 |
|
425 if ($location == null) { |
|
426 $uri = $standardFeedUri; |
|
427 } else if ($location instanceof Zend_Gdata_Query) { |
|
428 if ($location instanceof Zend_Gdata_YouTube_VideoQuery) { |
|
429 if (!isset($location->url)) { |
|
430 $location->setFeedType('most viewed'); |
|
431 } |
|
432 } |
|
433 $uri = $location->getQueryUrl(); |
|
434 } else { |
|
435 $uri = $location; |
|
436 } |
|
437 return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); |
|
438 } |
|
439 |
|
440 /** |
|
441 * Retrieves a feed of recently featured videos. |
|
442 * |
|
443 * @param mixed $location (optional) The URL to query or a |
|
444 * Zend_Gdata_Query object from which a URL can be determined |
|
445 * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the |
|
446 * specified URL. |
|
447 */ |
|
448 public function getRecentlyFeaturedVideoFeed($location = null) |
|
449 { |
|
450 $standardFeedUri = self::STANDARD_RECENTLY_FEATURED_URI; |
|
451 |
|
452 if ($this->getMajorProtocolVersion() == 2) { |
|
453 $standardFeedUri = self::STANDARD_RECENTLY_FEATURED_URI_V2; |
|
454 } |
|
455 |
|
456 if ($location == null) { |
|
457 $uri = $standardFeedUri; |
|
458 } else if ($location instanceof Zend_Gdata_Query) { |
|
459 if ($location instanceof Zend_Gdata_YouTube_VideoQuery) { |
|
460 if (!isset($location->url)) { |
|
461 $location->setFeedType('recently featured'); |
|
462 } |
|
463 } |
|
464 $uri = $location->getQueryUrl(); |
|
465 } else { |
|
466 $uri = $location; |
|
467 } |
|
468 return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); |
|
469 } |
|
470 |
|
471 /** |
|
472 * Retrieves a feed of videos recently featured for mobile devices. |
|
473 * These videos will have RTSP links in the $entry->mediaGroup->content |
|
474 * |
|
475 * @param mixed $location (optional) The URL to query or a |
|
476 * Zend_Gdata_Query object from which a URL can be determined |
|
477 * @return Zend_Gdata_YouTube_VideoFeed The feed of videos found at the |
|
478 * specified URL. |
|
479 */ |
|
480 public function getWatchOnMobileVideoFeed($location = null) |
|
481 { |
|
482 $standardFeedUri = self::STANDARD_WATCH_ON_MOBILE_URI; |
|
483 |
|
484 if ($this->getMajorProtocolVersion() == 2) { |
|
485 $standardFeedUri = self::STANDARD_WATCH_ON_MOBILE_URI_V2; |
|
486 } |
|
487 |
|
488 if ($location == null) { |
|
489 $uri = $standardFeedUri; |
|
490 } else if ($location instanceof Zend_Gdata_Query) { |
|
491 if ($location instanceof Zend_Gdata_YouTube_VideoQuery) { |
|
492 if (!isset($location->url)) { |
|
493 $location->setFeedType('watch on mobile'); |
|
494 } |
|
495 } |
|
496 $uri = $location->getQueryUrl(); |
|
497 } else { |
|
498 $uri = $location; |
|
499 } |
|
500 return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); |
|
501 } |
|
502 |
|
503 /** |
|
504 * Retrieves a feed which lists a user's playlist |
|
505 * |
|
506 * @param string $user (optional) The username of interest |
|
507 * @param mixed $location (optional) The URL to query or a |
|
508 * Zend_Gdata_Query object from which a URL can be determined |
|
509 * @return Zend_Gdata_YouTube_PlaylistListFeed The feed of playlists |
|
510 */ |
|
511 public function getPlaylistListFeed($user = null, $location = null) |
|
512 { |
|
513 if ($user !== null) { |
|
514 $uri = self::USER_URI . '/' . $user . '/playlists'; |
|
515 } else if ($location instanceof Zend_Gdata_Query) { |
|
516 $uri = $location->getQueryUrl(); |
|
517 } else { |
|
518 $uri = $location; |
|
519 } |
|
520 return parent::getFeed($uri, 'Zend_Gdata_YouTube_PlaylistListFeed'); |
|
521 } |
|
522 |
|
523 /** |
|
524 * Retrieves a feed of videos in a particular playlist |
|
525 * |
|
526 * @param mixed $location (optional) The URL to query or a |
|
527 * Zend_Gdata_Query object from which a URL can be determined |
|
528 * @return Zend_Gdata_YouTube_PlaylistVideoFeed The feed of videos found at |
|
529 * the specified URL. |
|
530 */ |
|
531 public function getPlaylistVideoFeed($location) |
|
532 { |
|
533 if ($location instanceof Zend_Gdata_Query) { |
|
534 $uri = $location->getQueryUrl(); |
|
535 } else { |
|
536 $uri = $location; |
|
537 } |
|
538 return parent::getFeed($uri, 'Zend_Gdata_YouTube_PlaylistVideoFeed'); |
|
539 } |
|
540 |
|
541 /** |
|
542 * Retrieves a feed of a user's subscriptions |
|
543 * |
|
544 * @param string $user (optional) The username of interest |
|
545 * @param mixed $location (optional) The URL to query or a |
|
546 * Zend_Gdata_Query object from which a URL can be determined |
|
547 * @return Zend_Gdata_YouTube_SubscriptionListFeed The feed of subscriptions |
|
548 */ |
|
549 public function getSubscriptionFeed($user = null, $location = null) |
|
550 { |
|
551 if ($user !== null) { |
|
552 $uri = self::USER_URI . '/' . $user . '/subscriptions'; |
|
553 } else if ($location instanceof Zend_Gdata_Query) { |
|
554 $uri = $location->getQueryUrl(); |
|
555 } else { |
|
556 $uri = $location; |
|
557 } |
|
558 return parent::getFeed($uri, 'Zend_Gdata_YouTube_SubscriptionFeed'); |
|
559 } |
|
560 |
|
561 /** |
|
562 * Retrieves a feed of a user's contacts |
|
563 * |
|
564 * @param string $user (optional) The username of interest |
|
565 * @param mixed $location (optional) The URL to query or a |
|
566 * Zend_Gdata_Query object from which a URL can be determined |
|
567 * @return Zend_Gdata_YouTube_ContactFeed The feed of contacts |
|
568 */ |
|
569 public function getContactFeed($user = null, $location = null) |
|
570 { |
|
571 if ($user !== null) { |
|
572 $uri = self::USER_URI . '/' . $user . '/contacts'; |
|
573 } else if ($location instanceof Zend_Gdata_Query) { |
|
574 $uri = $location->getQueryUrl(); |
|
575 } else { |
|
576 $uri = $location; |
|
577 } |
|
578 return parent::getFeed($uri, 'Zend_Gdata_YouTube_ContactFeed'); |
|
579 } |
|
580 |
|
581 /** |
|
582 * Retrieves a user's uploads |
|
583 * |
|
584 * @param string $user (optional) The username of interest |
|
585 * @param mixed $location (optional) The URL to query or a |
|
586 * Zend_Gdata_Query object from which a URL can be determined |
|
587 * @return Zend_Gdata_YouTube_VideoFeed The videos uploaded by the user |
|
588 */ |
|
589 public function getUserUploads($user = null, $location = null) |
|
590 { |
|
591 if ($user !== null) { |
|
592 $uri = self::USER_URI . '/' . $user . '/' . |
|
593 self::UPLOADS_URI_SUFFIX; |
|
594 } else if ($location instanceof Zend_Gdata_Query) { |
|
595 $uri = $location->getQueryUrl(); |
|
596 } else { |
|
597 $uri = $location; |
|
598 } |
|
599 return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); |
|
600 } |
|
601 |
|
602 /** |
|
603 * Retrieves a user's favorites |
|
604 * |
|
605 * @param string $user (optional) The username of interest |
|
606 * @param mixed $location (optional) The URL to query or a |
|
607 * Zend_Gdata_Query object from which a URL can be determined |
|
608 * @return Zend_Gdata_YouTube_VideoFeed The videos favorited by the user |
|
609 */ |
|
610 public function getUserFavorites($user = null, $location = null) |
|
611 { |
|
612 if ($user !== null) { |
|
613 $uri = self::USER_URI . '/' . $user . '/' . |
|
614 self::FAVORITES_URI_SUFFIX; |
|
615 } else if ($location instanceof Zend_Gdata_Query) { |
|
616 $uri = $location->getQueryUrl(); |
|
617 } else { |
|
618 $uri = $location; |
|
619 } |
|
620 return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); |
|
621 } |
|
622 |
|
623 /** |
|
624 * Retrieves a user's profile as an entry |
|
625 * |
|
626 * @param string $user (optional) The username of interest |
|
627 * @param mixed $location (optional) The URL to query or a |
|
628 * Zend_Gdata_Query object from which a URL can be determined |
|
629 * @return Zend_Gdata_YouTube_UserProfileEntry The user profile entry |
|
630 */ |
|
631 public function getUserProfile($user = null, $location = null) |
|
632 { |
|
633 if ($user !== null) { |
|
634 $uri = self::USER_URI . '/' . $user; |
|
635 } else if ($location instanceof Zend_Gdata_Query) { |
|
636 $uri = $location->getQueryUrl(); |
|
637 } else { |
|
638 $uri = $location; |
|
639 } |
|
640 return parent::getEntry($uri, 'Zend_Gdata_YouTube_UserProfileEntry'); |
|
641 } |
|
642 |
|
643 /** |
|
644 * Helper function for parsing a YouTube token response |
|
645 * |
|
646 * @param string $response The service response |
|
647 * @throws Zend_Gdata_App_Exception |
|
648 * @return array An array containing the token and URL |
|
649 */ |
|
650 public static function parseFormUploadTokenResponse($response) |
|
651 { |
|
652 // Load the feed as an XML DOMDocument object |
|
653 @ini_set('track_errors', 1); |
|
654 $doc = new DOMDocument(); |
|
655 $success = @$doc->loadXML($response); |
|
656 @ini_restore('track_errors'); |
|
657 |
|
658 if (!$success) { |
|
659 require_once 'Zend/Gdata/App/Exception.php'; |
|
660 throw new Zend_Gdata_App_Exception( |
|
661 "Zend_Gdata_YouTube::parseFormUploadTokenResponse - " . |
|
662 "DOMDocument cannot parse XML: $php_errormsg"); |
|
663 } |
|
664 $responseElement = $doc->getElementsByTagName('response')->item(0); |
|
665 |
|
666 $urlText = null; |
|
667 $tokenText = null; |
|
668 if ($responseElement != null) { |
|
669 $urlElement = |
|
670 $responseElement->getElementsByTagName('url')->item(0); |
|
671 $tokenElement = |
|
672 $responseElement->getElementsByTagName('token')->item(0); |
|
673 |
|
674 if ($urlElement && $urlElement->hasChildNodes() && |
|
675 $tokenElement && $tokenElement->hasChildNodes()) { |
|
676 |
|
677 $urlText = $urlElement->firstChild->nodeValue; |
|
678 $tokenText = $tokenElement->firstChild->nodeValue; |
|
679 } |
|
680 } |
|
681 |
|
682 if ($tokenText != null && $urlText != null) { |
|
683 return array('token' => $tokenText, 'url' => $urlText); |
|
684 } else { |
|
685 require_once 'Zend/Gdata/App/Exception.php'; |
|
686 throw new Zend_Gdata_App_Exception( |
|
687 'Form upload token not found in response'); |
|
688 } |
|
689 } |
|
690 |
|
691 /** |
|
692 * Retrieves a YouTube token |
|
693 * |
|
694 * @param Zend_Gdata_YouTube_VideoEntry $videoEntry The video entry |
|
695 * @param string $url The location as a string URL |
|
696 * @throws Zend_Gdata_App_Exception |
|
697 * @return array An array containing a token and URL |
|
698 */ |
|
699 public function getFormUploadToken($videoEntry, |
|
700 $url='http://gdata.youtube.com/action/GetUploadToken') |
|
701 { |
|
702 if ($url != null && is_string($url)) { |
|
703 // $response is a Zend_Http_response object |
|
704 $response = $this->post($videoEntry, $url); |
|
705 return self::parseFormUploadTokenResponse($response->getBody()); |
|
706 } else { |
|
707 require_once 'Zend/Gdata/App/Exception.php'; |
|
708 throw new Zend_Gdata_App_Exception( |
|
709 'Url must be provided as a string URL'); |
|
710 } |
|
711 } |
|
712 |
|
713 /** |
|
714 * Retrieves the activity feed for users |
|
715 * |
|
716 * @param mixed $usernames A string identifying the usernames for which to |
|
717 * retrieve activity for. This can also be a Zend_Gdata_Query |
|
718 * object from which a URL can be determined. |
|
719 * @throws Zend_Gdata_App_VersionException if using version less than 2. |
|
720 * @return Zend_Gdata_YouTube_ActivityFeed |
|
721 */ |
|
722 public function getActivityForUser($username) |
|
723 { |
|
724 if ($this->getMajorProtocolVersion() == 1) { |
|
725 require_once 'Zend/Gdata/App/VersionException.php'; |
|
726 throw new Zend_Gdata_App_VersionException('User activity feeds ' . |
|
727 'are not available in API version 1.'); |
|
728 } |
|
729 |
|
730 $uri = null; |
|
731 if ($username instanceof Zend_Gdata_Query) { |
|
732 $uri = $username->getQueryUrl(); |
|
733 } else { |
|
734 if (count(explode(',', $username)) > |
|
735 self::ACTIVITY_FEED_MAX_USERS) { |
|
736 require_once 'Zend/Gdata/App/InvalidArgumentException.php'; |
|
737 throw new Zend_Gdata_App_InvalidArgumentException( |
|
738 'Activity feed can only retrieve for activity for up to ' . |
|
739 self::ACTIVITY_FEED_MAX_USERS . ' users per request'); |
|
740 } |
|
741 $uri = self::ACTIVITY_FEED_URI . '?author=' . $username; |
|
742 } |
|
743 |
|
744 return parent::getFeed($uri, 'Zend_Gdata_YouTube_ActivityFeed'); |
|
745 } |
|
746 |
|
747 /** |
|
748 * Retrieve the activity of the currently authenticated users friend. |
|
749 * |
|
750 * @throws Zend_Gdata_App_Exception if not logged in. |
|
751 * @return Zend_Gdata_YouTube_ActivityFeed |
|
752 */ |
|
753 public function getFriendActivityForCurrentUser() |
|
754 { |
|
755 if (!$this->isAuthenticated()) { |
|
756 require_once 'Zend/Gdata/App/Exception.php'; |
|
757 throw new Zend_Gdata_App_Exception('You must be authenticated to ' . |
|
758 'use the getFriendActivityForCurrentUser function in Zend_' . |
|
759 'Gdata_YouTube.'); |
|
760 } |
|
761 return parent::getFeed(self::FRIEND_ACTIVITY_FEED_URI, |
|
762 'Zend_Gdata_YouTube_ActivityFeed'); |
|
763 } |
|
764 |
|
765 /** |
|
766 * Retrieve a feed of messages in the currently authenticated user's inbox. |
|
767 * |
|
768 * @throws Zend_Gdata_App_Exception if not logged in. |
|
769 * @return Zend_Gdata_YouTube_InboxFeed|null |
|
770 */ |
|
771 public function getInboxFeedForCurrentUser() |
|
772 { |
|
773 if (!$this->isAuthenticated()) { |
|
774 require_once 'Zend/Gdata/App/Exception.php'; |
|
775 throw new Zend_Gdata_App_Exception('You must be authenticated to ' . |
|
776 'use the getInboxFeedForCurrentUser function in Zend_' . |
|
777 'Gdata_YouTube.'); |
|
778 } |
|
779 |
|
780 return parent::getFeed(self::INBOX_FEED_URI, |
|
781 'Zend_Gdata_YouTube_InboxFeed'); |
|
782 } |
|
783 |
|
784 /** |
|
785 * Send a video message. |
|
786 * |
|
787 * Note: Either a Zend_Gdata_YouTube_VideoEntry or a valid video ID must |
|
788 * be provided. |
|
789 * |
|
790 * @param string $body The body of the message |
|
791 * @param Zend_Gdata_YouTube_VideoEntry (optional) The video entry to send |
|
792 * @param string $videoId The id of the video to send |
|
793 * @param string $recipientUserName The username of the recipient |
|
794 * @throws Zend_Gdata_App_InvalidArgumentException if no valid |
|
795 * Zend_Gdata_YouTube_VideoEntry or videoId were provided |
|
796 * @return Zend_Gdata_YouTube_InboxEntry|null The |
|
797 * Zend_Gdata_YouTube_Inbox_Entry representing the sent message. |
|
798 * |
|
799 */ |
|
800 public function sendVideoMessage($body, $videoEntry = null, |
|
801 $videoId = null, $recipientUserName) |
|
802 { |
|
803 if (!$videoId && !$videoEntry) { |
|
804 require_once 'Zend/Gdata/App/InvalidArgumentException.php'; |
|
805 throw new Zend_Gdata_App_InvalidArgumentException( |
|
806 'Expecting either a valid videoID or a videoEntry object in ' . |
|
807 'Zend_Gdata_YouTube->sendVideoMessage().'); |
|
808 } |
|
809 |
|
810 $messageEntry = new Zend_Gdata_YouTube_InboxEntry(); |
|
811 |
|
812 if ($this->getMajorProtocolVersion() == null || |
|
813 $this->getMajorProtocolVersion() == 1) { |
|
814 |
|
815 if (!$videoId) { |
|
816 $videoId = $videoEntry->getVideoId(); |
|
817 } elseif (strlen($videoId) < 12) { |
|
818 //Append the full URI |
|
819 $videoId = self::VIDEO_URI . '/' . $videoId; |
|
820 } |
|
821 |
|
822 $messageEntry->setId($this->newId($videoId)); |
|
823 // TODO there seems to be a bug where v1 inbox entries dont |
|
824 // retain their description... |
|
825 $messageEntry->setDescription( |
|
826 new Zend_Gdata_YouTube_Extension_Description($body)); |
|
827 |
|
828 } else { |
|
829 if (!$videoId) { |
|
830 $videoId = $videoEntry->getVideoId(); |
|
831 $videoId = substr($videoId, strrpos($videoId, ':')); |
|
832 } |
|
833 $messageEntry->setId($this->newId($videoId)); |
|
834 $messageEntry->setSummary($this->newSummary($body)); |
|
835 } |
|
836 |
|
837 $insertUrl = 'http://gdata.youtube.com/feeds/api/users/' . |
|
838 $recipientUserName . '/inbox'; |
|
839 $response = $this->insertEntry($messageEntry, $insertUrl, |
|
840 'Zend_Gdata_YouTube_InboxEntry'); |
|
841 return $response; |
|
842 } |
|
843 |
|
844 /** |
|
845 * Post a comment in reply to an existing comment |
|
846 * |
|
847 * @param $commentEntry Zend_Gdata_YouTube_CommentEntry The comment entry |
|
848 * to reply to |
|
849 * @param $commentText string The text of the comment to post |
|
850 * @return A Zend_Gdata_YouTube_CommentEntry representing the posted |
|
851 * comment |
|
852 */ |
|
853 public function replyToCommentEntry($commentEntry, $commentText) |
|
854 { |
|
855 $newComment = $this->newCommentEntry(); |
|
856 $newComment->content = $this->newContent()->setText($commentText); |
|
857 $commentId = $commentEntry->getId(); |
|
858 $commentIdArray = explode(':', $commentId); |
|
859 |
|
860 // create a new link element |
|
861 $inReplyToLinkHref = self::VIDEO_URI . '/' . $commentIdArray[3] . |
|
862 '/comments/' . $commentIdArray[5]; |
|
863 $inReplyToLink = $this->newLink($inReplyToLinkHref, |
|
864 self::IN_REPLY_TO_SCHEME, $type="application/atom+xml"); |
|
865 $links = $newComment->getLink(); |
|
866 $links[] = $inReplyToLink; |
|
867 $newComment->setLink($links); |
|
868 $commentFeedPostUrl = self::VIDEO_URI . '/' . $commentIdArray[3] . |
|
869 '/comments'; |
|
870 return $this->insertEntry($newComment, |
|
871 $commentFeedPostUrl, 'Zend_Gdata_YouTube_CommentEntry'); |
|
872 } |
|
873 |
|
874 } |