]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Post/Media.php
Merge remote-tracking branch 'upstream/develop' into share-rework
[friendica.git] / src / Model / Post / Media.php
index 2b17614e89b1ce54ae4c425433d049138c8be149..8d86bc757cba596d8688ca5c93809edc688f6bad 100644 (file)
@@ -23,10 +23,12 @@ namespace Friendica\Model\Post;
 
 use Friendica\Content\Text\BBCode;
 use Friendica\Core\Logger;
+use Friendica\Core\Protocol;
 use Friendica\Core\System;
 use Friendica\Database\Database;
 use Friendica\Database\DBA;
 use Friendica\DI;
+use Friendica\Model\Contact;
 use Friendica\Model\Item;
 use Friendica\Model\Photo;
 use Friendica\Model\Post;
@@ -56,6 +58,7 @@ class Media
        const HTML        = 17;
        const XML         = 18;
        const PLAIN       = 19;
+       const ACTIVITY    = 20;
        const DOCUMENT    = 128;
 
        /**
@@ -85,6 +88,7 @@ class Media
                }
 
                $media = self::unsetEmptyFields($media);
+               $media = DI::dbaDefinition()->truncateFieldsForTable('post-media', $media);
 
                // We are storing as fast as possible to avoid duplicated network requests
                // when fetching additional information for pictures and other content.
@@ -94,6 +98,7 @@ class Media
 
                $media = self::fetchAdditionalData($media);
                $media = self::unsetEmptyFields($media);
+               $media = DI::dbaDefinition()->truncateFieldsForTable('post-media', $media);
 
                if (array_diff_assoc($media, $stored)) {
                        $result = DBA::insert('post-media', $media, Database::INSERT_UPDATE);
@@ -192,7 +197,7 @@ class Media
 
                if (($media['type'] == self::IMAGE) || ($filetype == 'image')) {
                        $imagedata = Images::getInfoFromURLCached($media['url']);
-                       if (!empty($imagedata)) {
+                       if ($imagedata) {
                                $media['mimetype'] = $imagedata['mime'];
                                $media['size'] = $imagedata['size'];
                                $media['width'] = $imagedata[0];
@@ -202,7 +207,7 @@ class Media
                        }
                        if (!empty($media['preview'])) {
                                $imagedata = Images::getInfoFromURLCached($media['preview']);
-                               if (!empty($imagedata)) {
+                               if ($imagedata) {
                                        $media['preview-width'] = $imagedata[0];
                                        $media['preview-height'] = $imagedata[1];
                                }
@@ -213,6 +218,10 @@ class Media
                        $media = self::addType($media);
                }
 
+               if (in_array($media['type'], [self::TEXT, self::APPLICATION, self::HTML, self::XML, self::PLAIN])) {
+                       $media = self::addActivity($media);
+               }
+
                if ($media['type'] == self::HTML) {
                        $data = ParseUrl::getSiteinfoCached($media['url'], false);
                        $media['preview'] = $data['images'][0]['src'] ?? null;
@@ -230,6 +239,65 @@ class Media
                return $media;
        }
 
+       /**
+        * Adds the activity type if the media entry is linked to an activity
+        *
+        * @param array $media
+        * @return array
+        */
+       private static function addActivity(array $media): array
+       {
+               $id = Item::fetchByLink($media['url']);
+               if (empty($id)) {
+                       return $media;
+               }
+
+               $item = Post::selectFirst([], ['id' => $id, 'network' => Protocol::FEDERATED]);
+               if (empty($item['id'])) {
+                       Logger::debug('Not a federated activity', ['id' => $id, 'uri-id' => $media['uri-id'], 'url' => $media['url']]);
+                       return $media;
+               }
+
+               if (!empty($item['plink']) && Strings::compareLink($item['plink'], $media['url']) &&
+                       parse_url($item['plink'], PHP_URL_HOST) != parse_url($item['uri'], PHP_URL_HOST)) {
+                       Logger::debug('Not a link to an activity', ['uri-id' => $media['uri-id'], 'url' => $media['url'], 'plink' => $item['plink'], 'uri' => $item['uri']]);
+                       return $media;
+               }
+
+               if (in_array($item['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN])) {
+                       $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['description'] = $item['body'];
+               $media['name'] = $item['title'];
+               $media['author-url'] = $item['author-link'];
+               $media['author-name'] = $item['author-name'];
+               $media['author-image'] = $contact['avatar'] ?? $item['author-avatar'];
+               $media['publisher-url'] = $gserver['url'] ?? null;
+               $media['publisher-name'] = $gserver['site_name'] ?? null;
+               $media['publisher-image'] = null;
+
+               Logger::debug('Activity detected', ['uri-id' => $media['uri-id'], 'url' => $media['url'], 'plink' => $item['plink'], 'uri' => $item['uri']]);
+               return $media;
+       }
+
        /**
         * Fetch media data from local resources
         * @param array $media
@@ -338,7 +406,7 @@ class Media
                // 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);
+                       $unshared_body = BBCode::removeSharedData($body);
                }
 
                $attachments = [];
@@ -421,7 +489,7 @@ class Media
                $shared = BBCode::fetchShareAttributes($body);
                if (!empty($shared['guid'])) {
                        // Don't look at the shared content
-                       $body = preg_replace("/\s*\[share .*?\].*?\[\/share\]\s*/ism", '', $body);
+                       $body = BBCode::removeSharedData($body);
                }
 
                // Remove all hashtags and mentions
@@ -454,7 +522,7 @@ 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);
+               $body = BBCode::removeSharedData($body);
 
                $data = BBCode::getAttachmentData($body);
                if (empty($data))  {
@@ -646,11 +714,13 @@ class Media
        /**
         * Add media attachments to the body
         *
-        * @param int $uriid
+        * @param int    $uriid
         * @param string $body
+        * @param array  $types
+        *
         * @return string body
         */
-       public static function addAttachmentsToBody(int $uriid, string $body = ''): string
+       public static function addAttachmentsToBody(int $uriid, string $body = '', array $types = [self::IMAGE, self::AUDIO, self::VIDEO]): string
        {
                if (empty($body)) {
                        $item = Post::selectFirst(['body'], ['uri-id' => $uriid]);
@@ -663,7 +733,7 @@ class Media
 
                $body = preg_replace("/\s*\[attachment .*?\].*?\[\/attachment\]\s*/ism", '', $body);
 
-               foreach (self::getByURIId($uriid, [self::IMAGE, self::AUDIO, self::VIDEO]) as $media) {
+               foreach (self::getByURIId($uriid, $types) as $media) {
                        if (Item::containsLink($body, $media['preview'] ?? $media['url'], $media['type'])) {
                                continue;
                        }