From 54827e7feda8253b0f1055c81f6fd76b7c8ea3f5 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Wed, 29 Nov 2017 07:52:27 -0500 Subject: [PATCH 1/8] Photo to src Move Photo to Friendica\Object namespace and replace require_once statments with use statements. --- include/api.php | 2 +- include/follow.php | 2 +- include/items.php | 4 +--- include/network.php | 4 +--- include/plaintext.php | 10 ++++------ include/uimport.php | 6 ++++-- include/user.php | 6 ++++-- mod/contacts.php | 6 ++++-- mod/crepair.php | 2 +- mod/dfrn_confirm.php | 5 +---- mod/fbrowser.php | 3 +-- mod/install.php | 7 ++++--- mod/photo.php | 8 +++++--- mod/photos.php | 6 ++++-- mod/profile_photo.php | 7 ++++--- mod/proxy.php | 7 +++++-- mod/wall_upload.php | 3 +-- src/Model/GlobalContact.php | 2 +- src/Object/Contact.php | 3 +-- {include => src/Object}/Photo.php | 11 +++++++---- src/ParseUrl.php | 2 +- src/Protocol/Diaspora.php | 2 +- src/Protocol/OStatus.php | 2 +- src/Protocol/PortableContact.php | 2 +- update.php | 5 +++-- view/theme/frio/theme.php | 6 +++--- view/theme/frost/theme.php | 5 +++-- 27 files changed, 68 insertions(+), 60 deletions(-) rename {include => src/Object}/Photo.php (99%) diff --git a/include/api.php b/include/api.php index e0dc413c2a..9f1ad44e5f 100644 --- a/include/api.php +++ b/include/api.php @@ -23,6 +23,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 +33,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'; diff --git a/include/follow.php b/include/follow.php index 7e8b25d797..54ea9981fa 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\Photo; 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) { /* diff --git a/include/items.php b/include/items.php index cffa127288..938925cb99 100644 --- a/include/items.php +++ b/include/items.php @@ -1,9 +1,7 @@ +/** + * @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: diff --git a/mod/wall_upload.php b/mod/wall_upload.php index d6cb0c2e1a..5b5598a46e 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) { diff --git a/src/Model/GlobalContact.php b/src/Model/GlobalContact.php index be8b28260d..f0ad8faa1e 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\Photo; 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 diff --git a/src/Object/Contact.php b/src/Object/Contact.php index d7e7853621..9f81b98c48 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; @@ -643,8 +644,6 @@ class Contact extends BaseObject } } - require_once 'include/Photo.php'; - update_contact_avatar($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)); diff --git a/include/Photo.php b/src/Object/Photo.php similarity index 99% rename from include/Photo.php rename to src/Object/Photo.php index 761abc770c..b87a4b6e7f 100644 --- a/include/Photo.php +++ b/src/Object/Photo.php @@ -1,8 +1,9 @@ imagick = class_exists('Imagick'); $this->types = static::supportedTypes(); if (!array_key_exists($type, $this->types)){ @@ -80,7 +82,8 @@ class Photo { } } - public function is_imagick() { + public function is_imagick() + { return $this->imagick; } diff --git a/src/ParseUrl.php b/src/ParseUrl.php index 0183fdb3f5..c5c23d7d9c 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"; /** diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 4d91f8b1c0..2ffaac642a 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -19,6 +19,7 @@ use Friendica\Database\DBM; use Friendica\Model\GlobalContact; use Friendica\Network\Probe; use Friendica\Object\Contact; +use Friendica\Object\Photo; use Friendica\Object\Profile; use Friendica\Util\XML; @@ -27,7 +28,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'; diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index ed762084c2..206d188f5c 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'; 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..f228bf7351 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,8 +147,8 @@ 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)) { 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; From 0091d318e52f621f1af15e268b578798b972a25d Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Wed, 29 Nov 2017 12:17:12 -0500 Subject: [PATCH 2/8] Function names Update function names and corresponding function calls --- include/api.php | 17 +- include/follow.php | 2 +- include/items.php | 4 +- include/network.php | 4 +- include/plaintext.php | 4 +- include/user.php | 11 +- mod/contacts.php | 2 +- mod/crepair.php | 18 +- mod/dfrn_confirm.php | 4 +- mod/dfrn_request.php | 15 +- mod/photo.php | 2 +- mod/photos.php | 6 +- mod/profile_photo.php | 12 +- mod/proxy.php | 8 +- mod/wall_upload.php | 4 +- src/Model/GlobalContact.php | 2 +- src/Object/Contact.php | 2 +- src/Object/Photo.php | 1061 ++++++++++++++++++++--------------- src/ParseUrl.php | 4 +- src/Protocol/DFRN.php | 5 +- src/Protocol/Diaspora.php | 6 +- src/Protocol/OStatus.php | 8 +- update.php | 2 +- 23 files changed, 668 insertions(+), 535 deletions(-) diff --git a/include/api.php b/include/api.php index 9f1ad44e5f..9c42241594 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; @@ -2377,7 +2376,7 @@ function api_get_attachments(&$body) $attachments = array(); foreach ($images[1] as $image) { - $imagedata = get_photo_info($image); + $imagedata = Photo::getPhotoInfo($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::getPhotoInfo($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 54ea9981fa..cb575ae54c 100644 --- a/include/follow.php +++ b/include/follow.php @@ -250,7 +250,7 @@ function new_contact($uid, $url, $interactive = false, $network = '') { } // Update the avatar - update_contact_avatar($ret['photo'],$uid,$contact_id); + Photo::updateContactAvatar($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 938925cb99..a16635339c 100644 --- a/include/items.php +++ b/include/items.php @@ -1690,7 +1690,7 @@ function new_follower($importer, $contact, $datarray, $item, $sharing = false) { ); if (DBM::is_result($r)) { $contact_record = $r[0]; - update_contact_avatar($photo, $importer["uid"], $contact_record["id"], true); + Photo::updateContactAvatar($photo, $importer["uid"], $contact_record["id"], true); } /// @TODO Encapsulate this into a function/method @@ -1877,7 +1877,7 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) { $height = intval($match[2]); $ph = new Photo($data, $type); - if ($ph->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 775ed3eaa8..52e3409573 100644 --- a/include/network.php +++ b/include/network.php @@ -710,11 +710,11 @@ function scale_external_images($srctext, $include_link = true, $scale_replace = } // guess mimetype from headers or filename - $type = guess_image_type($mtch[1], true); + $type = Photo::guessImageType($mtch[1], true); if ($i) { $ph = new Photo($i, $type); - if ($ph->is_valid()) { + if ($ph->isValid()) { $orig_width = $ph->getWidth(); $orig_height = $ph->getHeight(); diff --git a/include/plaintext.php b/include/plaintext.php index 13df9d1c80..1ae02bc49e 100644 --- a/include/plaintext.php +++ b/include/plaintext.php @@ -51,7 +51,7 @@ function get_old_attachment_data($body) { if (preg_match("/\[img\]([$URLSearchString]*)\[\/img\]/ism", $attacheddata, $matches)) { - $picturedata = get_photo_info($matches[1]); + $picturedata = Photo::getPhotoInfo($matches[1]); if (($picturedata[0] >= 500) && ($picturedata[0] >= $picturedata[1])) $post["image"] = $matches[1]; @@ -221,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::getPhotoInfo($pictures[0][1]); if (substr($imgdata["mime"], 0, 6) == "image/") { $post["type"] = "photo"; $post["image"] = $pictures[0][1]; diff --git a/include/user.php b/include/user.php index ff7e9c9c8f..356f10ad09 100644 --- a/include/user.php +++ b/include/user.php @@ -285,23 +285,22 @@ function create_user($arr) { $photo = avatar_img($email); // unless there is no avatar-plugin loaded - if(strlen($photo)) { + if (strlen($photo)) { $photo_failure = false; $filename = basename($photo); - $img_str = fetch_url($photo,true); + $img_str = fetch_url($photo, true); // guess mimetype from headers or filename - $type = guess_image_type($photo,true); + $type = Photo::guessImageType($photo, true); $img = new Photo($img_str, $type); - if($img->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 5de39005bd..8a42a85d45 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -311,7 +311,7 @@ function _contact_update_profile($contact_id) { ); // Update the entry in the contact table - update_contact_avatar($data['photo'], local_user(), $contact_id, true); + Photo::updateContactAvatar($data['photo'], local_user(), $contact_id, true); // Update the entry in the gcontact table GlobalContact::updateFromProbe($data["url"]); diff --git a/mod/crepair.php b/mod/crepair.php index 4474cec99d..fe4f9dd534 100644 --- a/mod/crepair.php +++ b/mod/crepair.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); + Photo::updateContactAvatar($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); + Photo::updateContactAvatar($photo, $uid, $contact_record["id"], true); } } diff --git a/mod/photo.php b/mod/photo.php index 62a7350eda..8368b99a6b 100644 --- a/mod/photo.php +++ b/mod/photo.php @@ -169,7 +169,7 @@ function photo_init(App $a) { // Resize only if its not a GIF and it is supported by the library if (($mimetype != "image/gif") && in_array($mimetype, Photo::supportedTypes())) { $ph = new Photo($data, $mimetype); - if ($ph->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 84fffe8ba3..504f0ff146 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -424,7 +424,7 @@ function photos_post(App $a) { ); if (DBM::is_result($r)) { $ph = new Photo($r[0]['data'], $r[0]['type']); - if ($ph->is_valid()) { + if ($ph->isValid()) { $rotate_deg = ( (intval($_POST['rotate']) == 1) ? 270 : 90 ); $ph->rotate($rotate_deg); @@ -810,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); @@ -839,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 b185817d04..f667359b51 100644 --- a/mod/profile_photo.php +++ b/mod/profile_photo.php @@ -73,7 +73,7 @@ function profile_photo_post(App $a) { $base_image = $r[0]; $im = new Photo($base_image['data'], $base_image['type']); - if($im->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); @@ -151,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; } @@ -165,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 db9d7409d9..790309c627 100644 --- a/mod/proxy.php +++ b/mod/proxy.php @@ -131,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(); } } @@ -175,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(); } @@ -193,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); } } @@ -204,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 5b5598a46e..ce73f85151 100644 --- a/mod/wall_upload.php +++ b/mod/wall_upload.php @@ -162,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 @@ -192,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 f0ad8faa1e..6ee1fa4f9c 100644 --- a/src/Model/GlobalContact.php +++ b/src/Model/GlobalContact.php @@ -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"]); + Photo::updateContactAvatar($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 9f81b98c48..f4ca362437 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -644,7 +644,7 @@ class Contact extends BaseObject } } - update_contact_avatar($data["photo"], $uid, $contact_id); + Photo::updateContactAvatar($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)); diff --git a/src/Object/Photo.php b/src/Object/Photo.php index b87a4b6e7f..894a18c5da 100644 --- a/src/Object/Photo.php +++ b/src/Object/Photo.php @@ -13,8 +13,11 @@ use Friendica\Database\DBM; require_once "include/photos.php"; -class Photo { - +/** + * Class to handle Photos + */ +class Photo +{ private $image; /* @@ -30,9 +33,9 @@ class Photo { /** * @brief supported mimetypes and corresponding file extensions */ - public static function supportedTypes() { + public static function supportedTypes() + { if (class_exists('Imagick')) { - // Imagick::queryFormats won't help us a lot there... // At least, not yet, other parts of friendica uses this array $t = array( @@ -51,27 +54,38 @@ class Photo { return $t; } - public function __construct($data, $type=null) + /** + * @brief Constructor + * @param object $data data + * @param boolean $type optional, default null + * @return object + */ + public function __construct($data, $type = null) { $this->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; @@ -82,7 +96,10 @@ class Photo { } } - public function is_imagick() + /** + * @return boolean + */ + public function isImagick() { return $this->imagick; } @@ -91,7 +108,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 function getFormatsMap() + { $m = array( 'image/jpeg' => 'JPG', 'image/png' => 'PNG', @@ -100,8 +118,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); @@ -113,7 +136,7 @@ class Photo { /* * Setup the image to the format it will be saved to */ - $map = $this->get_FormatsMap(); + $map = $this->getFormatsMap(); $format = $map[$type]; $this->image->setFormat($format); @@ -123,7 +146,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)) { @@ -171,41 +194,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; @@ -213,24 +252,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; } @@ -244,7 +296,6 @@ class Photo { } if ($width > $max && $height > $max) { - // very tall image (greater than 16:9) // constrain the width - let the height float. @@ -265,7 +316,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 @@ -284,7 +334,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 @@ -292,7 +342,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. @@ -322,12 +371,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() @@ -336,17 +390,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) { @@ -375,20 +435,25 @@ 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); @@ -396,7 +461,7 @@ class Photo { } // based off comment on http://php.net/manual/en/function.imagerotate.php - if (!$this->is_valid()) { + if (!$this->isValid()) { return false; } @@ -404,15 +469,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; @@ -449,17 +513,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(); @@ -492,7 +557,7 @@ class Photo { } } - if ($this->is_imagick()) { + if ($this->isImagick()) { return $this->scaleImage($dest_width, $dest_height); } @@ -511,14 +576,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); @@ -541,13 +609,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); @@ -576,8 +652,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; } @@ -590,12 +671,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(); @@ -609,7 +694,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)) { @@ -630,10 +715,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']; @@ -656,417 +754,452 @@ 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 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 = $this->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; -} + /** + * @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 function updateContactAvatar($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"]); + } -function scale_image($width, $height, $max) { + if (($r["avatar"] != $avatar) || $force) { + $photos = $this->importProfilePhoto($avatar, $uid, $cid, true); - $dest_width = $dest_height = 0; + if ($photos) { + dba::update( + 'contact', + array('avatar' => $avatar, 'photo' => $photos[0], 'thumb' => $photos[1], 'micro' => $photos[2], 'avatar-date' => datetime_convert()), + array('id' => $cid) + ); - if ((!$width) || (!$height)) { - return false; + // 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)) { + $this->updateContactAvatar($avatar, 0, $pcontact['id'], $force); + } + } + + return $photos; + } + } + + return $data; } - if ($width > $max && $height > $max) { + /** + * @param string $photo photo + * @param integer $uid user id + * @param integer $cid contact id + * @param boolean $quit_on_error optional, default false + * @return array + */ + private 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) + ); - // 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); + if (DBM::is_result($r) && strlen($r['resource-id'])) { + $hash = $r['resource-id']; } else { - $dest_width = intval(($width * $max) / $height); - $dest_height = $max; + $hash = photo_new_resource(); } - } else { - if ($width > $max) { - $dest_width = $max; - $dest_height = intval(($height * $max) / $width); + + $photo_failure = false; + + $filename = basename($photo); + $img_str = fetch_url($photo, true); + + if ($quit_on_error && ($img_str == "")) { + return false; + } + + $type = $this->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 { - if ($height > $max) { + $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)); + } - // very tall image (greater than 16:9) - // but width is OK - don't do anything + /** + * @param string $url url + * @return object + */ + public function getPhotoInfo($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); + } + + return $data; + } - if ((($height * 9) / 16) > $width) { + /** + * @param integer $width width + * @param integer $height height + * @param integer $max max + * @return array + */ + public 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 ($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 doesn't seem to be used + * @param object $a App + * @param integer $uid user id + * @param string $imagedata optional, default empty + * @param string $url optional, default empty + * @return array + */ + private 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()); - } - - $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, - "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(); + + $max_length = Config::get('system', 'max_image_length'); + if (! $max_length) { + $max_length = MAX_IMAGE_LENGTH; } - } - - 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 ($max_length > 0) { + $ph->scaleImage($max_length); } - } - - if ($width > 160 && $height > 160) { - $x = 0; - $y = 0; - - $min = $ph->getWidth(); - if ($min > 160) { - $x = ($min - 160) / 2; + + $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()); } - - if ($ph->getHeight() < $min) { - $min = $ph->getHeight(); - if ($min > 160) { - $y = ($min - 160) / 2; + + $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(); } } - - $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 c5c23d7d9c..954ef5d482 100644 --- a/src/ParseUrl.php +++ b/src/ParseUrl.php @@ -353,7 +353,7 @@ class ParseUrl } $src = self::completeUrl($attr["src"], $url); - $photodata = get_photo_info($src); + $photodata = Photo::getPhotoInfo($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::getPhotoInfo($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..db1ded496b 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( + Photo::updateContactAvatar( $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); + Photo::updateContactAvatar($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 2ffaac642a..bb1a3f46e9 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -2211,7 +2211,7 @@ class Diaspora $image_url = "http://".$handle_parts[1].$image_url; } - update_contact_avatar($image_url, $importer["uid"], $contact["id"]); + Photo::updateContactAvatar($image_url, $importer["uid"], $contact["id"]); // Generic birthday. We don't know the timezone. The year is irrelevant. @@ -2471,7 +2471,7 @@ class Diaspora group_add_member($importer["uid"], "", $contact_record["id"], $def_gid); } - update_contact_avatar($ret["photo"], $importer['uid'], $contact_record["id"], true); + Photo::updateContactAvatar($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 +2494,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"]); + Photo::updateContactAvatar($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 206d188f5c..8d48873150 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.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"]); + Photo::updateContactAvatar($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); + Photo::updateContactAvatar($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::getPhotoInfo($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::getPhotoInfo($siteinfo["image"]); $attributes = array("rel" => "enclosure", "href" => $siteinfo["image"], "type" => $imgdata["mime"], diff --git a/update.php b/update.php index f228bf7351..ba0867d3a8 100644 --- a/update.php +++ b/update.php @@ -154,7 +154,7 @@ function update_1014() 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)); } From eb148cad55af1e894365753055cf0a7d42aca19b Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Wed, 29 Nov 2017 13:04:58 -0500 Subject: [PATCH 3/8] Missed use dba added use dba --- src/Object/Photo.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Object/Photo.php b/src/Object/Photo.php index 894a18c5da..db3c75f99e 100644 --- a/src/Object/Photo.php +++ b/src/Object/Photo.php @@ -10,6 +10,7 @@ use Friendica\Core\Cache; use Friendica\Core\Config; use Friendica\Core\System; use Friendica\Database\DBM; +use dba; require_once "include/photos.php"; From 0373056448aec398ee765065adc998aa0da02ac0 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Wed, 29 Nov 2017 17:29:11 -0500 Subject: [PATCH 4/8] Review and Use statements use statements and review changes. --- include/api.php | 4 +- include/follow.php | 4 +- include/items.php | 3 +- include/plaintext.php | 4 +- mod/contacts.php | 3 +- mod/crepair.php | 3 +- mod/dfrn_confirm.php | 6 +- mod/dfrn_request.php | 6 +- src/Model/GlobalContact.php | 4 +- src/Object/Contact.php | 47 +++++++- src/Object/Photo.php | 223 ++---------------------------------- src/ParseUrl.php | 4 +- src/Protocol/DFRN.php | 4 +- src/Protocol/Diaspora.php | 7 +- src/Protocol/OStatus.php | 8 +- 15 files changed, 83 insertions(+), 247 deletions(-) diff --git a/include/api.php b/include/api.php index 9c42241594..12380f4b84 100644 --- a/include/api.php +++ b/include/api.php @@ -2376,7 +2376,7 @@ function api_get_attachments(&$body) $attachments = array(); foreach ($images[1] as $image) { - $imagedata = Photo::getPhotoInfo($image); + $imagedata = Photo::getInfoFromURL($image); if ($imagedata) { $attachments[] = array("url" => $image, "mimetype" => $imagedata["mime"], "size" => $imagedata["size"]); @@ -2508,7 +2508,7 @@ function api_get_entitities(&$text, $bbcode) $start = iconv_strpos($text, $url, $offset, "UTF-8"); if (!($start === false)) { - $image = Photo::getPhotoInfo($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) diff --git a/include/follow.php b/include/follow.php index cb575ae54c..ac07c4085e 100644 --- a/include/follow.php +++ b/include/follow.php @@ -8,7 +8,7 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBM; use Friendica\Network\Probe; -use Friendica\Object\Photo; +use Friendica\Object\Contact; use Friendica\Protocol\Diaspora; use Friendica\Protocol\OStatus; use Friendica\Protocol\PortableContact; @@ -250,7 +250,7 @@ function new_contact($uid, $url, $interactive = false, $network = '') { } // Update the avatar - Photo::updateContactAvatar($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 a16635339c..d446d2773d 100644 --- a/include/items.php +++ b/include/items.php @@ -11,7 +11,6 @@ use Friendica\Core\System; use Friendica\Database\DBM; use Friendica\Model\GlobalContact; use Friendica\Object\Contact; -use Friendica\Object\Photo; use Friendica\Protocol\DFRN; use Friendica\Protocol\OStatus; use Friendica\Util\Lock; @@ -1690,7 +1689,7 @@ function new_follower($importer, $contact, $datarray, $item, $sharing = false) { ); if (DBM::is_result($r)) { $contact_record = $r[0]; - Photo::updateContactAvatar($photo, $importer["uid"], $contact_record["id"], true); + Contact::updateAvatar($photo, $importer["uid"], $contact_record["id"], true); } /// @TODO Encapsulate this into a function/method diff --git a/include/plaintext.php b/include/plaintext.php index 1ae02bc49e..221d1471b1 100644 --- a/include/plaintext.php +++ b/include/plaintext.php @@ -51,7 +51,7 @@ function get_old_attachment_data($body) { if (preg_match("/\[img\]([$URLSearchString]*)\[\/img\]/ism", $attacheddata, $matches)) { - $picturedata = Photo::getPhotoInfo($matches[1]); + $picturedata = Photo::getInfoFromURL($matches[1]); if (($picturedata[0] >= 500) && ($picturedata[0] >= $picturedata[1])) $post["image"] = $matches[1]; @@ -221,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 = Photo::getPhotoInfo($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/mod/contacts.php b/mod/contacts.php index 8a42a85d45..69f1884960 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -9,7 +9,6 @@ use Friendica\Database\DBM; use Friendica\Model\GlobalContact; use Friendica\Network\Probe; use Friendica\Object\Contact; -use Friendica\Object\Photo; require_once 'include/contact_selectors.php'; require_once 'mod/proxy.php'; @@ -311,7 +310,7 @@ function _contact_update_profile($contact_id) { ); // Update the entry in the contact table - Photo::updateContactAvatar($data['photo'], local_user(), $contact_id, true); + Contact::updateAvatar($data['photo'], local_user(), $contact_id, true); // Update the entry in the gcontact table GlobalContact::updateFromProbe($data["url"]); diff --git a/mod/crepair.php b/mod/crepair.php index fe4f9dd534..7e1921f304 100644 --- a/mod/crepair.php +++ b/mod/crepair.php @@ -6,7 +6,6 @@ use Friendica\App; use Friendica\Core\Config; use Friendica\Database\DBM; use Friendica\Object\Contact; -use Friendica\Object\Photo; require_once 'include/contact_selectors.php'; require_once 'mod/contacts.php'; @@ -90,7 +89,7 @@ function crepair_post(App $a) { if ($photo) { logger('mod-crepair: updating photo from ' . $photo); - Photo::updateContactAvatar($photo, local_user(), $contact['id']); + Contact::updateAvatar($photo, local_user(), $contact['id']); } if ($r) { diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php index 04ccd552af..18d9f25bf5 100644 --- a/mod/dfrn_confirm.php +++ b/mod/dfrn_confirm.php @@ -25,7 +25,7 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBM; use Friendica\Network\Probe; -use Friendica\Object\Photo; +use Friendica\Object\Contact; use Friendica\Protocol\Diaspora; require_once 'include/enotify.php'; @@ -326,7 +326,7 @@ function dfrn_confirm_post(App $a, $handsfree = null) { * */ - Photo::updateContactAvatar($contact['photo'],$uid,$contact_id); + Contact::updateAvatar($contact['photo'], $uid, $contact_id); logger('dfrn_confirm: confirm - imported photos'); @@ -675,7 +675,7 @@ function dfrn_confirm_post(App $a, $handsfree = null) { $photo = System::baseUrl() . '/images/person-175.jpg'; } - Photo::updateContactAvatar($photo,$local_uid,$dfrn_record); + Contact::updateAvatar($photo,$local_uid,$dfrn_record); logger('dfrn_confirm: request - photos imported'); diff --git a/mod/dfrn_request.php b/mod/dfrn_request.php index 1bf7d71d93..3c75843186 100644 --- a/mod/dfrn_request.php +++ b/mod/dfrn_request.php @@ -16,7 +16,7 @@ use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Database\DBM; use Friendica\Network\Probe; -use Friendica\Object\Photo; +use Friendica\Object\Contact; require_once 'include/enotify.php'; require_once 'include/group.php'; @@ -195,7 +195,7 @@ function dfrn_request_post(App $a) { group_add_member(local_user(), '', $r[0]['id'], $def_gid); if (isset($photo)) - Photo::updateContactAvatar($photo, local_user(), $r[0]["id"], true); + Contact::updateAvatar($photo, local_user(), $r[0]["id"], true); $forwardurl = System::baseUrl()."/contacts/".$r[0]['id']; } else { @@ -586,7 +586,7 @@ function dfrn_request_post(App $a) { ); if (DBM::is_result($r)) { $contact_record = $r[0]; - Photo::updateContactAvatar($photo, $uid, $contact_record["id"], true); + Contact::updateAvatar($photo, $uid, $contact_record["id"], true); } } diff --git a/src/Model/GlobalContact.php b/src/Model/GlobalContact.php index 6ee1fa4f9c..6ec1101775 100644 --- a/src/Model/GlobalContact.php +++ b/src/Model/GlobalContact.php @@ -10,7 +10,7 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBM; use Friendica\Network\Probe; -use Friendica\Object\Photo; +use Friendica\Object\Contact; use Friendica\Object\Profile; use Friendica\Protocol\PortableContact; use dba; @@ -881,7 +881,7 @@ class GlobalContact if (DBM::is_result($r)) { logger("Update public contact ".$r[0]["id"], LOGGER_DEBUG); - Photo::updateContactAvatar($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 f4ca362437..083982dda6 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -644,7 +644,7 @@ class Contact extends BaseObject } } - Photo::updateContactAvatar($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)); @@ -818,4 +818,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/src/Object/Photo.php b/src/Object/Photo.php index db3c75f99e..cd96b8c667 100644 --- a/src/Object/Photo.php +++ b/src/Object/Photo.php @@ -11,6 +11,8 @@ use Friendica\Core\Config; use Friendica\Core\System; use Friendica\Database\DBM; use dba; +use Imagick; +use ImagickPixel; require_once "include/photos.php"; @@ -33,6 +35,7 @@ class Photo /** * @brief supported mimetypes and corresponding file extensions + * @return array */ public static function supportedTypes() { @@ -446,18 +449,18 @@ class Photo // based off comment on http://php.net/manual/en/imagick.getimageorientation.php $orientation = $this->image->getImageOrientation(); switch ($orientation) { - case imagick::ORIENTATION_BOTTOMRIGHT: + case Imagick::ORIENTATION_BOTTOMRIGHT: $this->image->rotateimage("#000", 180); break; - case imagick::ORIENTATION_RIGHTTOP: + case Imagick::ORIENTATION_RIGHTTOP: $this->image->rotateimage("#000", 90); break; - case imagick::ORIENTATION_LEFTBOTTOM: + 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 @@ -805,51 +808,6 @@ class Photo 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 - */ - public function updateContactAvatar($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 = $this->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)) { - $this->updateContactAvatar($avatar, 0, $pcontact['id'], $force); - } - } - - return $photos; - } - } - - return $data; - } - /** * @param string $photo photo * @param integer $uid user id @@ -946,14 +904,14 @@ class Photo $micro = System::baseUrl() . '/images/person-48.jpg'; } - return(array($photo, $thumb, $micro)); + return array($photo, $thumb, $micro); } /** * @param string $url url * @return object */ - public function getPhotoInfo($url) + public function getInfoFromURL($url) { $data = array(); @@ -1040,167 +998,4 @@ class Photo } return array("width" => $dest_width, "height" => $dest_height); } - - /** - * @brief This function doesn't seem to be used - * @param object $a App - * @param integer $uid user id - * @param string $imagedata optional, default empty - * @param string $url optional, default empty - * @return array - */ - private 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); - file_put_contents($tempfile, $imagedata); - $a->save_timestamp($stamp1, "file"); - - $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); - - $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, - "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 > 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); - } } diff --git a/src/ParseUrl.php b/src/ParseUrl.php index 954ef5d482..2183a9c1e0 100644 --- a/src/ParseUrl.php +++ b/src/ParseUrl.php @@ -353,7 +353,7 @@ class ParseUrl } $src = self::completeUrl($attr["src"], $url); - $photodata = Photo::getPhotoInfo($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 = Photo::getPhotoInfo($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 db1ded496b..5af082905d 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -1660,7 +1660,7 @@ class DFRN ); } - Photo::updateContactAvatar( + Contact::updateAvatar( $author["avatar"], $importer["uid"], $contact["id"], @@ -2035,7 +2035,7 @@ class DFRN dbesc(normalise_link($old["url"])) ); - Photo::updateContactAvatar($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 bb1a3f46e9..26412e2704 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -19,7 +19,6 @@ use Friendica\Database\DBM; use Friendica\Model\GlobalContact; use Friendica\Network\Probe; use Friendica\Object\Contact; -use Friendica\Object\Photo; use Friendica\Object\Profile; use Friendica\Util\XML; @@ -2211,7 +2210,7 @@ class Diaspora $image_url = "http://".$handle_parts[1].$image_url; } - Photo::updateContactAvatar($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); } - Photo::updateContactAvatar($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); - Photo::updateContactAvatar($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 8d48873150..47538faa83 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.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); - Photo::updateContactAvatar($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 - Photo::updateContactAvatar($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 = Photo::getPhotoInfo($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 = Photo::getPhotoInfo($siteinfo["image"]); + $imgdata = Photo::getInfoFromURL($siteinfo["image"]); $attributes = array("rel" => "enclosure", "href" => $siteinfo["image"], "type" => $imgdata["mime"], From 7938decff3132cddeeff9b1d448ea9f22dfd06db Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Wed, 29 Nov 2017 18:37:32 -0500 Subject: [PATCH 5/8] Private to public change function to public as it's called from elsewhere --- src/Object/Photo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Object/Photo.php b/src/Object/Photo.php index cd96b8c667..24c1b728ad 100644 --- a/src/Object/Photo.php +++ b/src/Object/Photo.php @@ -815,7 +815,7 @@ class Photo * @param boolean $quit_on_error optional, default false * @return array */ - private function importProfilePhoto($photo, $uid, $cid, $quit_on_error = false) + public function importProfilePhoto($photo, $uid, $cid, $quit_on_error = false) { $r = dba::select( 'photo', From 00ad255540be030a5b040015e0acb190ab36b48e Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Thu, 30 Nov 2017 07:40:20 -0500 Subject: [PATCH 6/8] Replace function Replace function used by addon --- src/Object/Photo.php | 164 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) diff --git a/src/Object/Photo.php b/src/Object/Photo.php index 24c1b728ad..d0f6776618 100644 --- a/src/Object/Photo.php +++ b/src/Object/Photo.php @@ -998,4 +998,168 @@ class Photo } return array("width" => $dest_width, "height" => $dest_height); } + + /** + * @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 + */ + private 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); + file_put_contents($tempfile, $imagedata); + $a->save_timestamp($stamp1, "file"); + + $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); + + $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, + "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 > 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); + } } From cddadb4b17a02b95be54acc05f7b37aebb61b978 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Thu, 30 Nov 2017 07:48:47 -0500 Subject: [PATCH 7/8] Object error Uncaught Error: Using $this when not in object context --- src/Object/Photo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Object/Photo.php b/src/Object/Photo.php index d0f6776618..5d8ad6b3a7 100644 --- a/src/Object/Photo.php +++ b/src/Object/Photo.php @@ -839,7 +839,7 @@ class Photo return false; } - $type = $this->guessImageType($photo, true); + $type = self::guessImageType($photo, true); $img = new Photo($img_str, $type); if ($img->isValid()) { $img->scaleImageSquare(175); From d04d2cb838c8dac22e615fa53582f3808dff86fe Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Thu, 30 Nov 2017 13:51:04 -0500 Subject: [PATCH 8/8] Static update functions and check calls. --- src/Object/Photo.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Object/Photo.php b/src/Object/Photo.php index 5d8ad6b3a7..372f7312a1 100644 --- a/src/Object/Photo.php +++ b/src/Object/Photo.php @@ -112,7 +112,7 @@ class Photo * @brief Maps Mime types to Imagick formats * @return arr With with image formats (mime type as key) */ - public function getFormatsMap() + public static function getFormatsMap() { $m = array( 'image/jpeg' => 'JPG', @@ -140,7 +140,7 @@ class Photo /* * Setup the image to the format it will be saved to */ - $map = $this->getFormatsMap(); + $map = self::getFormatsMap(); $format = $map[$type]; $this->image->setFormat($format); @@ -767,7 +767,7 @@ class Photo * * @return object */ - public function guessImageType($filename, $fromcurl = false) + public static function guessImageType($filename, $fromcurl = false) { logger('Photo: guessImageType: '.$filename . ($fromcurl?' from curl headers':''), LOGGER_DEBUG); $type = null; @@ -795,7 +795,7 @@ class Photo $image->setInterlaceScheme(Imagick::INTERLACE_PLANE); } else { $ext = pathinfo($filename, PATHINFO_EXTENSION); - $types = $this->supportedTypes(); + $types = self::supportedTypes(); $type = "image/jpeg"; foreach ($types as $m => $e) { if ($ext == $e) { @@ -815,7 +815,7 @@ class Photo * @param boolean $quit_on_error optional, default false * @return array */ - public function importProfilePhoto($photo, $uid, $cid, $quit_on_error = false) + public static function importProfilePhoto($photo, $uid, $cid, $quit_on_error = false) { $r = dba::select( 'photo', @@ -911,7 +911,7 @@ class Photo * @param string $url url * @return object */ - public function getInfoFromURL($url) + public static function getInfoFromURL($url) { $data = array(); @@ -951,7 +951,7 @@ class Photo * @param integer $max max * @return array */ - public function scaleImageTo($width, $height, $max) + public static function scaleImageTo($width, $height, $max) { $dest_width = $dest_height = 0; @@ -1007,7 +1007,7 @@ class Photo * @param string $url optional, default empty * @return array */ - private function storePhoto(App $a, $uid, $imagedata = "", $url = "") + 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`