Merge pull request #12893 from annando/remove-media

Improved handling of images with links
This commit is contained in:
Philipp 2023-03-16 13:54:55 +01:00 committed by GitHub
commit 92c56f9cd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -461,19 +461,33 @@ class Media
* @param string $preview Preview picture * @param string $preview Preview picture
* @return boolean * @return boolean
*/ */
private static function isPictureLink(string $page, string $preview): bool private static function isLinkToPhoto(string $page, string $preview): bool
{ {
return (preg_match('#/photo/.*-0\.#ism', $page) || preg_match('#/photos/.*/image/#ism', $page)) && preg_match('#/photo/.*-[01]\.#ism', $preview); return preg_match('#/photo/.*-0\.#ism', $page) && preg_match('#/photo/.*-[01]\.#ism', $preview);
}
/**
* Tests for path patterns that are usef for picture links in Friendica
*
* @param string $page Link to the image page
* @param string $preview Preview picture
* @return boolean
*/
private static function isLinkToImagePage(string $page, string $preview): bool
{
return preg_match('#/photos/.*/image/#ism', $page) && preg_match('#/photo/.*-[01]\.#ism', $preview);
} }
/** /**
* Add media links and remove them from the body * Add media links and remove them from the body
* *
* @param integer $uriid * @param integer $uriid
* @param string $body * @param string $body
* @param bool $endmatch
* @param bool $removepicturelinks
* @return string Body without media links * @return string Body without media links
*/ */
public static function insertFromBody(int $uriid, string $body, bool $endmatch = false): string public static function insertFromBody(int $uriid, string $body, bool $endmatch = false, bool $removepicturelinks = false): string
{ {
$endmatchpattern = $endmatch ? '\z' : ''; $endmatchpattern = $endmatch ? '\z' : '';
// Simplify image codes // Simplify image codes
@ -482,14 +496,20 @@ class Media
$attachments = []; $attachments = [];
if (preg_match_all("#\[url=([^\]]+?)\]\s*\[img=([^\[\]]*)\]([^\[\]]*)\[\/img\]\s*\[/url\]$endmatchpattern#ism", $body, $pictures, PREG_SET_ORDER)) { if (preg_match_all("#\[url=([^\]]+?)\]\s*\[img=([^\[\]]*)\]([^\[\]]*)\[\/img\]\s*\[/url\]$endmatchpattern#ism", $body, $pictures, PREG_SET_ORDER)) {
foreach ($pictures as $picture) { foreach ($pictures as $picture) {
if (self::isPictureLink($picture[1], $picture[2])) { if (self::isLinkToImagePage($picture[1], $picture[2])) {
$body = str_replace($picture[0], '', $body); $body = str_replace($picture[0], '', $body);
$image = str_replace('-1.', '-0.', $picture[2]); $image = str_replace('-1.', '-0.', $picture[2]);
$attachments[$image] = [ $attachments[$image] = [
'uri-id' => $uriid, 'type' => self::IMAGE, 'url' => $image, 'uri-id' => $uriid, 'type' => self::IMAGE, 'url' => $image,
'preview' => $picture[2], 'description' => $picture[3] 'preview' => $picture[2], 'description' => $picture[3]
]; ];
} else { } elseif (self::isLinkToPhoto($picture[1], $picture[2])) {
$body = str_replace($picture[0], '', $body);
$attachments[$picture[1]] = [
'uri-id' => $uriid, 'type' => self::IMAGE, 'url' => $picture[1],
'preview' => $picture[2], 'description' => $picture[3]
];
} elseif ($removepicturelinks) {
$body = str_replace($picture[0], '', $body); $body = str_replace($picture[0], '', $body);
$attachments[$picture[1]] = [ $attachments[$picture[1]] = [
'uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $picture[1], 'uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $picture[1],
@ -508,14 +528,20 @@ class Media
if (preg_match_all("#\[url=([^\]]+?)\]\s*\[img\]([^\[]+?)\[/img\]\s*\[/url\]$endmatchpattern#ism", $body, $pictures, PREG_SET_ORDER)) { if (preg_match_all("#\[url=([^\]]+?)\]\s*\[img\]([^\[]+?)\[/img\]\s*\[/url\]$endmatchpattern#ism", $body, $pictures, PREG_SET_ORDER)) {
foreach ($pictures as $picture) { foreach ($pictures as $picture) {
if (self::isPictureLink($picture[1], $picture[2])) { if (self::isLinkToImagePage($picture[1], $picture[2])) {
$body = str_replace($picture[0], '', $body); $body = str_replace($picture[0], '', $body);
$image = str_replace('-1.', '-0.', $picture[2]); $image = str_replace('-1.', '-0.', $picture[2]);
$attachments[$image] = [ $attachments[$image] = [
'uri-id' => $uriid, 'type' => self::IMAGE, 'url' => $image, 'uri-id' => $uriid, 'type' => self::IMAGE, 'url' => $image,
'preview' => $picture[2], 'description' => null 'preview' => $picture[2], 'description' => null
]; ];
} else { } elseif (self::isLinkToPhoto($picture[1], $picture[2])) {
$body = str_replace($picture[0], '', $body);
$attachments[$picture[1]] = [
'uri-id' => $uriid, 'type' => self::IMAGE, 'url' => $picture[1],
'preview' => $picture[2], 'description' => null
];
} elseif ($removepicturelinks) {
$body = str_replace($picture[0], '', $body); $body = str_replace($picture[0], '', $body);
$attachments[$picture[1]] = [ $attachments[$picture[1]] = [
'uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $picture[1], 'uri-id' => $uriid, 'type' => self::UNKNOWN, 'url' => $picture[1],
@ -587,7 +613,7 @@ class Media
{ {
do { do {
$prebody = $body; $prebody = $body;
$body = self::insertFromBody(0, $body); $body = self::insertFromBody(0, $body, false, true);
} while ($prebody != $body); } while ($prebody != $body);
return $body; return $body;
} }