Issue 10019: Fix embedding of media objects

This commit is contained in:
Michael 2021-03-12 23:04:51 +00:00
parent 60a74fd5dc
commit 262ee2b0b1
3 changed files with 34 additions and 7 deletions

View file

@ -2257,10 +2257,10 @@ class BBCode
return $result; return $result;
} }
$siteinfo = ParseUrl::getSiteinfoCached($url); $type = ParseUrl::getContentType($url);
if (in_array($siteinfo['type'], ['image', 'video', 'audio'])) { if (in_array($type, ['image', 'video', 'audio'])) {
switch ($siteinfo['type']) { switch ($type) {
case 'video': case 'video':
$bbcode = "\n" . '[video]' . $url . '[/video]' . "\n"; $bbcode = "\n" . '[video]' . $url . '[/video]' . "\n";
break; break;
@ -2275,6 +2275,8 @@ class BBCode
return $bbcode; return $bbcode;
} }
$siteinfo = ParseUrl::getSiteinfoCached($url);
unset($siteinfo['keywords']); unset($siteinfo['keywords']);
// Bypass attachment if parse url for a comment // Bypass attachment if parse url for a comment

View file

@ -94,11 +94,10 @@ class ParseUrl extends BaseModule
} }
if ($format == 'json') { if ($format == 'json') {
$siteinfo = Util\ParseUrl::getSiteinfoCached($url); $type = Util\ParseUrl::getContentType($url);
if (empty($siteinfo['title']) && empty($siteinfo['text']) && empty($siteinfo['image']) if (in_array($type, ['image', 'video', 'audio'])) {
&& in_array($siteinfo['type'], ['image', 'video', 'audio'])) { switch ($type) {
switch ($siteinfo['type']) {
case 'video': case 'video':
$content_type = 'video'; $content_type = 'video';
break; break;
@ -114,6 +113,8 @@ class ParseUrl extends BaseModule
$ret['data'] = ['url' => $url]; $ret['data'] = ['url' => $url];
$ret['success'] = true; $ret['success'] = true;
} else { } else {
$siteinfo = Util\ParseUrl::getSiteinfoCached($url);
unset($siteinfo['keywords']); unset($siteinfo['keywords']);
$ret['data'] = $siteinfo; $ret['data'] = $siteinfo;

View file

@ -51,6 +51,30 @@ class ParseUrl
*/ */
const MIN_DESC_COUNT = 100; const MIN_DESC_COUNT = 100;
/**
* Fetch the content type of the given url
* @param string $url URL of the page
* @return string content type
*/
public static function getContentType(string $url)
{
$curlResult = DI::httpRequest()->head($url);
if (!$curlResult->isSuccess()) {
return '';
}
$contenttype = $curlResult->getHeader('Content-Type');
if (empty($contenttype)) {
return '';
}
if (!preg_match('#(image|video|audio)/#i', $contenttype, $matches)) {
return '';
}
return array_pop($matches);
}
/** /**
* Search for chached embeddable data of an url otherwise fetch it * Search for chached embeddable data of an url otherwise fetch it
* *