From a18372325461b518959741d52c78076584e1c298 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 30 Oct 2022 10:02:01 +0000 Subject: [PATCH] Improved handling of contact links --- src/Model/Post/Media.php | 55 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/src/Model/Post/Media.php b/src/Model/Post/Media.php index 478097effa..c1d951cc3d 100644 --- a/src/Model/Post/Media.php +++ b/src/Model/Post/Media.php @@ -59,6 +59,7 @@ class Media const XML = 18; const PLAIN = 19; const ACTIVITY = 20; + const ACCOUNT = 21; const DOCUMENT = 128; /** @@ -222,6 +223,10 @@ class Media $media = self::addActivity($media); } + if (in_array($media['type'], [self::TEXT, self::APPLICATION, self::HTML, self::XML, self::PLAIN])) { + $media = self::addAccount($media); + } + if ($media['type'] == self::HTML) { $data = ParseUrl::getSiteinfoCached($media['url'], false); $media['preview'] = $data['images'][0]['src'] ?? null; @@ -268,8 +273,6 @@ class Media $media['mimetype'] = 'application/activity+json'; } elseif ($item['network'] == Protocol::DIASPORA) { $media['mimetype'] = 'application/xml'; - } else { - $media['mimetype'] = ''; } $contact = Contact::getById($item['author-id'], ['avatar', 'gsid']); @@ -281,7 +284,6 @@ class Media $media['media-uri-id'] = $item['uri-id']; $media['height'] = null; $media['width'] = null; - $media['size'] = null; $media['preview'] = null; $media['preview-height'] = null; $media['preview-width'] = null; @@ -298,6 +300,47 @@ class Media return $media; } + /** + * Adds the account type if the media entry is linked to an account + * + * @param array $media + * @return array + */ + private static function addAccount(array $media): array + { + $contact = Contact::getByURL($media['url'], false); + if (empty($contact) || ($contact['network'] == Protocol::PHANTOM)) { + return $media; + } + + if (in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN])) { + $media['mimetype'] = 'application/activity+json'; + } + + if (!empty($contact['gsid'])) { + $gserver = DBA::selectFirst('gserver', ['url', 'site_name'], ['id' => $contact['gsid']]); + } + + $media['type'] = self::ACCOUNT; + $media['media-uri-id'] = $contact['uri-id']; + $media['height'] = null; + $media['width'] = null; + $media['preview'] = null; + $media['preview-height'] = null; + $media['preview-width'] = null; + $media['description'] = $contact['about']; + $media['name'] = $contact['name']; + $media['author-url'] = $contact['url']; + $media['author-name'] = $contact['name']; + $media['author-image'] = $contact['avatar']; + $media['publisher-url'] = $gserver['url'] ?? null; + $media['publisher-name'] = $gserver['site_name'] ?? null; + $media['publisher-image'] = null; + + Logger::debug('Account detected', ['uri-id' => $media['uri-id'], 'url' => $media['url'], 'uri' => $contact['url']]); + return $media; + } + /** * Fetch media data from local resources * @param array $media @@ -635,6 +678,12 @@ class Media } } + // Currently these two types are ignored here. + // Posts are added differently and contacts are not displayed as attachments. + if (in_array($medium['type'], [self::ACCOUNT, self::ACTIVITY])) { + continue; + } + if (!empty($medium['preview'])) { $previews[] = $medium['preview']; }