Merge branch 'm20_MDL-22449_wiki_help_buttons' of git://github.com/dongsheng/moodle
[moodle.git] / repository / flickr_public / lib.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * repository_flickr_public class
19  * This one is used to create public repository
20  * You can set up a public account in admin page, so everyone can access
21  * flickr photos from this plugin
22  *
23  * @since 2.0
24  * @package    repository
25  * @subpackage flickr_public
26  * @copyright  2009 Dongsheng Cai
27  * @author     Dongsheng Cai <dongsheng@moodle.com>
28  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
29  */
31 require_once($CFG->libdir.'/flickrlib.php');
32 require_once(dirname(__FILE__) . '/image.php');
34 class repository_flickr_public extends repository {
35     private $flickr;
36     public $photos;
38     /**
39      * constructor method
40      *
41      * @global object $CFG
42      * @global object $SESSION
43      * @param int $repositoryid
44      * @param int $context
45      * @param array $options
46      * @param boolean $readonly
47      */
48     public function __construct($repositoryid, $context = SYSCONTEXTID, $options = array(), $readonly=0) {
49         global $CFG, $SESSION;
50         parent::__construct($repositoryid, $context, $options,$readonly);
51         $this->api_key = $this->get_option('api_key');
52         $this->flickr  = new phpFlickr($this->api_key);
53         $this->flickr_account = $this->get_option('email_address');
54         $this->usewatermarks = $this->get_option('usewatermarks');
56         $account  = optional_param('flickr_account', '', PARAM_RAW);
57         $fulltext = optional_param('flickr_fulltext', '', PARAM_RAW);
58         if (empty($fulltext)) {
59             $fulltext = optional_param('s', '', PARAM_RAW);
60         }
61         $tag      = optional_param('flickr_tag', '', PARAM_RAW);
62         $license  = optional_param('flickr_license', '', PARAM_RAW);
64         $this->sess_account = 'flickr_public_'.$this->id.'_account';
65         $this->sess_tag     = 'flickr_public_'.$this->id.'_tag';
66         $this->sess_text    = 'flickr_public_'.$this->id.'_text';
68         if (!empty($account) or !empty($fulltext) or !empty($tag) or !empty($license)) {
69             $SESSION->{$this->sess_tag}  = $tag;
70             $SESSION->{$this->sess_text} = $fulltext;
71             $SESSION->{$this->sess_account} = $account;
72         }
73     }
75     /**
76      * save api_key in config table
77      * @param array $options
78      * @return boolean
79      */
80     public function set_option($options = array()) {
81         if (!empty($options['api_key'])) {
82             set_config('api_key', trim($options['api_key']), 'flickr_public');
83         }
84         unset($options['api_key']);
85         return parent::set_option($options);
86     }
88     /**
89      * get api_key from config table
90      *
91      * @param string $config
92      * @return mixed
93      */
94     public function get_option($config = '') {
95         if ($config==='api_key') {
96             return trim(get_config('flickr_public', 'api_key'));
97         } else {
98             $options['api_key'] = trim(get_config('flickr_public', 'api_key'));
99         }
100         return parent::get_option($config);
101     }
103     /**
104      * is global_search available?
105      *
106      * @return boolean
107      */
108     public function global_search() {
109         if (empty($this->flickr_account)) {
110             return false;
111         } else {
112             return true;
113         }
114     }
116     /**
117      * check if flickr account
118      * @return boolean
119      */
120     public function check_login() {
121         return !empty($this->flickr_account);
122     }
124     /**
125      * construct login form
126      *
127      * @param boolean $ajax
128      * @return array
129      */
130     public function print_login() {
131         if ($this->options['ajax']) {
132             $ret = array();
133             $fulltext = new stdClass();
134             $fulltext->label = get_string('fulltext', 'repository_flickr_public').': ';
135             $fulltext->id    = 'el_fulltext';
136             $fulltext->type = 'text';
137             $fulltext->name = 'flickr_fulltext';
139             $tag = new stdClass();
140             $tag->label = get_string('tag', 'repository_flickr_public').': ';
141             $tag->id    = 'el_tag';
142             $tag->type = 'text';
143             $tag->name = 'flickr_tag';
145             $email_field = new stdClass();
146             $email_field->label = get_string('username', 'repository_flickr_public').': ';
147             $email_field->id    = 'account';
148             $email_field->type = 'text';
149             $email_field->name = 'flickr_account';
151             $commercial = new stdClass();
152             $commercial->label = get_string('commercialuse', 'repository_flickr_public').': ';
153             $commercial->id    = 'flickr_commercial_id';
154             $commercial->type  = 'checkbox';
155             $commercial->name  = 'flickr_commercial';
156             $commercial->value = 'yes';
158             $modification = new stdClass();
159             $modification->label = get_string('modification', 'repository_flickr_public').': ';
160             $modification->id    = 'flickr_modification_id';
161             $modification->type  = 'checkbox';
162             $modification->name  = 'flickr_modification';
163             $modification->value = 'yes';
165             $ret['login'] = array($fulltext, $tag, $email_field, $commercial, $modification);
166             $ret['login_btn_label'] = get_string('search');
167             $ret['login_btn_action'] = 'search';
168             return $ret;
169         } else {
170             echo '<table>';
171             echo '<tr><td><label>'.get_string('fulltext', 'repository_flickr_public').'</label></td>';
172             echo '<td><input type="text" name="flickr_fulltext" /></td></tr>';
173             echo '<tr><td><label>'.get_string('tag', 'repository_flickr_public').'</label></td>';
174             echo '<td><input type="text" name="flickr_tag" /></td></tr>';
175             echo '<tr><td><label>'.get_string('username', 'repository_flickr_public').'</label></td>';
176             echo '<td><input type="text" name="flickr_account" /></td></tr>';
178             echo '<tr><td><label>'.get_string('commercialuse', 'repository_flickr_public').'</label></td>';
179             echo '<td>';
180             echo '<input type="checkbox" name="flickr_commercial" value="yes" />';
181             echo '</td></tr>';
183             echo '<tr><td><label>'.get_string('modification', 'repository_flickr_public').'</label></td>';
184             echo '<td>';
185             echo '<input type="checkbox" name="flickr_modification" value="yes" />';
186             echo '</td></tr>';
188             echo '</table>';
190             echo '<input type="hidden" name="action" value="search" />';
191             echo '<input type="submit" value="'.get_string('search', 'repository').'" />';
192         }
193     }
195     /**
196      * destroy session
197      *
198      * @return object
199      */
200     public function logout() {
201         global $SESSION;
202         unset($SESSION->{$this->sess_tag});
203         unset($SESSION->{$this->sess_text});
204         unset($SESSION->{$this->sess_account});
205         return $this->print_login();
206     }
208     public function license4moodle ($license_id) {
209         $license = array(
210             '1' => 'cc-nc-sa',
211             '2' => 'cc-nc',
212             '3' => 'cc-nc-nd',
213             '4' => 'cc',
214             '5' => 'cc-sa',
215             '6' => 'cc-nd',
216             '7' => 'allrightsreserved'
217             );
218         return $license[$license_id];
219     }
221     /**
222      * search images on flickr
223      *
224      * @param string $search_text
225      * @return array
226      */
227     public function search($search_text, $page = 1) {
228         global $SESSION;
229         $ret = array();
230         if (empty($page)) {
231             $page = 1;
232         }
234         if (!empty($this->flickr_account)) {
235             $people = $this->flickr->people_findByEmail($this->flickr_account);
236             $this->nsid = $people['nsid'];
237         }
238         if (!empty($SESSION->{$this->sess_account})) {
239             $people = $this->flickr->people_findByEmail($SESSION->{$this->sess_account});
240             $this->nsid = $people['nsid'];
241         }
242         if (empty($this->nsid)) {
243             $this->nsid = null;
244             // user specify a flickr account, but it is not valid
245             if (!empty($this->flickr_account) or !empty($SESSION->{$this->sess_account})) {
246                 $ret['e'] = get_string('invalidemail', 'repository_flickr_public');
247                 return $ret;
248             }
249         }
251         // including all licenses by default
252         $licenses = array(1=>1, 2, 3, 4, 5, 6, 7);
254         $commercial   = optional_param('flickr_commercial', '', PARAM_RAW);
255         $modification = optional_param('flickr_modification', '', PARAM_RAW);
257         if ($commercial == 'yes') {
258             // including
259             // 4: Attribution License
260             // 5: Attribution ShareAlike
261             // 6: Attribution NoDerives
262             // 7: unknown license
263             unset($licenses[1], $licenses[2], $licenses[3]);
264         }
265         if ($modification == 'yes') {
266             // including
267             // 1: Attribution NonCommercial ShareAlike
268             // 2: Attribution NonCommercial
269             // 4: Attribution License
270             // 5: Attribution ShareAlike
271             // 7: unknown license
272             unset($licenses[3], $licenses[6]);
273         }
274         //if ($modification == 'sharealike') {
275             // including
276             // 1: Attribution NonCommercial ShareAlike
277             // 5: Attribution ShareAlike
278             //unset($licenses[2], $licenses[3], $licenses[4], $licenses[6], $licenses[7]);
279         //}
281         $licenses = implode(',', $licenses);
283         if (!empty($SESSION->{$this->sess_tag})         // use tag to search
284             or !empty($SESSION->{$this->sess_text})     // use keyword to search
285             or !empty($this->nsid)/*use pre-defined accound*/) {
286             $photos = $this->flickr->photos_search(array(
287                 'tags'=>$SESSION->{$this->sess_tag},
288                 'page'=>$page,
289                 'per_page'=>24,
290                 'user_id'=>$this->nsid,
291                 'license'=>$licenses,
292                 'text'=>$SESSION->{$this->sess_text}
293                 )
294             );
295         }
296         $ret['total'] = $photos['total'];
297         $ret['perpage'] = $photos['perpage'];
298         if (empty($photos)) {
299             $ret['list'] = array();
300             return $ret;
301         }
302         $ret = $this->build_list($photos, $page, $ret);
303         $ret['list'] = array_filter($ret['list'], array($this, 'filter'));
304         return $ret;
305     }
307     /**
308      * return an image list
309      *
310      * @param string $path
311      * @param int $page
312      * @return array
313      */
314     public function get_listing($path = '', $page = 1) {
315         $people = $this->flickr->people_findByEmail($this->flickr_account);
316         $this->nsid = $people['nsid'];
317         $photos = $this->flickr->people_getPublicPhotos($people['nsid'], 'original_format', 24, $page);
318         $ret = array();
320         return $this->build_list($photos, $page, $ret);
321     }
323     /**
324      * build an image list
325      *
326      * @param array $photos
327      * @param int $page
328      * @return array
329      */
330     private function build_list($photos, $page = 1, &$ret) {
331         if (!empty($this->nsid)) {
332             $photos_url = $this->flickr->urls_getUserPhotos($this->nsid);
333             $ret['manage'] = $photos_url;
334         }
335         $ret['list']  = array();
336         $ret['nosearch'] = true;
337         $ret['norefresh'] = true;
338         $ret['logouttext'] = get_string('backtosearch', 'repository_flickr_public');
339         $ret['pages'] = $photos['pages'];
340         if (is_int($page) && $page <= $ret['pages']) {
341             $ret['page'] = $page;
342         } else {
343             $ret['page'] = 1;
344         }
345         if (!empty($photos['photo'])) {
346             foreach ($photos['photo'] as $p) {
347                 if(empty($p['title'])) {
348                     $p['title'] = get_string('notitle', 'repository_flickr');
349                 }
350                 if (isset($p['originalformat'])) {
351                     $format = $p['originalformat'];
352                 } else {
353                     $format = 'jpg';
354                 }
355                 $format = '.'.$format;
356                 if (substr($p['title'], strlen($p['title'])-strlen($format)) != $format) {
357                     // append author id
358                     // $p['title'] .= '-'.$p['owner'];
359                     // append file extension
360                     $p['title'] .= $format;
361                 }
362                 $ret['list'][] = array(
363                     'title'=>$p['title'],
364                     'source'=>$p['id'],
365                     'id'=>$p['id'],
366                     'thumbnail'=>$this->flickr->buildPhotoURL($p, 'Square'),
367                     'date'=>'',
368                     'size'=>'unknown',
369                     'url'=>'http://www.flickr.com/photos/'.$p['owner'].'/'.$p['id'],
370                     'haslicense'=>true,
371                     'hasauthor'=>true
372                 );
373             }
374         }
375         return $ret;
376     }
378     /**
379      * Print a search form
380      *
381      * @return string
382      */
383     public function print_search() {
384         $str = '';
385         $str .= '<input type="hidden" name="repo_id" value="'.$this->id.'" />';
386         $str .= '<input type="hidden" name="ctx_id" value="'.$this->context->id.'" />';
387         $str .= '<input type="hidden" name="seekey" value="'.sesskey().'" />';
388         $str .= '<label>'.get_string('fulltext', 'repository_flickr_public').': </label><br/><input name="s" value="" /><br/>';
389         $str .= '<label>'.get_string('tag', 'repository_flickr_public').'</label><br /><input type="text" name="flickr_tag" /><br />';
390         return $str;
391     }
393     public function get_link($photo_id) {
394         global $CFG;
395         $result = $this->flickr->photos_getSizes($photo_id);
396         $url = '';
397         if(!empty($result[4])) {
398             $url = $result[4]['source'];
399         } elseif(!empty($result[3])) {
400             $url = $result[3]['source'];
401         } elseif(!empty($result[2])) {
402             $url = $result[2]['source'];
403         }
404         return $url;
405     }
407     /**
408      *
409      * @global object $CFG
410      * @param string $photo_id
411      * @param string $file
412      * @return string
413      */
414     public function get_file($photo_id, $file = '') {
415         global $CFG;
416         $info = $this->flickr->photos_getInfo($photo_id);
417         if ($info['owner']['realname']) {
418             $author = $info['owner']['realname'];
419         } else {
420             $author = $info['owner']['username'];
421         }
422         $copyright = get_string('author', 'repository') . ': ' . $author;
423         $result = $this->flickr->photos_getSizes($photo_id);
424         // download link
425         $source = '';
426         // flickr photo page
427         $url = '';
428         if (!empty($result[4])) {
429             $source = $result[4]['source'];
430             $url = $result[4]['url'];
431         } elseif(!empty($result[3])) {
432             $source = $result[3]['source'];
433             $url = $result[3]['url'];
434         } elseif(!empty($result[2])) {
435             $source = $result[2]['source'];
436             $url = $result[2]['url'];
437         }
438         $path = $this->prepare_file($file);
439         $fp = fopen($path, 'w');
440         $c = new curl;
441         $c->download(array(array('url'=>$source, 'file'=>$fp)));
442         // must close file handler, otherwise gd lib will fail to process it
443         fclose($fp);
444         if (!empty($this->usewatermarks)) {
445             $img = new moodle_image($path);
446             $img->watermark($copyright, array(10,10), array('ttf'=>true, 'fontsize'=>12))->saveas($path);
447         }
449         return array('path'=>$path, 'url'=>$url, 'author'=>$info['owner']['realname'], 'license'=>$this->license4moodle($info['license']));
450     }
452     /**
453      * Add Instance settings input to Moodle form
454      * @param object $mform
455      */
456     public function instance_config_form($mform) {
457         $mform->addElement('text', 'email_address', get_string('emailaddress', 'repository_flickr_public'));
458         $mform->addElement('checkbox', 'usewatermarks', get_string('watermark', 'repository_flickr_public'));
459         //$mform->addRule('email_address', get_string('required'), 'required', null, 'client');
460     }
462     /**
463      * Names of the instance settings
464      * @return array
465      */
466     public static function get_instance_option_names() {
467         return array('email_address', 'usewatermarks');
468     }
470     /**
471      * Add Plugin settings input to Moodle form
472      * @param object $mform
473      */
474     public function type_config_form($mform) {
475         $api_key = get_config('flickr_public', 'api_key');
476         if (empty($api_key)) {
477             $api_key = '';
478         }
479         $strrequired = get_string('required');
481         $mform->addElement('text', 'api_key', get_string('apikey', 'repository_flickr_public'), array('value'=>$api_key,'size' => '40'));
482         $mform->addRule('api_key', $strrequired, 'required', null, 'client');
484         $mform->addElement('static', null, '',  get_string('information','repository_flickr_public'));
485     }
487     /**
488      * Names of the plugin settings
489      * @return array
490      */
491     public static function get_type_option_names() {
492         return array('api_key', 'pluginname');
493     }
495     /**
496      * is run when moodle administrator add the plugin
497      */
498     public static function plugin_init() {
499         //here we create a default instance for this type
501         $id = repository::static_function('flickr_public','create', 'flickr_public', 0, get_system_context(), array('name'=>'', 'email_address' => null), 0);
502         if (empty($id)) {
503             return false;
504         } else {
505             return true;
506         }
507     }
508     public function supported_filetypes() {
509         return array('web_image');
510     }
511     public function supported_returntypes() {
512         return (FILE_INTERNAL | FILE_EXTERNAL);
513     }