]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Post/Media.php
Merge branch 'develop' into new_image_presentation
[friendica.git] / src / Model / Post / Media.php
index 478097effa80d06c278da05ba7e1a40ae13ea734..62590594bea450fc2c851bc6504d0adb7cc46bc8 100644 (file)
@@ -59,6 +59,7 @@ class Media
        const XML         = 18;
        const PLAIN       = 19;
        const ACTIVITY    = 20;
+       const ACCOUNT     = 21;
        const DOCUMENT    = 128;
 
        /**
@@ -116,7 +117,7 @@ class Media
         */
        private static function unsetEmptyFields(array $media): array
        {
-               $fields = ['mimetype', 'height', 'width', 'size', 'preview', 'preview-height', 'preview-width', 'description'];
+               $fields = ['mimetype', 'height', 'width', 'size', 'preview', 'preview-height', 'preview-width', 'blurhash', 'description'];
                foreach ($fields as $field) {
                        if (empty($media[$field])) {
                                unset($media[$field]);
@@ -202,6 +203,7 @@ class Media
                                $media['size'] = $imagedata['size'];
                                $media['width'] = $imagedata[0];
                                $media['height'] = $imagedata[1];
+                               $media['blurhash'] = $imagedata['blurhash'] ?? null;
                        } else {
                                Logger::notice('No image data', ['media' => $media]);
                        }
@@ -222,11 +224,16 @@ 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;
                        $media['preview-height'] = $data['images'][0]['height'] ?? null;
                        $media['preview-width'] = $data['images'][0]['width'] ?? null;
+                       $media['blurhash'] = $data['images'][0]['blurhash'] ?? null;
                        $media['description'] = $data['text'] ?? null;
                        $media['name'] = $data['title'] ?? null;
                        $media['author-url'] = $data['author_url'] ?? null;
@@ -268,23 +275,21 @@ 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;
+               $media['blurhash'] = null;
                $media['description'] = $item['body'];
                $media['name'] = $item['title'];
                $media['author-url'] = $item['author-link'];
@@ -298,6 +303,48 @@ 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['blurhash'] = 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
@@ -314,6 +361,7 @@ class Media
                        $media['size'] = $photo['datasize'];
                        $media['width'] = $photo['width'];
                        $media['height'] = $photo['height'];
+                       $media['blurhash'] = $photo['blurhash'];
                }
 
                if (!preg_match('|.*?/photo/(.*[a-fA-F0-9])\-(.*[0-9])\..*[\w]|', $media['preview'] ?? '', $matches)) {
@@ -599,12 +647,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 +682,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';