From 4cd2fde6f2bd5d22108c0194bd0336a637d60c84 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 5 Feb 2024 22:21:58 +0000 Subject: [PATCH 1/2] Two new search options "media:card" and "media:post" --- doc/Channels.md | 2 ++ src/Model/Post/Engagement.php | 29 ++++++++++++++++++++++------- src/Model/Post/SearchIndex.php | 6 +++--- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/doc/Channels.md b/doc/Channels.md index 2e00e1a1c6..bc47f631ab 100644 --- a/doc/Channels.md +++ b/doc/Channels.md @@ -75,6 +75,8 @@ Alternatives are presented with "|". * media:image | media:photo | media:picture - The post contains an image * media:video - The post contains a video * media:audio - The post contains audio + * media:card - The post contains a link preview card + * media:post - The post links another post, means it is a quoted post * network | net - Use this to include or exclude some networks from your channel. * network:apub | network:activitypub - ActivityPub (Used by the systems in the Fediverse) * network:dfrn | network:friendica - Legacy Friendica protocol. Nowayday Friendica mostly uses ActivityPub. diff --git a/src/Model/Post/Engagement.php b/src/Model/Post/Engagement.php index e4647f43ed..d13fef7c4b 100644 --- a/src/Model/Post/Engagement.php +++ b/src/Model/Post/Engagement.php @@ -60,8 +60,10 @@ class Engagement return 0; } - $parent = Post::selectFirst(['uri-id', 'created', 'author-id', 'owner-id', 'uid', 'private', 'contact-contact-type', 'language', 'network', - 'title', 'content-warning', 'body', 'author-contact-type', 'author-nick', 'author-addr', 'author-gsid', 'owner-contact-type', 'owner-nick', 'owner-addr', 'owner-gsid'], + $parent = Post::selectFirst(['uri-id', 'created', 'uid', 'private', 'quote-uri-id', + 'contact-contact-type', 'network', 'title', 'content-warning', 'body', 'language', + 'author-id', 'author-contact-type', 'author-nick', 'author-addr', 'author-gsid', + 'owner-id', 'owner-contact-type', 'owner-nick', 'owner-addr', 'owner-gsid'], ['uri-id' => $item['parent-uri-id']]); if ($parent['created'] < self::getCreationDateLimit(false)) { @@ -89,7 +91,7 @@ class Engagement } } - $mediatype = self::getMediaType($item['parent-uri-id']); + $mediatype = self::getMediaType($item['parent-uri-id'], $parent['quote-uri-id']); if (!$store) { $store = !empty($mediatype); @@ -166,6 +168,7 @@ class Engagement 'owner-nick' => $author['nick'], 'owner-addr' => $author['addr'], 'owner-gsid' => $author['gsid'], + 'quote-uri-id' => 0, ]; foreach ($receivers as $receiver) { @@ -187,12 +190,12 @@ class Engagement } $post = Post::selectFirstPost(['uri-id', 'network', 'title', 'content-warning', 'body', 'private', - 'author-id', 'author-contact-type', 'author-nick', 'author-addr', 'author-gsid', + 'author-id', 'author-contact-type', 'author-nick', 'author-addr', 'author-gsid', 'quote-uri-id', 'owner-id', 'owner-contact-type', 'owner-nick', 'owner-addr', 'owner-gsid'], ['uri-id' => $uri_id]); if (empty($post['uri-id'])) { return ''; } - $mediatype = self::getMediaType($uri_id); + $mediatype = self::getMediaType($uri_id, $post['quote-uri-id']); return self::getSearchTextForItem($post, $mediatype); } @@ -301,6 +304,14 @@ class Engagement $body .= ' media_audio'; } + if ($mediatype & 8) { + $body .= ' media_card'; + } + + if ($mediatype & 16) { + $body .= ' media_post'; + } + $body .= ' ' . $item['title'] . ' ' . $item['content-warning'] . ' ' . $item['body']; return BBCode::toSearchText($body, $item['uri-id']); @@ -331,10 +342,10 @@ class Engagement return $text; } - public static function getMediaType(int $uri_id): int + public static function getMediaType(int $uri_id, int $quote_uri_id = null): int { $media = Post\Media::getByURIId($uri_id); - $type = 0; + $type = !empty($quote_uri_id) ? 16 : 0; foreach ($media as $entry) { if ($entry['type'] == Post\Media::IMAGE) { $type = $type | 1; @@ -342,6 +353,10 @@ class Engagement $type = $type | 2; } elseif ($entry['type'] == Post\Media::AUDIO) { $type = $type | 4; + } elseif ($entry['type'] == Post\Media::HTML) { + $type = $type | 8; + } elseif ($entry['type'] == Post\Media::ACTIVITY) { + $type = $type | 16; } } return $type; diff --git a/src/Model/Post/SearchIndex.php b/src/Model/Post/SearchIndex.php index 98a82cae63..554a1b90a7 100644 --- a/src/Model/Post/SearchIndex.php +++ b/src/Model/Post/SearchIndex.php @@ -47,13 +47,13 @@ class SearchIndex return; } - $item = Post::selectFirstPost(['created', 'owner-id', 'private', 'language', 'network', 'title', 'content-warning', 'body'], ['uri-id' => $uri_id]); + $item = Post::selectFirstPost(['created', 'owner-id', 'private', 'language', 'network', 'title', 'content-warning', 'body', 'quote-uri-id'], ['uri-id' => $uri_id]); $search = [ 'uri-id' => $uri_id, 'owner-id' => $item['owner-id'], - 'media-type' => Engagement::getMediaType($uri_id), - 'language' => !empty($item['language']) ? (array_key_first(json_decode($item['language'], true)) ?? L10n::UNDETERMINED_LANGUAGE) : L10n::UNDETERMINED_LANGUAGE, + 'media-type' => Engagement::getMediaType($uri_id, $item['quote-uri-id']), + 'language' => substr(!empty($item['language']) ? (array_key_first(json_decode($item['language'], true)) ?? L10n::UNDETERMINED_LANGUAGE) : L10n::UNDETERMINED_LANGUAGE, 0, 2), 'searchtext' => Post\Engagement::getSearchTextForUriId($uri_id, $refresh), 'size' => Engagement::getContentSize($item), 'created' => $item['created'], From d5bf3068848d3b4aca14a087737b47c82e4434bd Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 6 Feb 2024 06:34:16 +0000 Subject: [PATCH 2/2] We now use xonstants --- src/Model/Post/Engagement.php | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/Model/Post/Engagement.php b/src/Model/Post/Engagement.php index d13fef7c4b..e5de964d04 100644 --- a/src/Model/Post/Engagement.php +++ b/src/Model/Post/Engagement.php @@ -46,6 +46,12 @@ class Engagement 'network:activitypub' => 'network:apub', 'network:friendica' => 'network:dfrn', 'network:diaspora' => 'network:dspr', 'network:ostatus' => 'network:stat', 'network:discourse' => 'network:dscs', 'network:tumblr' => 'network:tmbl', 'network:bluesky' => 'network:bsky']; + const MEDIA_NONE = 0; + const MEDIA_IMAGE = 1; + const MEDIA_VIDEO = 2; + const MEDIA_AUDIO = 4; + const MEDIA_CARD = 8; + const MEDIA_POST = 16; /** * Store engagement data from an item array @@ -292,23 +298,23 @@ class Engagement $body .= ' language_' . array_key_first($languages); } - if ($mediatype & 1) { + if ($mediatype & self::MEDIA_IMAGE) { $body .= ' media_image'; } - if ($mediatype & 2) { + if ($mediatype & self::MEDIA_VIDEO) { $body .= ' media_video'; } - if ($mediatype & 4) { + if ($mediatype & self::MEDIA_AUDIO) { $body .= ' media_audio'; } - if ($mediatype & 8) { + if ($mediatype & self::MEDIA_CARD) { $body .= ' media_card'; } - if ($mediatype & 16) { + if ($mediatype & self::MEDIA_POST) { $body .= ' media_post'; } @@ -345,18 +351,18 @@ class Engagement public static function getMediaType(int $uri_id, int $quote_uri_id = null): int { $media = Post\Media::getByURIId($uri_id); - $type = !empty($quote_uri_id) ? 16 : 0; + $type = !empty($quote_uri_id) ? self::MEDIA_POST : self::MEDIA_NONE; foreach ($media as $entry) { if ($entry['type'] == Post\Media::IMAGE) { - $type = $type | 1; + $type = $type | self::MEDIA_IMAGE; } elseif ($entry['type'] == Post\Media::VIDEO) { - $type = $type | 2; + $type = $type | self::MEDIA_VIDEO; } elseif ($entry['type'] == Post\Media::AUDIO) { - $type = $type | 4; + $type = $type | self::MEDIA_AUDIO; } elseif ($entry['type'] == Post\Media::HTML) { - $type = $type | 8; + $type = $type | self::MEDIA_CARD; } elseif ($entry['type'] == Post\Media::ACTIVITY) { - $type = $type | 16; + $type = $type | self::MEDIA_POST; } } return $type;