API: Improved avatar handling

This commit is contained in:
Michael 2021-06-24 07:08:38 +00:00
parent a02426c08c
commit 96809b3fdd
5 changed files with 67 additions and 35 deletions

View file

@ -1614,7 +1614,7 @@ class Contact
* *
* @param array $contact contact array * @param array $contact contact array
* @param string $size Size of the avatar picture * @param string $size Size of the avatar picture
* @return void * @return string avatar URL
*/ */
public static function getDefaultAvatar(array $contact, string $size) public static function getDefaultAvatar(array $contact, string $size)
{ {

View file

@ -22,6 +22,7 @@
namespace Friendica\Model\Storage; namespace Friendica\Model\Storage;
use \BadMethodCallException; use \BadMethodCallException;
use Friendica\DI;
/** /**
* System resource storage class * System resource storage class
@ -41,6 +42,16 @@ class SystemResource implements IStorage
*/ */
public function get(string $filename) 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); $folder = dirname($filename);
if (!in_array($folder, self::VALID_FOLDERS)) { if (!in_array($folder, self::VALID_FOLDERS)) {
return ""; return "";

View file

@ -44,11 +44,6 @@ class Photo extends BaseModule
public static function rawContent(array $parameters = []) public static function rawContent(array $parameters = [])
{ {
$totalstamp = microtime(true); $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"])) { if (isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) {
header("HTTP/1.1 304 Not Modified"); header("HTTP/1.1 304 Not Modified");
@ -69,30 +64,27 @@ class Photo extends BaseModule
$customsize = 0; $customsize = 0;
$photo = false; $photo = false;
$scale = null; $scale = null;
// @TODO: Replace with parameter from router
$stamp = microtime(true); $stamp = microtime(true);
switch($a->argc) { if (!empty($parameters['customsize'])) {
case 4: $customsize = intval($parameters['customsize']);
$customsize = intval($a->argv[2]); $uid = MPhoto::stripExtension($parameters['name']);
$uid = MPhoto::stripExtension($a->argv[3]); $photo = self::getAvatar($uid, $parameters['type']);
$photo = self::getAvatar($uid, $a->argv[1]); } elseif (!empty($parameters['type'])) {
break; $uid = MPhoto::stripExtension($parameters['name']);
case 3: $photo = self::getAvatar($uid, $parameters['type']);
$uid = MPhoto::stripExtension($a->argv[2]); } elseif (!empty($parameters['name'])) {
$photo = self::getAvatar($uid, $a->argv[1]); $photoid = MPhoto::stripExtension($parameters['name']);
break; $scale = 0;
case 2: if (substr($photoid, -2, 1) == "-") {
$photoid = MPhoto::stripExtension($a->argv[1]); $scale = intval(substr($photoid, -1, 1));
$scale = 0; $photoid = substr($photoid, 0, -2);
if (substr($photoid, -2, 1) == "-") { }
$scale = intval(substr($photoid, -1, 1)); $photo = MPhoto::getPhoto($photoid, $scale);
$photoid = substr($photoid, 0, -2); if ($photo === false) {
} throw new \Friendica\Network\HTTPException\NotFoundException(DI::l10n()->t('The Photo with id %s is not available.', $photoid));
$photo = MPhoto::getPhoto($photoid, $scale); }
if ($photo === false) { } else {
throw new \Friendica\Network\HTTPException\NotFoundException(DI::l10n()->t('The Photo with id %s is not available.', $photoid)); throw new \Friendica\Network\HTTPException\BadRequestException();
}
break;
} }
$fetch = microtime(true) - $stamp; $fetch = microtime(true) - $stamp;
@ -160,6 +152,36 @@ class Photo extends BaseModule
private static function getAvatar($uid, $type="avatar") private static function getAvatar($uid, $type="avatar")
{ {
switch($type) { 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 "profile":
case "custom": case "custom":
$scale = 4; $scale = 4;

View file

@ -29,7 +29,6 @@ use Friendica\Database\DBA;
use Friendica\DI; use Friendica\DI;
use Friendica\Model\Contact; use Friendica\Model\Contact;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\Proxy;
/** /**
* Class Account * Class Account
@ -114,9 +113,9 @@ class Account extends BaseDataTransferObject
$this->note = BBCode::convert($publicContact['about'], false); $this->note = BBCode::convert($publicContact['about'], false);
$this->url = $publicContact['url']; $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->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->header_static = $this->header;
$this->followers_count = $apcontact['followers_count'] ?? 0; $this->followers_count = $apcontact['followers_count'] ?? 0;
$this->following_count = $apcontact['following_count'] ?? 0; $this->following_count = $apcontact['following_count'] ?? 0;

View file

@ -363,9 +363,9 @@ return [
'/permission/tooltip/{type}/{id:\d+}' => [Module\PermissionTooltip::class, [R::GET]], '/permission/tooltip/{type}/{id:\d+}' => [Module\PermissionTooltip::class, [R::GET]],
'/photo' => [ '/photo' => [
'/{name}' => [Module\Photo::class, [R::GET]], '/{name}' => [Module\Photo::class, [R::GET]],
'/{type}/{name}' => [Module\Photo::class, [R::GET]], '/{type}/{name}' => [Module\Photo::class, [R::GET]],
'/{type}/{customize}/{name}' => [Module\Photo::class, [R::GET]], '/{type}/{customsize}/{name}' => [Module\Photo::class, [R::GET]],
], ],
'/pretheme' => [Module\ThemeDetails::class, [R::GET]], '/pretheme' => [Module\ThemeDetails::class, [R::GET]],