Permalink
Browse files

Added jQuery.oembed.js

  • Loading branch information...
1 parent f19b932 commit 8f949e59c01f7737d1e025b57eb2449cde8243ce @miyagawa committed Oct 19, 2009
Showing with 185 additions and 0 deletions.
  1. +185 −0 eg/static/jquery.oembed.js
View
@@ -0,0 +1,185 @@
+(function($) {
+ $.fn.oembed = function(url, options, callback) {
+
+ options = $.extend({}, $.fn.oembed.defaults, options);
+
+ return this.each(function() {
+
+ var container = $(this);
+ var resourceURL = (url != null) ? url : container.attr("href");
+ var provider;
+
+ if (!callback) callback = function(container, oembed) {
+ $.fn.oembed.insertCode(container, options.embedMethod, oembed);
+ };
+
+ if (resourceURL != null) {
+ provider = getOEmbedProvider(resourceURL);
+
+ if (provider != null) {
+ provider.maxWidth = options.maxWidth;
+ provider.maxHeight = options.maxHeight;
+ provider.embedCode(container, resourceURL, callback);
+ return;
+ }
+ }
+
+ // callback(container, null);
+ });
+ };
+
+ // Plugin defaults
+ $.fn.oembed.defaults = {
+ maxWidth: 500,
+ maxHeight: 400,
+ embedMethod: "replace", // "auto", "append", "fill"
+ };
+
+ $.fn.oembed.insertCode = function(container, embedMethod, oembed) {
+ switch(embedMethod)
+ {
+ case "auto":
+ if (container.attr("href") != null) {
+ insertCode(container, "append", oembed);
+ }
+ else {
+ insertCode(container, "replace", oembed);
+ };
+ break;
+ case "replace":
+ container.replaceWith(oembed.code);
+ break;
+ case "fill":
+ container.html(oembed.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");
+ }
+ oembedContainer.html(oembed.code);
+ break;
+ }
+ }
+
+ $.fn.oembed.getPhotoCode = function(url, data) {
+ var alt = data.title ? data.title : '';
+ alt += data.author_name ? ' - ' + data.author_name : '';
+ alt += data.provider_name ? ' - ' +data.provider_name : '';
+ var code = '<div><a href="' + url + '" target="_blank"><img src="' + data.url + '" alt="' + alt + '"/></a></div>';
+ if (data.html)
+ code += "<div>" + data.html + "</div>";
+ return code;
+ };
+
+ $.fn.oembed.getVideoCode = function(url, data) {
+ var code = data.html;
+ return code;
+ };
+
+ $.fn.oembed.getRichCode = function(url, data) {
+ var code = data.html;
+ return code;
+ };
+
+ $.fn.oembed.getGenericCode = function(url, data) {
+ var title = (data.title != null) ? data.title : url,
+ code = '<a href="' + url + '">' + title + '</a>';
+ if (data.html)
+ code += "<div>" + data.html + "</div>";
+ return code;
+ };
+
+ $.fn.oembed.isAvailable = function(url) {
+ var provider = getOEmbedProvider(url);
+ return (provider != null);
+ };
+
+ /* Private Methods */
+ function getOEmbedProvider(url) {
+ for (var i = 0; i < providers.length; i++) {
+ if (providers[i].matches(url))
+ return providers[i];
+ }
+ return null;
+ }
+
+ var providers = [
+ new OEmbedProvider("fivemin", "5min.com"),
+ new OEmbedProvider("amazon", "amazon.com"),
+ new OEmbedProvider("flickr", "flickr", "http://flickr.com/services/oembed", "jsoncallback"),
+ new OEmbedProvider("googlevideo", "video.google."),
+ new OEmbedProvider("hulu", "hulu.com"),
+ new OEmbedProvider("imdb", "imdb.com"),
+ new OEmbedProvider("metacafe", "metacafe.com"),
+ new OEmbedProvider("qik", "qik.com"),
+ new OEmbedProvider("revision3", "slideshare"),
+ new OEmbedProvider("slideshare", "5min.com"),
+ new OEmbedProvider("twitpic", "twitpic.com"),
+ new OEmbedProvider("viddler", "viddler.com"),
+ new OEmbedProvider("vimeo", "vimeo.com", "http://vimeo.com/api/oembed.json"),
+ new OEmbedProvider("wikipedia", "wikipedia.org"),
+ new OEmbedProvider("wordpress", "wordpress.com"),
+ new OEmbedProvider("youtube", "youtube.com")
+ ];
+
+ function OEmbedProvider(name, urlPattern, oEmbedUrl, callbackparameter) {
+ this.name = name;
+ this.urlPattern = urlPattern;
+ this.oEmbedUrl = (oEmbedUrl != null) ? oEmbedUrl : "http://oohembed.com/oohembed/";
+ this.callbackparameter = (callbackparameter != null) ? callbackparameter : "callback";
+ this.maxWidth = 500;
+ this.maxHeight = 400;
+
+ this.matches = function(externalUrl) {
+ // TODO: Convert to Regex
+ return externalUrl.indexOf(this.urlPattern) >= 0;
+ };
+
+ this.getRequestUrl = function(externalUrl) {
+
+ var url = this.oEmbedUrl;
+
+ if (url.indexOf("?") <= 0)
+ url = url + "?";
+
+ url += "maxwidth=" + this.maxWidth +
+ "&maxHeight=" + this.maxHeight +
+ "&format=json" +
+ "&url=" + escape(externalUrl) +
+ "&" + this.callbackparameter + "=?";
+ return url;
+ }
+
+ this.embedCode = function(container, externalUrl, callback) {
+
+ var request = this.getRequestUrl(externalUrl);
+
+ $.getJSON(request, function(data) {
+
+ var oembed = $.extend(data);
+
+ var code, type = data.type;
+
+ switch (type) {
+ case "photo":
+ oembed.code = $.fn.oembed.getPhotoCode(externalUrl, data);
+ break;
+ case "video":
+ oembed.code = $.fn.oembed.getVideoCode(externalUrl, data);
+ break;
+ case "rich":
+ oembed.code = $.fn.oembed.getRichCode(externalUrl, data);
+ break;
+ default:
+ oembed.code = $.fn.oembed.getGenericCode(externalUrl, data);
+ break;
+ }
+
+ callback(container, oembed);
+ });
+ }
+ }
+})(jQuery);

0 comments on commit 8f949e5

Please sign in to comment.