]> git.mxchange.org Git - friendica.git/commitdiff
API: Improved avatar handling
authorMichael <heluecht@pirati.ca>
Thu, 24 Jun 2021 07:08:38 +0000 (07:08 +0000)
committerMichael <heluecht@pirati.ca>
Thu, 24 Jun 2021 07:08:38 +0000 (07:08 +0000)
src/Model/Contact.php
src/Model/Storage/SystemResource.php
src/Module/Photo.php
src/Object/Api/Mastodon/Account.php
static/routes.config.php

index f0d1c62bd93d38a8302e383d3aa1fed6fbf4ba0d..30fa41307d4103047b16b708c51f34a9546df290 100644 (file)
@@ -1614,7 +1614,7 @@ class Contact
         *
         * @param array $contact  contact array
         * @param string $size    Size of the avatar picture
-        * @return void
+        * @return string avatar URL
         */
        public static function getDefaultAvatar(array $contact, string $size)
        {
index c7699c2b79e8300a2cf57bc039ce665160f99c43..00af522ca5e4f06a1b0105fc3d4d5cfd48eccee8 100644 (file)
@@ -22,6 +22,7 @@
 namespace Friendica\Model\Storage;
 
 use \BadMethodCallException;
+use Friendica\DI;
 
 /**
  * System resource storage class
@@ -41,6 +42,16 @@ class SystemResource implements IStorage
         */
        public function get(string $filename)
        {
+               $parts = parse_url($filename);
+               if (!empty($parts['scheme']) && !empty($parts['host'])) {
+                       $curlResult = DI::httpRequest()->get($filename);
+                       if ($curlResult->isSuccess()) {
+                               return $curlResult->getBody();
+                       } else {
+                               return "";
+                       }
+               }
+
                $folder = dirname($filename);
                if (!in_array($folder, self::VALID_FOLDERS)) {
                        return "";
index 5faaafe40c813c6f5e675d61469636c7ba93af46..f193f9c6b0e233ee0425159c1adf0dbbc4362b8a 100644 (file)
@@ -44,11 +44,6 @@ class Photo extends BaseModule
        public static function rawContent(array $parameters = [])
        {
                $totalstamp = microtime(true);
-               $a = DI::app();
-               // @TODO: Replace with parameter from router
-               if ($a->argc <= 1 || $a->argc > 4) {
-                       throw new \Friendica\Network\HTTPException\BadRequestException();
-               }
 
                if (isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) {
                        header("HTTP/1.1 304 Not Modified");
@@ -69,30 +64,27 @@ class Photo extends BaseModule
                $customsize = 0;
                $photo = false;
                $scale = null;
-               // @TODO: Replace with parameter from router
                $stamp = microtime(true);
-               switch($a->argc) {
-                       case 4:
-                               $customsize = intval($a->argv[2]);
-                               $uid = MPhoto::stripExtension($a->argv[3]);
-                               $photo = self::getAvatar($uid, $a->argv[1]);
-                               break;
-                       case 3:
-                               $uid = MPhoto::stripExtension($a->argv[2]);
-                               $photo = self::getAvatar($uid, $a->argv[1]);
-                               break;
-                       case 2:
-                               $photoid = MPhoto::stripExtension($a->argv[1]);
-                               $scale = 0;
-                               if (substr($photoid, -2, 1) == "-") {
-                                       $scale = intval(substr($photoid, -1, 1));
-                                       $photoid = substr($photoid, 0, -2);
-                               }
-                               $photo = MPhoto::getPhoto($photoid, $scale);
-                               if ($photo === false) {
-                                       throw new \Friendica\Network\HTTPException\NotFoundException(DI::l10n()->t('The Photo with id %s is not available.', $photoid));
-                               }
-                               break;
+               if (!empty($parameters['customsize'])) {
+                       $customsize = intval($parameters['customsize']);
+                       $uid = MPhoto::stripExtension($parameters['name']);
+                       $photo = self::getAvatar($uid, $parameters['type']);
+               } elseif (!empty($parameters['type'])) {
+                       $uid = MPhoto::stripExtension($parameters['name']);
+                       $photo = self::getAvatar($uid, $parameters['type']);
+               } elseif (!empty($parameters['name'])) {
+                       $photoid = MPhoto::stripExtension($parameters['name']);
+                       $scale = 0;
+                       if (substr($photoid, -2, 1) == "-") {
+                               $scale = intval(substr($photoid, -1, 1));
+                               $photoid = substr($photoid, 0, -2);
+                       }
+                       $photo = MPhoto::getPhoto($photoid, $scale);
+                       if ($photo === false) {
+                               throw new \Friendica\Network\HTTPException\NotFoundException(DI::l10n()->t('The Photo with id %s is not available.', $photoid));
+                       }
+               } else {
+                       throw new \Friendica\Network\HTTPException\BadRequestException();
                }
                $fetch = microtime(true) - $stamp;
 
@@ -160,6 +152,36 @@ class Photo extends BaseModule
        private static function getAvatar($uid, $type="avatar")
        {
                switch($type) {
+                       case "contact":
+                               $contact = Contact::getById($uid, ['uid', 'url', 'avatar', 'photo']);
+                               if (empty($contact)) {
+                                       return false;
+                               }
+                               If (($contact['uid'] != 0) && empty($contact['photo']) && empty($contact['avatar'])) {
+                                       $contact = Contact::getByURL($contact['url'], false, ['avatar', 'photo']);
+                               }
+                               if (!empty($contact['photo'])) {
+                                       $url = $contact['photo'];
+                               } elseif (!empty($contact['avatar'])) {
+                                       $url = $contact['avatar'];
+                               } else {
+                                       $url = DI::baseUrl() . Contact::DEFAULT_AVATAR_PHOTO;
+                               }
+                               return MPhoto::createPhotoForSystemResource($url);
+                       case "header":
+                               $contact = Contact::getById($uid, ['uid', 'url', 'header']);
+                               if (empty($contact)) {
+                                       return false;
+                               }
+                               If (($contact['uid'] != 0) && empty($contact['header'])) {
+                                       $contact = Contact::getByURL($contact['url'], false, ['header']);
+                               }
+                               if (!empty($contact['header'])) {
+                                       $url = $contact['header'];
+                               } else {
+                                       $url = DI::baseUrl() . '/images/blank.png';
+                               }
+                               return MPhoto::createPhotoForSystemResource($url);
                        case "profile":
                        case "custom":
                                $scale = 4;
index 9b5639949d20e7622a6eb58edc8296c3d6b12f28..5104fde1f1170f9f19033d635386c813f84a8c3c 100644 (file)
@@ -29,7 +29,6 @@ use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Model\Contact;
 use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Proxy;
 
 /**
  * Class Account
@@ -114,9 +113,9 @@ class Account extends BaseDataTransferObject
 
                $this->note            = BBCode::convert($publicContact['about'], false);
                $this->url             = $publicContact['url'];
-               $this->avatar          = ($userContact['photo'] ?? $publicContact['photo']) ?: Proxy::proxifyUrl($userContact['avatar'] ?? $publicContact['avatar']);
+               $this->avatar          = (($userContact['photo'] ?? '') ?: $publicContact['photo']) ?: DI::baseUrl() . '/photo/contact/'. (($userContact['id'] ?? 0) ?: $publicContact['id']);
                $this->avatar_static   = $this->avatar;
-               $this->header          = Proxy::proxifyUrl($userContact['header'] ?? $publicContact['header'] ?? '') ?: DI::baseUrl() . '/images/blank.png'; 
+               $this->header          = DI::baseUrl() . '/photo/header/'. (($userContact['id'] ?? 0) ?: $publicContact['id']);
                $this->header_static   = $this->header;
                $this->followers_count = $apcontact['followers_count'] ?? 0;
                $this->following_count = $apcontact['following_count'] ?? 0;
index 815d833ada6e979948ff082edc9fae36e2f0a1fb..6bc17c41411edb56bf1f4138c5e0f013a1eab8da 100644 (file)
@@ -363,9 +363,9 @@ return [
        '/permission/tooltip/{type}/{id:\d+}' => [Module\PermissionTooltip::class, [R::GET]],
 
        '/photo' => [
-               '/{name}'                    => [Module\Photo::class, [R::GET]],
-               '/{type}/{name}'             => [Module\Photo::class, [R::GET]],
-               '/{type}/{customize}/{name}' => [Module\Photo::class, [R::GET]],
+               '/{name}'                     => [Module\Photo::class, [R::GET]],
+               '/{type}/{name}'              => [Module\Photo::class, [R::GET]],
+               '/{type}/{customsize}/{name}' => [Module\Photo::class, [R::GET]],
        ],
 
        '/pretheme'          => [Module\ThemeDetails::class, [R::GET]],