Delivers the embedded representation of a URL if one is provided or tries to create it with the information present on the given URL.
npm i oembedder
The oembedder
module exports a function that accepts two parameters, the url of the resource to get the oEmbed format and an optional configuration object that might contain custom selectors to extract values from a specific resource and/or the provider url.
If a provider url is given the custom selectors are superfluous.
The configuration consists of the following two properties (provider
, selectors
).
You can find the oEmbed provider from the oembed.com list, or you might know a provider that is not listed there.
Example provider for youtube:
{
"provider_name": "YouTube",
"provider_url": "https://www.youtube.com/",
"endpoints": [
{
"url": "https://www.youtube.com/oembed",
"discovery": true
}
]
}
The above JSON is retrieved from oembed.com and the library expects the https://www.youtube.com/oembed
endpoint from the endpoints
array.
If you have a provider that is not included in the list you could follow the instructions and submit it.
The oembedder returns a promise that resolves to the oEmbed format of the requested resource, as a javascript object.
Usage:
const oembedder = require('oembedder');
const provider = 'https://www.youtube.com/oembed';
const url = 'https://www.youtube.com/watch?v=_avbO-ckwQw';
oembedder(url, provider)
.then(console.log)
.catch(console.log);
Response
{
author_url: 'https://www.youtube.com/user/NBA',
type: 'video',
provider_url: 'https://www.youtube.com/',
thumbnail_url: 'https://i.ytimg.com/vi/_avbO-ckwQw/hqdefault.jpg',
thumbnail_width: 480,
html: '<iframe width="480" height="270" src="https://www.youtube.com/embed/_avbO-ckwQw?feature=oembed" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>',
provider_name: 'YouTube',
thumbnail_height: 360,
height: 270,
title: '2018 NBA Finals Game 4 Mini-Movie',
author_name: 'NBA',
version: '1.0',
width: 480
}
If you don't know the provider or there is no oEmbed provider to a specific url. The library will try to resolve the oEmbed format of the resource.
Usage:
const oembedder = require('oembedder');
const url = 'http://www.bbc.com/capital/story/20180626-why-owls-might-suffer-in-a-cashless-society';
oembedder(url)
.then(console.log)
.catch(console.log);
Response
{
version: '1.0',
type: 'link',
title: 'The strange reason owl theft may be on the rise ',
provider_url: 'http://www.bbc.com/',
provider_name: 'www.bbc.com',
author_url: 'http://www.bbc.com/',
author_name: 'Richard Gray',
thumbnail_url:'http://ichef.bbci.co.uk/wwfeatures/live/624_351/images/live/p0/6c/29/p06c29f1.jpg',
thumbnail_width: 624,
thumbnail_height: 351
}
You can use selectors to extract information from a specific page for a specific property of the oEmbed format. If no selectors are provided a set of default selectors will be used to extract this information. You can overwrite part or all of the default selectors by passing a custom selector for an oEmbed property.
The current library supports attribute values of matched element, text within its html tag, or the html content.
The selectors configuration accepts a set of selector objects per property, in case that the information needs to be extracted and combined from a series of html elements.
Property | Default selector(s) | text | attribute | Default value |
---|---|---|---|---|
title | h1 , h2 , div[class$=title] |
true | undefined |
|
providerUrl | resource domain |
|||
providerName | meta[property=site_name] |
false | content | resource host |
authorUrl | provider url |
|||
authorName | meta[name=author] |
false | content | resource host |
thumbnail | meta[property="og:image"] |
false | content | undefined |
text* | undefined |
|||
htmlText** | undefined |
* The text
property is an extension to possibly extract the text of a resource, which is not defined in the oembed.com provider response.
** The htmlText
property is another extension to possibly extract the text of a resource, similarly with the text property above, but including the html markup.
Those too extensions intent to enrich the oEmbed format for a better representation on the web.
The following configuration of selectors is set to extract the author name and url of blog post on medium.com.
const oembedder = require('oembedder');
const selectors = {
authorName: [
{
selector: 'meta[property="author"]',
attribute: 'content'
}
],
authorUrl: [
{
selector: 'link[rel="author"]',
attribute: 'href'
}
]
};
const url = 'https://medium.com/the-node-js-collection/native-extensions-for-node-js-767e221b3d26';
oembedder(url, { selectors })
.then(console.log)
.catch(console.log);
const oembedder = require('oembedder');
const selectors = {
authorName: [
{
selector: 'meta[property="author"]',
attribute: 'content'
}
],
authorUrl: [
{
selector: 'link[rel="author"]',
attribute: 'href'
}
],
text: [
{
selector: '.section-content',
text: true
}
]
};
const url = 'https://medium.com/the-node-js-collection/native-extensions-for-node-js-767e221b3d26';
oembedder(url, { selectors })
.then(console.log)
.catch(console.log);
The configuration of the module allows the user to set some information of the http GET request. The allowed options are the following:
http option | Default value | Description |
---|---|---|
encoding | utf-8 |
The encoding to be used by the request |
followRedirect | true |
To follow or not 3xx responses as redirects |
gzip | true |
Requests compressed content or not |
headers | undefined |
A JS object with http header info |
timeout | After the timeout in ms the request will respond with ESOCKETTIMEDOUT error |
const oembedder = require('oembedder');
const url = 'https://medium.com/the-node-js-collection/native-extensions-for-node-js-767e221b3d26';
const httpOptions = {
timeout: 5000 // sets the request timeout to 5 seconds
};
oembedder(url, { httpOptions })
.then(console.log)
.catch(console.log);
At the moment the library only resolves oEmbeds of type link for the resources that no provider is given or matched.