97dca52e30a68eebad6110f572d599d6701e5610
[moodle.git] / repository / flickr_public / repository.class.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
19 require_once($CFG->libdir.'/flickrlib.php');
20 require_once(dirname(__FILE__) . '/image.php');
22 /**
23  * repository_flickr_public class
24  * This one is used to create public repository
25  * You can set up a public account in admin page, so everyone can
26  * access photos in this public account
27  *
28  * @since 2.0
29  * @package moodlecore
30  * @subpackage repository
31  * @copyright 2009 Dongsheng Cai
32  * @author Dongsheng Cai <dongsheng@moodle.com>
33  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34  */
35 class repository_flickr_public extends repository {
36     private $flickr;
37     public $photos;
39     /**
40      * save api_key in config table
41      * @param array $options
42      * @return boolean
43      */
44     public function set_option($options = array()) {
45         if (!empty($options['api_key'])) {
46             set_config('api_key', trim($options['api_key']), 'flickr_public');
47         }
48         unset($options['api_key']);
49         return parent::set_option($options);
50     }
52     /**
53      * get api_key from config table
54      *
55      * @param string $config
56      * @return mixed
57      */
58     public function get_option($config = '') {
59         if ($config==='api_key') {
60             return trim(get_config('flickr_public', 'api_key'));
61         } else {
62             $options['api_key'] = trim(get_config('flickr_public', 'api_key'));
63         }
64         return parent::get_option($config);
65     }
67     /**
68      * is global_search available?
69      *
70      * @return boolean
71      */
72     public function global_search() {
73         if (empty($this->flickr_account)) {
74             return false;
75         } else {
76             return true;
77         }
78     }
80     /**
81      * constructor method
82      *
83      * @global object $CFG
84      * @global object $SESSION
85      * @param int $repositoryid
86      * @param int $context
87      * @param array $options
88      * @param boolean $readonly
89      */
90     public function __construct($repositoryid, $context = SITEID, $options = array(), $readonly=0) {
91         global $CFG, $SESSION;
92         parent::__construct($repositoryid, $context, $options,$readonly);
93         $this->api_key = $this->get_option('api_key');
94         $this->flickr  = new phpFlickr($this->api_key);
95         $this->flickr_account = $this->get_option('email_address');
97         $account  = optional_param('flickr_account', '', PARAM_RAW);
98         $fulltext = optional_param('flickr_fulltext', '', PARAM_RAW);
99         if (empty($fulltext)) {
100             $fulltext = optional_param('s', '', PARAM_RAW);
101         }
102         $tag      = optional_param('flickr_tag', '', PARAM_RAW);
103         $license  = optional_param('flickr_license', '', PARAM_RAW);
105         $this->sess_account = 'flickr_public_'.$this->id.'_account';
106         $this->sess_tag     = 'flickr_public_'.$this->id.'_tag';
107         $this->sess_text    = 'flickr_public_'.$this->id.'_text';
109         if (!empty($account) or !empty($fulltext) or !empty($tag) or !empty($license)) {
110             $SESSION->{$this->sess_tag}  = $tag;
111             $SESSION->{$this->sess_text} = $fulltext;
112             $SESSION->{$this->sess_account} = $account;
113         }
114     }
116     /**
117      * check 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     /**
209      * search images on flickr
210      *
211      * @param string $search_text
212      * @return array
213      */
214     public function search($search_text, $page = 1) {
215         global $SESSION;
216         $ret = array();
217         if (empty($page)) {
218             $page = 1;
219         }
221         if (!empty($this->flickr_account)) {
222             $people = $this->flickr->people_findByEmail($this->flickr_account);
223             $this->nsid = $people['nsid'];
224         }
225         if (!empty($SESSION->{$this->sess_account})) {
226             $people = $this->flickr->people_findByEmail($SESSION->{$this->sess_account});
227             $this->nsid = $people['nsid'];
228         }
229         if (empty($this->nsid)) {
230             $this->nsid = null;
231             // user specify a flickr account, but it is not valid
232             if (!empty($this->flickr_account) or !empty($SESSION->{$this->sess_account})) {
233                 $ret['e'] = get_string('invalidemail', 'repository_flickr_public');
234                 return $ret;
235             }
236         }
238         // including all licenses by default
239         $licenses = array(1=>1, 2, 3, 4, 5, 6, 7);
241         $commercial   = optional_param('flickr_commercial', '', PARAM_RAW);
242         $modification = optional_param('flickr_modification', '', PARAM_RAW);
244         if ($commercial == 'yes') {
245             // including
246             // 4: Attribution License
247             // 5: Attribution ShareAlike
248             // 6: Attribution NoDerives
249             // 7: unknown license
250             unset($licenses[1], $licenses[2], $licenses[3]);
251         }
252         if ($modification == 'yes') {
253             // including
254             // 1: Attribution NonCommercial ShareAlike
255             // 2: Attribution NonCommercial
256             // 4: Attribution License
257             // 5: Attribution ShareAlike
258             // 7: unknown license
259             unset($licenses[3], $licenses[6]);
260         }
261         //if ($modification == 'sharealike') {
262             // including
263             // 1: Attribution NonCommercial ShareAlike
264             // 5: Attribution ShareAlike
265             //unset($licenses[2], $licenses[3], $licenses[4], $licenses[6], $licenses[7]);
266         //}
268         $licenses = implode(',', $licenses);
270         if (!empty($SESSION->{$this->sess_tag})         // use tag to search
271             or !empty($SESSION->{$this->sess_text})     // use keyword to search
272             or !empty($this->nsid)/*use pre-defined accound*/) {
273             $photos = $this->flickr->photos_search(array(
274                 'tags'=>$SESSION->{$this->sess_tag},
275                 'page'=>$page,
276                 'per_page'=>24,
277                 'user_id'=>$this->nsid,
278                 'license'=>$licenses,
279                 'text'=>$SESSION->{$this->sess_text}
280                 )
281             );
282         }
283         $ret['total'] = $photos['total'];
284         $ret['perpage'] = $photos['perpage'];
285         if (empty($photos)) {
286             $ret['list'] = array();
287             return $ret;
288         }
289         $ret = $this->build_list($photos, $page, $ret);
290         $ret['list'] = array_filter($ret['list'], array($this, 'filter'));
291         return $ret;
292     }
294     /**
295      * return an image list
296      *
297      * @param string $path
298      * @param int $page
299      * @return array
300      */
301     public function get_listing($path = '', $page = 1) {
302         $people = $this->flickr->people_findByEmail($this->flickr_account);
303         $this->nsid = $people['nsid'];
304         $photos = $this->flickr->people_getPublicPhotos($people['nsid'], 'original_format', 24, $page);
305         $ret = array();
307         return $this->build_list($photos, $page, $ret);
308     }
310     /**
311      * build an image list
312      *
313      * @param array $photos
314      * @param int $page
315      * @return array
316      */
317     private function build_list($photos, $page = 1, &$ret) {
318         if (!empty($this->nsid)) {
319             $photos_url = $this->flickr->urls_getUserPhotos($this->nsid);
320             $ret['manage'] = $photos_url;
321         }
322         $ret['list']  = array();
323         $ret['pages'] = $photos['pages'];
324         if (is_int($page) && $page <= $ret['pages']) {
325             $ret['page'] = $page;
326         } else {
327             $ret['page'] = 1;
328         }
329         if (!empty($photos['photo'])) {
330             foreach ($photos['photo'] as $p) {
331                 if(empty($p['title'])) {
332                     $p['title'] = get_string('notitle', 'repository_flickr');
333                 }
334                 if (isset($p['originalformat'])) {
335                     $format = $p['originalformat'];
336                 } else {
337                     $format = 'jpg';
338                 }
339                 $format = '.'.$format;
340                 if (substr($p['title'], strlen($p['title'])-strlen($format)) != $format) {
341                     // append author id
342                     // $p['title'] .= '-'.$p['owner'];
343                     // append file extension
344                     $p['title'] .= $format;
345                 }
346                 $ret['list'][] = array('title'=>$p['title'], 'source'=>$p['id'],
347                     'id'=>$p['id'],'thumbnail'=>$this->flickr->buildPhotoURL($p, 'Square'),
348                     'date'=>'', 'size'=>'unknown', 'url'=>'http://www.flickr.com/photos/'.$p['owner'].'/'.$p['id']);
349             }
350         }
351         return $ret;
352     }
354     /**
355      * Print a search form
356      *
357      * @return string
358      */
359     public function print_search() {
360         $str = '';
361         $str .= '<input type="hidden" name="repo_id" value="'.$this->id.'" />';
362         $str .= '<input type="hidden" name="ctx_id" value="'.$this->context->id.'" />';
363         $str .= '<input type="hidden" name="seekey" value="'.sesskey().'" />';
364         $str .= '<label>'.get_string('fulltext', 'repository_flickr_public').': </label><br/><input name="s" value="" /><br/>';
365         $str .= '<label>'.get_string('tag', 'repository_flickr_public').'</label><br /><input type="text" name="tag" /><br />';
366         return $str;
367     }
369     public function get_link($photo_id) {
370         global $CFG;
371         $result = $this->flickr->photos_getSizes($photo_id);
372         $url = '';
373         if(!empty($result[4])) {
374             $url = $result[4]['source'];
375         } elseif(!empty($result[3])) {
376             $url = $result[3]['source'];
377         } elseif(!empty($result[2])) {
378             $url = $result[2]['source'];
379         }
380         return $url;
381     }
383     /**
384      *
385      * @global object $CFG
386      * @param string $photo_id
387      * @param string $file
388      * @return string
389      */
390     public function get_file($photo_id, $file = '') {
391         global $CFG;
392         $result = $this->flickr->photos_getSizes($photo_id);
393         $url = '';
394         if (!empty($result[4])) {
395             $url = $result[4]['source'];
396         } elseif(!empty($result[3])) {
397             $url = $result[3]['source'];
398         } elseif(!empty($result[2])) {
399             $url = $result[2]['source'];
400         }
401         $path = $this->prepare_file($file);
402         $fp = fopen($path, 'w');
403         $c = new curl;
404         $c->download(array(array('url'=>$url, 'file'=>$fp)));
406         $watermark = get_config('flickr_public', 'watermark');
407         if ($watermark === 'on') {
408             $img = new moodle_image($path);
409             $pathinfo = pathinfo($path);
410             $newpath = $pathinfo['dirname'] . '/wm_' . $pathinfo['basename'];
411             $img->watermark($url, array(10,10), array('ttf'=>true, 'fontsize'=>9))->saveas($newpath);
412             unlink($path);
413             $path = $newpath;
414         }
415         return $path;
416     }
418     /**
419      * Add Instance settings input to Moodle form
420      * @param object $mform
421      */
422     public function instance_config_form($mform) {
423         $mform->addElement('text', 'email_address', get_string('emailaddress', 'repository_flickr_public'));
424         //$mform->addRule('email_address', get_string('required'), 'required', null, 'client');
425     }
427     /**
428      * Names of the instance settings
429      * @return array
430      */
431     public static function get_instance_option_names() {
432         return array('email_address');
433     }
435     /**
436      * Add Plugin settings input to Moodle form
437      * @param object $mform
438      */
439     public function type_config_form($mform) {
440         $api_key = get_config('flickr_public', 'api_key');
441         if (empty($api_key)) {
442             $api_key = '';
443         }
444         $strrequired = get_string('required');
446         $mform->addElement('checkbox', 'watermark', get_string('watermark', 'repository_flickr_public'));
448         $mform->addElement('text', 'api_key', get_string('apikey', 'repository_flickr_public'), array('value'=>$api_key,'size' => '40'));
449         $mform->addRule('api_key', $strrequired, 'required', null, 'client');
452         $mform->addElement('static', null, '',  get_string('information','repository_flickr_public'));
453     }
455     /**
456      * Names of the plugin settings
457      * @return array 
458      */
459     public static function get_type_option_names() {
460         return array('api_key', 'watermark');
461     }
463     /**
464      * is run when moodle administrator add the plugin
465      */
466     public static function plugin_init() {
467         //here we create a default instance for this type
469         $id = repository::static_function('flickr_public','create', 'flickr_public', 0, get_system_context(), array('name' => get_string('repositoryname', 'repository_flickr_public'),'email_address' => null), 1);
470         if (empty($id)) {
471             return false;
472         } else {
473             return true;
474         }
475     }
476     public function supported_filetypes() {
477         return array('web_image');
478     }
479     public function supported_returntypes() {
480         return (FILE_INTERNAL | FILE_EXTERNAL);
481     }