Merge branch 'MDL-78173' of https://github.com/paulholden/moodle
[moodle.git] / lib / flickrlib.php
blob25af647ffb4143c6aa4b067ac162d4e0b81ad31b
1 <?php
2 /**
3 * phpFlickr Class 2.2.0
4 * Written by Dan Coulter (dan@dancoulter.com)
5 * Sourceforge Project Page: {@link http://www.sourceforge.net/projects/phpflickr/}
6 * Released under GNU Lesser General Public License ({@link http://www.gnu.org/copyleft/lgpl.html})
7 * For more information about the class and upcoming tools and toys using it,
8 * visit {@link http://www.phpflickr.com/} or {@link http://phpflickr.sourceforge.net}
10 * For installation instructions, open the README.txt file packaged with this
11 * class. If you don't have a copy, you can see it at:
12 * {@link http://www.phpflickr.com/README.txt}
14 * Please submit all problems or questions to the Help Forum on my project page:
15 * {@link http://sourceforge.net/forum/forum.php?forum_id=469652}
17 * Modified by Dongsheng Cai <dongsheng@moodle.com>
18 * ChangeLog:
19 * 1. Remove PEAR HTTP LIB, use curl.class.php (created by myself)
20 * 2. Remove PEAR DB LIB
21 * 3. Remove all cache code, it will implement in curl class.
22 * 4. Clean up session code
24 * Modified by David Mudrak <david@moodle.com>
25 * ChangeLog:
26 * 1. upload() method uses Moodle stored_file
27 * 2. upload() method supports all params provided by http://www.flickr.com/services/api/upload.api.html
28 * 3. auth() method shows debugging warning as this library cannot be used any
29 * more for calling Flickr API that requires authentication.
31 * @package moodlecore
32 * @subpackage 3rd-party
35 defined('MOODLE_INTERNAL') || die();
37 global $CFG;
38 require_once("{$CFG->libdir}/flickrclient.php");
40 /**
41 * Flickr Class
42 * @package moodlecore
43 * @subpackage 3rd-party
45 class phpFlickr {
46 var $api_key;
47 var $secret;
48 var $REST = 'https://api.flickr.com/services/rest/';
49 var $Upload = 'https://api.flickr.com/services/upload/';
50 var $Replace = 'https://api.flickr.com/services/replace/';
51 var $req;
52 var $response;
53 var $parsed_response;
54 var $die_on_error;
55 var $error_code;
56 var $error_msg;
57 var $token;
58 var $php_version;
60 /** @var curl cURL class. */
61 private $curl;
63 /**
64 * When your database cache table hits this many rows, a cleanup
65 * will occur to get rid of all of the old rows and cleanup the
66 * garbage in the table. For most personal apps, 1000 rows should
67 * be more than enough. If your site gets hit by a lot of traffic
68 * or you have a lot of disk space to spare, bump this number up.
69 * You should try to set it high enough that the cleanup only
70 * happens every once in a while, so this will depend on the growth
71 * of your table.
73 * @global object
76 function __construct ($api_key, $secret = NULL, $token = '')
78 global $CFG;
79 //The API Key must be set before any calls can be made. You can
80 //get your own at http://www.flickr.com/services/api/misc.api_keys.html
81 $this->api_key = $api_key;
82 $this->secret = $secret;
83 $this->die_on_error = false;
84 $this->token = $token;
85 //Find the PHP version and store it for future reference
86 $this->php_version = explode("-", phpversion());
87 $this->php_version = explode(".", $this->php_version[0]);
89 // Initialize curl helper, set custom user agent as Flickr blocks our "MoodleBot" agent string.
90 $this->curl = new curl(array('cache'=>true, 'module_cache'=>'repository'));
91 $this->curl->setopt([
92 'CURLOPT_USERAGENT' => flickr_client::user_agent(),
93 ]);
96 function request ($command, $args = array())
98 //Sends a request to Flickr's REST endpoint via POST.
99 if (substr($command,0,7) != "flickr.") {
100 $command = "flickr." . $command;
103 //Process arguments, including method and login data.
104 if ($command == 'flickr.upload') {
105 $photo = $args['photo'];
106 if (empty($args['is_public'])) {
107 $args['is_public'] = 0;
109 if (empty($args['is_friend'])) {
110 $args['is_friend'] = 0;
112 if (empty($args['is_family'])) {
113 $args['is_family'] = 0;
115 if (empty($args['hidden'])) {
116 $args['hidden'] = 1;
118 $args = array("api_key" => $this->api_key,
119 "title" => $args['title'],
120 "description" => $args['description'],
121 "tags" => $args['tags'],
122 "is_public" => $args['is_public'],
123 "is_friend" => $args['is_friend'],
124 "is_family" => $args['is_family'],
125 "safety_level" => $args['safety_level'],
126 "content_type" => $args['content_type'],
127 "hidden" => $args['hidden']);
128 } else {
129 $args = array_merge(array("method" => $command, "format" => "php_serial", "api_key" => $this->api_key), $args);
132 if (!empty($this->token)) {
133 $args = array_merge($args, array("auth_token" => $this->token));
136 ksort($args);
137 $auth_sig = "";
138 foreach ($args as $key => $data) {
139 $auth_sig .= $key . $data;
142 if (!empty($this->secret)) {
143 $api_sig = md5($this->secret . $auth_sig);
144 $args['api_sig'] = $api_sig;
147 //$this->req->addHeader("Connection", "Keep-Alive");
148 if ($command != 'flickr.upload') {
149 $ret = $this->curl->post($this->REST, $args);
150 $this->parsed_response = $this->clean_text_nodes(unserialize($ret));
151 } else {
152 $args['photo'] = $photo;
153 $xml = simplexml_load_string($this->curl->post($this->Upload, $args));
155 if ($xml['stat'] == 'fail') {
156 $this->parsed_response = array('stat' => (string) $xml['stat'], 'code' => (int) $xml->err['code'], 'message' => (string) $xml->err['msg']);
157 } elseif ($xml['stat'] == 'ok') {
158 $this->parsed_response = array('stat' => (string) $xml['stat'], 'photoid' => (int) $xml->photoid);
159 $this->response = true;
163 if ($this->parsed_response['stat'] == 'fail') {
164 if ($this->die_on_error) die("The Flickr API returned the following error: #{$this->parsed_response['code']} - {$this->parsed_response['message']}");
165 else {
166 $this->error_code = $this->parsed_response['code'];
167 $this->error_msg = $this->parsed_response['message'];
168 $this->parsed_response = false;
170 } else {
171 $this->error_code = false;
172 $this->error_msg = false;
174 return $this->response;
177 function clean_text_nodes($arr) {
178 if (!is_array($arr)) {
179 return $arr;
180 } elseif (count($arr) == 0) {
181 return $arr;
182 } elseif (count($arr) == 1 && array_key_exists('_content', $arr)) {
183 return $arr['_content'];
184 } else {
185 foreach ($arr as $key => $element) {
186 $arr[$key] = $this->clean_text_nodes($element);
188 return($arr);
192 function setToken($token)
194 // Sets an authentication token to use instead of the session variable
195 $this->token = $token;
198 function setProxy($server, $port)
200 // Sets the proxy for all phpFlickr calls.
201 //$this->req->setProxy($server, $port);
204 function getErrorCode()
206 // Returns the error code of the last call. If the last call did not
207 // return an error. This will return a false boolean.
208 return $this->error_code;
211 function getErrorMsg()
213 // Returns the error message of the last call. If the last call did not
214 // return an error. This will return a false boolean.
215 return $this->error_msg;
218 /** These functions are front ends for the flickr calls */
220 function buildPhotoURL ($photo, $size = "Medium")
222 //receives an array (can use the individual photo data returned
223 //from an API call) and returns a URL (doesn't mean that the
224 //file size exists)
225 $sizes = array(
226 "square" => "_s",
227 "thumbnail" => "_t",
228 "small" => "_m",
229 "medium" => "",
230 "large" => "_b",
231 "original" => "_o"
234 $size = strtolower($size);
235 if (!array_key_exists($size, $sizes)) {
236 $size = "medium";
239 if ($size == "original") {
240 $url = "http://farm" . $photo['farm'] . ".static.flickr.com/" . $photo['server'] . "/" . $photo['id'] . "_" . $photo['originalsecret'] . "_o" . "." . $photo['originalformat'];
241 } else {
242 $url = "http://farm" . $photo['farm'] . ".static.flickr.com/" . $photo['server'] . "/" . $photo['id'] . "_" . $photo['secret'] . $sizes[$size] . ".jpg";
244 return $url;
247 function getFriendlyGeodata($lat, $lon) {
248 /** I've added this method to get the friendly geodata (i.e. 'in New York, NY') that the
249 * website provides, but isn't available in the API. I'm providing this service as long
250 * as it doesn't flood my server with requests and crash it all the time.
252 return unserialize(file_get_contents('http://phpflickr.com/geodata/?format=php&lat=' . $lat . '&lon=' . $lon));
255 function auth ($perms = "write", $remember_uri = true)
258 debugging('The flickrlib.php cannot be used for authenticated Flickr API calls.
259 Flickr does not support their legacy auth API any more. Use the new flickrclient.php instead.');
261 // Redirects to Flickr's authentication piece if there is no valid token.
262 // If remember_uri is set to false, the callback script (included) will
263 // redirect to its default page.
264 if ($remember_uri) {
265 $redirect = qualified_me(); // TODO: this is not used, why?
267 $api_sig = md5($this->secret . "api_key" . $this->api_key . "perms" . $perms);
268 $url = 'http://www.flickr.com/services/auth/?api_key=' . $this->api_key . "&perms=" . $perms . '&api_sig='. $api_sig;
269 return $url;
273 * To use the phpFlickr::call method, pass a string containing the API method you want
274 * to use and an associative array of arguments. For example:
275 * $result = $f->call("flickr.photos.comments.getList", array("photo_id"=>'34952612'));
276 * This method will allow you to make calls to arbitrary methods that haven't been
277 * implemented in phpFlickr yet.
280 function call($method, $arguments)
282 $this->request($method, $arguments);
283 return $this->parsed_response ? $this->parsed_response : false;
287 * These functions are the direct implementations of flickr calls.
288 * For method documentation, including arguments, visit the address
289 * included in a comment in the function.
292 /** Activity methods */
293 function activity_userComments ($per_page = NULL, $page = NULL)
295 /** http://www.flickr.com/services/api/flickr.activity.userComments.html */
296 $this->request('flickr.activity.userComments', array("per_page" => $per_page, "page" => $page));
297 return $this->parsed_response ? $this->parsed_response['items']['item'] : false;
300 function activity_userPhotos ($timeframe = NULL, $per_page = NULL, $page = NULL)
302 /** http://www.flickr.com/services/api/flickr.activity.userPhotos.html */
303 $this->request('flickr.activity.userPhotos', array("timeframe" => $timeframe, "per_page" => $per_page, "page" => $page));
304 return $this->parsed_response ? $this->parsed_response['items']['item'] : false;
307 /** Authentication methods */
308 function auth_checkToken ()
310 /** http://www.flickr.com/services/api/flickr.auth.checkToken.html */
311 $this->request('flickr.auth.checkToken');
312 return $this->parsed_response ? $this->parsed_response['auth'] : false;
315 function auth_getFrob ()
317 /** http://www.flickr.com/services/api/flickr.auth.getFrob.html */
318 $this->request('flickr.auth.getFrob');
319 return $this->parsed_response ? $this->parsed_response['frob'] : false;
322 function auth_getFullToken ($mini_token)
324 /** http://www.flickr.com/services/api/flickr.auth.getFullToken.html */
325 $this->request('flickr.auth.getFullToken', array('mini_token'=>$mini_token));
326 return $this->parsed_response ? $this->parsed_response['auth'] : false;
329 function auth_getToken ($frob)
331 /** http://www.flickr.com/services/api/flickr.auth.getToken.html */
332 $this->request('flickr.auth.getToken', array('frob'=>$frob));
333 $this->token = $this->parsed_response['auth']['token'];
334 return $this->parsed_response ? $this->parsed_response['auth'] : false;
337 /** Blogs methods */
338 function blogs_getList ()
340 /** http://www.flickr.com/services/api/flickr.blogs.getList.html */
341 $this->request('flickr.blogs.getList');
342 return $this->parsed_response ? $this->parsed_response['blogs']['blog'] : false;
345 function blogs_postPhoto($blog_id, $photo_id, $title, $description, $blog_password = NULL)
347 /** http://www.flickr.com/services/api/flickr.blogs.postPhoto.html */
348 $this->request('flickr.blogs.postPhoto', array('blog_id'=>$blog_id, 'photo_id'=>$photo_id, 'title'=>$title, 'description'=>$description, 'blog_password'=>$blog_password), TRUE);
349 return $this->parsed_response ? true : false;
352 /** Contacts Methods */
353 function contacts_getList ($filter = NULL, $page = NULL, $per_page = NULL)
355 /** http://www.flickr.com/services/api/flickr.contacts.getList.html */
356 $this->request('flickr.contacts.getList', array('filter'=>$filter, 'page'=>$page, 'per_page'=>$per_page));
357 return $this->parsed_response ? $this->parsed_response['contacts'] : false;
360 function contacts_getPublicList($user_id, $page = NULL, $per_page = NULL)
362 /** http://www.flickr.com/services/api/flickr.contacts.getPublicList.html */
363 $this->request('flickr.contacts.getPublicList', array('user_id'=>$user_id, 'page'=>$page, 'per_page'=>$per_page));
364 return $this->parsed_response ? $this->parsed_response['contacts'] : false;
367 /** Favorites Methods */
368 function favorites_add ($photo_id)
370 /** http://www.flickr.com/services/api/flickr.favorites.add.html */
371 $this->request('flickr.favorites.add', array('photo_id'=>$photo_id), TRUE);
372 return $this->parsed_response ? true : false;
375 function favorites_getList($user_id = NULL, $extras = NULL, $per_page = NULL, $page = NULL)
377 /** http://www.flickr.com/services/api/flickr.favorites.getList.html */
378 if (is_array($extras)) { $extras = implode(",", $extras); }
379 $this->request("flickr.favorites.getList", array("user_id"=>$user_id, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page));
380 return $this->parsed_response ? $this->parsed_response['photos'] : false;
383 function favorites_getPublicList($user_id = NULL, $extras = NULL, $per_page = NULL, $page = NULL)
385 /** http://www.flickr.com/services/api/flickr.favorites.getPublicList.html */
386 if (is_array($extras)) {
387 $extras = implode(",", $extras);
389 $this->request("flickr.favorites.getPublicList", array("user_id"=>$user_id, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page));
390 return $this->parsed_response ? $this->parsed_response['photos'] : false;
393 function favorites_remove($photo_id)
395 /** http://www.flickr.com/services/api/flickr.favorites.remove.html */
396 $this->request("flickr.favorites.remove", array("photo_id"=>$photo_id), TRUE);
397 return $this->parsed_response ? true : false;
400 /** Groups Methods */
401 function groups_browse ($cat_id = NULL)
403 /** http://www.flickr.com/services/api/flickr.groups.browse.html */
404 $this->request("flickr.groups.browse", array("cat_id"=>$cat_id));
405 return $this->parsed_response ? $this->parsed_response['category'] : false;
408 function groups_getInfo ($group_id)
410 /** http://www.flickr.com/services/api/flickr.groups.getInfo.html */
411 $this->request("flickr.groups.getInfo", array("group_id"=>$group_id));
412 return $this->parsed_response ? $this->parsed_response['group'] : false;
415 function groups_search ($text, $per_page=NULL, $page=NULL)
417 /** http://www.flickr.com/services/api/flickr.groups.search.html */
418 $this->request("flickr.groups.search", array("text"=>$text,"per_page"=>$per_page,"page"=>$page));
419 return $this->parsed_response ? $this->parsed_response['groups'] : false;
422 /** Groups Pools Methods */
423 function groups_pools_add ($photo_id, $group_id)
425 /** http://www.flickr.com/services/api/flickr.groups.pools.add.html */
426 $this->request("flickr.groups.pools.add", array("photo_id"=>$photo_id, "group_id"=>$group_id), TRUE);
427 return $this->parsed_response ? true : false;
430 function groups_pools_getContext ($photo_id, $group_id)
432 /** http://www.flickr.com/services/api/flickr.groups.pools.getContext.html */
433 $this->request("flickr.groups.pools.getContext", array("photo_id"=>$photo_id, "group_id"=>$group_id));
434 return $this->parsed_response ? $this->parsed_response : false;
437 function groups_pools_getGroups ($page = NULL, $per_page = NULL)
439 /** http://www.flickr.com/services/api/flickr.groups.pools.getGroups.html */
440 $this->request("flickr.groups.pools.getGroups", array('page'=>$page, 'per_page'=>$per_page));
441 return $this->parsed_response ? $this->parsed_response['groups'] : false;
444 function groups_pools_getPhotos ($group_id, $tags = NULL, $user_id = NULL, $extras = NULL, $per_page = NULL, $page = NULL)
446 /** http://www.flickr.com/services/api/flickr.groups.pools.getPhotos.html */
447 if (is_array($extras)) {
448 $extras = implode(",", $extras);
450 $this->request("flickr.groups.pools.getPhotos", array("group_id"=>$group_id, "tags"=>$tags, "user_id"=>$user_id, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page));
451 return $this->parsed_response ? $this->parsed_response['photos'] : false;
454 function groups_pools_remove ($photo_id, $group_id)
456 /** http://www.flickr.com/services/api/flickr.groups.pools.remove.html */
457 $this->request("flickr.groups.pools.remove", array("photo_id"=>$photo_id, "group_id"=>$group_id), TRUE);
458 return $this->parsed_response ? true : false;
461 /** Interestingness methods */
462 function interestingness_getList($date = NULL, $extras = NULL, $per_page = NULL, $page = NULL)
464 /** http://www.flickr.com/services/api/flickr.interestingness.getList.html */
465 if (is_array($extras)) {
466 $extras = implode(",", $extras);
469 $this->request("flickr.interestingness.getList", array("date"=>$date, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page));
470 return $this->parsed_response ? $this->parsed_response['photos'] : false;
473 /** People methods */
474 function people_findByEmail ($find_email)
476 /** http://www.flickr.com/services/api/flickr.people.findByEmail.html */
477 $this->request("flickr.people.findByEmail", array("find_email"=>$find_email));
478 return $this->parsed_response ? $this->parsed_response['user'] : false;
481 function people_findByUsername ($username)
483 /** http://www.flickr.com/services/api/flickr.people.findByUsername.html */
484 $this->request("flickr.people.findByUsername", array("username"=>$username));
485 return $this->parsed_response ? $this->parsed_response['user'] : false;
488 function people_getInfo($user_id)
490 /** http://www.flickr.com/services/api/flickr.people.getInfo.html */
491 $this->request("flickr.people.getInfo", array("user_id"=>$user_id));
492 return $this->parsed_response ? $this->parsed_response['person'] : false;
495 function people_getPublicGroups($user_id)
497 /** http://www.flickr.com/services/api/flickr.people.getPublicGroups.html */
498 $this->request("flickr.people.getPublicGroups", array("user_id"=>$user_id));
499 return $this->parsed_response ? $this->parsed_response['groups']['group'] : false;
502 function people_getPublicPhotos($user_id, $extras = NULL, $per_page = NULL, $page = NULL) {
503 /** http://www.flickr.com/services/api/flickr.people.getPublicPhotos.html */
504 if (is_array($extras)) {
505 $extras = implode(",", $extras);
508 $this->request("flickr.people.getPublicPhotos", array("user_id"=>$user_id, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page));
509 return $this->parsed_response ? $this->parsed_response['photos'] : false;
512 function people_getUploadStatus()
514 /** http://www.flickr.com/services/api/flickr.people.getUploadStatus.html */
515 /** Requires Authentication */
516 $this->request("flickr.people.getUploadStatus");
517 return $this->parsed_response ? $this->parsed_response['user'] : false;
521 /** Photos Methods */
522 function photos_addTags ($photo_id, $tags)
524 /** http://www.flickr.com/services/api/flickr.photos.addTags.html */
525 $this->request("flickr.photos.addTags", array("photo_id"=>$photo_id, "tags"=>$tags), TRUE);
526 return $this->parsed_response ? true : false;
529 function photos_delete($photo_id)
531 /** http://www.flickr.com/services/api/flickr.photos.delete.html */
532 $this->request("flickr.photos.delete", array("photo_id"=>$photo_id), TRUE);
533 return $this->parsed_response ? true : false;
536 function photos_getAllContexts ($photo_id)
538 /** http://www.flickr.com/services/api/flickr.photos.getAllContexts.html */
539 $this->request("flickr.photos.getAllContexts", array("photo_id"=>$photo_id));
540 return $this->parsed_response ? $this->parsed_response : false;
543 function photos_getContactsPhotos ($count = NULL, $just_friends = NULL, $single_photo = NULL, $include_self = NULL, $extras = NULL)
545 /** http://www.flickr.com/services/api/flickr.photos.getContactsPhotos.html */
546 $this->request("flickr.photos.getContactsPhotos", array("count"=>$count, "just_friends"=>$just_friends, "single_photo"=>$single_photo, "include_self"=>$include_self, "extras"=>$extras));
547 return $this->parsed_response ? $this->parsed_response['photos']['photo'] : false;
550 function photos_getContactsPublicPhotos ($user_id, $count = NULL, $just_friends = NULL, $single_photo = NULL, $include_self = NULL, $extras = NULL)
552 /** http://www.flickr.com/services/api/flickr.photos.getContactsPublicPhotos.html */
553 $this->request("flickr.photos.getContactsPublicPhotos", array("user_id"=>$user_id, "count"=>$count, "just_friends"=>$just_friends, "single_photo"=>$single_photo, "include_self"=>$include_self, "extras"=>$extras));
554 return $this->parsed_response ? $this->parsed_response['photos']['photo'] : false;
557 function photos_getContext ($photo_id)
559 /** http://www.flickr.com/services/api/flickr.photos.getContext.html */
560 $this->request("flickr.photos.getContext", array("photo_id"=>$photo_id));
561 return $this->parsed_response ? $this->parsed_response : false;
564 function photos_getCounts ($dates = NULL, $taken_dates = NULL)
566 /** http://www.flickr.com/services/api/flickr.photos.getCounts.html */
567 $this->request("flickr.photos.getCounts", array("dates"=>$dates, "taken_dates"=>$taken_dates));
568 return $this->parsed_response ? $this->parsed_response['photocounts']['photocount'] : false;
571 function photos_getExif ($photo_id, $secret = NULL)
573 /** http://www.flickr.com/services/api/flickr.photos.getExif.html */
574 $this->request("flickr.photos.getExif", array("photo_id"=>$photo_id, "secret"=>$secret));
575 return $this->parsed_response ? $this->parsed_response['photo'] : false;
578 function photos_getFavorites($photo_id, $page = NULL, $per_page = NULL)
580 /** http://www.flickr.com/services/api/flickr.photos.getFavorites.html */
581 $this->request("flickr.photos.getFavorites", array("photo_id"=>$photo_id, "page"=>$page, "per_page"=>$per_page));
582 return $this->parsed_response ? $this->parsed_response['photo'] : false;
585 function photos_getInfo($photo_id, $secret = NULL)
587 /** http://www.flickr.com/services/api/flickr.photos.getInfo.html */
588 $this->request("flickr.photos.getInfo", array("photo_id"=>$photo_id, "secret"=>$secret));
589 return $this->parsed_response ? $this->parsed_response['photo'] : false;
592 function photos_getNotInSet($min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL, $privacy_filter = NULL, $extras = NULL, $per_page = NULL, $page = NULL)
594 /** http://www.flickr.com/services/api/flickr.photos.getNotInSet.html */
595 if (is_array($extras)) {
596 $extras = implode(",", $extras);
598 $this->request("flickr.photos.getNotInSet", array("min_upload_date"=>$min_upload_date, "max_upload_date"=>$max_upload_date, "min_taken_date"=>$min_taken_date, "max_taken_date"=>$max_taken_date, "privacy_filter"=>$privacy_filter, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page));
599 return $this->parsed_response ? $this->parsed_response['photos'] : false;
602 function photos_getPerms($photo_id)
604 /** http://www.flickr.com/services/api/flickr.photos.getPerms.html */
605 $this->request("flickr.photos.getPerms", array("photo_id"=>$photo_id));
606 return $this->parsed_response ? $this->parsed_response['perms'] : false;
609 function photos_getRecent($extras = NULL, $per_page = NULL, $page = NULL)
611 /** http://www.flickr.com/services/api/flickr.photos.getRecent.html */
613 if (is_array($extras)) {
614 $extras = implode(",", $extras);
616 $this->request("flickr.photos.getRecent", array("extras"=>$extras, "per_page"=>$per_page, "page"=>$page));
617 return $this->parsed_response ? $this->parsed_response['photos'] : false;
620 function photos_getSizes($photo_id)
622 /** http://www.flickr.com/services/api/flickr.photos.getSizes.html */
623 $this->request("flickr.photos.getSizes", array("photo_id"=>$photo_id));
624 return $this->parsed_response ? $this->parsed_response['sizes']['size'] : false;
627 function photos_getUntagged($min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL, $privacy_filter = NULL, $extras = NULL, $per_page = NULL, $page = NULL)
629 /** http://www.flickr.com/services/api/flickr.photos.getUntagged.html */
630 if (is_array($extras)) {
631 $extras = implode(",", $extras);
633 $this->request("flickr.photos.getUntagged", array("min_upload_date"=>$min_upload_date, "max_upload_date"=>$max_upload_date, "min_taken_date"=>$min_taken_date, "max_taken_date"=>$max_taken_date, "privacy_filter"=>$privacy_filter, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page));
634 return $this->parsed_response ? $this->parsed_response['photos'] : false;
637 function photos_getWithGeoData($args = NULL) {
638 /** See the documentation included with the photos_search() function.
639 * I'm using the same style of arguments for this function. The only
640 * difference here is that this doesn't require any arguments. The
641 * flickr.photos.search method requires at least one search parameter.
643 /** http://www.flickr.com/services/api/flickr.photos.getWithGeoData.html */
644 if (is_null($args)) {
645 $args = array();
647 $this->request("flickr.photos.getWithGeoData", $args);
648 return $this->parsed_response ? $this->parsed_response['photos'] : false;
651 function photos_getWithoutGeoData($args = NULL) {
652 /** See the documentation included with the photos_search() function.
653 * I'm using the same style of arguments for this function. The only
654 * difference here is that this doesn't require any arguments. The
655 * flickr.photos.search method requires at least one search parameter.
657 /** http://www.flickr.com/services/api/flickr.photos.getWithoutGeoData.html */
658 if (is_null($args)) {
659 $args = array();
661 $this->request("flickr.photos.getWithoutGeoData", $args);
662 return $this->parsed_response ? $this->parsed_response['photos'] : false;
665 function photos_recentlyUpdated($min_date = NULL, $extras = NULL, $per_page = NULL, $page = NULL)
667 /** http://www.flickr.com/services/api/flickr.photos.getUntagged.html */
668 if (is_array($extras)) {
669 $extras = implode(",", $extras);
671 $this->request("flickr.photos.recentlyUpdated", array("min_date"=>$min_date, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page));
672 return $this->parsed_response ? $this->parsed_response['photos'] : false;
675 function photos_removeTag($tag_id)
677 /** http://www.flickr.com/services/api/flickr.photos.removeTag.html */
678 $this->request("flickr.photos.removeTag", array("tag_id"=>$tag_id), TRUE);
679 return $this->parsed_response ? true : false;
682 function photos_search($args)
684 /** This function strays from the method of arguments that I've
685 * used in the other functions for the fact that there are just
686 * so many arguments to this API method. What you'll need to do
687 * is pass an associative array to the function containing the
688 * arguments you want to pass to the API. For example:
689 * $photos = $f->photos_search(array("tags"=>"brown,cow", "tag_mode"=>"any"));
690 * This will return photos tagged with either "brown" or "cow"
691 * or both. See the API documentation (link below) for a full
692 * list of arguments.
695 /** http://www.flickr.com/services/api/flickr.photos.search.html */
696 $this->request("flickr.photos.search", $args);
697 return $this->parsed_response ? $this->parsed_response['photos'] : false;
700 function photos_setContentType ($photo_id, $content_type) {
701 /** http://www.flickr.com/services/api/flickr.photos.setContentType.html */
702 return $this->call('flickr.photos.setContentType', array('photo_id' => $photo_id, 'content_type' => $content_type));
705 function photos_setDates($photo_id, $date_posted = NULL, $date_taken = NULL, $date_taken_granularity = NULL)
707 /** http://www.flickr.com/services/api/flickr.photos.setDates.html */
708 $this->request("flickr.photos.setDates", array("photo_id"=>$photo_id, "date_posted"=>$date_posted, "date_taken"=>$date_taken, "date_taken_granularity"=>$date_taken_granularity), TRUE);
709 return $this->parsed_response ? true : false;
712 function photos_setMeta($photo_id, $title, $description)
714 /** http://www.flickr.com/services/api/flickr.photos.setMeta.html */
715 $this->request("flickr.photos.setMeta", array("photo_id"=>$photo_id, "title"=>$title, "description"=>$description), TRUE);
716 return $this->parsed_response ? true : false;
719 function photos_setPerms($photo_id, $is_public, $is_friend, $is_family, $perm_comment, $perm_addmeta)
721 /** http://www.flickr.com/services/api/flickr.photos.setPerms.html */
722 $this->request("flickr.photos.setPerms", array("photo_id"=>$photo_id, "is_public"=>$is_public, "is_friend"=>$is_friend, "is_family"=>$is_family, "perm_comment"=>$perm_comment, "perm_addmeta"=>$perm_addmeta), TRUE);
723 return $this->parsed_response ? true : false;
726 function photos_setSafetyLevel ($photo_id, $safety_level, $hidden = null) {
727 /** http://www.flickr.com/services/api/flickr.photos.setSafetyLevel.html */
728 return $this->call('flickr.photos.setSafetyLevel', array('photo_id' => $photo_id, 'safety_level' => $safety_level, 'hidden' => $hidden));
732 function photos_setTags($photo_id, $tags)
734 /** http://www.flickr.com/services/api/flickr.photos.setTags.html */
735 $this->request("flickr.photos.setTags", array("photo_id"=>$photo_id, "tags"=>$tags), TRUE);
736 return $this->parsed_response ? true : false;
739 /** Photos - Comments Methods */
740 function photos_comments_addComment($photo_id, $comment_text) {
741 /** http://www.flickr.com/services/api/flickr.photos.comments.addComment.html */
742 $this->request("flickr.photos.comments.addComment", array("photo_id" => $photo_id, "comment_text"=>$comment_text), TRUE);
743 return $this->parsed_response ? $this->parsed_response['comment'] : false;
746 function photos_comments_deleteComment($comment_id) {
747 /** http://www.flickr.com/services/api/flickr.photos.comments.deleteComment.html */
748 $this->request("flickr.photos.comments.deleteComment", array("comment_id" => $comment_id), TRUE);
749 return $this->parsed_response ? true : false;
752 function photos_comments_editComment($comment_id, $comment_text) {
753 /** http://www.flickr.com/services/api/flickr.photos.comments.editComment.html */
754 $this->request("flickr.photos.comments.editComment", array("comment_id" => $comment_id, "comment_text"=>$comment_text), TRUE);
755 return $this->parsed_response ? true : false;
758 function photos_comments_getList($photo_id)
760 /** http://www.flickr.com/services/api/flickr.photos.comments.getList.html */
761 $this->request("flickr.photos.comments.getList", array("photo_id"=>$photo_id));
762 return $this->parsed_response ? $this->parsed_response['comments'] : false;
765 /** Photos - Geo Methods */
766 function photos_geo_getLocation($photo_id)
768 /** http://www.flickr.com/services/api/flickr.photos.geo.getLocation.html */
769 $this->request("flickr.photos.geo.getLocation", array("photo_id"=>$photo_id));
770 return $this->parsed_response ? $this->parsed_response['photo'] : false;
773 function photos_geo_getPerms($photo_id)
775 /** http://www.flickr.com/services/api/flickr.photos.geo.getPerms.html */
776 $this->request("flickr.photos.geo.getPerms", array("photo_id"=>$photo_id));
777 return $this->parsed_response ? $this->parsed_response['perms'] : false;
780 function photos_geo_removeLocation($photo_id)
782 /** http://www.flickr.com/services/api/flickr.photos.geo.removeLocation.html */
783 $this->request("flickr.photos.geo.removeLocation", array("photo_id"=>$photo_id), TRUE);
784 return $this->parsed_response ? true : false;
787 function photos_geo_setLocation($photo_id, $lat, $lon, $accuracy = NULL)
789 /** http://www.flickr.com/services/api/flickr.photos.geo.setLocation.html */
790 $this->request("flickr.photos.geo.setLocation", array("photo_id"=>$photo_id, "lat"=>$lat, "lon"=>$lon, "accuracy"=>$accuracy), TRUE);
791 return $this->parsed_response ? true : false;
794 function photos_geo_setPerms($photo_id, $is_public, $is_contact, $is_friend, $is_family)
796 /** http://www.flickr.com/services/api/flickr.photos.geo.setPerms.html */
797 $this->request("flickr.photos.geo.setPerms", array("photo_id"=>$photo_id, "is_public"=>$is_public, "is_contact"=>$is_contact, "is_friend"=>$is_friend, "is_family"=>$is_family), TRUE);
798 return $this->parsed_response ? true : false;
801 /** Photos - Licenses Methods */
802 function photos_licenses_getInfo()
804 /** http://www.flickr.com/services/api/flickr.photos.licenses.getInfo.html */
805 $this->request("flickr.photos.licenses.getInfo");
806 return $this->parsed_response ? $this->parsed_response['licenses']['license'] : false;
809 function photos_licenses_setLicense($photo_id, $license_id)
811 /** http://www.flickr.com/services/api/flickr.photos.licenses.setLicense.html */
812 /** Requires Authentication */
813 $this->request("flickr.photos.licenses.setLicense", array("photo_id"=>$photo_id, "license_id"=>$license_id), TRUE);
814 return $this->parsed_response ? true : false;
817 /** Photos - Notes Methods */
818 function photos_notes_add($photo_id, $note_x, $note_y, $note_w, $note_h, $note_text)
820 /** http://www.flickr.com/services/api/flickr.photos.notes.add.html */
821 $this->request("flickr.photos.notes.add", array("photo_id" => $photo_id, "note_x" => $note_x, "note_y" => $note_y, "note_w" => $note_w, "note_h" => $note_h, "note_text" => $note_text), TRUE);
822 return $this->parsed_response ? $this->parsed_response['note'] : false;
825 function photos_notes_delete($note_id)
827 /** http://www.flickr.com/services/api/flickr.photos.notes.delete.html */
828 $this->request("flickr.photos.notes.delete", array("note_id" => $note_id), TRUE);
829 return $this->parsed_response ? true : false;
832 function photos_notes_edit($note_id, $note_x, $note_y, $note_w, $note_h, $note_text)
834 /** http://www.flickr.com/services/api/flickr.photos.notes.edit.html */
835 $this->request("flickr.photos.notes.edit", array("note_id" => $note_id, "note_x" => $note_x, "note_y" => $note_y, "note_w" => $note_w, "note_h" => $note_h, "note_text" => $note_text), TRUE);
836 return $this->parsed_response ? true : false;
839 /** Photos - Transform Methods */
840 function photos_transform_rotate($photo_id, $degrees)
842 /** http://www.flickr.com/services/api/flickr.photos.transform.rotate.html */
843 $this->request("flickr.photos.transform.rotate", array("photo_id" => $photo_id, "degrees" => $degrees), TRUE);
844 return $this->parsed_response ? true : false;
847 /** Photos - Upload Methods */
848 function photos_upload_checkTickets($tickets)
850 /** http://www.flickr.com/services/api/flickr.photos.upload.checkTickets.html */
851 if (is_array($tickets)) {
852 $tickets = implode(",", $tickets);
854 $this->request("flickr.photos.upload.checkTickets", array("tickets" => $tickets), TRUE);
855 return $this->parsed_response ? $this->parsed_response['uploader']['ticket'] : false;
858 /** Photosets Methods */
859 function photosets_addPhoto($photoset_id, $photo_id)
861 /** http://www.flickr.com/services/api/flickr.photosets.addPhoto.html */
862 $this->request("flickr.photosets.addPhoto", array("photoset_id" => $photoset_id, "photo_id" => $photo_id), TRUE);
863 return $this->parsed_response ? true : false;
866 function photosets_create($title, $description, $primary_photo_id)
868 /** http://www.flickr.com/services/api/flickr.photosets.create.html */
869 $this->request("flickr.photosets.create", array("title" => $title, "primary_photo_id" => $primary_photo_id, "description" => $description), TRUE);
870 return $this->parsed_response ? $this->parsed_response['photoset'] : false;
873 function photosets_delete($photoset_id)
875 /** http://www.flickr.com/services/api/flickr.photosets.delete.html */
876 $this->request("flickr.photosets.delete", array("photoset_id" => $photoset_id), TRUE);
877 return $this->parsed_response ? true : false;
880 function photosets_editMeta($photoset_id, $title, $description = NULL)
882 /** http://www.flickr.com/services/api/flickr.photosets.editMeta.html */
883 $this->request("flickr.photosets.editMeta", array("photoset_id" => $photoset_id, "title" => $title, "description" => $description), TRUE);
884 return $this->parsed_response ? true : false;
887 function photosets_editPhotos($photoset_id, $primary_photo_id, $photo_ids)
889 /** http://www.flickr.com/services/api/flickr.photosets.editPhotos.html */
890 $this->request("flickr.photosets.editPhotos", array("photoset_id" => $photoset_id, "primary_photo_id" => $primary_photo_id, "photo_ids" => $photo_ids), TRUE);
891 return $this->parsed_response ? true : false;
894 function photosets_getContext($photo_id, $photoset_id)
896 /** http://www.flickr.com/services/api/flickr.photosets.getContext.html */
897 $this->request("flickr.photosets.getContext", array("photo_id" => $photo_id, "photoset_id" => $photoset_id));
898 return $this->parsed_response ? $this->parsed_response : false;
901 function photosets_getInfo($photoset_id)
903 /** http://www.flickr.com/services/api/flickr.photosets.getInfo.html */
904 $this->request("flickr.photosets.getInfo", array("photoset_id" => $photoset_id));
905 return $this->parsed_response ? $this->parsed_response['photoset'] : false;
908 function photosets_getList($user_id = NULL)
910 /** http://www.flickr.com/services/api/flickr.photosets.getList.html */
911 $this->request("flickr.photosets.getList", array("user_id" => $user_id));
912 return $this->parsed_response ? $this->parsed_response['photosets'] : false;
915 function photosets_getPhotos($photoset_id, $extras = NULL, $privacy_filter = NULL, $per_page = NULL, $page = NULL)
917 /** http://www.flickr.com/services/api/flickr.photosets.getPhotos.html */
918 $this->request("flickr.photosets.getPhotos", array("photoset_id" => $photoset_id, "extras" => $extras, "privacy_filter" => $privacy_filter, "per_page" => $per_page, "page" => $page));
919 return $this->parsed_response ? $this->parsed_response['photoset'] : false;
922 function photosets_orderSets($photoset_ids)
924 /** http://www.flickr.com/services/api/flickr.photosets.orderSets.html */
925 if (is_array($photoset_ids)) {
926 $photoset_ids = implode(",", $photoset_ids);
928 $this->request("flickr.photosets.orderSets", array("photoset_ids" => $photoset_ids), TRUE);
929 return $this->parsed_response ? true : false;
932 function photosets_removePhoto($photoset_id, $photo_id)
934 /** http://www.flickr.com/services/api/flickr.photosets.removePhoto.html */
935 $this->request("flickr.photosets.removePhoto", array("photoset_id" => $photoset_id, "photo_id" => $photo_id), TRUE);
936 return $this->parsed_response ? true : false;
939 /** Photosets Comments Methods */
940 function photosets_comments_addComment($photoset_id, $comment_text) {
941 /** http://www.flickr.com/services/api/flickr.photosets.comments.addComment.html */
942 $this->request("flickr.photosets.comments.addComment", array("photoset_id" => $photoset_id, "comment_text"=>$comment_text), TRUE);
943 return $this->parsed_response ? $this->parsed_response['comment'] : false;
946 function photosets_comments_deleteComment($comment_id) {
947 /** http://www.flickr.com/services/api/flickr.photosets.comments.deleteComment.html */
948 $this->request("flickr.photosets.comments.deleteComment", array("comment_id" => $comment_id), TRUE);
949 return $this->parsed_response ? true : false;
952 function photosets_comments_editComment($comment_id, $comment_text) {
953 /** http://www.flickr.com/services/api/flickr.photosets.comments.editComment.html */
954 $this->request("flickr.photosets.comments.editComment", array("comment_id" => $comment_id, "comment_text"=>$comment_text), TRUE);
955 return $this->parsed_response ? true : false;
958 function photosets_comments_getList($photoset_id)
960 /** http://www.flickr.com/services/api/flickr.photosets.comments.getList.html */
961 $this->request("flickr.photosets.comments.getList", array("photoset_id"=>$photoset_id));
962 return $this->parsed_response ? $this->parsed_response['comments'] : false;
965 /** Places Methods */
966 function places_resolvePlaceId ($place_id) {
967 /** http://www.flickr.com/services/api/flickr.places.resolvePlaceId.html */
968 $rsp = $this->call('flickr.places.resolvePlaceId', array('place_id' => $place_id));
969 return $rsp ? $rsp['location'] : $rsp;
972 function places_resolvePlaceURL ($url) {
973 /** http://www.flickr.com/services/api/flickr.places.resolvePlaceURL.html */
974 $rsp = $this->call('flickr.places.resolvePlaceURL', array('url' => $url));
975 return $rsp ? $rsp['location'] : $rsp;
978 /** Prefs Methods */
979 function prefs_getContentType () {
980 /** http://www.flickr.com/services/api/flickr.prefs.getContentType.html */
981 $rsp = $this->call('flickr.prefs.getContentType', array());
982 return $rsp ? $rsp['person'] : $rsp;
985 function prefs_getHidden () {
986 /** http://www.flickr.com/services/api/flickr.prefs.getHidden.html */
987 $rsp = $this->call('flickr.prefs.getHidden', array());
988 return $rsp ? $rsp['person'] : $rsp;
991 function prefs_getPrivacy () {
992 /** http://www.flickr.com/services/api/flickr.prefs.getPrivacy.html */
993 $rsp = $this->call('flickr.prefs.getPrivacy', array());
994 return $rsp ? $rsp['person'] : $rsp;
997 function prefs_getSafetyLevel () {
998 /** http://www.flickr.com/services/api/flickr.prefs.getSafetyLevel.html */
999 $rsp = $this->call('flickr.prefs.getSafetyLevel', array());
1000 return $rsp ? $rsp['person'] : $rsp;
1003 /** Reflection Methods */
1004 function reflection_getMethodInfo($method_name)
1006 /** http://www.flickr.com/services/api/flickr.reflection.getMethodInfo.html */
1007 $this->request("flickr.reflection.getMethodInfo", array("method_name" => $method_name));
1008 return $this->parsed_response ? $this->parsed_response : false;
1011 function reflection_getMethods()
1013 /** http://www.flickr.com/services/api/flickr.reflection.getMethods.html */
1014 $this->request("flickr.reflection.getMethods");
1015 return $this->parsed_response ? $this->parsed_response['methods']['method'] : false;
1018 /** Tags Methods */
1019 function tags_getHotList($period = NULL, $count = NULL)
1021 /** http://www.flickr.com/services/api/flickr.tags.getHotList.html */
1022 $this->request("flickr.tags.getHotList", array("period" => $period, "count" => $count));
1023 return $this->parsed_response ? $this->parsed_response['hottags'] : false;
1026 function tags_getListPhoto($photo_id)
1028 /** http://www.flickr.com/services/api/flickr.tags.getListPhoto.html */
1029 $this->request("flickr.tags.getListPhoto", array("photo_id" => $photo_id));
1030 return $this->parsed_response ? $this->parsed_response['photo']['tags']['tag'] : false;
1033 function tags_getListUser($user_id = NULL)
1035 /** http://www.flickr.com/services/api/flickr.tags.getListUser.html */
1036 $this->request("flickr.tags.getListUser", array("user_id" => $user_id));
1037 return $this->parsed_response ? $this->parsed_response['who']['tags']['tag'] : false;
1040 function tags_getListUserPopular($user_id = NULL, $count = NULL)
1042 /** http://www.flickr.com/services/api/flickr.tags.getListUserPopular.html */
1043 $this->request("flickr.tags.getListUserPopular", array("user_id" => $user_id, "count" => $count));
1044 return $this->parsed_response ? $this->parsed_response['who']['tags']['tag'] : false;
1047 function tags_getListUserRaw($tag)
1049 /** http://www.flickr.com/services/api/flickr.tags.getListUserRaw.html */
1050 $this->request("flickr.tags.getListUserRaw", array("tag" => $tag));
1051 return $this->parsed_response ? $this->parsed_response['who']['tags']['tag'][0]['raw'] : false;
1054 function tags_getRelated($tag)
1056 /** http://www.flickr.com/services/api/flickr.tags.getRelated.html */
1057 $this->request("flickr.tags.getRelated", array("tag" => $tag));
1058 return $this->parsed_response ? $this->parsed_response['tags'] : false;
1061 function test_echo($args = array())
1063 /** http://www.flickr.com/services/api/flickr.test.echo.html */
1064 $this->request("flickr.test.echo", $args);
1065 return $this->parsed_response ? $this->parsed_response : false;
1068 function test_login()
1070 /** http://www.flickr.com/services/api/flickr.test.login.html */
1071 $this->request("flickr.test.login");
1072 return $this->parsed_response ? $this->parsed_response['user'] : false;
1075 function urls_getGroup($group_id)
1077 /** http://www.flickr.com/services/api/flickr.urls.getGroup.html */
1078 $this->request("flickr.urls.getGroup", array("group_id"=>$group_id));
1079 return $this->parsed_response ? $this->parsed_response['group']['url'] : false;
1082 function urls_getUserPhotos($user_id = NULL)
1084 /** http://www.flickr.com/services/api/flickr.urls.getUserPhotos.html */
1085 $this->request("flickr.urls.getUserPhotos", array("user_id"=>$user_id));
1086 return $this->parsed_response ? $this->parsed_response['user']['url'] : false;
1089 function urls_getUserProfile($user_id = NULL)
1091 /** http://www.flickr.com/services/api/flickr.urls.getUserProfile.html */
1092 $this->request("flickr.urls.getUserProfile", array("user_id"=>$user_id));
1093 return $this->parsed_response ? $this->parsed_response['user']['url'] : false;
1096 function urls_lookupGroup($url)
1098 /** http://www.flickr.com/services/api/flickr.urls.lookupGroup.html */
1099 $this->request("flickr.urls.lookupGroup", array("url"=>$url));
1100 return $this->parsed_response ? $this->parsed_response['group'] : false;
1103 function urls_lookupUser($url)
1105 /** http://www.flickr.com/services/api/flickr.photos.notes.edit.html */
1106 $this->request("flickr.urls.lookupUser", array("url"=>$url));
1107 return $this->parsed_response ? $this->parsed_response['user'] : false;
1111 * Upload a photo from Moodle file pool to Flickr
1113 * Optional meta information are title, description, tags, is_public, is_friend, is_family, safety_level,
1114 * content_type and hidden {@see http://www.flickr.com/services/api/upload.api.html}
1116 * @param stored_file $photo stored in Moodle file pool
1117 * @param array $meta optional meta information
1118 * @return boolean
1120 function upload(stored_file $photo, array $meta = array()) {
1122 $args = array();
1124 $args['title'] = isset($meta['title']) ? $meta['title'] : null;
1125 $args['description'] = isset($meta['description']) ? $meta['description'] : null;
1126 $args['tags'] = isset($meta['tags']) ? $meta['tags'] : null;
1127 $args['is_public'] = isset($meta['is_public']) ? $meta['is_public'] : 0;
1128 $args['is_friend'] = isset($meta['is_friend']) ? $meta['is_friend'] : 0;
1129 $args['is_family'] = isset($meta['is_family']) ? $meta['is_family'] : 0;
1130 $args['safety_level'] = isset($meta['safety_level']) ? $meta['safety_level'] : 1; // safe by default
1131 $args['content_type'] = isset($meta['content_type']) ? $meta['content_type'] : 1; // photo by default
1132 $args['hidden'] = isset($meta['hidden']) ? $meta['hidden'] : 2; // hide from public searches by default
1134 // Do not enable the asynchronous more because then the query does not return a photo ID,
1135 // and we need a photo ID to add the photo to a set later on.
1136 // $args['async'] = 1;
1137 $args['api_key'] = $this->api_key;
1139 if (!empty($this->token)) {
1140 $args['auth_token'] = $this->token;
1143 // sign the arguments using the shared secret
1144 ksort($args);
1145 $auth_sig = '';
1146 foreach ($args as $key => $data) {
1147 if (!is_null($data)) {
1148 $auth_sig .= $key . $data;
1149 } else {
1150 unset($args[$key]);
1153 if (!empty($this->secret)) {
1154 $api_sig = md5($this->secret . $auth_sig);
1155 $args['api_sig'] = $api_sig;
1158 $args['photo'] = $photo; // $this->curl will process it correctly
1160 if ($response = $this->curl->post($this->Upload, $args)) {
1161 $xml = simplexml_load_string($response);
1162 if ($xml['stat'] == 'fail') {
1163 $this->parsed_response = array('stat' => (string) $xml['stat'], 'code' => (int) $xml->err['code'],
1164 'message' => (string) $xml->err['msg']);
1165 } elseif ($xml['stat'] == 'ok') {
1166 $this->parsed_response = array('stat' => (string) $xml['stat'], 'photoid' => (int) $xml->photoid);
1168 return true;
1169 } else {
1170 $this->parsed_response = array('stat' => 'fail', 'code' => $this->curl->get_errno(),
1171 'message' => $this->curl->error);
1172 return false;