public static function getContentType(string $url)
{
$curlResult = DI::httpClient()->head($url);
+
+ // Workaround for systems that can't handle a HEAD request
+ if (!$curlResult->isSuccess() && ($curlResult->getReturnCode() == 405)) {
+ $curlResult = DI::httpClient()->get($url, [HttpClientOptions::CONTENT_LENGTH => 1000000]);
+ }
+
if (!$curlResult->isSuccess()) {
return [];
}
$contenttype = $curlResult->getHeader('Content-Type')[0] ?? '';
if (empty($contenttype)) {
- return [];
+ return ['application', 'octet-stream'];
}
return explode('/', current(explode(';', $contenttype)));
$curlResult = DI::httpClient()->get($url, [HttpClientOptions::CONTENT_LENGTH => 1000000]);
if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
+ Logger::info('Empty body or error when fetching', ['url' => $url, 'success' => $curlResult->isSuccess(), 'code' => $curlResult->getReturnCode()]);
return $siteinfo;
}
$siteinfo['title'] = trim($list->item(0)->nodeValue);
}
- $twitter_card = false;
- $twitter_image = false;
-
$list = $xpath->query('//meta[@name]');
foreach ($list as $node) {
$meta_tag = [];
break;
case 'twitter:image':
$siteinfo['image'] = $meta_tag['content'];
- $twitter_image = true;
break;
case 'twitter:image:src':
$siteinfo['image'] = $meta_tag['content'];
break;
- case 'twitter:card':
- // Detect photo pages
- if ($meta_tag['content'] == 'summary_large_image') {
- $twitter_card = true;
- }
- break;
case 'twitter:description':
$siteinfo['text'] = trim($meta_tag['content']);
break;
case 'twitter:title':
$siteinfo['title'] = trim($meta_tag['content']);
break;
+ case 'twitter:player':
+ $siteinfo['player']['embed'] = trim($meta_tag['content']);
+ break;
+ case 'twitter:player:stream':
+ $siteinfo['player']['stream'] = trim($meta_tag['content']);
+ break;
+ case 'twitter:player:width':
+ $siteinfo['player']['width'] = intval($meta_tag['content']);
+ break;
+ case 'twitter:player:height':
+ $siteinfo['player']['height'] = intval($meta_tag['content']);
+ break;
case 'dc.title':
$siteinfo['title'] = trim($meta_tag['content']);
break;
case 'og:site_name':
$siteinfo['publisher_name'] = trim($meta_tag['content']);
break;
+ case 'og:locale':
+ $siteinfo['language'] = trim($meta_tag['content']);
+ break;
+ case 'og:type':
+ $siteinfo['pagetype'] = trim($meta_tag['content']);
+ break;
case 'twitter:description':
$siteinfo['text'] = trim($meta_tag['content']);
break;
break;
case 'twitter:image':
$siteinfo['image'] = $meta_tag['content'];
- $twitter_image = true;
break;
}
}
}
}
-// Currently deactivated, see https://github.com/friendica/friendica/pull/10148#issuecomment-821512658
- // Prevent to have a photo type without an image
-// if ($twitter_card && $twitter_image && !empty($siteinfo['image'])) {
-// $siteinfo['type'] = 'photo';
-// }
+ if (!empty($siteinfo['player']['stream'])) {
+ // Only add player data to media arrays if there is no duplicate
+ $content_urls = array_merge(array_column($siteinfo['audio'] ?? [], 'content'), array_column($siteinfo['video'] ?? [], 'content'));
+ if (!in_array($siteinfo['player']['stream'], $content_urls)) {
+ $contenttype = self::getContentType($siteinfo['player']['stream']);
+ if (!empty($contenttype[0]) && in_array($contenttype[0], ['audio', 'video'])) {
+ $media = ['content' => $siteinfo['player']['stream']];
+
+ if (!empty($siteinfo['player']['embed'])) {
+ $media['embed'] = $siteinfo['player']['embed'];
+ }
+
+ $siteinfo[$contenttype[0]][] = $media;
+ }
+ }
+ }
if (!empty($siteinfo['image'])) {
$siteinfo['images'] = $siteinfo['images'] ?? [];
Hook::callAll('getsiteinfo', $siteinfo);
+ ksort($siteinfo);
+
return $siteinfo;
}
*
* @param string $page_url
* @param array $siteinfo
- * @return void
+ * @return array
*/
- private static function checkMedia(string $page_url, array $siteinfo)
+ private static function checkMedia(string $page_url, array $siteinfo) : array
{
if (!empty($siteinfo['images'])) {
array_walk($siteinfo['images'], function (&$image) use ($page_url) {
}
if (!empty($embed)) {
$media['embed'] = $embed;
- if (!empty($media['main'])) {
- $siteinfo['embed'] = $embed;
+ if (empty($siteinfo['player']['embed'])) {
+ $siteinfo['player']['embed'] = $embed;
}
}
if (!empty($content)) {
}
}
+ $content = JsonLD::fetchElement($jsonld, 'datePublished');
+ if (!empty($content) && is_string($content)) {
+ $jsonldinfo['published'] = DateTimeFormat::utc($content);
+ }
+
+ $content = JsonLD::fetchElement($jsonld, 'dateModified');
+ if (!empty($content) && is_string($content)) {
+ $jsonldinfo['modified'] = DateTimeFormat::utc($content);
+ }
+
$jsonldinfo = self::parseJsonLdAuthor($jsonldinfo, $jsonld);
Logger::info('Fetched article information', ['url' => $siteinfo['url'], 'fetched' => $jsonldinfo]);