Skip to content

Instantly share code, notes, and snippets.

@nfreear
Created April 18, 2022 20:52
Show Gist options
  • Select an option

  • Save nfreear/890f90a9f0917b6a15cdce947442a291 to your computer and use it in GitHub Desktop.

Select an option

Save nfreear/890f90a9f0917b6a15cdce947442a291 to your computer and use it in GitHub Desktop.
jQuery oEmbed plugin - The Open University | https://embed.open.ac.uk/scripts/jquery.oembed.js
/*auto-generated: 2022-04-18T21:50:42+01:00 */
/*!
* jquery oembed plugin
*
* Copyright (c) 2009 Richard Chamorro
* Licensed under the MIT license
*
* Author: Richard Chamorro
*/
/*!
* Open Media Player modifications: © 2011 The Open University.
*/
// Revision #23 on Google Code (was #20).
/* eslint no-useless-escape: "off" */
/* global getOEmbedProvider */
(function ($) {
$.fn.oembed = function (url, options, embedAction) {
settings = $.extend(true, $.fn.oembed.defaults, options);
initializeProviders();
return this.each(function () {
var container = $(this);
var resourceURL = (url != null) ? url : container.attr('href');
var provider;
if (embedAction) {
settings.onEmbed = embedAction;
} else {
settings.onEmbed = function (oembedData) {
$.fn.oembed.insertCode(this, settings.embedMethod, oembedData);
};
}
if (resourceURL != null) {
provider = $.fn.oembed.getOEmbedProvider(resourceURL);
if (provider != null) {
provider.params = getNormalizedParams(settings[provider.name]) || {};
provider.maxWidth = settings.maxWidth;
provider.maxHeight = settings.maxHeight;
embedCode(container, resourceURL, provider);
} else {
settings.onProviderNotFound.call(container, resourceURL);
}
}
return container;
});
};
var settings; var activeProviders = [];
// Plugin defaults
$.fn.oembed.defaults = {
maxWidth: null,
maxHeight: null,
embedMethod: 'replace', // "auto", "append", "fill"
defaultOEmbedProvider: 'oohembed', // "oohembed", "embed.ly", "none"
allowedProviders: null,
disallowedProviders: null,
customProviders: null, // [ new $.fn.oembed.OEmbedProvider("customprovider", null, ["customprovider\\.com/watch.+v=[\\w-]+&?"]) ]
defaultProvider: null,
greedy: true,
onProviderNotFound: function () { },
beforeEmbed: function () { },
afterEmbed: function () { },
onEmbed: function () { },
onError: function () {},
ajaxOptions: {}
};
/* Private functions */
function getRequestUrl (provider, externalUrl) {
var url = provider.apiendpoint; var qs = ''; var callbackparameter = provider.callbackparameter || 'callback'; var i;
if (url.indexOf('?') <= 0) { url = url + '?'; } else { url = url + '&'; }
if (provider.maxWidth != null && provider.params['maxwidth'] == null) { provider.params['maxwidth'] = provider.maxWidth; }
if (provider.maxHeight != null && provider.params['maxheight'] == null) { provider.params['maxheight'] = provider.maxHeight; }
for (i in provider.params) {
// We don't want them to jack everything up by changing the callback parameter
if (i === provider.callbackparameter) { continue; }
// allows the options to be set to null, don't send null values to the server as parameters
if (provider.params[i] != null) { qs += '&' + escape(i) + '=' + provider.params[i]; }
}
url += 'format=json&url=' + escape(externalUrl) + qs + '&' + callbackparameter + '=?';
return url;
}
function embedCode (container, externalUrl, embedProvider) {
var requestUrl = getRequestUrl(embedProvider, externalUrl);
var ajaxopts = $.extend({
url: requestUrl,
type: 'get',
dataType: 'json',
// error: jsonp request doesnt' support error handling
success: function (data) {
var oembedData = $.extend({}, data);
switch (oembedData.type) {
case 'photo':
oembedData.code = $.fn.oembed.getPhotoCode(externalUrl, oembedData);
break;
case 'video':
oembedData.code = $.fn.oembed.getVideoCode(externalUrl, oembedData);
break;
case 'rich':
oembedData.code = $.fn.oembed.getRichCode(externalUrl, oembedData);
break;
default:
oembedData.code = $.fn.oembed.getGenericCode(externalUrl, oembedData);
break;
}
settings.beforeEmbed.call(container, oembedData);
settings.onEmbed.call(container, oembedData);
settings.afterEmbed.call(container, oembedData);
},
error: settings.onError.call(container, externalUrl, embedProvider)
}, settings.ajaxOptions || { });
$.ajax(ajaxopts);
}
function initializeProviders () {
activeProviders = [];
var defaultProvider; var restrictedProviders = []; var i; var provider;
if (!isNullOrEmpty(settings.allowedProviders)) {
for (i = 0; i < $.fn.oembed.providers.length; i++) {
if ($.inArray($.fn.oembed.providers[i].name, settings.allowedProviders) >= 0) { activeProviders.push($.fn.oembed.providers[i]); }
}
// If there are allowed providers, jquery-oembed cannot be greedy
settings.greedy = false;
} else {
activeProviders = $.fn.oembed.providers;
}
if (!isNullOrEmpty(settings.disallowedProviders)) {
for (i = 0; i < activeProviders.length; i++) {
if ($.inArray(activeProviders[i].name, settings.disallowedProviders) < 0) { restrictedProviders.push(activeProviders[i]); }
}
activeProviders = restrictedProviders;
// If there are allowed providers, jquery-oembed cannot be greedy
settings.greedy = false;
}
if (!isNullOrEmpty(settings.customProviders)) {
$.each(settings.customProviders, function (n, customProvider) {
if (customProvider instanceof $.fn.oembed.OEmbedProvider) {
// ou-specific: Bug fix.
// activeProviders.push(provider);
activeProviders.push(customProvider);
} else {
provider = new $.fn.oembed.OEmbedProvider();
if (provider.fromJSON(customProvider)) { activeProviders.push(provider); }
}
});
}
// If in greedy mode, we add the default provider
defaultProvider = getDefaultOEmbedProvider(settings.defaultOEmbedProvider);
if (settings.greedy === true) {
activeProviders.push(defaultProvider);
}
// If any provider has no apiendpoint, we use the default provider endpoint
for (i = 0; i < activeProviders.length; i++) {
if (activeProviders[i].apiendpoint == null) { activeProviders[i].apiendpoint = defaultProvider.apiendpoint; }
}
}
function getDefaultOEmbedProvider (defaultOEmbedProvider) {
var url = 'http://oohembed.com/oohembed/';
if (defaultOEmbedProvider === 'embed.ly') { url = 'https://api.embed.ly/v1/api/oembed?'; }
return new $.fn.oembed.OEmbedProvider(defaultOEmbedProvider, null, null, url, 'callback');
}
function getNormalizedParams (params) {
if (params == null) { return null; }
var key; var normalizedParams = {};
for (key in params) {
if (key != null) { normalizedParams[key.toLowerCase()] = params[key]; }
}
return normalizedParams;
}
function isNullOrEmpty (object) {
if (typeof object === 'undefined') { return true; }
if (object == null) { return true; }
if ($.isArray(object) && object.length === 0) { return true; }
return false;
}
/* Public functions */
$.fn.oembed.insertCode = function (container, embedMethod, oembedData) {
if (oembedData == null) { return; }
switch (embedMethod) {
case 'auto':
if (container.attr('href') != null) {
$.fn.oembed.insertCode(container, 'append', oembedData);
} else {
$.fn.oembed.insertCode(container, 'replace', oembedData);
}
break;
case 'replace':
container.replaceWith(oembedData.code);
break;
case 'fill':
container.html(oembedData.code);
break;
case 'append':
var oembedContainer = container.next();
if (oembedContainer == null || !oembedContainer.hasClass('oembed-container')) {
oembedContainer = container
.after('<div class="oembed-container"></div>')
.next('.oembed-container');
if (oembedData != null && oembedData.provider_name != null) { oembedContainer.toggleClass('oembed-container-' + oembedData.provider_name); }
}
oembedContainer.html(oembedData.code);
break;
}
};
$.fn.oembed.getPhotoCode = function (url, oembedData) {
var code; var alt = oembedData.title ? oembedData.title : '';
alt += oembedData.author_name ? ' - ' + oembedData.author_name : '';
alt += oembedData.provider_name ? ' - ' + oembedData.provider_name : '';
code = '<div><a href="' + url + '" target=\'_blank\'><img src="' + oembedData.url + '" alt="' + alt + '"/></a></div>';
if (oembedData.html) { code += '<div>' + oembedData.html + '</div>'; }
return code;
};
$.fn.oembed.getVideoCode = function (url, oembedData) {
var code = oembedData.html;
return code;
};
$.fn.oembed.getRichCode = function (url, oembedData) {
var code = oembedData.html;
return code;
};
$.fn.oembed.getGenericCode = function (url, oembedData) {
var title = (oembedData.title != null) ? oembedData.title : url;
var code = '<a href="' + url + '">' + title + '</a>';
if (oembedData.html) { code += '<div>' + oembedData.html + '</div>'; }
return code;
};
$.fn.oembed.isProviderAvailable = function (url) {
var provider = getOEmbedProvider(url);
return (provider != null);
};
$.fn.oembed.getOEmbedProvider = function (url) {
for (var i = 0; i < activeProviders.length; i++) {
if (activeProviders[i].matches(url)) { return activeProviders[i]; }
}
return null;
};
$.fn.oembed.OEmbedProvider = function (name, type, urlschemesarray, apiendpoint, callbackparameter) {
this.name = name;
this.type = type; // "photo", "video", "link", "rich", null
this.urlschemes = getUrlSchemes(urlschemesarray);
this.apiendpoint = apiendpoint;
this.callbackparameter = callbackparameter;
this.maxWidth = 500;
this.maxHeight = 400;
var i, property, regExp;
this.matches = function (externalUrl) {
for (i = 0; i < this.urlschemes.length; i++) {
regExp = new RegExp(this.urlschemes[i], 'i');
if (externalUrl.match(regExp) != null) { return true; }
}
return false;
};
this.fromJSON = function (json) {
for (property in json) {
if (property !== 'urlschemes') { this[property] = json[property]; } else { this[property] = getUrlSchemes(json[property]); }
}
return true;
};
function getUrlSchemes (urls) {
if (isNullOrEmpty(urls)) { return ['.']; }
if ($.isArray(urls)) { return urls; }
return urls.split(';');
}
};
/* Native & common providers */
$.fn.oembed.providers = [
// ou-specific
new $.fn.oembed.OEmbedProvider('nfb', 'video', ["nfb\.ca"]),
new $.fn.oembed.OEmbedProvider('last.fm', 'audio', ["last\.fm"]),
new $.fn.oembed.OEmbedProvider('dotsub', 'video', ["dotsub\.com"]),
new $.fn.oembed.OEmbedProvider('twitter', 'rich', ["twitter\.com"]),
new $.fn.oembed.OEmbedProvider('xtranormal', 'video', ["xtranormal\.com"]),
new $.fn.oembed.OEmbedProvider('timetoast', 'rich', ["timetoast\.com"]),
new $.fn.oembed.OEmbedProvider('speakerdeck', 'rich', ["speakerdeck\.com"], 'http://speakerdeck.com/oembed.json'),
new $.fn.oembed.OEmbedProvider('cacoo', 'rich', ["cacoo\.com"], 'http://cacoo.com/oembed.json'),
new $.fn.oembed.OEmbedProvider('wordpress', 'rich', ["\.wordpress\.com"], 'http://public-api.wordpress.com/oembed/1.0/?for=Embed.open.ac.uk'),
new $.fn.oembed.OEmbedProvider('wordpress', 'rich', ["wp\.me"], 'http://public-api.wordpress.com/oembed/1.0/?for=Embed.open.ac.uk'),
new $.fn.oembed.OEmbedProvider('juxtalearn', 'rich', ["juxtalearn\.net"], 'http://trickytopic.juxtalearn.net/juxtalearn-oembed'),
new $.fn.oembed.OEmbedProvider('github gist', 'rich', ["gist\.github\.com"], 'https://noembed.com/embed'),
new $.fn.oembed.OEmbedProvider('github commit', 'rich', ["github\.com"], 'https://noembed.com/embed'),
new $.fn.oembed.OEmbedProvider('spotify', 'rich', ["open\.spotify\.com"], 'https://noembed.com/embed'),
new $.fn.oembed.OEmbedProvider('wikipedia', 'rich', ["wikipedia\.org"], 'https://noembed.com/embed'),
new $.fn.oembed.OEmbedProvider('bibsonomy', 'rich', ["bibsonomy\.org"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('cohere', 'rich', ["cohere\.open\.ac\.uk"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('dev8d', 'rich', ["data\.dev8d\.org"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('googledoc', 'rich', ["docs\.google\.com"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["dl\.dropbox\.com"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["\.googleusercontent\.com"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["ubuntuone\.com"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["openclipart\.org"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["upload\.wikimedia\.org"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["www\.open\.edu"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["www\.open\.ac\.uk"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('trackoer', 'rich', ["openlearn\.open\.ac\.uk"], 'http://track.olnet.org/oembed'),
new $.fn.oembed.OEmbedProvider('trackoer', 'rich', ["labspace\.open\.ac\.uk"], 'http://track.olnet.org/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["compendiumld\.open\.ac\.uk"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["kn\.open\.ac\.uk"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["oro\.open\.ac\.uk"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["embed\.open\.ac\.uk"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["sites\.google\.com"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["www\.lkl\.ac\.uk"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('fileviewer', 'rich', ["blogs\.cetis\.ac\.uk"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('googlegroups', 'rich', ["groups\.google\.com"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('ispot', 'rich', ["ispotnature\.org"], 'http://www.ispotnature.org/oembed'),
new $.fn.oembed.OEmbedProvider('lams', 'rich', ["lamscommunity\.org"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('mathtran', 'photo', ["mathtran\.org"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('prezi', 'rich', ["prezi\.com"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('scraperwiki', 'rich', ["views\.scraperwiki\.com"], 'https://views.scraperwiki.com/run/scraperwiki_oembed_v1/'),
new $.fn.oembed.OEmbedProvider('scratch', 'rich', ["scratch\.mit\.edu"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('sharepoint', 'rich', ["intranet7\.open\.ac\.uk"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('trackoer', 'rich', ["oercommons\.org"], 'http://track.olnet.org/oembed'),
new $.fn.oembed.OEmbedProvider('youtube', 'video', ["youtube\.com"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('youtube', 'video', ["m\.youtube\.com"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('youtube', 'video', ["youtu\.be"], 'https://embed.open.ac.uk/oembed'),
new $.fn.oembed.OEmbedProvider('oupodcast', 'video', ["podcast\.open\.ac\.uk"], 'https://embed.open.ac.uk/oembed'), /*IMPORTANT: This endpoint will be deprecated in favour of http://mediaplayer.open.ac.uk [live] */
// new $.fn.oembed.OEmbedProvider("youtube", "video", ["youtube\\.com/watch.+v=[\\w-]+&?"]), // "https://www.youtube.com/oembed" (no jsonp)
// ou-specific ends.
new $.fn.oembed.OEmbedProvider('flickr', 'photo', [ 'flickr\.com\/photos' ], 'https://www.flickr.com/services/oembed', 'jsoncallback'),
// new $.fn.oembed.OEmbedProvider("flickr", "photo", ["flickr\\.com/photos/[-.\\w@]+/\\d+/?"], "https://flickr.com/services/oembed", "jsoncallback"),
new $.fn.oembed.OEmbedProvider('viddler', 'video', ['viddler\.com']), // "https://lab.viddler.com/services/oembed/" (no jsonp)
new $.fn.oembed.OEmbedProvider('blip', 'video', ['blip\\.tv/.+'], 'https://blip.tv/oembed/'),
new $.fn.oembed.OEmbedProvider('hulu', 'video', ['hulu\\.com/watch/.*'], 'https://www.hulu.com/api/oembed.json'),
new $.fn.oembed.OEmbedProvider('vimeo', 'video', ['\/\/www\.vimeo\.com\/groups\/.*\/videos\/.*', 'www\.vimeo\.com\/.*', 'vimeo\.com\/groups\/.*\/videos\/.*', 'vimeo\.com\/.*'], 'https://vimeo.com/api/oembed.json'),
new $.fn.oembed.OEmbedProvider('dailymotion', 'video', ['dailymotion\\.com/.+']), // "https://www.dailymotion.com/api/oembed/" (callback parameter does not return jsonp)
new $.fn.oembed.OEmbedProvider('scribd', 'rich', ['scribd\\.com/.+']), // ", "https://www.scribd.com/services/oembed"" (no jsonp)
// ou-specific - 1 line, V2 api.
new $.fn.oembed.OEmbedProvider('slideshare', 'rich', ['slideshare\.net'], 'https://www.slideshare.net/api/oembed/2'),
new $.fn.oembed.OEmbedProvider('photobucket', 'photo', ['photobucket\\.com/(albums|groups)/.*'], 'https://api.photobucket.com/oembed/')
// new $.fn.oembed.OEmbedProvider("vids.myspace.com", "video", ["vids\.myspace\.com"]), // "https://vids.myspace.com/index.cfm?fuseaction=oembed" (not working)
// new $.fn.oembed.OEmbedProvider("screenr", "rich", ["screenr\.com"], "https://screenr.com/api/oembed.json") (error)
// new $.fn.oembed.OEmbedProvider("qik", "video", ["qik\\.com/\\w+"], "https://qik.com/api/oembed.json"),
// new $.fn.oembed.OEmbedProvider("revision3", "video", ["revision3\.com"], "https://revision3.com/api/oembed/")
];
})(window.jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment