Merge pull request #14697 from annando/updatecontact

Only update a contact when it should be updated
This commit is contained in:
Tobias Diekershoff 2025-01-14 07:36:33 +01:00 committed by GitHub
commit f3106097af
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 19 additions and 17 deletions

View file

@ -27,6 +27,7 @@ use Friendica\Network\HTTPException;
use Friendica\Network\HTTPException\NotModifiedException;
use Friendica\Object\Image;
use Friendica\Security\OpenWebAuth;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Images;
use Friendica\Util\ParseUrl;
use Friendica\Util\Proxy;
@ -64,19 +65,19 @@ class Photo extends BaseApi
OpenWebAuth::addVisitorCookieForHTTPSigner($this->server);
$customsize = 0;
$customsize = 0;
$square_resize = true;
$scale = null;
$stamp = microtime(true);
$scale = null;
$stamp = microtime(true);
// User avatar
if (!empty($this->parameters['type'])) {
if (!empty($this->parameters['customsize'])) {
$customsize = intval($this->parameters['customsize']);
$customsize = intval($this->parameters['customsize']);
$square_resize = !in_array($this->parameters['type'], ['media', 'preview']);
}
if (!empty($this->parameters['guid'])) {
$guid = $this->parameters['guid'];
$guid = $this->parameters['guid'];
$account = DBA::selectFirst('account-user-view', ['id'], ['guid' => $guid], ['order' => ['uid' => true]]);
if (empty($account)) {
throw new HTTPException\NotFoundException();
@ -91,7 +92,7 @@ class Photo extends BaseApi
if (!empty($this->parameters['nickname_ext'])) {
$nickname = pathinfo($this->parameters['nickname_ext'], PATHINFO_FILENAME);
$user = User::getByNickname($nickname, ['uid']);
$user = User::getByNickname($nickname, ['uid']);
if (empty($user)) {
throw new HTTPException\NotFoundException();
}
@ -111,9 +112,9 @@ class Photo extends BaseApi
$photo = self::getPhotoById($id, $this->parameters['type'], $customsize ?: Proxy::PIXEL_SMALL);
} else {
$photoid = pathinfo($this->parameters['name'], PATHINFO_FILENAME);
$scale = 0;
$scale = 0;
if (substr($photoid, -2, 1) == '-') {
$scale = intval(substr($photoid, -1, 1));
$scale = intval(substr($photoid, -1, 1));
$photoid = substr($photoid, 0, -2);
}
@ -175,7 +176,7 @@ class Photo extends BaseApi
Logger::warning('Invalid photo', ['id' => $photo['id']]);
if (in_array($photo['backend-class'], [ExternalResource::NAME])) {
$reference = json_decode($photo['backend-ref'], true);
$error = DI::l10n()->t('Invalid external resource with url %s.', $reference['url']);
$error = DI::l10n()->t('Invalid external resource with url %s.', $reference['url']);
} else {
$error = DI::l10n()->t('Invalid photo with id %s.', $photo['id']);
}
@ -229,13 +230,13 @@ class Photo extends BaseApi
$output = microtime(true) - $stamp;
$total = microtime(true) - $totalstamp;
$rest = $total - ($fetch + $data + $checksum + $output);
$rest = $total - ($fetch + $data + $checksum + $output);
if (!is_null($scale) && ($scale < 4)) {
Logger::debug('Performance:', [
'scale' => $scale, 'resource' => $photo['resource-id'],
'total' => number_format($total, 3), 'fetch' => number_format($fetch, 3),
'data' => number_format($data, 3), 'checksum' => number_format($checksum, 3),
'scale' => $scale, 'resource' => $photo['resource-id'],
'total' => number_format($total, 3), 'fetch' => number_format($fetch, 3),
'data' => number_format($data, 3), 'checksum' => number_format($checksum, 3),
'output' => number_format($output, 3), 'rest' => number_format($rest, 3)
]);
}
@ -297,7 +298,7 @@ class Photo extends BaseApi
return MPhoto::createPhotoForExternalResource($link['url'], (int)DI::userSession()->getLocalUserId(), $link['mimetype'] ?? '', $link['blurhash'] ?? '', $link['width'] ?? 0, $link['height'] ?? 0);
case 'contact':
$fields = ['uid', 'uri-id', 'url', 'nurl', 'avatar', 'photo', 'blurhash', 'xmpp', 'addr', 'network', 'failed', 'updated'];
$fields = ['uid', 'uri-id', 'url', 'nurl', 'avatar', 'photo', 'blurhash', 'xmpp', 'addr', 'network', 'failed', 'updated', 'next-update'];
$contact = Contact::getById($id, $fields);
if (empty($contact)) {
return false;
@ -355,10 +356,10 @@ class Photo extends BaseApi
} else {
// Only update federated accounts that hadn't failed before and hadn't been updated recently
$update = in_array($contact['network'], Protocol::FEDERATED) && !$contact['failed']
&& ((time() - strtotime($contact['updated']) > 86400));
&& ($contact['next-update'] < DateTimeFormat::utcNow());
if ($update) {
$curlResult = DI::httpClient()->head($url, [HttpClientOptions::ACCEPT_CONTENT => HttpClientAccept::IMAGE, HttpClientOptions::REQUEST => HttpClientRequest::CONTENTTYPE]);
$update = !$curlResult->isSuccess() && ($curlResult->getReturnCode() == 404);
$update = !$curlResult->isSuccess() && ($curlResult->getReturnCode() == 404);
Logger::debug('Got return code for avatar', ['return code' => $curlResult->getReturnCode(), 'cid' => $id, 'url' => $contact['url'], 'avatar' => $url]);
}
if ($update) {
@ -401,7 +402,7 @@ class Photo extends BaseApi
}
return MPhoto::createPhotoForExternalResource($url, 0, $mimetext, $contact['blurhash'] ?? null, $customsize, $customsize);
case 'header':
$fields = ['uid', 'url', 'header', 'network', 'gsid'];
$fields = ['uid', 'url', 'header', 'network', 'gsid'];
$contact = Contact::getById($id, $fields);
if (empty($contact)) {
return false;

View file

@ -51,6 +51,7 @@ class UpdateContact
return 0;
}
Logger::debug('Update contact', ['id' => $contact_id]);
return Worker::add($run_parameters, 'UpdateContact', $contact_id);
}
}