]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Post/Media.php
Merge pull request #12277 from nupplaphil/mod/fbrowser
[friendica.git] / src / Model / Post / Media.php
index 478097effa80d06c278da05ba7e1a40ae13ea734..854e5d8f91335e435e08a1db60ec47af69463954 100644 (file)
@@ -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,20 +273,17 @@ 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']);
                if (!empty($contact['gsid'])) {
                        $gserver = DBA::selectFirst('gserver', ['url', 'site_name'], ['id' => $contact['gsid']]);
                }
-               
+
                $media['type'] = self::ACTIVITY;
                $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
@@ -599,12 +642,11 @@ class Media
         * Split the attachment media in the three segments "visual", "link" and "additional"
         *
         * @param int    $uri_id URI id
-        * @param string $guid GUID
         * @param array  $links list of links that shouldn't be added
         * @param bool   $has_media
         * @return array attachments
         */
-       public static function splitAttachments(int $uri_id, string $guid = '', array $links = [], bool $has_media = true): array
+       public static function splitAttachments(int $uri_id, array $links = [], bool $has_media = true): array
        {
                $attachments = ['visual' => [], 'link' => [], 'additional' => []];
 
@@ -635,11 +677,17 @@ 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'];
                        }
 
-                       $type = explode('/', current(explode(';', $medium['mimetype'])));
+                       $type = explode('/', explode(';', $medium['mimetype'] ?? '')[0]);
                        if (count($type) < 2) {
                                Logger::info('Unknown MimeType', ['type' => $type, 'media' => $medium]);
                                $filetype = 'unkn';