diff --git a/include/api.php b/include/api.php index e0dc413c2a..12380f4b84 100644 --- a/include/api.php +++ b/include/api.php @@ -5,7 +5,6 @@ * * @todo Automatically detect if incoming data is HTML or BBCode */ - use Friendica\App; use Friendica\Core\System; use Friendica\Core\Config; @@ -23,6 +22,7 @@ use Friendica\Network\HTTPException\NotImplementedException; use Friendica\Network\HTTPException\UnauthorizedException; use Friendica\Network\HTTPException\TooManyRequestsException; use Friendica\Object\Contact; +use Friendica\Object\Photo; use Friendica\Protocol\Diaspora; use Friendica\Util\XML; @@ -32,7 +32,6 @@ require_once 'include/conversation.php'; require_once 'include/oauth.php'; require_once 'include/html2plain.php'; require_once 'mod/share.php'; -require_once 'include/Photo.php'; require_once 'mod/item.php'; require_once 'include/security.php'; require_once 'include/contact_selectors.php'; @@ -2377,7 +2376,7 @@ function api_get_attachments(&$body) $attachments = array(); foreach ($images[1] as $image) { - $imagedata = get_photo_info($image); + $imagedata = Photo::getInfoFromURL($image); if ($imagedata) { $attachments[] = array("url" => $image, "mimetype" => $imagedata["mime"], "size" => $imagedata["size"]); @@ -2509,7 +2508,7 @@ function api_get_entitities(&$text, $bbcode) $start = iconv_strpos($text, $url, $offset, "UTF-8"); if (!($start === false)) { - $image = get_photo_info($url); + $image = Photo::getInfoFromURL($url); if ($image) { // If image cache is activated, then use the following sizes: // thumb (150), small (340), medium (600) and large (1024) @@ -2517,19 +2516,19 @@ function api_get_entitities(&$text, $bbcode) $media_url = proxy_url($url); $sizes = array(); - $scale = scale_image($image[0], $image[1], 150); + $scale = Photo::scaleImageTo($image[0], $image[1], 150); $sizes["thumb"] = array("w" => $scale["width"], "h" => $scale["height"], "resize" => "fit"); if (($image[0] > 150) || ($image[1] > 150)) { - $scale = scale_image($image[0], $image[1], 340); + $scale = Photo::scaleImageTo($image[0], $image[1], 340); $sizes["small"] = array("w" => $scale["width"], "h" => $scale["height"], "resize" => "fit"); } - $scale = scale_image($image[0], $image[1], 600); + $scale = Photo::scaleImageTo($image[0], $image[1], 600); $sizes["medium"] = array("w" => $scale["width"], "h" => $scale["height"], "resize" => "fit"); if (($image[0] > 600) || ($image[1] > 600)) { - $scale = scale_image($image[0], $image[1], 1024); + $scale = Photo::scaleImageTo($image[0], $image[1], 1024); $sizes["large"] = array("w" => $scale["width"], "h" => $scale["height"], "resize" => "fit"); } } else { @@ -3946,7 +3945,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ } if ($filetype == "") { - $filetype=guess_image_type($filename); + $filetype=Photo::guessImageType($filename); } $imagedata = getimagesize($src); if ($imagedata) { @@ -3971,7 +3970,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ // create Photo instance with the data of the image $imagedata = @file_get_contents($src); $ph = new Photo($imagedata, $filetype); - if (! $ph->is_valid()) { + if (! $ph->isValid()) { throw new InternalServerErrorException("unable to process image data"); } diff --git a/include/follow.php b/include/follow.php index 7e8b25d797..ac07c4085e 100644 --- a/include/follow.php +++ b/include/follow.php @@ -8,13 +8,13 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBM; use Friendica\Network\Probe; +use Friendica\Object\Contact; use Friendica\Protocol\Diaspora; use Friendica\Protocol\OStatus; use Friendica\Protocol\PortableContact; require_once 'include/group.php'; require_once 'include/salmon.php'; -require_once 'include/Photo.php'; function update_contact($id) { /* @@ -250,7 +250,7 @@ function new_contact($uid, $url, $interactive = false, $network = '') { } // Update the avatar - update_contact_avatar($ret['photo'],$uid,$contact_id); + Contact::updateAvatar($ret['photo'], $uid, $contact_id); // pull feed and consume it, which should subscribe to the hub. diff --git a/include/items.php b/include/items.php index cffa127288..d446d2773d 100644 --- a/include/items.php +++ b/include/items.php @@ -1,9 +1,7 @@ is_valid()) { + if ($ph->isValid()) { $ph->scaleImage(max($width, $height)); $data = $ph->imageString(); $type = $ph->getType(); diff --git a/include/network.php b/include/network.php index c11cdb2c6c..52e3409573 100644 --- a/include/network.php +++ b/include/network.php @@ -1,13 +1,12 @@ is_valid()) { + if ($ph->isValid()) { $orig_width = $ph->getWidth(); $orig_height = $ph->getHeight(); diff --git a/include/plaintext.php b/include/plaintext.php index 8fa2917440..221d1471b1 100644 --- a/include/plaintext.php +++ b/include/plaintext.php @@ -1,17 +1,15 @@ = 500) && ($picturedata[0] >= $picturedata[1])) $post["image"] = $matches[1]; @@ -223,7 +221,7 @@ function get_attached_data($body, $item = array()) { $post["preview"] = $pictures[0][2]; $post["text"] = str_replace($pictures[0][0], "", $body); } else { - $imgdata = get_photo_info($pictures[0][1]); + $imgdata = Photo::getInfoFromURL($pictures[0][1]); if (substr($imgdata["mime"], 0, 6) == "image/") { $post["type"] = "photo"; $post["image"] = $pictures[0][1]; diff --git a/include/uimport.php b/include/uimport.php index 8554ba6f0b..4e30eabe39 100644 --- a/include/uimport.php +++ b/include/uimport.php @@ -1,12 +1,14 @@ is_valid()) { - + if ($img->isValid()) { $img->scaleImageSquare(175); $hash = photo_new_resource(); - $r = $img->store($newuid, 0, $hash, $filename, t('Profile Photos'), 4 ); + $r = $img->store($newuid, 0, $hash, $filename, t('Profile Photos'), 4); if ($r === false) { $photo_failure = true; diff --git a/mod/contacts.php b/mod/contacts.php index 35be8e79e3..69f1884960 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -1,5 +1,7 @@ argc > 1) +function dfrn_request_init(App $a) +{ + if ($a->argc > 1) $which = $a->argv[1]; - profile_load($a,$which); + profile_load($a, $which); return; } @@ -196,7 +195,7 @@ function dfrn_request_post(App $a) { group_add_member(local_user(), '', $r[0]['id'], $def_gid); if (isset($photo)) - update_contact_avatar($photo, local_user(), $r[0]["id"], true); + Contact::updateAvatar($photo, local_user(), $r[0]["id"], true); $forwardurl = System::baseUrl()."/contacts/".$r[0]['id']; } else { @@ -587,7 +586,7 @@ function dfrn_request_post(App $a) { ); if (DBM::is_result($r)) { $contact_record = $r[0]; - update_contact_avatar($photo, $uid, $contact_record["id"], true); + Contact::updateAvatar($photo, $uid, $contact_record["id"], true); } } diff --git a/mod/fbrowser.php b/mod/fbrowser.php index 9c0b7bb5af..516be52987 100644 --- a/mod/fbrowser.php +++ b/mod/fbrowser.php @@ -7,8 +7,7 @@ use Friendica\App; use Friendica\Core\System; - -require_once('include/Photo.php'); +use Friendica\Object\Photo; /** * @param App $a diff --git a/mod/install.php b/mod/install.php index 9c9d60eeff..803d7f1964 100755 --- a/mod/install.php +++ b/mod/install.php @@ -1,10 +1,11 @@ is_valid()) { + if ($ph->isValid()) { if (isset($customres) && $customres > 0 && $customres < 500) { $ph->scaleImageSquare($customres); } diff --git a/mod/photos.php b/mod/photos.php index 7b58bb645d..504f0ff146 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -1,5 +1,7 @@ is_valid()) { + if ($ph->isValid()) { $rotate_deg = ( (intval($_POST['rotate']) == 1) ? 270 : 90 ); $ph->rotate($rotate_deg); @@ -808,7 +810,7 @@ function photos_post(App $a) { $type = $_FILES['userfile']['type']; } if ($type == "") { - $type = guess_image_type($filename); + $type = Photo::guessImageType($filename); } logger('photos: upload: received file: ' . $filename . ' as ' . $src . ' ('. $type . ') ' . $filesize . ' bytes', LOGGER_DEBUG); @@ -837,7 +839,7 @@ function photos_post(App $a) { $ph = new Photo($imagedata, $type); - if (! $ph->is_valid()) { + if (! $ph->isValid()) { logger('mod/photos.php: photos_post(): unable to process image' , LOGGER_DEBUG); notice( t('Unable to process image.') . EOL ); @unlink($src); diff --git a/mod/profile_photo.php b/mod/profile_photo.php index e80b9ee84e..f667359b51 100644 --- a/mod/profile_photo.php +++ b/mod/profile_photo.php @@ -1,12 +1,13 @@ is_valid()) { + if ($im->isValid()) { $im->cropImage(175,$srcX,$srcY,$srcW,$srcH); $r = $im->store(local_user(), 0, $base_image['resource-id'],$base_image['filename'], t('Profile Photos'), 4, $is_default_profile); @@ -150,13 +151,13 @@ function profile_photo_post(App $a) { $filesize = intval($_FILES['userfile']['size']); $filetype = $_FILES['userfile']['type']; if ($filetype == "") { - $filetype = guess_image_type($filename); + $filetype = Photo::guessImageType($filename); } - $maximagesize = Config::get('system','maximagesize'); + $maximagesize = Config::get('system', 'maximagesize'); if (($maximagesize) && ($filesize > $maximagesize)) { - notice( sprintf(t('Image exceeds size limit of %s'), formatBytes($maximagesize)) . EOL); + notice(sprintf(t('Image exceeds size limit of %s'), formatBytes($maximagesize)) . EOL); @unlink($src); return; } @@ -164,8 +165,8 @@ function profile_photo_post(App $a) { $imagedata = @file_get_contents($src); $ph = new Photo($imagedata, $filetype); - if (! $ph->is_valid()) { - notice( t('Unable to process image.') . EOL ); + if (! $ph->isValid()) { + notice(t('Unable to process image.') . EOL); @unlink($src); return; } diff --git a/mod/proxy.php b/mod/proxy.php index 8b5f0834f2..790309c627 100644 --- a/mod/proxy.php +++ b/mod/proxy.php @@ -1,10 +1,14 @@ +/** + * @file mod/proxy.php + * @brief Based upon "Privacy Image Cache" by Tobias Hößl + */ use Friendica\App; use Friendica\Core\Config; use Friendica\Core\System; use Friendica\Database\DBM; +use Friendica\Object\Photo; define('PROXY_DEFAULT_TIME', 86400); // 1 Day @@ -15,7 +19,6 @@ define('PROXY_SIZE_MEDIUM', 'medium'); define('PROXY_SIZE_LARGE', 'large'); require_once 'include/security.php'; -require_once 'include/Photo.php'; function proxy_init(App $a) { // Pictures are stored in one of the following ways: @@ -128,7 +131,7 @@ function proxy_init(App $a) { // reduce quality - if it isn't a GIF if ($mime != 'image/gif') { $img = new Photo($img_str, $mime); - if ($img->is_valid()) { + if ($img->isValid()) { $img_str = $img->imageString(); } } @@ -172,7 +175,7 @@ function proxy_init(App $a) { $cachefile = ''; // Clear the cachefile so that the dummy isn't stored $valid = false; $img = new Photo($img_str, 'image/png'); - if ($img->is_valid()) { + if ($img->isValid()) { $img->scaleImage(10); $img_str = $img->imageString(); } @@ -190,7 +193,7 @@ function proxy_init(App $a) { dba::insert('photo', $fields); } else { $img = new Photo($img_str, $mime); - if ($img->is_valid() && !$direct_cache && ($cachefile == '')) { + if ($img->isValid() && !$direct_cache && ($cachefile == '')) { $img->store(0, 0, $urlhash, $_REQUEST['url'], '', 100); } } @@ -201,7 +204,7 @@ function proxy_init(App $a) { // reduce quality - if it isn't a GIF if ($mime != 'image/gif') { $img = new Photo($img_str, $mime); - if ($img->is_valid()) { + if ($img->isValid()) { $img->scaleImage($size); $img_str = $img->imageString(); } diff --git a/mod/wall_upload.php b/mod/wall_upload.php index d6cb0c2e1a..ce73f85151 100644 --- a/mod/wall_upload.php +++ b/mod/wall_upload.php @@ -13,8 +13,7 @@ use Friendica\App; use Friendica\Core\System; use Friendica\Core\Config; use Friendica\Database\DBM; - -require_once 'include/Photo.php'; +use Friendica\Object\Photo; function wall_upload_post(App $a, $desktopmode = true) { @@ -163,7 +162,7 @@ function wall_upload_post(App $a, $desktopmode = true) { } if ($filetype=="") { - $filetype=guess_image_type($filename); + $filetype=Photo::guessImageType($filename); } // If there is a temp name, then do a manual check @@ -193,7 +192,7 @@ function wall_upload_post(App $a, $desktopmode = true) { $imagedata = @file_get_contents($src); $ph = new Photo($imagedata, $filetype); - if (! $ph->is_valid()) { + if (! $ph->isValid()) { $msg = t('Unable to process image.'); if ($r_json) { echo json_encode(array('error'=>$msg)); diff --git a/src/Model/GlobalContact.php b/src/Model/GlobalContact.php index be8b28260d..6ec1101775 100644 --- a/src/Model/GlobalContact.php +++ b/src/Model/GlobalContact.php @@ -10,6 +10,7 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBM; use Friendica\Network\Probe; +use Friendica\Object\Contact; use Friendica\Object\Profile; use Friendica\Protocol\PortableContact; use dba; @@ -18,7 +19,6 @@ use Exception; require_once 'include/datetime.php'; require_once 'include/network.php'; require_once 'include/html2bbcode.php'; -require_once 'include/Photo.php'; /** * @brief This class handles GlobalContact related functions @@ -881,7 +881,7 @@ class GlobalContact if (DBM::is_result($r)) { logger("Update public contact ".$r[0]["id"], LOGGER_DEBUG); - update_contact_avatar($contact["photo"], 0, $r[0]["id"]); + Contact::updateAvatar($contact["photo"], 0, $r[0]["id"]); $fields = array('name', 'nick', 'addr', 'network', 'bd', 'gender', diff --git a/src/Object/Contact.php b/src/Object/Contact.php index 919113672e..72f287a3ef 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -13,6 +13,7 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBM; use Friendica\Network\Probe; +use Friendica\Object\Photo; use Friendica\Protocol\Diaspora; use Friendica\Protocol\DFRN; use Friendica\Protocol\OStatus; @@ -645,9 +646,7 @@ class Contact extends BaseObject } } - require_once 'include/Photo.php'; - - update_contact_avatar($data["photo"], $uid, $contact_id); + self::updateAvatar($data["photo"], $uid, $contact_id); $contact = dba::select('contact', array('url', 'nurl', 'addr', 'alias', 'name', 'nick', 'keywords', 'location', 'about', 'avatar-date'), array('id' => $contact_id), array('limit' => 1)); @@ -821,4 +820,49 @@ class Contact extends BaseObject return $account_type; } + + /** + * @brief Updates the avatar links in a contact only if needed + * + * @param string $avatar Link to avatar picture + * @param int $uid User id of contact owner + * @param int $cid Contact id + * @param bool $force force picture update + * + * @return array Returns array of the different avatar sizes + */ + public static function updateAvatar($avatar, $uid, $cid, $force = false) + { + // Limit = 1 returns the row so no need for dba:inArray() + $r = dba::select('contact', array('avatar', 'photo', 'thumb', 'micro', 'nurl'), array('id' => $cid), array('limit' => 1)); + if (!DBM::is_result($r)) { + return false; + } else { + $data = array($r["photo"], $r["thumb"], $r["micro"]); + } + + if (($r["avatar"] != $avatar) || $force) { + $photos = Photo::importProfilePhoto($avatar, $uid, $cid, true); + + if ($photos) { + dba::update( + 'contact', + array('avatar' => $avatar, 'photo' => $photos[0], 'thumb' => $photos[1], 'micro' => $photos[2], 'avatar-date' => datetime_convert()), + array('id' => $cid) + ); + + // Update the public contact (contact id = 0) + if ($uid != 0) { + $pcontact = dba::select('contact', array('id'), array('nurl' => $r[0]['nurl']), array('limit' => 1)); + if (DBM::is_result($pcontact)) { + self::updateAvatar($avatar, 0, $pcontact['id'], $force); + } + } + + return $photos; + } + } + + return $data; + } } diff --git a/include/Photo.php b/src/Object/Photo.php similarity index 50% rename from include/Photo.php rename to src/Object/Photo.php index 761abc770c..372f7312a1 100644 --- a/include/Photo.php +++ b/src/Object/Photo.php @@ -1,19 +1,26 @@ imagick = class_exists('Imagick'); $this->types = static::supportedTypes(); - if (!array_key_exists($type, $this->types)){ + if (!array_key_exists($type, $this->types)) { $type='image/jpeg'; } $this->type = $type; - if ($this->is_imagick() && $this->load_data($data)) { + if ($this->isImagick() && $this->loadData($data)) { return true; } else { // Failed to load with Imagick, fallback $this->imagick = false; } - return $this->load_data($data); + return $this->loadData($data); } - public function __destruct() { + /** + * @brief Destructor + * @return void + */ + public function __destruct() + { if ($this->image) { - if ($this->is_imagick()) { + if ($this->isImagick()) { $this->image->clear(); $this->image->destroy(); return; @@ -80,7 +100,11 @@ class Photo { } } - public function is_imagick() { + /** + * @return boolean + */ + public function isImagick() + { return $this->imagick; } @@ -88,7 +112,8 @@ class Photo { * @brief Maps Mime types to Imagick formats * @return arr With with image formats (mime type as key) */ - public function get_FormatsMap() { + public static function getFormatsMap() + { $m = array( 'image/jpeg' => 'JPG', 'image/png' => 'PNG', @@ -97,8 +122,13 @@ class Photo { return $m; } - private function load_data($data) { - if ($this->is_imagick()) { + /** + * @param object $data data + * @return boolean + */ + private function loadData($data) + { + if ($this->isImagick()) { $this->image = new Imagick(); try { $this->image->readImageBlob($data); @@ -110,7 +140,7 @@ class Photo { /* * Setup the image to the format it will be saved to */ - $map = $this->get_FormatsMap(); + $map = self::getFormatsMap(); $format = $map[$type]; $this->image->setFormat($format); @@ -120,7 +150,7 @@ class Photo { /* * setup the compression here, so we'll do it only once */ - switch($this->getType()){ + switch ($this->getType()) { case "image/png": $quality = Config::get('system', 'png_quality'); if ((! $quality) || ($quality > 9)) { @@ -168,41 +198,57 @@ class Photo { return false; } - public function is_valid() { - if ($this->is_imagick()) { + /** + * @return boolean + */ + public function isValid() + { + if ($this->isImagick()) { return ($this->image !== false); } return $this->valid; } - public function getWidth() { - if (!$this->is_valid()) { + /** + * @return mixed + */ + public function getWidth() + { + if (!$this->isValid()) { return false; } - if ($this->is_imagick()) { + if ($this->isImagick()) { return $this->image->getImageWidth(); } return $this->width; } - public function getHeight() { - if (!$this->is_valid()) { + /** + * @return mixed + */ + public function getHeight() + { + if (!$this->isValid()) { return false; } - if ($this->is_imagick()) { + if ($this->isImagick()) { return $this->image->getImageHeight(); } return $this->height; } - public function getImage() { - if (!$this->is_valid()) { + /** + * @return mixed + */ + public function getImage() + { + if (!$this->isValid()) { return false; } - if ($this->is_imagick()) { + if ($this->isImagick()) { /* Clean it */ $this->image = $this->image->deconstructImages(); return $this->image; @@ -210,24 +256,37 @@ class Photo { return $this->image; } - public function getType() { - if (!$this->is_valid()) { + /** + * @return mixed + */ + public function getType() + { + if (!$this->isValid()) { return false; } return $this->type; } - public function getExt() { - if (!$this->is_valid()) { + /** + * @return mixed + */ + public function getExt() + { + if (!$this->isValid()) { return false; } return $this->types[$this->getType()]; } - public function scaleImage($max) { - if (!$this->is_valid()) { + /** + * @param integer $max max dimension + * @return mixed + */ + public function scaleImage($max) + { + if (!$this->isValid()) { return false; } @@ -241,7 +300,6 @@ class Photo { } if ($width > $max && $height > $max) { - // very tall image (greater than 16:9) // constrain the width - let the height float. @@ -262,7 +320,6 @@ class Photo { $dest_height = intval(($height * $max) / $width); } else { if ($height > $max) { - // very tall image (greater than 16:9) // but width is OK - don't do anything @@ -281,7 +338,7 @@ class Photo { } - if ($this->is_imagick()) { + if ($this->isImagick()) { /* * If it is not animated, there will be only one iteration here, * so don't bother checking @@ -289,7 +346,6 @@ class Photo { // Don't forget to go back to the first frame $this->image->setFirstIterator(); do { - // FIXME - implement horizantal bias for scaling as in followin GD functions // to allow very tall images to be constrained only horizontally. @@ -319,12 +375,17 @@ class Photo { $this->height = imagesy($this->image); } - public function rotate($degrees) { - if (!$this->is_valid()) { + /** + * @param integer $degrees degrees to rotate image + * @return mixed + */ + public function rotate($degrees) + { + if (!$this->isValid()) { return false; } - if ($this->is_imagick()) { + if ($this->isImagick()) { $this->image->setFirstIterator(); do { $this->image->rotateImage(new ImagickPixel(), -$degrees); // ImageMagick rotates in the opposite direction of imagerotate() @@ -333,17 +394,23 @@ class Photo { } // if script dies at this point check memory_limit setting in php.ini - $this->image = imagerotate($this->image,$degrees,0); + $this->image = imagerotate($this->image, $degrees, 0); $this->width = imagesx($this->image); $this->height = imagesy($this->image); } - public function flip($horiz = true, $vert = false) { - if (!$this->is_valid()) { + /** + * @param boolean $horiz optional, default true + * @param boolean $vert optional, default false + * @return mixed + */ + public function flip($horiz = true, $vert = false) + { + if (!$this->isValid()) { return false; } - if ($this->is_imagick()) { + if ($this->isImagick()) { $this->image->setFirstIterator(); do { if ($horiz) { @@ -372,28 +439,33 @@ class Photo { $this->image = $flipped; } - public function orient($filename) { - if ($this->is_imagick()) { + /** + * @param string $filename filename + * @return mixed + */ + public function orient($filename) + { + if ($this->isImagick()) { // based off comment on http://php.net/manual/en/imagick.getimageorientation.php $orientation = $this->image->getImageOrientation(); switch ($orientation) { - case imagick::ORIENTATION_BOTTOMRIGHT: - $this->image->rotateimage("#000", 180); - break; - case imagick::ORIENTATION_RIGHTTOP: - $this->image->rotateimage("#000", 90); - break; - case imagick::ORIENTATION_LEFTBOTTOM: - $this->image->rotateimage("#000", -90); - break; + case Imagick::ORIENTATION_BOTTOMRIGHT: + $this->image->rotateimage("#000", 180); + break; + case Imagick::ORIENTATION_RIGHTTOP: + $this->image->rotateimage("#000", 90); + break; + case Imagick::ORIENTATION_LEFTBOTTOM: + $this->image->rotateimage("#000", -90); + break; } - $this->image->setImageOrientation(imagick::ORIENTATION_TOPLEFT); + $this->image->setImageOrientation(Imagick::ORIENTATION_TOPLEFT); return true; } // based off comment on http://php.net/manual/en/function.imagerotate.php - if (!$this->is_valid()) { + if (!$this->isValid()) { return false; } @@ -401,15 +473,14 @@ class Photo { return; } - $exif = @exif_read_data($filename,null,true); + $exif = @exif_read_data($filename, null, true); if (!$exif) { return; } $ort = $exif['IFD0']['Orientation']; - switch($ort) - { + switch ($ort) { case 1: // nothing break; @@ -446,17 +517,18 @@ class Photo { // logger('exif: ' . print_r($exif,true)); return $exif; - } - - - public function scaleImageUp($min) { - if (!$this->is_valid()) { + /** + * @param integer $min minimum dimension + * @return mixed + */ + public function scaleImageUp($min) + { + if (!$this->isValid()) { return false; } - $width = $this->getWidth(); $height = $this->getHeight(); @@ -489,7 +561,7 @@ class Photo { } } - if ($this->is_imagick()) { + if ($this->isImagick()) { return $this->scaleImage($dest_width, $dest_height); } @@ -508,14 +580,17 @@ class Photo { $this->height = imagesy($this->image); } - - - public function scaleImageSquare($dim) { - if (!$this->is_valid()) { + /** + * @param integer $dim dimension + * @return mixed + */ + public function scaleImageSquare($dim) + { + if (!$this->isValid()) { return false; } - if ($this->is_imagick()) { + if ($this->isImagick()) { $this->image->setFirstIterator(); do { $this->image->scaleImage($dim, $dim); @@ -538,13 +613,21 @@ class Photo { $this->height = imagesy($this->image); } - - public function cropImage($max, $x, $y, $w, $h) { - if (!$this->is_valid()) { + /** + * @param integer $max maximum + * @param integer $x x coordinate + * @param integer $y y coordinate + * @param integer $w width + * @param integer $h height + * @return mixed + */ + public function cropImage($max, $x, $y, $w, $h) + { + if (!$this->isValid()) { return false; } - if ($this->is_imagick()) { + if ($this->isImagick()) { $this->image->setFirstIterator(); do { $this->image->cropImage($w, $h, $x, $y); @@ -573,8 +656,13 @@ class Photo { $this->height = imagesy($this->image); } - public function saveImage($path) { - if (!$this->is_valid()) { + /** + * @param string $path file path + * @return mixed + */ + public function saveImage($path) + { + if (!$this->isValid()) { return false; } @@ -587,12 +675,16 @@ class Photo { $a->save_timestamp($stamp1, "file"); } - public function imageString() { - if (!$this->is_valid()) { + /** + * @return mixed + */ + public function imageString() + { + if (!$this->isValid()) { return false; } - if ($this->is_imagick()) { + if ($this->isImagick()) { /* Clean it */ $this->image = $this->image->deconstructImages(); $string = $this->image->getImagesBlob(); @@ -606,7 +698,7 @@ class Photo { // Enable interlacing imageinterlace($this->image, true); - switch($this->getType()){ + switch ($this->getType()) { case "image/png": $quality = Config::get('system', 'png_quality'); if ((!$quality) || ($quality > 9)) { @@ -627,10 +719,23 @@ class Photo { return $string; } - - - public function store($uid, $cid, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '', $desc = '') { - + /** + * @param integer $uid uid + * @param integer $cid cid + * @param integer $rid rid + * @param string $filename filename + * @param string $album album name + * @param integer $scale scale + * @param integer $profile optional, default = 0 + * @param string $allow_cid optional, default = '' + * @param string $allow_gid optional, default = '' + * @param string $deny_cid optional, default = '' + * @param string $deny_gid optional, default = '' + * @param string $desc optional, default = '' + * @return object + */ + public function store($uid, $cid, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '', $desc = '') + { $r = dba::select('photo', array('guid'), array("`resource-id` = ? AND `guid` != ?", $rid, ''), array('limit' => 1)); if (DBM::is_result($r)) { $guid = $r['guid']; @@ -653,417 +758,408 @@ class Photo { return $r; } -} - - -/** - * Guess image mimetype from filename or from Content-Type header - * - * @arg $filename string Image filename - * @arg $fromcurl boolean Check Content-Type header from curl request - */ -function guess_image_type($filename, $fromcurl=false) { - logger('Photo: guess_image_type: '.$filename . ($fromcurl?' from curl headers':''), LOGGER_DEBUG); - $type = null; - if ($fromcurl) { - $a = get_app(); - $headers=array(); - $h = explode("\n",$a->get_curl_headers()); - foreach ($h as $l) { - list($k,$v) = array_map("trim", explode(":", trim($l), 2)); - $headers[$k] = $v; - } - if (array_key_exists('Content-Type', $headers)) - $type = $headers['Content-Type']; - } - if (is_null($type)){ - // Guessing from extension? Isn't that... dangerous? - if (class_exists('Imagick') && file_exists($filename) && is_readable($filename)) { - /** - * Well, this not much better, - * but at least it comes from the data inside the image, - * we won't be tricked by a manipulated extension - */ - $image = new Imagick($filename); - $type = $image->getImageMimeType(); - $image->setInterlaceScheme(Imagick::INTERLACE_PLANE); - } else { - $ext = pathinfo($filename, PATHINFO_EXTENSION); - $types = Photo::supportedTypes(); - $type = "image/jpeg"; - foreach ($types as $m => $e){ - if ($ext == $e) { - $type = $m; - } - } - } - } - logger('Photo: guess_image_type: type='.$type, LOGGER_DEBUG); - return $type; - -} - -/** - * @brief Updates the avatar links in a contact only if needed - * - * @param string $avatar Link to avatar picture - * @param int $uid User id of contact owner - * @param int $cid Contact id - * @param bool $force force picture update - * - * @return array Returns array of the different avatar sizes - */ -function update_contact_avatar($avatar, $uid, $cid, $force = false) { - $r = q("SELECT `avatar`, `photo`, `thumb`, `micro`, `nurl` FROM `contact` WHERE `id` = %d LIMIT 1", intval($cid)); - if (!DBM::is_result($r)) { - return false; - } else { - $data = array($r[0]["photo"], $r[0]["thumb"], $r[0]["micro"]); - } - - if (($r[0]["avatar"] != $avatar) || $force) { - $photos = import_profile_photo($avatar, $uid, $cid, true); - - if ($photos) { - q("UPDATE `contact` SET `avatar` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' WHERE `id` = %d", - dbesc($avatar), dbesc($photos[0]), dbesc($photos[1]), dbesc($photos[2]), - dbesc(datetime_convert()), intval($cid)); - - // Update the public contact (contact id = 0) - if ($uid != 0) { - $pcontact = dba::select('contact', array('id'), array('nurl' => $r[0]['nurl']), array('limit' => 1)); - if (DBM::is_result($pcontact)) { - update_contact_avatar($avatar, 0, $pcontact['id'], $force); - } - } - - return $photos; - } - } - - return $data; -} - -function import_profile_photo($photo, $uid, $cid, $quit_on_error = false) { - - $r = q("SELECT `resource-id` FROM `photo` WHERE `uid` = %d AND `contact-id` = %d AND `scale` = 4 AND `album` = 'Contact Photos' LIMIT 1", - intval($uid), - intval($cid) - ); - if (DBM::is_result($r) && strlen($r[0]['resource-id'])) { - $hash = $r[0]['resource-id']; - } else { - $hash = photo_new_resource(); - } - - $photo_failure = false; - - $filename = basename($photo); - $img_str = fetch_url($photo, true); - - if ($quit_on_error && ($img_str == "")) { - return false; - } - - $type = guess_image_type($photo, true); - $img = new Photo($img_str, $type); - if ($img->is_valid()) { - - $img->scaleImageSquare(175); - - $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 4); - - if ($r === false) - $photo_failure = true; - - $img->scaleImage(80); - - $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 5); - - if ($r === false) - $photo_failure = true; - - $img->scaleImage(48); - - $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 6); - - if ($r === false) { - $photo_failure = true; - } - - $suffix = '?ts='.time(); - - $photo = System::baseUrl() . '/photo/' . $hash . '-4.' . $img->getExt() . $suffix; - $thumb = System::baseUrl() . '/photo/' . $hash . '-5.' . $img->getExt() . $suffix; - $micro = System::baseUrl() . '/photo/' . $hash . '-6.' . $img->getExt() . $suffix; - - // Remove the cached photo - $a = get_app(); - $basepath = $a->get_basepath(); - - if (is_dir($basepath."/photo")) { - $filename = $basepath.'/photo/'.$hash.'-4.'.$img->getExt(); - if (file_exists($filename)) { - unlink($filename); - } - $filename = $basepath.'/photo/'.$hash.'-5.'.$img->getExt(); - if (file_exists($filename)) { - unlink($filename); - } - $filename = $basepath.'/photo/'.$hash.'-6.'.$img->getExt(); - if (file_exists($filename)) { - unlink($filename); - } - } - } else { - $photo_failure = true; - } - - if ($photo_failure && $quit_on_error) { - return false; - } - - if ($photo_failure) { - $photo = System::baseUrl() . '/images/person-175.jpg'; - $thumb = System::baseUrl() . '/images/person-80.jpg'; - $micro = System::baseUrl() . '/images/person-48.jpg'; - } - - return(array($photo,$thumb,$micro)); - -} - -function get_photo_info($url) { - $data = array(); - - $data = Cache::get($url); - - if (is_null($data) || !$data || !is_array($data)) { - $img_str = fetch_url($url, true, $redirects, 4); - $filesize = strlen($img_str); - - if (function_exists("getimagesizefromstring")) { - $data = getimagesizefromstring($img_str); - } else { - $tempfile = tempnam(get_temppath(), "cache"); + /** + * Guess image mimetype from filename or from Content-Type header + * + * @param string $filename Image filename + * @param boolean $fromcurl Check Content-Type header from curl request + * + * @return object + */ + public static function guessImageType($filename, $fromcurl = false) + { + logger('Photo: guessImageType: '.$filename . ($fromcurl?' from curl headers':''), LOGGER_DEBUG); + $type = null; + if ($fromcurl) { $a = get_app(); - $stamp1 = microtime(true); - file_put_contents($tempfile, $img_str); - $a->save_timestamp($stamp1, "file"); - - $data = getimagesize($tempfile); - unlink($tempfile); + $headers=array(); + $h = explode("\n", $a->get_curl_headers()); + foreach ($h as $l) { + list($k,$v) = array_map("trim", explode(":", trim($l), 2)); + $headers[$k] = $v; + } + if (array_key_exists('Content-Type', $headers)) + $type = $headers['Content-Type']; } - - if ($data) { - $data["size"] = $filesize; + if (is_null($type)) { + // Guessing from extension? Isn't that... dangerous? + if (class_exists('Imagick') && file_exists($filename) && is_readable($filename)) { + /** + * Well, this not much better, + * but at least it comes from the data inside the image, + * we won't be tricked by a manipulated extension + */ + $image = new Imagick($filename); + $type = $image->getImageMimeType(); + $image->setInterlaceScheme(Imagick::INTERLACE_PLANE); + } else { + $ext = pathinfo($filename, PATHINFO_EXTENSION); + $types = self::supportedTypes(); + $type = "image/jpeg"; + foreach ($types as $m => $e) { + if ($ext == $e) { + $type = $m; + } + } + } } - - Cache::set($url, $data); + logger('Photo: guessImageType: type='.$type, LOGGER_DEBUG); + return $type; } - return $data; -} + /** + * @param string $photo photo + * @param integer $uid user id + * @param integer $cid contact id + * @param boolean $quit_on_error optional, default false + * @return array + */ + public static function importProfilePhoto($photo, $uid, $cid, $quit_on_error = false) + { + $r = dba::select( + 'photo', + array('resource-id'), + array('uid' => $uid, 'contact-id' => $cid, 'scale' => 4, 'album' => 'Contact Photos'), + array('limit' => 1) + ); -function scale_image($width, $height, $max) { - - $dest_width = $dest_height = 0; - - if ((!$width) || (!$height)) { - return false; + if (DBM::is_result($r) && strlen($r['resource-id'])) { + $hash = $r['resource-id']; + } else { + $hash = photo_new_resource(); + } + + $photo_failure = false; + + $filename = basename($photo); + $img_str = fetch_url($photo, true); + + if ($quit_on_error && ($img_str == "")) { + return false; + } + + $type = self::guessImageType($photo, true); + $img = new Photo($img_str, $type); + if ($img->isValid()) { + $img->scaleImageSquare(175); + + $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 4); + + if ($r === false) { + $photo_failure = true; + } + + $img->scaleImage(80); + + $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 5); + + if ($r === false) { + $photo_failure = true; + } + + $img->scaleImage(48); + + $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 6); + + if ($r === false) { + $photo_failure = true; + } + + $suffix = '?ts='.time(); + + $photo = System::baseUrl() . '/photo/' . $hash . '-4.' . $img->getExt() . $suffix; + $thumb = System::baseUrl() . '/photo/' . $hash . '-5.' . $img->getExt() . $suffix; + $micro = System::baseUrl() . '/photo/' . $hash . '-6.' . $img->getExt() . $suffix; + + // Remove the cached photo + $a = get_app(); + $basepath = $a->get_basepath(); + + if (is_dir($basepath."/photo")) { + $filename = $basepath.'/photo/'.$hash.'-4.'.$img->getExt(); + if (file_exists($filename)) { + unlink($filename); + } + $filename = $basepath.'/photo/'.$hash.'-5.'.$img->getExt(); + if (file_exists($filename)) { + unlink($filename); + } + $filename = $basepath.'/photo/'.$hash.'-6.'.$img->getExt(); + if (file_exists($filename)) { + unlink($filename); + } + } + } else { + $photo_failure = true; + } + + if ($photo_failure && $quit_on_error) { + return false; + } + + if ($photo_failure) { + $photo = System::baseUrl() . '/images/person-175.jpg'; + $thumb = System::baseUrl() . '/images/person-80.jpg'; + $micro = System::baseUrl() . '/images/person-48.jpg'; + } + + return array($photo, $thumb, $micro); } - if ($width > $max && $height > $max) { - - // very tall image (greater than 16:9) - // constrain the width - let the height float. - - if ((($height * 9) / 16) > $width) { - $dest_width = $max; - $dest_height = intval(($height * $max) / $width); - } elseif ($width > $height) { - // else constrain both dimensions - $dest_width = $max; - $dest_height = intval(($height * $max) / $width); - } else { - $dest_width = intval(($width * $max) / $height); - $dest_height = $max; + /** + * @param string $url url + * @return object + */ + public static function getInfoFromURL($url) + { + $data = array(); + + $data = Cache::get($url); + + if (is_null($data) || !$data || !is_array($data)) { + $img_str = fetch_url($url, true, $redirects, 4); + $filesize = strlen($img_str); + + if (function_exists("getimagesizefromstring")) { + $data = getimagesizefromstring($img_str); + } else { + $tempfile = tempnam(get_temppath(), "cache"); + + $a = get_app(); + $stamp1 = microtime(true); + file_put_contents($tempfile, $img_str); + $a->save_timestamp($stamp1, "file"); + + $data = getimagesize($tempfile); + unlink($tempfile); + } + + if ($data) { + $data["size"] = $filesize; + } + + Cache::set($url, $data); } - } else { - if ($width > $max) { - $dest_width = $max; - $dest_height = intval(($height * $max) / $width); + + return $data; + } + + /** + * @param integer $width width + * @param integer $height height + * @param integer $max max + * @return array + */ + public static function scaleImageTo($width, $height, $max) + { + $dest_width = $dest_height = 0; + + if ((!$width) || (!$height)) { + return false; + } + + if ($width > $max && $height > $max) { + // very tall image (greater than 16:9) + // constrain the width - let the height float. + + if ((($height * 9) / 16) > $width) { + $dest_width = $max; + $dest_height = intval(($height * $max) / $width); + } elseif ($width > $height) { + // else constrain both dimensions + $dest_width = $max; + $dest_height = intval(($height * $max) / $width); + } else { + $dest_width = intval(($width * $max) / $height); + $dest_height = $max; + } } else { - if ($height > $max) { - - // very tall image (greater than 16:9) - // but width is OK - don't do anything - - if ((($height * 9) / 16) > $width) { + if ($width > $max) { + $dest_width = $max; + $dest_height = intval(($height * $max) / $width); + } else { + if ($height > $max) { + // very tall image (greater than 16:9) + // but width is OK - don't do anything + + if ((($height * 9) / 16) > $width) { + $dest_width = $width; + $dest_height = $height; + } else { + $dest_width = intval(($width * $max) / $height); + $dest_height = $max; + } + } else { $dest_width = $width; $dest_height = $height; - } else { - $dest_width = intval(($width * $max) / $height); - $dest_height = $max; } - } else { - $dest_width = $width; - $dest_height = $height; } } - } - return array("width" => $dest_width, "height" => $dest_height); -} - -function store_photo(App $a, $uid, $imagedata = "", $url = "") { - $r = q("SELECT `user`.`nickname`, `user`.`page-flags`, `contact`.`id` FROM `user` INNER JOIN `contact` on `user`.`uid` = `contact`.`uid` - WHERE `user`.`uid` = %d AND `user`.`blocked` = 0 AND `contact`.`self` = 1 LIMIT 1", - intval($uid)); - - if (!DBM::is_result($r)) { - logger("Can't detect user data for uid ".$uid, LOGGER_DEBUG); - return(array()); + return array("width" => $dest_width, "height" => $dest_height); } - $page_owner_nick = $r[0]['nickname']; - - /// @TODO - /// $default_cid = $r[0]['id']; - /// $community_page = (($r[0]['page-flags'] == PAGE_COMMUNITY) ? true : false); - - if ((strlen($imagedata) == 0) && ($url == "")) { - logger("No image data and no url provided", LOGGER_DEBUG); - return(array()); - } elseif (strlen($imagedata) == 0) { - logger("Uploading picture from ".$url, LOGGER_DEBUG); - + /** + * @brief This function is used by the fromgplus addon + * @param object $a App + * @param integer $uid user id + * @param string $imagedata optional, default empty + * @param string $url optional, default empty + * @return array + */ + public static function storePhoto(App $a, $uid, $imagedata = "", $url = "") + { + $r = q( + "SELECT `user`.`nickname`, `user`.`page-flags`, `contact`.`id` FROM `user` INNER JOIN `contact` on `user`.`uid` = `contact`.`uid` + WHERE `user`.`uid` = %d AND `user`.`blocked` = 0 AND `contact`.`self` = 1 LIMIT 1", + intval($uid) + ); + + if (!DBM::is_result($r)) { + logger("Can't detect user data for uid ".$uid, LOGGER_DEBUG); + return(array()); + } + + $page_owner_nick = $r[0]['nickname']; + + /// @TODO + /// $default_cid = $r[0]['id']; + /// $community_page = (($r[0]['page-flags'] == PAGE_COMMUNITY) ? true : false); + + if ((strlen($imagedata) == 0) && ($url == "")) { + logger("No image data and no url provided", LOGGER_DEBUG); + return(array()); + } elseif (strlen($imagedata) == 0) { + logger("Uploading picture from ".$url, LOGGER_DEBUG); + + $stamp1 = microtime(true); + $imagedata = @file_get_contents($url); + $a->save_timestamp($stamp1, "file"); + } + + $maximagesize = Config::get('system', 'maximagesize'); + + if (($maximagesize) && (strlen($imagedata) > $maximagesize)) { + logger("Image exceeds size limit of ".$maximagesize, LOGGER_DEBUG); + return(array()); + } + + $tempfile = tempnam(get_temppath(), "cache"); + $stamp1 = microtime(true); - $imagedata = @file_get_contents($url); + file_put_contents($tempfile, $imagedata); $a->save_timestamp($stamp1, "file"); - } - - $maximagesize = Config::get('system', 'maximagesize'); - - if (($maximagesize) && (strlen($imagedata) > $maximagesize)) { - logger("Image exceeds size limit of ".$maximagesize, LOGGER_DEBUG); - return(array()); - } - - $tempfile = tempnam(get_temppath(), "cache"); - - $stamp1 = microtime(true); - file_put_contents($tempfile, $imagedata); - $a->save_timestamp($stamp1, "file"); - - $data = getimagesize($tempfile); - - if (!isset($data["mime"])) { + + $data = getimagesize($tempfile); + + if (!isset($data["mime"])) { + unlink($tempfile); + logger("File is no picture", LOGGER_DEBUG); + return(array()); + } + + $ph = new Photo($imagedata, $data["mime"]); + + if (!$ph->isValid()) { + unlink($tempfile); + logger("Picture is no valid picture", LOGGER_DEBUG); + return(array()); + } + + $ph->orient($tempfile); unlink($tempfile); - logger("File is no picture", LOGGER_DEBUG); - return(array()); - } + + $max_length = Config::get('system', 'max_image_length'); + if (! $max_length) { + $max_length = MAX_IMAGE_LENGTH; + } - $ph = new Photo($imagedata, $data["mime"]); - - if (!$ph->is_valid()) { - unlink($tempfile); - logger("Picture is no valid picture", LOGGER_DEBUG); - return(array()); - } - - $ph->orient($tempfile); - unlink($tempfile); - - $max_length = Config::get('system', 'max_image_length'); - if (! $max_length) { - $max_length = MAX_IMAGE_LENGTH; - } - if ($max_length > 0) { - $ph->scaleImage($max_length); - } - - $width = $ph->getWidth(); - $height = $ph->getHeight(); - - $hash = photo_new_resource(); - - $smallest = 0; - - // Pictures are always public by now - //$defperm = '<'.$default_cid.'>'; - $defperm = ""; - $visitor = 0; - - $r = $ph->store($uid, $visitor, $hash, $tempfile, t('Wall Photos'), 0, 0, $defperm); - - if (!$r) { - logger("Picture couldn't be stored", LOGGER_DEBUG); - return(array()); - } - - $image = array("page" => System::baseUrl().'/photos/'.$page_owner_nick.'/image/'.$hash, + if ($max_length > 0) { + $ph->scaleImage($max_length); + } + + $width = $ph->getWidth(); + $height = $ph->getHeight(); + + $hash = photo_new_resource(); + + $smallest = 0; + + // Pictures are always public by now + //$defperm = '<'.$default_cid.'>'; + $defperm = ""; + $visitor = 0; + + $r = $ph->store($uid, $visitor, $hash, $tempfile, t('Wall Photos'), 0, 0, $defperm); + + if (!$r) { + logger("Picture couldn't be stored", LOGGER_DEBUG); + return(array()); + } + + $image = array("page" => System::baseUrl().'/photos/'.$page_owner_nick.'/image/'.$hash, "full" => System::baseUrl()."/photo/{$hash}-0.".$ph->getExt()); - - if ($width > 800 || $height > 800) { - $image["large"] = System::baseUrl()."/photo/{$hash}-0.".$ph->getExt(); - } - - if ($width > 640 || $height > 640) { - $ph->scaleImage(640); - $r = $ph->store($uid, $visitor, $hash, $tempfile, t('Wall Photos'), 1, 0, $defperm); - if ($r) { - $image["medium"] = System::baseUrl()."/photo/{$hash}-1.".$ph->getExt(); + + if ($width > 800 || $height > 800) { + $image["large"] = System::baseUrl()."/photo/{$hash}-0.".$ph->getExt(); } - } - - if ($width > 320 || $height > 320) { - $ph->scaleImage(320); - $r = $ph->store($uid, $visitor, $hash, $tempfile, t('Wall Photos'), 2, 0, $defperm); - if ($r) { - $image["small"] = System::baseUrl()."/photo/{$hash}-2.".$ph->getExt(); - } - } - - if ($width > 160 && $height > 160) { - $x = 0; - $y = 0; - - $min = $ph->getWidth(); - if ($min > 160) { - $x = ($min - 160) / 2; - } - - if ($ph->getHeight() < $min) { - $min = $ph->getHeight(); - if ($min > 160) { - $y = ($min - 160) / 2; + + if ($width > 640 || $height > 640) { + $ph->scaleImage(640); + $r = $ph->store($uid, $visitor, $hash, $tempfile, t('Wall Photos'), 1, 0, $defperm); + if ($r) { + $image["medium"] = System::baseUrl()."/photo/{$hash}-1.".$ph->getExt(); } } - - $min = 160; - $ph->cropImage(160, $x, $y, $min, $min); - - $r = $ph->store($uid, $visitor, $hash, $tempfile, t('Wall Photos'), 3, 0, $defperm); - if ($r) { - $image["thumb"] = System::baseUrl()."/photo/{$hash}-3.".$ph->getExt(); + + if ($width > 320 || $height > 320) { + $ph->scaleImage(320); + $r = $ph->store($uid, $visitor, $hash, $tempfile, t('Wall Photos'), 2, 0, $defperm); + if ($r) { + $image["small"] = System::baseUrl()."/photo/{$hash}-2.".$ph->getExt(); + } } + + if ($width > 160 && $height > 160) { + $x = 0; + $y = 0; + + $min = $ph->getWidth(); + if ($min > 160) { + $x = ($min - 160) / 2; + } + + if ($ph->getHeight() < $min) { + $min = $ph->getHeight(); + if ($min > 160) { + $y = ($min - 160) / 2; + } + } + + $min = 160; + $ph->cropImage(160, $x, $y, $min, $min); + + $r = $ph->store($uid, $visitor, $hash, $tempfile, t('Wall Photos'), 3, 0, $defperm); + if ($r) { + $image["thumb"] = System::baseUrl()."/photo/{$hash}-3.".$ph->getExt(); + } + } + + // Set the full image as preview image. This will be overwritten, if the picture is larger than 640. + $image["preview"] = $image["full"]; + + // Deactivated, since that would result in a cropped preview, if the picture wasn't larger than 320 + //if (isset($image["thumb"])) + // $image["preview"] = $image["thumb"]; + + // Unsure, if this should be activated or deactivated + //if (isset($image["small"])) + // $image["preview"] = $image["small"]; + + if (isset($image["medium"])) { + $image["preview"] = $image["medium"]; + } + + return($image); } - - // Set the full image as preview image. This will be overwritten, if the picture is larger than 640. - $image["preview"] = $image["full"]; - - // Deactivated, since that would result in a cropped preview, if the picture wasn't larger than 320 - //if (isset($image["thumb"])) - // $image["preview"] = $image["thumb"]; - - // Unsure, if this should be activated or deactivated - //if (isset($image["small"])) - // $image["preview"] = $image["small"]; - - if (isset($image["medium"])) { - $image["preview"] = $image["medium"]; - } - - return($image); } diff --git a/src/ParseUrl.php b/src/ParseUrl.php index 0183fdb3f5..2183a9c1e0 100644 --- a/src/ParseUrl.php +++ b/src/ParseUrl.php @@ -6,6 +6,7 @@ namespace Friendica; use Friendica\Core\Config; +use Friendica\Object\Photo; use Friendica\Util\XML; use dba; @@ -13,7 +14,6 @@ use DomXPath; use DOMDocument; require_once "include/network.php"; -require_once "include/Photo.php"; require_once "include/oembed.php"; /** @@ -353,7 +353,7 @@ class ParseUrl } $src = self::completeUrl($attr["src"], $url); - $photodata = get_photo_info($src); + $photodata = Photo::getInfoFromURL($src); if (($photodata) && ($photodata[0] > 150) && ($photodata[1] > 150)) { if ($photodata[0] > 300) { @@ -374,7 +374,7 @@ class ParseUrl unset($siteinfo["image"]); - $photodata = get_photo_info($src); + $photodata = Photo::getInfoFromURL($src); if (($photodata) && ($photodata[0] > 10) && ($photodata[1] > 10)) { $siteinfo["images"][] = array("src" => $src, diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index 47aeaf05e5..5af082905d 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -15,6 +15,7 @@ use Friendica\Core\Worker; use Friendica\Database\DBM; use Friendica\Model\GlobalContact; use Friendica\Object\Contact; +use Friendica\Object\Photo; use Friendica\Object\Profile; use Friendica\Protocol\OStatus; use Friendica\Util\XML; @@ -1659,7 +1660,7 @@ class DFRN ); } - update_contact_avatar( + Contact::updateAvatar( $author["avatar"], $importer["uid"], $contact["id"], @@ -2034,7 +2035,7 @@ class DFRN dbesc(normalise_link($old["url"])) ); - update_contact_avatar($relocate["avatar"], $importer["importer_uid"], $importer["id"], true); + Contact::updateAvatar($relocate["avatar"], $importer["importer_uid"], $importer["id"], true); if ($x === false) { return false; diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 4d91f8b1c0..26412e2704 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -27,7 +27,6 @@ use SimpleXMLElement; require_once 'include/items.php'; require_once 'include/bb2diaspora.php'; -require_once 'include/Photo.php'; require_once 'include/group.php'; require_once 'include/datetime.php'; require_once 'include/queue_fn.php'; @@ -2211,7 +2210,7 @@ class Diaspora $image_url = "http://".$handle_parts[1].$image_url; } - update_contact_avatar($image_url, $importer["uid"], $contact["id"]); + Contact::updateAvatar($image_url, $importer["uid"], $contact["id"]); // Generic birthday. We don't know the timezone. The year is irrelevant. @@ -2471,7 +2470,7 @@ class Diaspora group_add_member($importer["uid"], "", $contact_record["id"], $def_gid); } - update_contact_avatar($ret["photo"], $importer['uid'], $contact_record["id"], true); + Contact::updateAvatar($ret["photo"], $importer['uid'], $contact_record["id"], true); if ($importer["page-flags"] == PAGE_NORMAL) { logger("Sending intra message for author ".$author.".", LOGGER_DEBUG); @@ -2494,7 +2493,7 @@ class Diaspora logger("Does an automatic friend approval for author ".$author.".", LOGGER_DEBUG); - update_contact_avatar($contact_record["photo"], $importer["uid"], $contact_record["id"]); + Contact::updateAvatar($contact_record["photo"], $importer["uid"], $contact_record["id"]); // technically they are sharing with us (CONTACT_IS_SHARING), // but if our page-type is PAGE_COMMUNITY or PAGE_SOAPBOX diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index ed762084c2..47538faa83 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -12,6 +12,7 @@ use Friendica\Database\DBM; use Friendica\Model\GlobalContact; use Friendica\Network\Probe; use Friendica\Object\Contact; +use Friendica\Object\Photo; use Friendica\Util\Lock; use Friendica\Util\XML; use dba; @@ -24,7 +25,6 @@ require_once 'include/bbcode.php'; require_once 'include/items.php'; require_once 'mod/share.php'; require_once 'include/enotify.php'; -require_once 'include/Photo.php'; require_once 'include/follow.php'; require_once 'include/api.php'; require_once 'mod/proxy.php'; @@ -203,7 +203,7 @@ class OStatus if (!empty($author["author-avatar"]) && ($author["author-avatar"] != $current['avatar'])) { logger("Update profile picture for contact ".$contact["id"], LOGGER_DEBUG); - update_contact_avatar($author["author-avatar"], $importer["uid"], $contact["id"]); + Contact::updateAvatar($author["author-avatar"], $importer["uid"], $contact["id"]); } // Ensure that we are having this contact (with uid=0) @@ -223,7 +223,7 @@ class OStatus dba::update('contact', $fields, array('id' => $cid), $old_contact); // Update the avatar - update_contact_avatar($author["author-avatar"], 0, $cid); + Contact::updateAvatar($author["author-avatar"], 0, $cid); } $contact["generation"] = 2; @@ -1326,7 +1326,7 @@ class OStatus switch ($siteinfo["type"]) { case 'photo': - $imgdata = get_photo_info($siteinfo["image"]); + $imgdata = Photo::getInfoFromURL($siteinfo["image"]); $attributes = array("rel" => "enclosure", "href" => $siteinfo["image"], "type" => $imgdata["mime"], @@ -1346,7 +1346,7 @@ class OStatus } if (!Config::get('system', 'ostatus_not_attach_preview') && ($siteinfo["type"] != "photo") && isset($siteinfo["image"])) { - $imgdata = get_photo_info($siteinfo["image"]); + $imgdata = Photo::getInfoFromURL($siteinfo["image"]); $attributes = array("rel" => "enclosure", "href" => $siteinfo["image"], "type" => $imgdata["mime"], diff --git a/src/Protocol/PortableContact.php b/src/Protocol/PortableContact.php index 59b3ad4325..feb4dfdc8d 100644 --- a/src/Protocol/PortableContact.php +++ b/src/Protocol/PortableContact.php @@ -14,6 +14,7 @@ use Friendica\Core\Worker; use Friendica\Database\DBM; use Friendica\Model\GlobalContact; use Friendica\Network\Probe; +use Friendica\Object\Photo; use Friendica\Object\Profile; use dba; use DOMDocument; @@ -23,7 +24,6 @@ use Exception; require_once 'include/datetime.php'; require_once 'include/network.php'; require_once 'include/html2bbcode.php'; -require_once 'include/Photo.php'; class PortableContact { diff --git a/update.php b/update.php index 21074c1d87..ba0867d3a8 100644 --- a/update.php +++ b/update.php @@ -6,6 +6,7 @@ use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\Worker; use Friendica\Database\DBM; +use Friendica\Object\Photo; /** * @@ -146,14 +147,14 @@ function update_1013() { AFTER `object` , ADD `target` TEXT NOT NULL AFTER `target-type`"); } -function update_1014() { - require_once('include/Photo.php'); +function update_1014() +{ q("ALTER TABLE `contact` ADD `micro` TEXT NOT NULL AFTER `thumb` "); $r = q("SELECT * FROM `photo` WHERE `scale` = 4"); if (DBM::is_result($r)) { foreach ($r as $rr) { $ph = new Photo($rr['data']); - if ($ph->is_valid()) { + if ($ph->isValid()) { $ph->scaleImage(48); $ph->store($rr['uid'],$rr['contact-id'],$rr['resource-id'],$rr['filename'],$rr['album'],6,(($rr['profile']) ? 1 : 0)); } diff --git a/view/theme/frio/theme.php b/view/theme/frio/theme.php index 35e40aa965..0a6b48e4eb 100644 --- a/view/theme/frio/theme.php +++ b/view/theme/frio/theme.php @@ -12,6 +12,7 @@ use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Database\DBM; +use Friendica\Object\Photo; $frio = "view/theme/frio"; @@ -79,9 +80,8 @@ function frio_uninstall() { * @param App $a Unused but required by hook definition * @param array $body_info The item and its html output */ -function frio_item_photo_links(App $a, &$body_info) { - require_once('include/Photo.php'); - +function frio_item_photo_links(App $a, &$body_info) +{ $phototypes = Photo::supportedTypes(); $occurence = 1; $p = bb_find_open_close($body_info['html'], ""); diff --git a/view/theme/frost/theme.php b/view/theme/frost/theme.php index 5023aeb9ba..5d5162cd32 100644 --- a/view/theme/frost/theme.php +++ b/view/theme/frost/theme.php @@ -11,6 +11,7 @@ use Friendica\App; use Friendica\Core\System; +use Friendica\Object\Photo; function frost_init(App $a) { $a->videowidth = 400; @@ -45,8 +46,8 @@ function frost_uninstall() { logger("uninstalled theme frost"); } -function frost_item_photo_links(App $a, &$body_info) { - require_once('include/Photo.php'); +function frost_item_photo_links(App $a, &$body_info) +{ $phototypes = Photo::supportedTypes(); $occurence = 1;