From 85554bb6fd2dc0bae3f7323bc2b687fee02e0336 Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Sat, 1 May 2021 08:59:14 +0000
Subject: [PATCH] Twitter: Attachments are stripped from the body / Posting
 connectors: Add attachments to the body

---
 diaspora/diaspora.php   |   3 ++
 dwpost/dwpost.php       |   3 ++
 libertree/libertree.php |   3 ++
 ljpost/ljpost.php       |   3 ++
 pumpio/pumpio.php       |   2 +
 statusnet/statusnet.php |   2 +
 tumblr/tumblr.php       |   3 ++
 twitter/twitter.php     | 112 ++++++++++++----------------------------
 wppost/wppost.php       |   4 +-
 9 files changed, 56 insertions(+), 79 deletions(-)

diff --git a/diaspora/diaspora.php b/diaspora/diaspora.php
index 77aef3af..599e5223 100644
--- a/diaspora/diaspora.php
+++ b/diaspora/diaspora.php
@@ -18,6 +18,7 @@ use Friendica\Core\Session;
 use Friendica\Database\DBA;
 use Friendica\Core\Worker;
 use Friendica\DI;
+use Friendica\Model\Post;
 
 function diaspora_install()
 {
@@ -197,6 +198,8 @@ function diaspora_send(App $a, array &$b)
 		return;
 	}
 
+	$b['body'] = Post\Media::addAttachmentsToBody($b['uri-id'], $b['body']);
+
 	// Dont't post if the post doesn't belong to us.
 	// This is a check for forum postings
 	$self = DBA::selectFirst('contact', ['id'], ['uid' => $b['uid'], 'self' => true]);
diff --git a/dwpost/dwpost.php b/dwpost/dwpost.php
index da35aa0f..ce4d9096 100644
--- a/dwpost/dwpost.php
+++ b/dwpost/dwpost.php
@@ -14,6 +14,7 @@ use Friendica\Core\Hook;
 use Friendica\Core\Logger;
 use Friendica\Database\DBA;
 use Friendica\DI;
+use Friendica\Model\Post;
 use Friendica\Model\Tag;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\XML;
@@ -159,6 +160,8 @@ function dwpost_send(App $a, array &$b)
 		return;
 	}
 
+	$b['body'] = Post\Media::addAttachmentsToBody($b['uri-id'], $b['body']);
+
 	/*
 	 * dreamwidth post in the LJ user's timezone.
 	 * Hopefully the person's Friendica account
diff --git a/libertree/libertree.php b/libertree/libertree.php
index 1062ab5a..a38a8582 100644
--- a/libertree/libertree.php
+++ b/libertree/libertree.php
@@ -12,6 +12,7 @@ use Friendica\Core\Hook;
 use Friendica\Core\Logger;
 use Friendica\Database\DBA;
 use Friendica\DI;
+use Friendica\Model\Post;
 
 function libertree_install()
 {
@@ -191,6 +192,8 @@ function libertree_send(&$a,&$b) {
 		return;
 	}
 
+	$b['body'] = Post\Media::addAttachmentsToBody($b['uri-id'], $b['body']);
+
 	$ltree_api_token = DI::pConfig()->get($b['uid'],'libertree','libertree_api_token');
 	$ltree_url = DI::pConfig()->get($b['uid'],'libertree','libertree_url');
 	$ltree_blog = "$ltree_url/api/v1/posts/create/?token=$ltree_api_token";
diff --git a/ljpost/ljpost.php b/ljpost/ljpost.php
index 0d061008..be831fa5 100644
--- a/ljpost/ljpost.php
+++ b/ljpost/ljpost.php
@@ -12,6 +12,7 @@ use Friendica\Content\Text\BBCode;
 use Friendica\Core\Hook;
 use Friendica\Core\Logger;
 use Friendica\DI;
+use Friendica\Model\Post;
 use Friendica\Model\Tag;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\XML;
@@ -153,6 +154,8 @@ function ljpost_send(&$a,&$b) {
     if($b['parent'] != $b['id'])
         return;
 
+	$b['body'] = Post\Media::addAttachmentsToBody($b['uri-id'], $b['body']);
+
 	// LiveJournal post in the LJ user's timezone.
 	// Hopefully the person's Friendica account
 	// will be set to the same thing.
diff --git a/pumpio/pumpio.php b/pumpio/pumpio.php
index 8e60f46d..5f03c6c5 100644
--- a/pumpio/pumpio.php
+++ b/pumpio/pumpio.php
@@ -436,6 +436,8 @@ function pumpio_send(App $a, array &$b)
 
 	Logger::log("pumpio_send: parameter ".print_r($b, true), Logger::DATA);
 
+	$b['body'] = Post\Media::addAttachmentsToBody($b['uri-id'], $b['body']);
+
 	if ($b['parent'] != $b['id']) {
 		// Looking if its a reply to a pumpio post
 		$condition = ['id' => $b['parent'], 'network' => Protocol::PUMPIO];
diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php
index ae4f7c13..bb51e24b 100644
--- a/statusnet/statusnet.php
+++ b/statusnet/statusnet.php
@@ -481,6 +481,8 @@ function statusnet_post_hook(App $a, &$b)
 			return;
 	}
 
+	$b['body'] = Post\Media::addAttachmentsToBody($b['uri-id'], $b['body']);
+
 	$api = DI::pConfig()->get($b["uid"], 'statusnet', 'baseapi');
 	$hostname = preg_replace("=https?://([\w\.]*)/.*=ism", "$1", $api);
 
diff --git a/tumblr/tumblr.php b/tumblr/tumblr.php
index 4504534c..3dc89a37 100644
--- a/tumblr/tumblr.php
+++ b/tumblr/tumblr.php
@@ -16,6 +16,7 @@ use Friendica\Core\Logger;
 use Friendica\Core\Renderer;
 use Friendica\Database\DBA;
 use Friendica\DI;
+use Friendica\Model\Post;
 use Friendica\Model\Tag;
 use Friendica\Util\Strings;
 
@@ -366,6 +367,8 @@ function tumblr_send(App $a, array &$b) {
 		return;
 	}
 
+	$b['body'] = Post\Media::addAttachmentsToBody($b['uri-id'], $b['body']);
+
 	$oauth_token = DI::pConfig()->get($b['uid'], "tumblr", "oauth_token");
 	$oauth_token_secret = DI::pConfig()->get($b['uid'], "tumblr", "oauth_token_secret");
 	$page = DI::pConfig()->get($b['uid'], "tumblr", "page");
diff --git a/twitter/twitter.php b/twitter/twitter.php
index a68b5b6a..41f865e8 100644
--- a/twitter/twitter.php
+++ b/twitter/twitter.php
@@ -66,8 +66,6 @@ use Abraham\TwitterOAuth\TwitterOAuth;
 use Abraham\TwitterOAuth\TwitterOAuthException;
 use Codebird\Codebird;
 use Friendica\App;
-use Friendica\Content\OEmbed;
-use Friendica\Content\PageInfo;
 use Friendica\Content\Text\BBCode;
 use Friendica\Content\Text\Plaintext;
 use Friendica\Core\Hook;
@@ -544,6 +542,8 @@ function twitter_post_hook(App $a, array &$b)
 		return;
 	}
 
+	$b['body'] = Post\Media::addAttachmentsToBody($b['uri-id'], $b['body']);
+
 	$thr_parent = null;
 
 	if ($b['parent'] != $b['id']) {
@@ -1356,13 +1356,13 @@ function twitter_fetchuser($screen_name)
  *
  * @param string   $body
  * @param stdClass $status
- * @param string   $picture
  * @return array
  * @throws \Friendica\Network\HTTPException\InternalServerErrorException
  */
-function twitter_expand_entities($body, stdClass $status, $picture)
+function twitter_expand_entities($body, stdClass $status)
 {
 	$plain = $body;
+	$contains_urls = false;
 
 	$taglist = [];
 
@@ -1403,40 +1403,17 @@ function twitter_expand_entities($body, stdClass $status, $picture)
 				continue;
 			}
 
+			$contains_urls = true;
+
 			$expanded_url = $url->expanded_url;
 
-			$final_url = DI::httpRequest()->finalUrl($url->expanded_url);
-
-			$oembed_data = OEmbed::fetchURL($final_url);
-
-			$type = $oembed_data->type ?? '';
-
 			// Quickfix: Workaround for URL with '[' and ']' in it
 			if (strpos($expanded_url, '[') || strpos($expanded_url, ']')) {
 				$expanded_url = $url->url;
 			}
 
-			if ($type === 'photo' && !empty($oembed_data->url)) {
-				$replace = '[url=' . $expanded_url . '][img]' . $oembed_data->url . '[/img][/url]';
-			} elseif ($type === 'link') {
-				$curlResult = DI::httpRequest()->head($final_url, ['timeout' => 4]);
-				if ($curlResult->isSuccess()) {
-					$mimetype = $curlResult->getHeader('Content-Type');
-				} else {
-					$mimetype = '';
-				}
-
-				if (substr($mimetype, 0, 6) == 'image/') {
-					$replace = '[img]' . $final_url . '[/img]';
-				} else {
-					$replace = '[url=' . $expanded_url . ']' . $url->display_url . '[/url]';
-				}
-			} else {
-				$replace = '[url=' . $expanded_url . ']' . $url->display_url . '[/url]';
-			}
-
 			$replacementList[$url->indices[0]] = [
-				'replace' => $replace,
+				'replace' => '[url=' . $expanded_url . ']' . $url->display_url . '[/url]',
 				'length' => $url->indices[1] - $url->indices[0],
 			];
 		}
@@ -1450,14 +1427,7 @@ function twitter_expand_entities($body, stdClass $status, $picture)
 
 	$body = trim($body);
 
-	// Footer will be taken care of with a share block in the case of a quote
-	if (empty($status->quoted_status)) {
-		if ($picture) {
-			$body .= "\n\n[img]" . $picture . "[/img]\n";
-		}
-	}
-
-	return ['body' => trim($body), 'plain' => trim($plain), 'taglist' => $taglist];
+	return ['body' => trim($body), 'plain' => trim($plain), 'taglist' => $taglist, 'urls' => $contains_urls];
 }
 
 /**
@@ -1474,15 +1444,9 @@ function twitter_store_attachments(int $uriid, $post)
 				case 'photo':
 					$attachment = ['uri-id' => $uriid, 'type' => Post\Media::IMAGE];
 
-					// @todo In the future store the large picture.
-					// This can be done when we don't embed the pictures in the body anymore.
-					//$attachment['url'] = $medium->media_url_https . '?name=large';
-					//$attachment['width'] = $medium->sizes->large->w;
-					//$attachment['height'] = $medium->sizes->large->h;
-
-					$attachment['url'] = $medium->media_url_https;
-					$attachment['width'] = $medium->sizes->medium->w;
-					$attachment['height'] = $medium->sizes->medium->h;
+					$attachment['url'] = $medium->media_url_https . '?name=large';
+					$attachment['width'] = $medium->sizes->large->w;
+					$attachment['height'] = $medium->sizes->large->h;
 
 					if ($medium->sizes->small->w != $attachment['width']) {
 						$attachment['preview'] = $medium->media_url_https . '?name=small';
@@ -1535,35 +1499,17 @@ function twitter_store_attachments(int $uriid, $post)
 /**
  * @brief Fetch media entities and add media links to the body
  *
- * @param object $post Twitter object with the post
- * @param array $postarray Array of the item that is about to be posted
- *
- * @return $picture string Image URL or empty string
+ * @param object  $post      Twitter object with the post
+ * @param array   $postarray Array of the item that is about to be posted
+ * @param integer $uriid URI Id used to store tags. -1 = don't store tags for this post.
  */
-function twitter_media_entities($post, array &$postarray)
+function twitter_media_entities($post, array &$postarray, int $uriid = -1)
 {
 	// There are no media entities? So we quit.
 	if (empty($post->extended_entities->media)) {
-		return '';
+		return;
 	}
 
-	// When the post links to an external page, we only take one picture.
-	// We only do this when there is exactly one media.
-	if ((count($post->entities->urls) > 0) && (count($post->extended_entities->media) == 1)) {
-		$medium = $post->extended_entities->media[0];
-		$picture = '';
-		foreach ($post->entities->urls as $link) {
-			// Let's make sure the external link url matches the media url
-			if ($medium->url == $link->url && isset($medium->media_url_https)) {
-				$picture = $medium->media_url_https;
-				$postarray['body'] = str_replace($medium->url, '', $postarray['body']);
-				return $picture;
-			}
-		}
-	}
-
-
-
 	// This is a pure media post, first search for all media urls
 	$media = [];
 	foreach ($post->extended_entities->media AS $medium) {
@@ -1583,7 +1529,9 @@ function twitter_media_entities($post, array &$postarray)
 				$postarray['post-type'] = Item::PT_IMAGE;
 				break;
 			case 'video':
-				$postarray['post-type'] = Item::PT_VIDEO;
+				// Currently deactivated, since this causes the video to be display before the content
+				// We have to figure out a better way for declaring the post type and the display style.
+				//$postarray['post-type'] = Item::PT_VIDEO;
 			case 'animated_gif':
 				if (!empty($medium->ext_alt_text)) {
 					Logger::info('Got text description', ['alt_text' => $medium->ext_alt_text]);
@@ -1604,18 +1552,20 @@ function twitter_media_entities($post, array &$postarray)
 					}
 				}
 				break;
-			// The following code will only be activated for test reasons
-			//default:
-			//	$postarray['body'] .= print_r($medium, true);
 		}
 	}
 
+	if ($uriid != -1) {
+		foreach ($media AS $key => $value) {
+			$postarray['body'] = str_replace($key, '', $postarray['body']);
+		}
+		return;
+	}
+
 	// Now we replace the media urls.
 	foreach ($media AS $key => $value) {
 		$postarray['body'] = str_replace($key, "\n" . $value . "\n", $postarray['body']);
 	}
-
-	return '';
 }
 
 /**
@@ -1737,9 +1687,15 @@ function twitter_createpost(App $a, $uid, $post, array $self, $create_user, $onl
 	}
 
 	// Search for media links
-	$picture = twitter_media_entities($post, $postarray);
+	twitter_media_entities($post, $postarray, $uriid);
+
+	$converted = twitter_expand_entities($postarray['body'], $post);
+
+	// When the post contains external links then images or videos are just "decorations".
+	if (!empty($converted['urls'])) {
+		$postarray['post-type'] = Item::PT_NOTE;
+	}
 
-	$converted = twitter_expand_entities($postarray['body'], $post, $picture);
 	$postarray['body'] = $converted['body'];
 	$postarray['created'] = DateTimeFormat::utc($post->created_at);
 	$postarray['edited'] = DateTimeFormat::utc($post->created_at);
diff --git a/wppost/wppost.php b/wppost/wppost.php
index f9caf232..1d24dbcf 100644
--- a/wppost/wppost.php
+++ b/wppost/wppost.php
@@ -12,7 +12,7 @@ use Friendica\Core\Hook;
 use Friendica\Core\Logger;
 use Friendica\Database\DBA;
 use Friendica\DI;
-use Friendica\Util\Strings;
+use Friendica\Model\Post;
 use Friendica\Util\XML;
 
 function wppost_install()
@@ -223,6 +223,8 @@ function wppost_send(&$a, &$b)
 		return;
 	}
 
+	$b['body'] = Post\Media::addAttachmentsToBody($b['uri-id'], $b['body']);
+
 	$wp_username = XML::escape(DI::pConfig()->get($b['uid'], 'wppost', 'wp_username'));
 	$wp_password = XML::escape(DI::pConfig()->get($b['uid'], 'wppost', 'wp_password'));
 	$wp_blog = DI::pConfig()->get($b['uid'],'wppost','wp_blog');