diff --git a/app/oembed/client/oembedFrameWidget.html b/app/oembed/client/oembedFrameWidget.html index 6e6a91669db57..964a76ec536ef 100644 --- a/app/oembed/client/oembedFrameWidget.html +++ b/app/oembed/client/oembedFrameWidget.html @@ -23,7 +23,7 @@ {{#if meta.oembedDescription}}
{{meta.oembedDescription}}
{{/if}} - + {{{meta.oembedHtml}}} {{/unless}} {{/if}} diff --git a/app/oembed/server/providers.js b/app/oembed/server/providers.js index 54bf583e1429d..f6ba54a3d3ba9 100644 --- a/app/oembed/server/providers.js +++ b/app/oembed/server/providers.js @@ -101,31 +101,52 @@ callbacks.add('oembed:beforeGetUrlContent', function(data) { return data; }, callbacks.priority.MEDIUM, 'oembed-providers-before'); +const cleanupOembed = (data) => { + if (!data?.meta) { + return data; + } + + // remove oembedHtml key from original meta + const { oembedHtml, ...meta } = data.meta; + + return { + ...data, + meta, + }; +}; + callbacks.add('oembed:afterParseContent', function(data) { - if (data.parsedUrl && data.parsedUrl.query) { - let queryString = data.parsedUrl.query; - if (_.isString(data.parsedUrl.query)) { - queryString = QueryString.parse(data.parsedUrl.query); - } - if (queryString.url != null) { - const { url } = queryString; - const provider = providers.getProviderForUrl(url); - if (provider != null) { - if (data.content && data.content.body) { - try { - const metas = JSON.parse(data.content.body); - _.each(metas, function(value, key) { - if (_.isString(value)) { - data.meta[camelCase(`oembed_${ key }`)] = value; - } - }); - data.meta.oembedUrl = url; - } catch (error) { - console.log(error); - } - } + if (!data || !data.url || !data.content?.body || !data.parsedUrl?.query) { + return cleanupOembed(data); + } + + let queryString = data.parsedUrl.query; + if (_.isString(data.parsedUrl.query)) { + queryString = QueryString.parse(data.parsedUrl.query); + } + + if (!queryString.url) { + return cleanupOembed(data); + } + + const { url: originalUrl } = data; + const provider = providers.getProviderForUrl(originalUrl); + if (!provider) { + return cleanupOembed(data); + } + + const { url } = queryString; + data.meta.oembedUrl = url; + + try { + const metas = JSON.parse(data.content.body); + _.each(metas, function(value, key) { + if (_.isString(value)) { + data.meta[camelCase(`oembed_${ key }`)] = value; } - } + }); + } catch (error) { + console.log(error); } return data; }, callbacks.priority.MEDIUM, 'oembed-providers-after'); diff --git a/app/oembed/server/server.js b/app/oembed/server/server.js index a342b89ab11e1..1233a2e3c1232 100644 --- a/app/oembed/server/server.js +++ b/app/oembed/server/server.js @@ -60,7 +60,7 @@ const toUtf8 = function(contentType, body) { return iconv.decode(body, getCharset(contentType, body)); }; -const getUrlContent = function(urlObj, redirectCount = 5, callback) { +const getUrlContent = Meteor.wrapAsync(function(urlObj, redirectCount = 5, callback) { if (_.isString(urlObj)) { urlObj = URL.parse(urlObj); } @@ -142,10 +142,9 @@ const getUrlContent = function(urlObj, redirectCount = 5, callback) { return stream.on('error', function(err) { error = err; }); -}; +}); OEmbed.getUrlMeta = function(url, withFragment) { - const getUrlContentSync = Meteor.wrapAsync(getUrlContent); const urlObj = URL.parse(url); if (withFragment != null) { const queryStringObj = querystring.parse(urlObj.query); @@ -158,7 +157,7 @@ OEmbed.getUrlMeta = function(url, withFragment) { } urlObj.path = path; } - const content = getUrlContentSync(urlObj, 5); + const content = getUrlContent(urlObj, 5); if (!content) { return; } @@ -190,12 +189,11 @@ OEmbed.getUrlMeta = function(url, withFragment) { if (metas.fragment === '!' && (withFragment == null)) { return OEmbed.getUrlMeta(url, true); } + delete metas.oembedHtml; } let headers = undefined; - let data = undefined; - - if (content && content.headers) { + if (content?.headers) { headers = {}; const headerObj = content.headers; Object.keys(headerObj).forEach((header) => { @@ -203,15 +201,15 @@ OEmbed.getUrlMeta = function(url, withFragment) { }); } if (content && content.statusCode !== 200) { - return data; + return; } - data = callbacks.run('oembed:afterParseContent', { + return callbacks.run('oembed:afterParseContent', { + url, meta: metas, headers, parsedUrl: content.parsedUrl, content, }); - return data; }; OEmbed.getUrlMetaWithCache = function(url, withFragment) {