Merge pull request #12361 from annando/issue-12345

Issue 12345: No link preview on DFRN posts
This commit is contained in:
Tobias Diekershoff 2022-12-08 06:59:04 +01:00 committed by GitHub
commit 3fcf35a5bc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 72 additions and 26 deletions

View file

@ -220,7 +220,7 @@ class Item
$content_fields['raw-body'] = Post\Media::insertFromBody($item['uri-id'], $content_fields['raw-body']); $content_fields['raw-body'] = Post\Media::insertFromBody($item['uri-id'], $content_fields['raw-body']);
$content_fields['raw-body'] = self::setHashtags($content_fields['raw-body']); $content_fields['raw-body'] = self::setHashtags($content_fields['raw-body']);
Post\Media::insertFromRelevantUrl($item['uri-id'], $content_fields['raw-body']); Post\Media::insertFromRelevantUrl($item['uri-id'], $content_fields['raw-body'], $fields['body'], $item['author-network']);
Post\Content::update($item['uri-id'], $content_fields); Post\Content::update($item['uri-id'], $content_fields);
} }
@ -1188,7 +1188,8 @@ class Item
$item['raw-body'] = Post\Media::insertFromBody($item['uri-id'], $item['raw-body']); $item['raw-body'] = Post\Media::insertFromBody($item['uri-id'], $item['raw-body']);
$item['raw-body'] = self::setHashtags($item['raw-body']); $item['raw-body'] = self::setHashtags($item['raw-body']);
Post\Media::insertFromRelevantUrl($item['uri-id'], $item['raw-body']); $author = Contact::getById($item['author-id'], ['network']);
Post\Media::insertFromRelevantUrl($item['uri-id'], $item['raw-body'], $item['body'], $author['network'] ?? '');
// Check for hashtags in the body and repair or add hashtag links // Check for hashtags in the body and repair or add hashtag links
$item['body'] = self::setHashtags($item['body']); $item['body'] = self::setHashtags($item['body']);

View file

@ -66,6 +66,7 @@ class Media
* Insert a post-media record * Insert a post-media record
* *
* @param array $media * @param array $media
* @param bool $force
* @return void * @return void
*/ */
public static function insert(array $media, bool $force = false) public static function insert(array $media, bool $force = false)
@ -229,20 +230,9 @@ class Media
} }
if ($media['type'] == self::HTML) { if ($media['type'] == self::HTML) {
$data = ParseUrl::getSiteinfoCached($media['url'], false); $media = self::addPage($media);
$media['preview'] = $data['images'][0]['src'] ?? null;
$media['preview-height'] = $data['images'][0]['height'] ?? null;
$media['preview-width'] = $data['images'][0]['width'] ?? null;
$media['blurhash'] = $data['images'][0]['blurhash'] ?? null;
$media['description'] = $data['text'] ?? null;
$media['name'] = $data['title'] ?? null;
$media['author-url'] = $data['author_url'] ?? null;
$media['author-name'] = $data['author_name'] ?? null;
$media['author-image'] = $data['author_img'] ?? null;
$media['publisher-url'] = $data['publisher_url'] ?? null;
$media['publisher-name'] = $data['publisher_name'] ?? null;
$media['publisher-image'] = $data['publisher_img'] ?? null;
} }
return $media; return $media;
} }
@ -345,6 +335,31 @@ class Media
return $media; return $media;
} }
/**
* Add page infos for HTML entries
*
* @param array $media
* @return array
*/
private static function addPage(array $media): array
{
$data = ParseUrl::getSiteinfoCached($media['url'], false);
$media['preview'] = $data['images'][0]['src'] ?? null;
$media['preview-height'] = $data['images'][0]['height'] ?? null;
$media['preview-width'] = $data['images'][0]['width'] ?? null;
$media['blurhash'] = $data['images'][0]['blurhash'] ?? null;
$media['description'] = $data['text'] ?? null;
$media['name'] = $data['title'] ?? null;
$media['author-url'] = $data['author_url'] ?? null;
$media['author-name'] = $data['author_name'] ?? null;
$media['author-image'] = $data['author_img'] ?? null;
$media['publisher-url'] = $data['publisher_url'] ?? null;
$media['publisher-name'] = $data['publisher_name'] ?? null;
$media['publisher-image'] = $data['publisher_img'] ?? null;
return $media;
}
/** /**
* Fetch media data from local resources * Fetch media data from local resources
* @param array $media * @param array $media
@ -543,7 +558,7 @@ class Media
* @param string $body * @param string $body
* @return void * @return void
*/ */
public static function insertFromRelevantUrl(int $uriid, string $body) public static function insertFromRelevantUrl(int $uriid, string $body, string $fullbody, string $network)
{ {
// Remove all hashtags and mentions // Remove all hashtags and mentions
$body = preg_replace("/([#@!])\[url\=(.*?)\](.*?)\[\/url\]/ism", '', $body); $body = preg_replace("/([#@!])\[url\=(.*?)\](.*?)\[\/url\]/ism", '', $body);
@ -552,7 +567,10 @@ class Media
if (preg_match_all("/\[url\](https?:.*?)\[\/url\]/ism", $body, $matches)) { if (preg_match_all("/\[url\](https?:.*?)\[\/url\]/ism", $body, $matches)) {
foreach ($matches[1] as $url) { foreach ($matches[1] as $url) {
Logger::info('Got page url (link without description)', ['uri-id' => $uriid, 'url' => $url]); Logger::info('Got page url (link without description)', ['uri-id' => $uriid, 'url' => $url]);
self::insert(['uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $url]); self::insert(['uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $url], false, $network);
if ($network == Protocol::DFRN) {
self::revertHTMLType($uriid, $url, $fullbody);
}
} }
} }
@ -560,11 +578,31 @@ class Media
if (preg_match_all("/\[url\=(https?:.*?)\].*?\[\/url\]/ism", $body, $matches)) { if (preg_match_all("/\[url\=(https?:.*?)\].*?\[\/url\]/ism", $body, $matches)) {
foreach ($matches[1] as $url) { foreach ($matches[1] as $url) {
Logger::info('Got page url (link with description)', ['uri-id' => $uriid, 'url' => $url]); Logger::info('Got page url (link with description)', ['uri-id' => $uriid, 'url' => $url]);
self::insert(['uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $url]); self::insert(['uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $url], false, $network);
if ($network == Protocol::DFRN) {
self::revertHTMLType($uriid, $url, $fullbody);
}
} }
} }
} }
/**
* Revert the media type of links to UNKNOWN for DFRN posts when they aren't attached
*
* @param integer $uriid
* @param string $url
* @param string $body
* @return void
*/
private static function revertHTMLType(int $uriid, string $url, string $body)
{
$attachment = BBCode::getAttachmentData($body);
if (!empty($attachment['url']) && Network::getUrlMatch($attachment['url'], $url)) {
return;
}
DBA::update('post-media', ['type' => self::UNKNOWN], ['uri-id' => $uriid, 'type' => self::HTML, 'url' => $url]);
}
/** /**
* Add media links from the attachment field * Add media links from the attachment field
* *
@ -633,7 +671,7 @@ class Media
*/ */
public static function getByURIId(int $uri_id, array $types = []) public static function getByURIId(int $uri_id, array $types = [])
{ {
$condition = ['uri-id' => $uri_id]; $condition = ["`uri-id` = ? AND `type` != ?", $uri_id, self::UNKNOWN];
if (!empty($types)) { if (!empty($types)) {
$condition = DBA::mergeConditions($condition, ['type' => $types]); $condition = DBA::mergeConditions($condition, ['type' => $types]);
@ -652,7 +690,7 @@ class Media
*/ */
public static function existsByURIId(int $uri_id, array $types = []): bool public static function existsByURIId(int $uri_id, array $types = []): bool
{ {
$condition = ['uri-id' => $uri_id]; $condition = ["`uri-id` = ? AND `type` != ?", $uri_id, self::UNKNOWN];
if (!empty($types)) { if (!empty($types)) {
$condition = DBA::mergeConditions($condition, ['type' => $types]); $condition = DBA::mergeConditions($condition, ['type' => $types]);

View file

@ -734,6 +734,9 @@ class Image
public function getBlurHash(): string public function getBlurHash(): string
{ {
$image = New Image($this->asString()); $image = New Image($this->asString());
if (empty($image)) {
return '';
}
$width = $image->getWidth(); $width = $image->getWidth();
$height = $image->getHeight(); $height = $image->getHeight();
@ -749,7 +752,11 @@ class Image
$row = []; $row = [];
for ($x = 0; $x < $width; ++$x) { for ($x = 0; $x < $width; ++$x) {
if ($image->isImagick()) { if ($image->isImagick()) {
$colors = $image->image->getImagePixelColor($x, $y)->getColor(); try {
$colors = $image->image->getImagePixelColor($x, $y)->getColor();
} catch (\Throwable $th) {
return '';
}
$row[] = [$colors['r'], $colors['g'], $colors['b']]; $row[] = [$colors['r'], $colors['g'], $colors['b']];
} else { } else {
$index = imagecolorat($image->image, $x, $y); $index = imagecolorat($image->image, $x, $y);

View file

@ -711,7 +711,7 @@ class DFRN
*/ */
private static function getAttachment($doc, $root, array $item) private static function getAttachment($doc, $root, array $item)
{ {
foreach (Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT, Post\Media::UNKNOWN]) as $attachment) { foreach (Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT]) as $attachment) {
$attributes = ['rel' => 'enclosure', $attributes = ['rel' => 'enclosure',
'href' => $attachment['url'], 'href' => $attachment['url'],
'type' => $attachment['mimetype']]; 'type' => $attachment['mimetype']];

View file

@ -499,7 +499,7 @@ class Diaspora
} }
if (!($fields = self::validPosting($msg))) { if (!($fields = self::validPosting($msg))) {
Logger::warning('Invalid posting'); Logger::warning('Invalid posting', ['msg' => $msg]);
return false; return false;
} }
@ -534,7 +534,7 @@ class Diaspora
if (is_null($fields)) { if (is_null($fields)) {
$private = true; $private = true;
if (!($fields = self::validPosting($msg))) { if (!($fields = self::validPosting($msg))) {
Logger::warning('Invalid posting'); Logger::warning('Invalid posting', ['msg' => $msg]);
return false; return false;
} }
} else { } else {
@ -3387,7 +3387,7 @@ class Diaspora
$body = '### ' . html_entity_decode($title) . "\n\n" . $body; $body = '### ' . html_entity_decode($title) . "\n\n" . $body;
} }
$attachments = Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT, Post\Media::UNKNOWN]); $attachments = Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT]);
if (!empty($attachments)) { if (!empty($attachments)) {
$body .= "\n[hr]\n"; $body .= "\n[hr]\n";
foreach ($attachments as $attachment) { foreach ($attachments as $attachment) {

View file

@ -1186,7 +1186,7 @@ class OStatus
} }
} }
foreach (Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT, Post\Media::UNKNOWN]) as $attachment) { foreach (Post\Media::getByURIId($item['uri-id'], [Post\Media::DOCUMENT, Post\Media::TORRENT]) as $attachment) {
$attributes = ['rel' => 'enclosure', $attributes = ['rel' => 'enclosure',
'href' => $attachment['url'], 'href' => $attachment['url'],
'type' => $attachment['mimetype']]; 'type' => $attachment['mimetype']];