[ActivityPub] Add support for more attachments structures
authorHypolite Petovan <hypolite@mrpetovan.com>
Thu, 4 Jun 2020 19:51:14 +0000 (15:51 -0400)
committerHypolite Petovan <hypolite@mrpetovan.com>
Sun, 7 Jun 2020 19:41:11 +0000 (15:41 -0400)
- Add support for type: Page into [attachment], type: Link using href attribute
- Ensure Receiver::process* parameter is an array
- Remove superfluous eptiness check in JsonLD::fetchElementArray

src/Protocol/ActivityPub/Processor.php
src/Protocol/ActivityPub/Receiver.php
src/Util/JsonLD.php

index 2d385c0..d6ef34f 100644 (file)
@@ -94,39 +94,43 @@ class Processor
                }
 
                foreach ($activity['attachments'] as $attach) {
-                       $filetype = strtolower(substr($attach['mediaType'], 0, strpos($attach['mediaType'], '/')));
-                       if ($filetype == 'image') {
-                               if (!empty($activity['source']) && strpos($activity['source'], $attach['url'])) {
-                                       continue;
-                               }
-
-                               if (empty($attach['name'])) {
-                                       $item['body'] .= "\n[img]" . $attach['url'] . '[/img]';
-                               } else {
-                                       $item['body'] .= "\n[img=" . $attach['url'] . ']' . $attach['name'] . '[/img]';
-                               }
-                       } elseif ($filetype == 'audio') {
-                               if (!empty($activity['source']) && strpos($activity['source'], $attach['url'])) {
-                                       continue;
-                               }
-
-                               $item['body'] .= "\n[audio]" . $attach['url'] . '[/audio]';
-                       } elseif ($filetype == 'video') {
-                               if (!empty($activity['source']) && strpos($activity['source'], $attach['url'])) {
-                                       continue;
-                               }
-
-                               $item['body'] .= "\n[video]" . $attach['url'] . '[/video]';
-                       } else {
-                               if (!empty($item["attach"])) {
-                                       $item["attach"] .= ',';
-                               } else {
-                                       $item["attach"] = '';
-                               }
-                               if (!isset($attach['length'])) {
-                                       $attach['length'] = "0";
-                               }
-                               $item["attach"] .= '[attach]href="'.$attach['url'].'" length="'.$attach['length'].'" type="'.$attach['mediaType'].'" title="'.($attach['name'] ?? '') .'"[/attach]';
+                       switch ($attach['type']) {
+                               case 'link':
+                                       $item['body'] .= "\n[attachment type='link' url='" . $attach['url'] . "' title='" . ($attach['title'] ?? '') . "' image='" . ($attach['image'] ?? '') . "']" . ($attach['desc'] ?? '') . '[/attachment]';
+                                       break;
+                               default:
+                                       $filetype = strtolower(substr($attach['mediaType'], 0, strpos($attach['mediaType'], '/')));
+                                       if ($filetype == 'image') {
+                                               if (!empty($activity['source']) && strpos($activity['source'], $attach['url'])) {
+                                                       continue;
+                                               }
+
+                                               if (empty($attach['name'])) {
+                                                       $item['body'] .= "\n[img]" . $attach['url'] . '[/img]';
+                                               } else {
+                                                       $item['body'] .= "\n[img=" . $attach['url'] . ']' . $attach['name'] . '[/img]';
+                                               }
+                                       } elseif ($filetype == 'audio') {
+                                               if (!empty($activity['source']) && strpos($activity['source'], $attach['url'])) {
+                                                       continue;
+                                               }
+
+                                               $item['body'] .= "\n[audio]" . $attach['url'] . '[/audio]';
+                                       } elseif ($filetype == 'video') {
+                                               if (!empty($activity['source']) && strpos($activity['source'], $attach['url'])) {
+                                                       continue;
+                                               }
+
+                                               $item['body'] .= "\n[video]" . $attach['url'] . '[/video]';
+                                       } else {
+                                               if (!empty($item["attach"])) {
+                                                       $item["attach"] .= ',';
+                                               } else {
+                                                       $item["attach"] = '';
+                                               }
+
+                                               $item["attach"] .= '[attach]href="' . $attach['url'] . '" length="' . ($attach['length'] ?? '0') . '" type="' . $attach['mediaType'] . '" title="' . ($attach['name'] ?? '') . '"[/attach]';
+                                       }
                        }
                }
 
index 603d06f..7a0a9c1 100644 (file)
@@ -821,14 +821,10 @@ class Receiver
         *
         * @return array with tags in a simplified format
         */
-       private static function processTags($tags)
+       private static function processTags(array $tags)
        {
                $taglist = [];
 
-               if (empty($tags)) {
-                       return [];
-               }
-
                foreach ($tags as $tag) {
                        if (empty($tag)) {
                                continue;
@@ -854,17 +850,13 @@ class Receiver
        /**
         * Convert emojis from JSON-LD format into a simplified format
         *
-        * @param $emojis
+        * @param array $emojis
         * @return array with emojis in a simplified format
         */
-       private static function processEmojis($emojis)
+       private static function processEmojis(array $emojis)
        {
                $emojilist = [];
 
-               if (empty($emojis)) {
-                       return [];
-               }
-
                foreach ($emojis as $emoji) {
                        if (empty($emoji) || (JsonLD::fetchElement($emoji, '@type') != 'toot:Emoji') || empty($emoji['as:icon'])) {
                                continue;
@@ -876,6 +868,7 @@ class Receiver
 
                        $emojilist[] = $element;
                }
+
                return $emojilist;
        }
 
@@ -886,24 +879,62 @@ class Receiver
         *
         * @return array with attachmants in a simplified format
         */
-       private static function processAttachments($attachments)
+       private static function processAttachments(array $attachments)
        {
                $attachlist = [];
 
-               if (empty($attachments)) {
-                       return [];
-               }
+               // Removes empty values
+               $attachments = array_filter($attachments);
 
                foreach ($attachments as $attachment) {
-                       if (empty($attachment)) {
-                               continue;
-                       }
+                       switch (JsonLD::fetchElement($attachment, '@type')) {
+                               case 'as:Page':
+                                       $pageUrl = null;
+                                       $pageImage = null;
+
+                                       $urls = JsonLD::fetchElementArray($attachment, 'as:url');
+                                       foreach ($urls as $url) {
+                                               // Single scalar URL case
+                                               if (is_string($url)) {
+                                                       $pageUrl = $url;
+                                                       continue;
+                                               }
+
+                                               $href = JsonLD::fetchElement($url, 'as:href', '@id');
+                                               $mediaType = JsonLD::fetchElement($url, 'as:mediaType', '@value');
+                                               if (Strings::startsWith($mediaType, 'image')) {
+                                                       $pageImage = $href;
+                                               } else {
+                                                       $pageUrl = $href;
+                                               }
+                                       }
 
-                       $attachlist[] = ['type' => str_replace('as:', '', JsonLD::fetchElement($attachment, '@type')),
-                               'mediaType' => JsonLD::fetchElement($attachment, 'as:mediaType', '@value'),
-                               'name' => JsonLD::fetchElement($attachment, 'as:name', '@value'),
-                               'url' => JsonLD::fetchElement($attachment, 'as:url', '@id')];
+                                       $attachlist[] = [
+                                               'type'  => 'link',
+                                               'title' => JsonLD::fetchElement($attachment, 'as:name', '@value'),
+                                               'desc'  => JsonLD::fetchElement($attachment, 'as:summary', '@value'),
+                                               'url'   => $pageUrl,
+                                               'image' => $pageImage,
+                                       ];
+                                       break;
+                               case 'as:Link':
+                                       $attachlist[] = [
+                                               'type' => str_replace('as:', '', JsonLD::fetchElement($attachment, '@type')),
+                                               'mediaType' => JsonLD::fetchElement($attachment, 'as:mediaType', '@value'),
+                                               'name' => JsonLD::fetchElement($attachment, 'as:name', '@value'),
+                                               'url' => JsonLD::fetchElement($attachment, 'as:href', '@id')
+                                       ];
+                                       break;
+                               default:
+                                       $attachlist[] = [
+                                               'type' => str_replace('as:', '', JsonLD::fetchElement($attachment, '@type')),
+                                               'mediaType' => JsonLD::fetchElement($attachment, 'as:mediaType', '@value'),
+                                               'name' => JsonLD::fetchElement($attachment, 'as:name', '@value'),
+                                               'url' => JsonLD::fetchElement($attachment, 'as:url', '@id')
+                                       ];
+                       }
                }
+
                return $attachlist;
        }
 
@@ -1086,9 +1117,9 @@ class Receiver
                $object_data['latitude'] = JsonLD::fetchElement($object_data, 'latitude', '@value');
                $object_data['longitude'] = JsonLD::fetchElement($object, 'as:location', 'as:longitude', '@type', 'as:Place');
                $object_data['longitude'] = JsonLD::fetchElement($object_data, 'longitude', '@value');
-               $object_data['attachments'] = self::processAttachments(JsonLD::fetchElementArray($object, 'as:attachment'));
-               $object_data['tags'] = self::processTags(JsonLD::fetchElementArray($object, 'as:tag'));
-               $object_data['emojis'] = self::processEmojis(JsonLD::fetchElementArray($object, 'as:tag', 'toot:Emoji'));
+               $object_data['attachments'] = self::processAttachments(JsonLD::fetchElementArray($object, 'as:attachment') ?? []);
+               $object_data['tags'] = self::processTags(JsonLD::fetchElementArray($object, 'as:tag') ?? []);
+               $object_data['emojis'] = self::processEmojis(JsonLD::fetchElementArray($object, 'as:tag', 'toot:Emoji') ?? []);
                $object_data['generator'] = JsonLD::fetchElement($object, 'as:generator', 'as:name', '@type', 'as:Application');
                $object_data['generator'] = JsonLD::fetchElement($object_data, 'generator', '@value');
                $object_data['alternate-url'] = JsonLD::fetchElement($object, 'as:url', '@id');
index 878cd71..2649e90 100644 (file)
@@ -175,10 +175,6 @@ class JsonLD
         */
        public static function fetchElementArray($array, $element, $key = null)
        {
-               if (empty($array)) {
-                       return null;
-               }
-
                if (!isset($array[$element])) {
                        return null;
                }