mirror of
https://github.com/friendica/friendica
synced 2024-11-18 23:03:40 +00:00
Merge pull request #8894 from MrPetovan/task/8788-pageinfo-activitypub-processor
Use PageInfo::appendDataToBody in ActivityPub\Processor::constructAttachList
This commit is contained in:
commit
283830f4bf
6 changed files with 64 additions and 48 deletions
|
@ -40,7 +40,7 @@ class PageInfo
|
||||||
* @return string
|
* @return string
|
||||||
* @throws HTTPException\InternalServerErrorException
|
* @throws HTTPException\InternalServerErrorException
|
||||||
*/
|
*/
|
||||||
public static function appendToBody(string $body, bool $searchNakedUrls = false, bool $no_photos = false)
|
public static function searchAndAppendToBody(string $body, bool $searchNakedUrls = false, bool $no_photos = false)
|
||||||
{
|
{
|
||||||
Logger::info('add_page_info_to_body: fetch page info for body', ['body' => $body]);
|
Logger::info('add_page_info_to_body: fetch page info for body', ['body' => $body]);
|
||||||
|
|
||||||
|
@ -49,14 +49,34 @@ class PageInfo
|
||||||
return $body;
|
return $body;
|
||||||
}
|
}
|
||||||
|
|
||||||
$footer = self::getFooterFromUrl($url, $no_photos);
|
$data = self::queryUrl($url);
|
||||||
if (!$footer) {
|
if (!$data) {
|
||||||
return $body;
|
return $body;
|
||||||
}
|
}
|
||||||
|
|
||||||
$body = self::stripTrailingUrlFromBody($body, $url);
|
return self::appendDataToBody($body, $data, $no_photos);
|
||||||
|
}
|
||||||
|
|
||||||
$body .= "\n" . $footer;
|
/**
|
||||||
|
* @param string $body
|
||||||
|
* @param array $data
|
||||||
|
* @param bool $no_photos
|
||||||
|
* @return string
|
||||||
|
* @throws HTTPException\InternalServerErrorException
|
||||||
|
*/
|
||||||
|
public static function appendDataToBody(string $body, array $data, bool $no_photos = false)
|
||||||
|
{
|
||||||
|
// Only one [attachment] tag per body is allowed
|
||||||
|
$existingAttachmentPos = strpos($body, '[attachment');
|
||||||
|
if ($existingAttachmentPos !== false) {
|
||||||
|
$linkTitle = $data['title'] ?: $data['url'];
|
||||||
|
// Additional link attachments are prepended before the existing [attachment] tag
|
||||||
|
$body = substr_replace($body, "\n[bookmark=" . $data['url'] . ']' . $linkTitle . "[/bookmark]\n", $existingAttachmentPos, 0);
|
||||||
|
} else {
|
||||||
|
$footer = PageInfo::getFooterFromData($data, $no_photos);
|
||||||
|
$body = self::stripTrailingUrlFromBody($body, $data['url']);
|
||||||
|
$body .= "\n" . $footer;
|
||||||
|
}
|
||||||
|
|
||||||
return $body;
|
return $body;
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@ class Babel extends BaseModule
|
||||||
'content' => visible_whitespace(var_export($tags, true)),
|
'content' => visible_whitespace(var_export($tags, true)),
|
||||||
];
|
];
|
||||||
|
|
||||||
$body2 = PageInfo::appendToBody($bbcode, true);
|
$body2 = PageInfo::searchAndAppendToBody($bbcode, true);
|
||||||
$results[] = [
|
$results[] = [
|
||||||
'title' => DI::l10n()->t('PageInfo::appendToBody'),
|
'title' => DI::l10n()->t('PageInfo::appendToBody'),
|
||||||
'content' => visible_whitespace($body2)
|
'content' => visible_whitespace($body2)
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
namespace Friendica\Protocol\ActivityPub;
|
namespace Friendica\Protocol\ActivityPub;
|
||||||
|
|
||||||
|
use Friendica\Content\PageInfo;
|
||||||
use Friendica\Content\Text\BBCode;
|
use Friendica\Content\Text\BBCode;
|
||||||
use Friendica\Content\Text\HTML;
|
use Friendica\Content\Text\HTML;
|
||||||
use Friendica\Core\Logger;
|
use Friendica\Core\Logger;
|
||||||
|
@ -96,18 +97,16 @@ class Processor
|
||||||
foreach ($activity['attachments'] as $attach) {
|
foreach ($activity['attachments'] as $attach) {
|
||||||
switch ($attach['type']) {
|
switch ($attach['type']) {
|
||||||
case 'link':
|
case 'link':
|
||||||
// Only one [attachment] tag is allowed
|
$data = [
|
||||||
$existingAttachmentPos = strpos($item['body'], '[attachment');
|
'url' => $attach['url'],
|
||||||
if ($existingAttachmentPos !== false) {
|
'type' => $attach['type'],
|
||||||
$linkTitle = $attach['title'] ?: $attach['url'];
|
'title' => $attach['title'] ?? '',
|
||||||
// Additional link attachments are prepended before the existing [attachment] tag
|
'text' => $attach['desc'] ?? '',
|
||||||
$item['body'] = substr_replace($item['body'], "\n[bookmark=" . $attach['url'] . ']' . $linkTitle . "[/bookmark]\n", $existingAttachmentPos, 0);
|
'image' => $attach['image'] ?? '',
|
||||||
} else {
|
'images' => [],
|
||||||
// Strip the link preview URL from the end of the body if any
|
'keywords' => [],
|
||||||
$quotedUrl = preg_quote($attach['url'], '#');
|
];
|
||||||
$item['body'] = preg_replace("#\s*(?:\[bookmark={$quotedUrl}].+?\[/bookmark]|\[url={$quotedUrl}].+?\[/url]|\[url]{$quotedUrl}\[/url]|{$quotedUrl})\s*$#", '', $item['body']);
|
$item['body'] = PageInfo::appendDataToBody($item['body'], $data);
|
||||||
$item['body'] .= "\n[attachment type='link' url='" . $attach['url'] . "' title='" . htmlspecialchars($attach['title'] ?? '', ENT_QUOTES) . "' image='" . ($attach['image'] ?? '') . "']" . ($attach['desc'] ?? '') . '[/attachment]';
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
$filetype = strtolower(substr($attach['mediaType'], 0, strpos($attach['mediaType'], '/')));
|
$filetype = strtolower(substr($attach['mediaType'], 0, strpos($attach['mediaType'], '/')));
|
||||||
|
|
|
@ -2622,7 +2622,7 @@ class Diaspora
|
||||||
$item["body"] = self::replacePeopleGuid($item["body"], $item["author-link"]);
|
$item["body"] = self::replacePeopleGuid($item["body"], $item["author-link"]);
|
||||||
|
|
||||||
// Add OEmbed and other information to the body
|
// Add OEmbed and other information to the body
|
||||||
$item["body"] = PageInfo::appendToBody($item["body"], false, true);
|
$item["body"] = PageInfo::searchAndAppendToBody($item["body"], false, true);
|
||||||
|
|
||||||
return $item;
|
return $item;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2986,7 +2986,7 @@ class Diaspora
|
||||||
|
|
||||||
// Add OEmbed and other information to the body
|
// Add OEmbed and other information to the body
|
||||||
if (!self::isHubzilla($contact["url"])) {
|
if (!self::isHubzilla($contact["url"])) {
|
||||||
$body = PageInfo::appendToBody($body, false, true);
|
$body = PageInfo::searchAndAppendToBody($body, false, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -698,7 +698,7 @@ class OStatus
|
||||||
|
|
||||||
// Only add additional data when there is no picture in the post
|
// Only add additional data when there is no picture in the post
|
||||||
if (!strstr($item["body"], '[/img]')) {
|
if (!strstr($item["body"], '[/img]')) {
|
||||||
$item["body"] = PageInfo::appendToBody($item["body"]);
|
$item["body"] = PageInfo::searchAndAppendToBody($item["body"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
Tag::storeFromBody($item['uri-id'], $item['body']);
|
Tag::storeFromBody($item['uri-id'], $item['body']);
|
||||||
|
|
|
@ -55,14 +55,13 @@ class ParseUrl
|
||||||
* to avoid endless loops
|
* to avoid endless loops
|
||||||
*
|
*
|
||||||
* @return array which contains needed data for embedding
|
* @return array which contains needed data for embedding
|
||||||
* string 'url' => The url of the parsed page
|
* string 'url' => The url of the parsed page
|
||||||
* string 'type' => Content type
|
* string 'type' => Content type
|
||||||
* string 'title' => The title of the content
|
* string 'title' => (optional) The title of the content
|
||||||
* string 'text' => The description for the content
|
* string 'text' => (optional) The description for the content
|
||||||
* string 'image' => A preview image of the content (only available
|
* string 'image' => (optional) A preview image of the content (only available if $no_geuessing = false)
|
||||||
* if $no_geuessing = false
|
* array 'images' => (optional) Array of preview pictures
|
||||||
* array'images' = Array of preview pictures
|
* string 'keywords' => (optional) The tags which belong to the content
|
||||||
* string 'keywords' => The tags which belong to the content
|
|
||||||
*
|
*
|
||||||
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
||||||
* @see ParseUrl::getSiteinfo() for more information about scraping
|
* @see ParseUrl::getSiteinfo() for more information about scraping
|
||||||
|
@ -115,14 +114,13 @@ class ParseUrl
|
||||||
* @param int $count Internal counter to avoid endless loops
|
* @param int $count Internal counter to avoid endless loops
|
||||||
*
|
*
|
||||||
* @return array which contains needed data for embedding
|
* @return array which contains needed data for embedding
|
||||||
* string 'url' => The url of the parsed page
|
* string 'url' => The url of the parsed page
|
||||||
* string 'type' => Content type
|
* string 'type' => Content type
|
||||||
* string 'title' => The title of the content
|
* string 'title' => (optional) The title of the content
|
||||||
* string 'text' => The description for the content
|
* string 'text' => (optional) The description for the content
|
||||||
* string 'image' => A preview image of the content (only available
|
* string 'image' => (optional) A preview image of the content (only available if $no_guessing = false)
|
||||||
* if $no_geuessing = false
|
* array 'images' => (optional) Array of preview pictures
|
||||||
* array'images' = Array of preview pictures
|
* string 'keywords' => (optional) The tags which belong to the content
|
||||||
* string 'keywords' => The tags which belong to the content
|
|
||||||
*
|
*
|
||||||
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
|
||||||
* @todo https://developers.google.com/+/plugins/snippet/
|
* @todo https://developers.google.com/+/plugins/snippet/
|
||||||
|
@ -140,28 +138,27 @@ class ParseUrl
|
||||||
*/
|
*/
|
||||||
public static function getSiteinfo($url, $no_guessing = false, $do_oembed = true, $count = 1)
|
public static function getSiteinfo($url, $no_guessing = false, $do_oembed = true, $count = 1)
|
||||||
{
|
{
|
||||||
$siteinfo = [];
|
|
||||||
|
|
||||||
// Check if the URL does contain a scheme
|
// Check if the URL does contain a scheme
|
||||||
$scheme = parse_url($url, PHP_URL_SCHEME);
|
$scheme = parse_url($url, PHP_URL_SCHEME);
|
||||||
|
|
||||||
if ($scheme == '') {
|
if ($scheme == '') {
|
||||||
$url = 'http://' . trim($url, '/');
|
$url = 'http://' . ltrim($url, '/');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$url = trim($url, "'\"");
|
||||||
|
|
||||||
|
$url = Network::stripTrackingQueryParams($url);
|
||||||
|
|
||||||
|
$siteinfo = [
|
||||||
|
'url' => $url,
|
||||||
|
'type' => 'link',
|
||||||
|
];
|
||||||
|
|
||||||
if ($count > 10) {
|
if ($count > 10) {
|
||||||
Logger::log('Endless loop detected for ' . $url, Logger::DEBUG);
|
Logger::log('Endless loop detected for ' . $url, Logger::DEBUG);
|
||||||
return $siteinfo;
|
return $siteinfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
$url = trim($url, "'");
|
|
||||||
$url = trim($url, '"');
|
|
||||||
|
|
||||||
$url = Network::stripTrackingQueryParams($url);
|
|
||||||
|
|
||||||
$siteinfo['url'] = $url;
|
|
||||||
$siteinfo['type'] = 'link';
|
|
||||||
|
|
||||||
$curlResult = Network::curl($url);
|
$curlResult = Network::curl($url);
|
||||||
if (!$curlResult->isSuccess()) {
|
if (!$curlResult->isSuccess()) {
|
||||||
return $siteinfo;
|
return $siteinfo;
|
||||||
|
|
Loading…
Reference in a new issue