diff --git a/repository/flickr/lib.php b/repository/flickr/lib.php index cfc1739c247a6..82a966eb75954 100644 --- a/repository/flickr/lib.php +++ b/repository/flickr/lib.php @@ -36,6 +36,11 @@ class repository_flickr extends repository { private $flickr; public $photos; + /** + * Stores sizes of images to prevent multiple API call + */ + static private $sizes = array(); + /** * * @param int $repositoryid @@ -221,18 +226,41 @@ public function get_listing($path = '', $page = '') { return $this->search('', $page); } + /** + * Return photo url by given photo id + * @param string $photo_id + * @return string + */ public function get_link($photo_id) { - global $CFG; - $result = $this->flickr->photos_getSizes($photo_id); - $url = ''; - if(!empty($result[4])) { - $url = $result[4]['source']; - } elseif(!empty($result[3])) { - $url = $result[3]['source']; - } elseif(!empty($result[2])) { - $url = $result[2]['source']; + $bestsize = $this->get_best_size($photo_id); + if (!isset($bestsize['source'])) { + throw new repository_exception('cannotdownload', 'repository'); + } + return $bestsize['source']; + } + + /** + * Returns the best size for a photo + * + * @param string $photoid the photo identifier + * @return array of information provided by the API + */ + protected function get_best_size($photoid) { + if (!isset(self::$sizes[$photoid])) { + // Sizes are returned from smallest to greatest. + self::$sizes[$photoid] = $this->flickr->photos_getSizes($photoid); + } + $sizes = self::$sizes[$photoid]; + $bestsize = array(); + if (is_array($sizes)) { + while ($bestsize = array_pop($sizes)) { + // Make sure the source is set. Exit the loop if found. + if (isset($bestsize['source'])) { + break; + } + } } - return $url; + return $bestsize; } /** diff --git a/repository/flickr_public/lib.php b/repository/flickr_public/lib.php index 1cfb42f820ad9..964ac7dc3cd27 100644 --- a/repository/flickr_public/lib.php +++ b/repository/flickr_public/lib.php @@ -35,6 +35,11 @@ class repository_flickr_public extends repository { private $flickr; public $photos; + /** + * Stores sizes of images to prevent multiple API call + */ + static private $sizes = array(); + /** * constructor method * @@ -207,13 +212,14 @@ public function logout() { public function license4moodle ($license_id) { $license = array( + '0' => 'allrightsreserved', '1' => 'cc-nc-sa', '2' => 'cc-nc', '3' => 'cc-nc-nd', '4' => 'cc', '5' => 'cc-sa', '6' => 'cc-nd', - '7' => 'allrightsreserved' + '7' => 'other' ); return $license[$license_id]; } @@ -390,18 +396,41 @@ public function print_search() { return $str; } + /** + * Return photo url by given photo id + * @param string $photo_id + * @return string + */ public function get_link($photo_id) { - global $CFG; - $result = $this->flickr->photos_getSizes($photo_id); - $url = ''; - if(!empty($result[4])) { - $url = $result[4]['source']; - } elseif(!empty($result[3])) { - $url = $result[3]['source']; - } elseif(!empty($result[2])) { - $url = $result[2]['source']; + $bestsize = $this->get_best_size($photo_id); + if (!isset($bestsize['source'])) { + throw new repository_exception('cannotdownload', 'repository'); + } + return $bestsize['source']; + } + + /** + * Returns the best size for a photo + * + * @param string $photoid the photo identifier + * @return array of information provided by the API + */ + protected function get_best_size($photoid) { + if (!isset(self::$sizes[$photoid])) { + // Sizes are returned from smallest to greatest. + self::$sizes[$photoid] = $this->flickr->photos_getSizes($photoid); + } + $sizes = self::$sizes[$photoid]; + $bestsize = array(); + if (is_array($sizes)) { + while ($bestsize = array_pop($sizes)) { + // Make sure the source is set. Exit the loop if found. + if (isset($bestsize['source'])) { + break; + } + } } - return $url; + return $bestsize; } /** @@ -420,21 +449,14 @@ public function get_file($photo_id, $file = '') { $author = $info['owner']['username']; } $copyright = get_string('author', 'repository') . ': ' . $author; - $result = $this->flickr->photos_getSizes($photo_id); - // download link - $source = ''; - // flickr photo page - $url = ''; - if (!empty($result[4])) { - $source = $result[4]['source']; - $url = $result[4]['url']; - } elseif(!empty($result[3])) { - $source = $result[3]['source']; - $url = $result[3]['url']; - } elseif(!empty($result[2])) { - $source = $result[2]['source']; - $url = $result[2]['url']; + + // If we can read the original secret, it means that we have access to the original picture. + if (isset($info['originalsecret'])) { + $source = $this->flickr->buildPhotoURL($info, 'original'); + } else { + $source = $this->build_photo_url($photoid); } + $path = $this->prepare_file($file); $fp = fopen($path, 'w'); $c = new curl; @@ -446,7 +468,7 @@ public function get_file($photo_id, $file = '') { $img->watermark($copyright, array(10,10), array('ttf'=>true, 'fontsize'=>12))->saveas($path); } - return array('path'=>$path, 'url'=>$url, 'author'=>$info['owner']['realname'], 'license'=>$this->license4moodle($info['license'])); + return array('path'=>$path, 'author'=>$info['owner']['realname'], 'license'=>$this->license4moodle($info['license'])); } /**