From 82bf5b10b9e3e4078e18960c3ab762cf8a9ef8a8 Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Tue, 28 Aug 2012 17:01:41 +0800 Subject: [PATCH] MDL-34633 Repository: Flickr supports small images --- repository/flickr/lib.php | 42 +++++++++++++++----- repository/flickr_public/lib.php | 66 ++++++++++++++++++++------------ 2 files changed, 75 insertions(+), 33 deletions(-) diff --git a/repository/flickr/lib.php b/repository/flickr/lib.php index 478e53b0b0d..84bac4bb284 100644 --- a/repository/flickr/lib.php +++ b/repository/flickr/lib.php @@ -37,6 +37,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 @@ -228,16 +233,35 @@ class repository_flickr extends repository { * @return string */ private function build_photo_url($photoid) { - $result = $this->flickr->photos_getSizes($photoid); - $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($photoid); + if (!isset($bestsize['source'])) { + throw new repository_exception('cannotdownload', 'repository'); } - return $url; + 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 $bestsize; } public function get_link($photoid) { diff --git a/repository/flickr_public/lib.php b/repository/flickr_public/lib.php index 42d7e04ed2a..17cdb57a94b 100644 --- a/repository/flickr_public/lib.php +++ b/repository/flickr_public/lib.php @@ -41,6 +41,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 * @@ -403,16 +408,35 @@ class repository_flickr_public extends repository { * @return string */ private function build_photo_url($photoid) { - $result = $this->flickr->photos_getSizes($photoid); - $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($photoid); + if (!isset($bestsize['source'])) { + throw new repository_exception('cannotdownload', 'repository'); } - return $url; + 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 $bestsize; } public function get_link($photoid) { @@ -435,29 +459,23 @@ class repository_flickr_public extends repository { $author = $info['owner']['username']; } $copyright = get_string('author', 'repository') . ': ' . $author; - $result = $this->flickr->photos_getSizes($photoid); - // 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); } + $result = parent::get_file($source, $file); $path = $result['path']; + if (!empty($this->usewatermarks)) { $img = new moodle_image($path); $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'])); } /**