From 85554bb6fd2dc0bae3f7323bc2b687fee02e0336 Mon Sep 17 00:00:00 2001 From: Michael 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');