source: extensions/Google2Piwigo/include/Zend/Gdata/Photos.php @ 17475

Last change on this file since 17475 was 17475, checked in by mistic100, 12 years ago

new extension: Google2Piwigo

File size: 19.8 KB
Line 
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 Photos
19 * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
20 * @license    http://framework.zend.com/license/new-bsd     New BSD License
21 * @version    $Id: Photos.php 24594 2012-01-05 21:27:01Z matthew $
22 */
23
24/**
25 * @see Zend_Gdata
26 */
27require_once 'Zend/Gdata.php';
28
29/**
30 * @see Zend_Gdata_Photos_UserFeed
31 */
32require_once 'Zend/Gdata/Photos/UserFeed.php';
33
34/**
35 * @see Zend_Gdata_Photos_AlbumFeed
36 */
37require_once 'Zend/Gdata/Photos/AlbumFeed.php';
38
39/**
40 * @see Zend_Gdata_Photos_PhotoFeed
41 */
42require_once 'Zend/Gdata/Photos/PhotoFeed.php';
43
44/**
45 * Service class for interacting with the Google Photos Data API.
46 *
47 * Like other service classes in this module, this class provides access via
48 * an HTTP client to Google servers for working with entries and feeds.
49 *
50 * @link http://code.google.com/apis/picasaweb/gdata.html
51 *
52 * @category   Zend
53 * @package    Zend_Gdata
54 * @subpackage Photos
55 * @copyright  Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
56 * @license    http://framework.zend.com/license/new-bsd     New BSD License
57 */
58class Zend_Gdata_Photos extends Zend_Gdata
59{
60
61    const PICASA_BASE_URI = 'https://picasaweb.google.com/data';
62    const PICASA_BASE_FEED_URI = 'https://picasaweb.google.com/data/feed';
63    const AUTH_SERVICE_NAME = 'lh2';
64
65    /**
66     * Default projection when interacting with the Picasa server.
67     */
68    const DEFAULT_PROJECTION = 'api';
69
70    /**
71     * The default visibility to filter events by.
72     */
73    const DEFAULT_VISIBILITY = 'all';
74
75    /**
76     * The default user to retrieve feeds for.
77     */
78    const DEFAULT_USER = 'default';
79
80    /**
81     * Path to the user feed on the Picasa server.
82     */
83    const USER_PATH = 'user';
84
85    /**
86     * Path to album feeds on the Picasa server.
87     */
88    const ALBUM_PATH = 'albumid';
89
90    /**
91     * Path to photo feeds on the Picasa server.
92     */
93    const PHOTO_PATH = 'photoid';
94
95    /**
96     * The path to the community search feed on the Picasa server.
97     */
98    const COMMUNITY_SEARCH_PATH = 'all';
99
100    /**
101     * The path to use for finding links to feeds within entries
102     */
103    const FEED_LINK_PATH = 'http://schemas.google.com/g/2005#feed';
104
105    /**
106     * The path to use for the determining type of an entry
107     */
108    const KIND_PATH = 'http://schemas.google.com/g/2005#kind';
109
110    /**
111     * Namespaces used for Zend_Gdata_Photos
112     *
113     * @var array
114     */
115    public static $namespaces = array(
116        array('gphoto', 'http://schemas.google.com/photos/2007', 1, 0),
117        array('photo', 'http://www.pheed.com/pheed/', 1, 0),
118        array('exif', 'http://schemas.google.com/photos/exif/2007', 1, 0),
119        array('georss', 'http://www.georss.org/georss', 1, 0),
120        array('gml', 'http://www.opengis.net/gml', 1, 0),
121        array('media', 'http://search.yahoo.com/mrss/', 1, 0)
122    );
123
124    /**
125     * Create Zend_Gdata_Photos object
126     *
127     * @param Zend_Http_Client $client (optional) The HTTP client to use when
128     *          when communicating with the servers.
129     * @param string $applicationId The identity of the app in the form of Company-AppName-Version
130     */
131    public function __construct($client = null, $applicationId = 'MyCompany-MyApp-1.0')
132    {
133        $this->registerPackage('Zend_Gdata_Photos');
134        $this->registerPackage('Zend_Gdata_Photos_Extension');
135        parent::__construct($client, $applicationId);
136        $this->_httpClient->setParameterPost('service', self::AUTH_SERVICE_NAME);
137    }
138
139    /**
140     * Retrieve a UserFeed containing AlbumEntries, PhotoEntries and
141     * TagEntries associated with a given user.
142     *
143     * @param string $userName The userName of interest
144     * @param mixed $location (optional) The location for the feed, as a URL
145     *          or Query. If not provided, a default URL will be used instead.
146     * @return Zend_Gdata_Photos_UserFeed
147     * @throws Zend_Gdata_App_Exception
148     * @throws Zend_Gdata_App_HttpException
149     */
150    public function getUserFeed($userName = null, $location = null)
151    {
152        if ($location instanceof Zend_Gdata_Photos_UserQuery) {
153            $location->setType('feed');
154            if ($userName !== null) {
155                $location->setUser($userName);
156            }
157            $uri = $location->getQueryUrl();
158        } else if ($location instanceof Zend_Gdata_Query) {
159            if ($userName !== null) {
160                $location->setUser($userName);
161            }
162            $uri = $location->getQueryUrl();
163        } else if ($location !== null) {
164            $uri = $location;
165        } else if ($userName !== null) {
166            $uri = self::PICASA_BASE_FEED_URI . '/' .
167                self::DEFAULT_PROJECTION . '/' . self::USER_PATH . '/' .
168                $userName;
169        } else {
170            $uri = self::PICASA_BASE_FEED_URI . '/' .
171                self::DEFAULT_PROJECTION . '/' . self::USER_PATH . '/' .
172                self::DEFAULT_USER;
173        }
174
175        return parent::getFeed($uri, 'Zend_Gdata_Photos_UserFeed');
176    }
177
178    /**
179     * Retreive AlbumFeed object containing multiple PhotoEntry or TagEntry
180     * objects.
181     *
182     * @param mixed $location (optional) The location for the feed, as a URL or Query.
183     * @return Zend_Gdata_Photos_AlbumFeed
184     * @throws Zend_Gdata_App_Exception
185     * @throws Zend_Gdata_App_HttpException
186     */
187    public function getAlbumFeed($location = null)
188    {
189        if ($location === null) {
190            require_once 'Zend/Gdata/App/InvalidArgumentException.php';
191            throw new Zend_Gdata_App_InvalidArgumentException(
192                    'Location must not be null');
193        } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
194            $location->setType('feed');
195            $uri = $location->getQueryUrl();
196        } else if ($location instanceof Zend_Gdata_Query) {
197            $uri = $location->getQueryUrl();
198        } else {
199            $uri = $location;
200        }
201        return parent::getFeed($uri, 'Zend_Gdata_Photos_AlbumFeed');
202    }
203
204    /**
205     * Retreive PhotoFeed object containing comments and tags associated
206     * with a given photo.
207     *
208     * @param mixed $location (optional) The location for the feed, as a URL
209     *          or Query. If not specified, the community search feed will
210     *          be returned instead.
211     * @return Zend_Gdata_Photos_PhotoFeed
212     * @throws Zend_Gdata_App_Exception
213     * @throws Zend_Gdata_App_HttpException
214     */
215    public function getPhotoFeed($location = null)
216    {
217        if ($location === null) {
218            $uri = self::PICASA_BASE_FEED_URI . '/' .
219                self::DEFAULT_PROJECTION . '/' .
220                self::COMMUNITY_SEARCH_PATH;
221        } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
222            $location->setType('feed');
223            $uri = $location->getQueryUrl();
224        } else if ($location instanceof Zend_Gdata_Query) {
225            $uri = $location->getQueryUrl();
226        } else {
227            $uri = $location;
228        }
229        return parent::getFeed($uri, 'Zend_Gdata_Photos_PhotoFeed');
230    }
231
232    /**
233     * Retreive a single UserEntry object.
234     *
235     * @param mixed $location The location for the feed, as a URL or Query.
236     * @return Zend_Gdata_Photos_UserEntry
237     * @throws Zend_Gdata_App_Exception
238     * @throws Zend_Gdata_App_HttpException
239     */
240    public function getUserEntry($location)
241    {
242        if ($location === null) {
243            require_once 'Zend/Gdata/App/InvalidArgumentException.php';
244            throw new Zend_Gdata_App_InvalidArgumentException(
245                    'Location must not be null');
246        } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
247            $location->setType('entry');
248            $uri = $location->getQueryUrl();
249        } else if ($location instanceof Zend_Gdata_Query) {
250            $uri = $location->getQueryUrl();
251        } else {
252            $uri = $location;
253        }
254        return parent::getEntry($uri, 'Zend_Gdata_Photos_UserEntry');
255    }
256
257    /**
258     * Retreive a single AlbumEntry object.
259     *
260     * @param mixed $location The location for the feed, as a URL or Query.
261     * @return Zend_Gdata_Photos_AlbumEntry
262     * @throws Zend_Gdata_App_Exception
263     * @throws Zend_Gdata_App_HttpException
264     */
265    public function getAlbumEntry($location)
266    {
267        if ($location === null) {
268            require_once 'Zend/Gdata/App/InvalidArgumentException.php';
269            throw new Zend_Gdata_App_InvalidArgumentException(
270                    'Location must not be null');
271        } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
272            $location->setType('entry');
273            $uri = $location->getQueryUrl();
274        } else if ($location instanceof Zend_Gdata_Query) {
275            $uri = $location->getQueryUrl();
276        } else {
277            $uri = $location;
278        }
279        return parent::getEntry($uri, 'Zend_Gdata_Photos_AlbumEntry');
280    }
281
282    /**
283     * Retreive a single PhotoEntry object.
284     *
285     * @param mixed $location The location for the feed, as a URL or Query.
286     * @return Zend_Gdata_Photos_PhotoEntry
287     * @throws Zend_Gdata_App_Exception
288     * @throws Zend_Gdata_App_HttpException
289     */
290    public function getPhotoEntry($location)
291    {
292        if ($location === null) {
293            require_once 'Zend/Gdata/App/InvalidArgumentException.php';
294            throw new Zend_Gdata_App_InvalidArgumentException(
295                    'Location must not be null');
296        } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
297            $location->setType('entry');
298            $uri = $location->getQueryUrl();
299        } else if ($location instanceof Zend_Gdata_Query) {
300            $uri = $location->getQueryUrl();
301        } else {
302            $uri = $location;
303        }
304        return parent::getEntry($uri, 'Zend_Gdata_Photos_PhotoEntry');
305    }
306
307    /**
308     * Retreive a single TagEntry object.
309     *
310     * @param mixed $location The location for the feed, as a URL or Query.
311     * @return Zend_Gdata_Photos_TagEntry
312     * @throws Zend_Gdata_App_Exception
313     * @throws Zend_Gdata_App_HttpException
314     */
315    public function getTagEntry($location)
316    {
317        if ($location === null) {
318            require_once 'Zend/Gdata/App/InvalidArgumentException.php';
319            throw new Zend_Gdata_App_InvalidArgumentException(
320                    'Location must not be null');
321        } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
322            $location->setType('entry');
323            $uri = $location->getQueryUrl();
324        } else if ($location instanceof Zend_Gdata_Query) {
325            $uri = $location->getQueryUrl();
326        } else {
327            $uri = $location;
328        }
329        return parent::getEntry($uri, 'Zend_Gdata_Photos_TagEntry');
330    }
331
332    /**
333     * Retreive a single CommentEntry object.
334     *
335     * @param mixed $location The location for the feed, as a URL or Query.
336     * @return Zend_Gdata_Photos_CommentEntry
337     * @throws Zend_Gdata_App_Exception
338     * @throws Zend_Gdata_App_HttpException
339     */
340    public function getCommentEntry($location)
341    {
342        if ($location === null) {
343            require_once 'Zend/Gdata/App/InvalidArgumentException.php';
344            throw new Zend_Gdata_App_InvalidArgumentException(
345                    'Location must not be null');
346        } else if ($location instanceof Zend_Gdata_Photos_UserQuery) {
347            $location->setType('entry');
348            $uri = $location->getQueryUrl();
349        } else if ($location instanceof Zend_Gdata_Query) {
350            $uri = $location->getQueryUrl();
351        } else {
352            $uri = $location;
353        }
354        return parent::getEntry($uri, 'Zend_Gdata_Photos_CommentEntry');
355    }
356
357    /**
358     * Create a new album from a AlbumEntry.
359     *
360     * @param Zend_Gdata_Photos_AlbumEntry $album The album entry to
361     *          insert.
362     * @param string $url (optional) The URI that the album should be
363     *          uploaded to. If null, the default album creation URI for
364     *          this domain will be used.
365     * @return Zend_Gdata_Photos_AlbumEntry The inserted album entry as
366     *          returned by the server.
367     * @throws Zend_Gdata_App_Exception
368     * @throws Zend_Gdata_App_HttpException
369     */
370    public function insertAlbumEntry($album, $uri = null)
371    {
372        if ($uri === null) {
373            $uri = self::PICASA_BASE_FEED_URI . '/' .
374                self::DEFAULT_PROJECTION . '/' . self::USER_PATH . '/' .
375                self::DEFAULT_USER;
376        }
377        $newEntry = $this->insertEntry($album, $uri, 'Zend_Gdata_Photos_AlbumEntry');
378        return $newEntry;
379    }
380
381    /**
382     * Create a new photo from a PhotoEntry.
383     *
384     * @param Zend_Gdata_Photos_PhotoEntry $photo The photo to insert.
385     * @param string $url The URI that the photo should be uploaded
386     *          to. Alternatively, an AlbumEntry can be provided and the
387     *          photo will be added to that album.
388     * @return Zend_Gdata_Photos_PhotoEntry The inserted photo entry
389     *          as returned by the server.
390     * @throws Zend_Gdata_App_Exception
391     * @throws Zend_Gdata_App_HttpException
392     */
393    public function insertPhotoEntry($photo, $uri = null)
394    {
395        if ($uri instanceof Zend_Gdata_Photos_AlbumEntry) {
396            $uri = $uri->getLink(self::FEED_LINK_PATH)->href;
397        }
398        if ($uri === null) {
399            require_once 'Zend/Gdata/App/InvalidArgumentException.php';
400            throw new Zend_Gdata_App_InvalidArgumentException(
401                    'URI must not be null');
402        }
403        $newEntry = $this->insertEntry($photo, $uri, 'Zend_Gdata_Photos_PhotoEntry');
404        return $newEntry;
405    }
406
407    /**
408     * Create a new tag from a TagEntry.
409     *
410     * @param Zend_Gdata_Photos_TagEntry $tag The tag entry to insert.
411     * @param string $url The URI where the tag should be
412     *          uploaded to. Alternatively, a PhotoEntry can be provided and
413     *          the tag will be added to that photo.
414     * @return Zend_Gdata_Photos_TagEntry The inserted tag entry as returned
415     *          by the server.
416     * @throws Zend_Gdata_App_Exception
417     * @throws Zend_Gdata_App_HttpException
418     */
419    public function insertTagEntry($tag, $uri = null)
420    {
421        if ($uri instanceof Zend_Gdata_Photos_PhotoEntry) {
422            $uri = $uri->getLink(self::FEED_LINK_PATH)->href;
423        }
424        if ($uri === null) {
425            require_once 'Zend/Gdata/App/InvalidArgumentException.php';
426            throw new Zend_Gdata_App_InvalidArgumentException(
427                    'URI must not be null');
428        }
429        $newEntry = $this->insertEntry($tag, $uri, 'Zend_Gdata_Photos_TagEntry');
430        return $newEntry;
431    }
432
433    /**
434     * Create a new comment from a CommentEntry.
435     *
436     * @param Zend_Gdata_Photos_CommentEntry $comment The comment entry to
437     *          insert.
438     * @param string $url The URI where the comment should be uploaded to.
439     *          Alternatively, a PhotoEntry can be provided and
440     *          the comment will be added to that photo.
441     * @return Zend_Gdata_Photos_CommentEntry The inserted comment entry
442     *          as returned by the server.
443     * @throws Zend_Gdata_App_Exception
444     * @throws Zend_Gdata_App_HttpException
445     */
446    public function insertCommentEntry($comment, $uri = null)
447    {
448        if ($uri instanceof Zend_Gdata_Photos_PhotoEntry) {
449            $uri = $uri->getLink(self::FEED_LINK_PATH)->href;
450        }
451        if ($uri === null) {
452            require_once 'Zend/Gdata/App/InvalidArgumentException.php';
453            throw new Zend_Gdata_App_InvalidArgumentException(
454                    'URI must not be null');
455        }
456        $newEntry = $this->insertEntry($comment, $uri, 'Zend_Gdata_Photos_CommentEntry');
457        return $newEntry;
458    }
459
460    /**
461     * Delete an AlbumEntry.
462     *
463     * @param Zend_Gdata_Photos_AlbumEntry $album The album entry to
464     *          delete.
465     * @param boolean $catch Whether to catch an exception when
466     *            modified and re-delete or throw
467     * @return void.
468     * @throws Zend_Gdata_App_Exception
469     * @throws Zend_Gdata_App_HttpException
470     */
471    public function deleteAlbumEntry($album, $catch)
472    {
473        if ($catch) {
474            try {
475                $this->delete($album);
476            } catch (Zend_Gdata_App_HttpException $e) {
477                if ($e->getResponse()->getStatus() === 409) {
478                    $entry = new Zend_Gdata_Photos_AlbumEntry($e->getResponse()->getBody());
479                    $this->delete($entry->getLink('edit')->href);
480                } else {
481                    throw $e;
482                }
483            }
484        } else {
485            $this->delete($album);
486        }
487    }
488
489    /**
490     * Delete a PhotoEntry.
491     *
492     * @param Zend_Gdata_Photos_PhotoEntry $photo The photo entry to
493     *          delete.
494     * @param boolean $catch Whether to catch an exception when
495     *            modified and re-delete or throw
496     * @return void.
497     * @throws Zend_Gdata_App_Exception
498     * @throws Zend_Gdata_App_HttpException
499     */
500    public function deletePhotoEntry($photo, $catch)
501    {
502        if ($catch) {
503            try {
504                $this->delete($photo);
505            } catch (Zend_Gdata_App_HttpException $e) {
506                if ($e->getResponse()->getStatus() === 409) {
507                    $entry = new Zend_Gdata_Photos_PhotoEntry($e->getResponse()->getBody());
508                    $this->delete($entry->getLink('edit')->href);
509                } else {
510                    throw $e;
511                }
512            }
513        } else {
514            $this->delete($photo);
515        }
516    }
517
518    /**
519     * Delete a CommentEntry.
520     *
521     * @param Zend_Gdata_Photos_CommentEntry $comment The comment entry to
522     *          delete.
523     * @param boolean $catch Whether to catch an exception when
524     *            modified and re-delete or throw
525     * @return void.
526     * @throws Zend_Gdata_App_Exception
527     * @throws Zend_Gdata_App_HttpException
528     */
529    public function deleteCommentEntry($comment, $catch)
530    {
531        if ($catch) {
532            try {
533                $this->delete($comment);
534            } catch (Zend_Gdata_App_HttpException $e) {
535                if ($e->getResponse()->getStatus() === 409) {
536                    $entry = new Zend_Gdata_Photos_CommentEntry($e->getResponse()->getBody());
537                    $this->delete($entry->getLink('edit')->href);
538                } else {
539                    throw $e;
540                }
541            }
542        } else {
543            $this->delete($comment);
544        }
545    }
546
547    /**
548     * Delete a TagEntry.
549     *
550     * @param Zend_Gdata_Photos_TagEntry $tag The tag entry to
551     *          delete.
552     * @param boolean $catch Whether to catch an exception when
553     *            modified and re-delete or throw
554     * @return void.
555     * @throws Zend_Gdata_App_Exception
556     * @throws Zend_Gdata_App_HttpException
557     */
558    public function deleteTagEntry($tag, $catch)
559    {
560        if ($catch) {
561            try {
562                $this->delete($tag);
563            } catch (Zend_Gdata_App_HttpException $e) {
564                if ($e->getResponse()->getStatus() === 409) {
565                    $entry = new Zend_Gdata_Photos_TagEntry($e->getResponse()->getBody());
566                    $this->delete($entry->getLink('edit')->href);
567                } else {
568                    throw $e;
569                }
570            }
571        } else {
572            $this->delete($tag);
573        }
574    }
575
576}
Note: See TracBrowser for help on using the repository browser.