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"],