/* Embed.providerName.getData should return an object with the following properties: - title - description - thumbnailUrl - sourceName - sourceUrl - media (object) */ import { Embed } from '../../modules/embed.js'; // import Metascraper from 'metascraper'; Embed.builtin = { getData(url) { // const metadata = await Metascraper.scrapeUrl(url); const metadata = extractMeta(url); return { title: metadata.title, description: metadata.description, thumbnailUrl: metadata.image, } } } // -------------- // // adapted from https://github.com/acemtp/meteor-meta-extractor/blob/master/meta-extractor.js import he from 'he'; const extractMeta = function (params) { var html; var match; var META = {}; if (params.substr(0, 4) === 'http') { try { var result = HTTP.call('GET', params); if (result.statusCode !== 200) { return META; } html = result.content; } catch (e) { // eslint-disable-next-line no-console console.log('catch error', e); return META; } } else { html = params; } // search for a var title_regex = /<title>(.*)<\/title>/gmi; while ((match = title_regex.exec(html)) !== null) { if (match.index === title_regex.lastIndex) { title_regex.lastIndex++; } META.title = match[1]; } // search and parse all <meta> var meta_tag_regex = /<meta.*?(?:name|property|http-equiv)=['"]([^'"]*?)['"][\w\W]*?content=['"]([^'"]*?)['"].*?>/gmi; var tags = { title: ['title', 'og:title', 'twitter:title'], description: ['description', 'og:description', 'twitter:description'], image: ['image', 'og:image', 'twitter:image'], url: ['url', 'og:url', 'twitter:url'] }; while ((match = meta_tag_regex.exec(html)) !== null) { if (match.index === meta_tag_regex.lastIndex) { meta_tag_regex.lastIndex++; } for (var item in tags) { tags[item].forEach(function(prop) { if (match[1] === prop) { var property = tags[item][0]; var content = match[2]; // Only push content to our 'META' object if 'META' doesn't already // contain content for that property. if (!META[property]) { META[property] = he.decode(content); } } }); } } return META; };