X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FPhoto.php;h=d27bac47aceaaf385e82c5f7274da6f5476a2f56;hb=2e05dac7dae0a3d028b442a2d5afbd4176a32e99;hp=2a2d02f86f66ec6c7824b03becc1c65646ae8423;hpb=26401e88b87646cabc21eb7a095b3ac8ebd76fe9;p=friendica.git diff --git a/src/Model/Photo.php b/src/Model/Photo.php index 2a2d02f86f..d27bac47ac 100644 --- a/src/Model/Photo.php +++ b/src/Model/Photo.php @@ -21,17 +21,17 @@ namespace Friendica\Model; -use Friendica\Core\Cache\Duration; +use Friendica\Core\Cache\Enum\Duration; use Friendica\Core\Logger; use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Database\DBStructure; use Friendica\DI; -use Friendica\Model\Storage\ExternalResource; -use Friendica\Model\Storage\InvalidClassStorageException; -use Friendica\Model\Storage\ReferenceStorageException; -use Friendica\Model\Storage\StorageException; -use Friendica\Model\Storage\SystemResource; +use Friendica\Core\Storage\Type\ExternalResource; +use Friendica\Core\Storage\Exception\InvalidClassStorageException; +use Friendica\Core\Storage\Exception\ReferenceStorageException; +use Friendica\Core\Storage\Exception\StorageException; +use Friendica\Core\Storage\Type\SystemResource; use Friendica\Object\Image; use Friendica\Util\DateTimeFormat; use Friendica\Util\Images; @@ -39,14 +39,19 @@ use Friendica\Security\Security; use Friendica\Util\Proxy; use Friendica\Util\Strings; -require_once "include/dba.php"; - /** * Class to handle photo dabatase table */ class Photo { const CONTACT_PHOTOS = 'Contact Photos'; + const PROFILE_PHOTOS = 'Profile Photos'; + + const DEFAULT = 0; + const USER_AVATAR = 10; + const USER_BANNER = 11; + const CONTACT_AVATAR = 20; + const CONTACT_BANNER = 21; /** * Select rows from the photo table and returns them as array @@ -324,7 +329,7 @@ class Photo * @return boolean True on success * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public static function store(Image $Image, $uid, $cid, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = "", $allow_gid = "", $deny_cid = "", $deny_gid = "", $desc = "") + public static function store(Image $Image, $uid, $cid, $rid, $filename, $album, $scale, $type = self::DEFAULT, $allow_cid = "", $allow_gid = "", $deny_cid = "", $deny_gid = "", $desc = "") { $photo = self::selectFirst(["guid"], ["`resource-id` = ? AND `guid` != ?", $rid, ""]); if (DBA::isResult($photo)) { @@ -374,7 +379,8 @@ class Photo "datasize" => strlen($Image->asString()), "data" => $data, "scale" => $scale, - "profile" => $profile, + "photo-type" => $type, + "profile" => false, "allow_cid" => $allow_cid, "allow_gid" => $allow_gid, "deny_cid" => $deny_cid, @@ -413,7 +419,7 @@ class Photo while ($photo = DBA::fetch($photos)) { try { $backend_class = DI::storageManager()->getWritableStorageByName($photo['backend-class'] ?? ''); - $backend_class->delete($item['backend-ref'] ?? ''); + $backend_class->delete($photo['backend-ref'] ?? ''); // Delete the photos after they had been deleted successfully DBA::delete("photo", ['id' => $photo['id']]); } catch (InvalidClassStorageException $storageException) { @@ -478,7 +484,7 @@ class Photo $micro = ""; $photo = DBA::selectFirst( - "photo", ["resource-id"], ["uid" => $uid, "contact-id" => $cid, "scale" => 4, "album" => self::CONTACT_PHOTOS] + "photo", ["resource-id"], ["uid" => $uid, "contact-id" => $cid, "scale" => 4, "photo-type" => self::CONTACT_AVATAR] ); if (!empty($photo['resource-id'])) { $resource_id = $photo["resource-id"]; @@ -490,19 +496,19 @@ class Photo $filename = basename($image_url); if (!empty($image_url)) { - $ret = DI::httpRequest()->get($image_url); + $ret = DI::httpClient()->get($image_url); $img_str = $ret->getBody(); - $contType = $ret->getContentType(); + $type = $ret->getContentType(); } else { $img_str = ''; - $contType = ''; + $type = ''; } if ($quit_on_error && ($img_str == "")) { return false; } - $type = Images::getMimeTypeByData($img_str, $image_url, $contType); + $type = Images::getMimeTypeByData($img_str, $image_url, $type); $Image = new Image($img_str, $type); if ($Image->isValid()) { @@ -531,7 +537,7 @@ class Photo Logger::info('Avatar is resized', ['uid' => $uid, 'cid' => $cid, 'size' => $filesize, 'type' => $Image->getType()]); } - $r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 4); + $r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 4, self::CONTACT_AVATAR); if ($r === false) { $photo_failure = true; @@ -539,7 +545,7 @@ class Photo $Image->scaleDown(80); - $r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 5); + $r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 5, self::CONTACT_AVATAR); if ($r === false) { $photo_failure = true; @@ -547,7 +553,7 @@ class Photo $Image->scaleDown(48); - $r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 6); + $r = self::store($Image, $uid, $cid, $resource_id, $filename, self::CONTACT_PHOTOS, 6, self::CONTACT_AVATAR); if ($r === false) { $photo_failure = true; @@ -558,25 +564,6 @@ class Photo $image_url = DI::baseUrl() . "/photo/" . $resource_id . "-4." . $Image->getExt() . $suffix; $thumb = DI::baseUrl() . "/photo/" . $resource_id . "-5." . $Image->getExt() . $suffix; $micro = DI::baseUrl() . "/photo/" . $resource_id . "-6." . $Image->getExt() . $suffix; - - // Remove the cached photo - $a = DI::app(); - $basepath = $a->getBasePath(); - - if (is_dir($basepath . "/photo")) { - $filename = $basepath . "/photo/" . $resource_id . "-4." . $Image->getExt(); - if (file_exists($filename)) { - unlink($filename); - } - $filename = $basepath . "/photo/" . $resource_id . "-5." . $Image->getExt(); - if (file_exists($filename)) { - unlink($filename); - } - $filename = $basepath . "/photo/" . $resource_id . "-6." . $Image->getExt(); - if (file_exists($filename)) { - unlink($filename); - } - } } else { $photo_failure = true; } @@ -645,29 +632,31 @@ class Photo { $sql_extra = Security::getPermissionsSQLByUserId($uid); + $avatar_type = (local_user() && (local_user() == $uid)) ? Photo::USER_AVATAR : Photo::DEFAULT; + $key = "photo_albums:".$uid.":".local_user().":".remote_user(); $albums = DI::cache()->get($key); if (is_null($albums) || $update) { if (!DI::config()->get("system", "no_count", false)) { /// @todo This query needs to be renewed. It is really slow // At this time we just store the data in the cache - $albums = q("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album`, ANY_VALUE(`created`) AS `created` + $albums = DBA::toArray(DBA::p("SELECT COUNT(DISTINCT `resource-id`) AS `total`, `album`, ANY_VALUE(`created`) AS `created` FROM `photo` - WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra + WHERE `uid` = ? AND `photo-type` IN (?, ?) $sql_extra GROUP BY `album` ORDER BY `created` DESC", - intval($uid), - DBA::escape(self::CONTACT_PHOTOS), - DBA::escape(DI::l10n()->t(self::CONTACT_PHOTOS)) - ); + $uid, + self::DEFAULT, + $avatar_type + )); } else { // This query doesn't do the count and is much faster - $albums = q("SELECT DISTINCT(`album`), '' AS `total` + $albums = DBA::toArray(DBA::p("SELECT DISTINCT(`album`), '' AS `total` FROM `photo` USE INDEX (`uid_album_scale_created`) - WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s' $sql_extra", - intval($uid), - DBA::escape(self::CONTACT_PHOTOS), - DBA::escape(DI::l10n()->t(self::CONTACT_PHOTOS)) - ); + WHERE `uid` = ? AND `photo-type` IN (?, ?) $sql_extra", + $uid, + self::DEFAULT, + $avatar_type + )); } DI::cache()->set($key, $albums, Duration::DAY); } @@ -799,22 +788,6 @@ class Photo Photo::update($fields, $condition); } - /** - * Strips known picture extensions from picture links - * - * @param string $name Picture link - * @return string stripped picture link - * @throws \Exception - */ - public static function stripExtension($name) - { - $name = str_replace([".jpg", ".png", ".gif"], ["", "", ""], $name); - foreach (Images::supportedTypes() as $m => $e) { - $name = str_replace("." . $e, "", $name); - } - return $name; - } - /** * Fetch the guid and scale from picture links * @@ -831,7 +804,7 @@ class Photo return []; } - $guid = self::stripExtension($guid); + $guid = pathinfo($guid, PATHINFO_FILENAME); if (substr($guid, -2, 1) != "-") { return []; } @@ -978,9 +951,6 @@ class Photo @unlink($src); $max_length = DI::config()->get('system', 'max_image_length'); - if (!$max_length) { - $max_length = MAX_IMAGE_LENGTH; - } if ($max_length > 0) { $Image->scaleDown($max_length); $filesize = strlen($Image->asString()); @@ -1016,7 +986,7 @@ class Photo $smallest = 0; - $r = Photo::store($Image, $user['uid'], 0, $resource_id, $filename, $album, 0, 0, $defperm); + $r = Photo::store($Image, $user['uid'], 0, $resource_id, $filename, $album, 0, self::DEFAULT, $defperm); if (!$r) { Logger::notice('Photo could not be stored'); return []; @@ -1024,7 +994,7 @@ class Photo if ($width > 640 || $height > 640) { $Image->scaleDown(640); - $r = Photo::store($Image, $user['uid'], 0, $resource_id, $filename, $album, 1, 0, $defperm); + $r = Photo::store($Image, $user['uid'], 0, $resource_id, $filename, $album, 1, self::DEFAULT, $defperm); if ($r) { $smallest = 1; } @@ -1032,7 +1002,7 @@ class Photo if ($width > 320 || $height > 320) { $Image->scaleDown(320); - $r = Photo::store($Image, $user['uid'], 0, $resource_id, $filename, $album, 2, 0, $defperm); + $r = Photo::store($Image, $user['uid'], 0, $resource_id, $filename, $album, 2, self::DEFAULT, $defperm); if ($r && ($smallest == 0)) { $smallest = 2; }