]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Post/Media.php
Fix null value passed to string functions deprecation notices
[friendica.git] / src / Model / Post / Media.php
index 6d0707743eed1876d09a2f9bf9b76b0e92dfe9ee..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
@@ -403,12 +446,6 @@ class Media
                // Simplify image codes
                $unshared_body = $body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $body);
 
-               // Only remove the shared data from "real" reshares
-               $shared = BBCode::fetchShareAttributes($body);
-               if (!empty($shared['guid'])) {
-                       $unshared_body = preg_replace("/\s*\[share .*?\].*?\[\/share\]\s*/ism", '', $body);
-               }
-
                $attachments = [];
                if (preg_match_all("#\[url=([^\]]+?)\]\s*\[img=([^\[\]]*)\]([^\[\]]*)\[\/img\]\s*\[/url\]#ism", $body, $pictures, PREG_SET_ORDER)) {
                        foreach ($pictures as $picture) {
@@ -485,13 +522,6 @@ class Media
         */
        public static function insertFromRelevantUrl(int $uriid, string $body)
        {
-               // Only remove the shared data from "real" reshares
-               $shared = BBCode::fetchShareAttributes($body);
-               if (!empty($shared['guid'])) {
-                       // Don't look at the shared content
-                       $body = preg_replace("/\s*\[share .*?\].*?\[\/share\]\s*/ism", '', $body);
-               }
-
                // Remove all hashtags and mentions
                $body = preg_replace("/([#@!])\[url\=(.*?)\](.*?)\[\/url\]/ism", '', $body);
 
@@ -521,9 +551,6 @@ class Media
         */
        public static function insertFromAttachmentData(int $uriid, string $body)
        {
-               // Don't look at the shared content
-               $body = preg_replace("/\s*\[share .*?\].*?\[\/share\]\s*/ism", '', $body);
-
                $data = BBCode::getAttachmentData($body);
                if (empty($data))  {
                        return;
@@ -615,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' => []];
 
@@ -651,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';