Created
June 22, 2018 03:26
-
-
Save arthur-debert/1c7e54de5efe02d9ef0477ef29bf7097 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/media/js/video/vimeovideosource.js b/media/js/video/vimeovideosource.js | |
index ad0d728..5cc2ca6 100644 | |
--- a/media/js/video/vimeovideosource.js | |
+++ b/media/js/video/vimeovideosource.js | |
@@ -32,6 +32,17 @@ mirosubs.video.VimeoVideoSource = function(videoID, videoURL, opt_videoConfig) { | |
this.videoConfig_ = opt_videoConfig; | |
}; | |
+mirosubs.video.VimeoVideoSource.forURL = | |
+ function(videoURL, opt_videoConfig) | |
+{ | |
+ var videoID = new goog.Uri(videoURL).getParameterValue("clip_id"); | |
+ if (videoID) | |
+ return new mirosubs.video.VimeoVideoSource( | |
+ videoID , videoURL, opt_videoConfig); | |
+ else | |
+ return null; | |
+}; | |
+ | |
mirosubs.video.VimeoVideoSource.prototype.createPlayer = function() { | |
return this.createPlayer_(false); | |
}; | |
@@ -40,6 +51,10 @@ mirosubs.video.VimeoVideoSource.prototype.createControlledPlayer = function() { | |
return new mirosubs.video.ControlledVideoPlayer(this.createPlayer_(true)); | |
}; | |
+mirosubs.video.VimeoVideoSource.isVimeo = function(videoURL) { | |
+ return /^\s*https?:\/\/([^\.]+\.)?vimeo/i.test(videoURL); | |
+}; | |
+ | |
mirosubs.video.VimeoVideoSource.prototype.createPlayer_ = function(forDialog) { | |
return new mirosubs.video.VimeoVideoPlayer( | |
new mirosubs.video.VimeoVideoSource( | |
@@ -60,5 +75,5 @@ mirosubs.video.VimeoVideoSource.prototype.getVideoConfig = function() { | |
}; | |
mirosubs.video.VimeoVideoSource.prototype.getVideoURL = function() { | |
- return this.videoURL_; | |
-}; | |
\ No newline at end of file | |
+ return "http://vimeo.com/" + this.videoID_; | |
+}; | |
diff --git a/media/js/widgetizer/vimeo.js b/media/js/widgetizer/vimeo.js | |
index 4e220aa..532f82d 100644 | |
--- a/media/js/widgetizer/vimeo.js | |
+++ b/media/js/widgetizer/vimeo.js | |
@@ -22,22 +22,136 @@ goog.provide('mirosubs.widgetizer.Vimeo'); | |
* @constructor | |
*/ | |
mirosubs.widgetizer.Vimeo = function() { | |
- mirosubs.widgetizer.Vimeo.call(this); | |
+ mirosubs.widgetizer.VideoPlayerMaker.call(this); | |
/** | |
* @const | |
*/ | |
this.ON_VIMEO_SITE = | |
window.location.hostname.match(/vimeo\.com$/) != null; | |
}; | |
-goog.inheirts(mirosubs.widgetizer.Vimeo, | |
+goog.inherits(mirosubs.widgetizer.Vimeo, | |
mirosubs.widgetizer.VideoPlayerMaker); | |
-mirosubs.widgetizer.Vimeo.prototype.logger_ = | |
+mirosubs.widgetizer.Vimeo.logger_ = | |
goog.debug.Logger.getLogger('mirosubs.widgetizer.Vimeo'); | |
-mirosubs.widgetizer.Vimeo.prototype.unwidgetizedElement_ = function() { | |
- if (this.ON_VIMEO_SITE) { | |
- var moviePlayer = goog.dom.getElementsByTagAndClassName('object'); | |
- | |
+ | |
+ | |
+mirosubs.widgetizer.Vimeo.prototype.videosExist = function() { | |
+ return this.unwidgetizedElements_().length > 0; | |
+}; | |
+ | |
+mirosubs.widgetizer.Vimeo.prototype.makeVideoPlayers = function() { | |
+ var elements = this.unwidgetizedElements_(); | |
+ var videoPlayers = []; | |
+ for (var i = 0; i < elements.length; i++) { | |
+ var decoratable = this.isDecoratable_(elements[i]); | |
+ var videoSource = this.makeVideoSource_( | |
+ elements[i], !decoratable); | |
+ var videoPlayer = videoSource.createPlayer(); | |
+ videoPlayers.push(videoPlayer); | |
+ if (decoratable) | |
+ videoPlayer.decorate(elements[i]); | |
+ else | |
+ this.replaceVideoElement_(videoPlayer, elements[i]); | |
+ } | |
+ return videoPlayers; | |
+}; | |
+ | |
+mirosubs.widgetizer.Vimeo.prototype.isDecoratable_ = function(element) { | |
+ // FIXME: Vimeo won't allow for regular accounts to hide | |
+ // the player chrome at all, should we try to find out if | |
+ // the video is owner by a plus account or just give up on it? | |
+ return false; | |
+ | |
+}; | |
+ | |
+mirosubs.widgetizer.Vimeo.prototype.makeVideoSource_ = function(element, includeConfig) { | |
+ var url; | |
+ if (element.nodeName == "EMBED") | |
+ url = element['src']; | |
+ else | |
+ url = element['data']; | |
+ var config = null; | |
+ if (includeConfig) { | |
+ config = {}; | |
+ var uri = new goog.Uri(url, true); | |
+ var params = uri.getQueryData().getKeys(); | |
+ | |
+ for (var i = 0; i < params.length; i++) | |
+ config[params[i]] = uri.getParameterValue(params[i]); | |
+ if (element['width'] && element['height']) { | |
+ config['width'] = element['width']; | |
+ config['height'] = element['height']; | |
+ } | |
+ else if (element.style.width && element.style.height) { | |
+ config['width'] = parseInt(element.style['width']) + ''; | |
+ config['height'] = parseInt(element.style['height']) + ''; | |
+ } | |
+ // make sure we allways enable the API | |
+ config["js_api"] = 1; | |
+ } | |
+ var vimeoPageURL = this.ON_VIMEO_SITE ? window.location.href : url; | |
+ return mirosubs.video.VimeoVideoSource.forURL( | |
+ vimeoPageURL, config); | |
+}; | |
+ | |
+mirosubs.widgetizer.Vimeo.prototype.replaceVideoElement_ = | |
+ function(player, element) | |
+{ | |
+ // this might get extracted to superclass as soon as we include | |
+ // players other than youtube. | |
+ if (element.nodeName == "EMBED" && element.parentNode.nodeName == "OBJECT") | |
+ element = element.parentNode; | |
+ var nextNode = element.nextSibling; | |
+ var parent = element.parentNode; | |
+ goog.dom.removeNode(element); | |
+ if (nextNode) | |
+ player.renderBefore(nextNode); | |
+ else | |
+ player.render(parent); | |
+}; | |
+ | |
+mirosubs.widgetizer.Vimeo.prototype.isVimeoEmbed_ = function(element) { | |
+ var url = element['src']; | |
+ return mirosubs.video.VimeoVideoSource.isVimeo(url); | |
+}; | |
+ | |
+mirosubs.widgetizer.Vimeo.prototype.isVimeoObject_ = function(element) { | |
+ var url = element['data']; | |
+ return mirosubs.video.VimeoVideoSource.isVimeo(url); | |
+}; | |
+ | |
+mirosubs.widgetizer.Vimeo.prototype.objectContainsEmbed_ = | |
+ function(element) | |
+{ | |
+ return !!goog.dom.findNode( | |
+ element, | |
+ function(node) { | |
+ return node.nodeName == "EMBED"; | |
+ }); | |
+}; | |
+ | |
+mirosubs.widgetizer.Vimeo.prototype.unwidgetizedElements_ = function() { | |
+ if (this.ON_YT_SITE) { | |
+ var moviePlayer = goog.dom.getElement('movie_player'); | |
+ var elements = moviePlayer ? [moviePlayer] : []; | |
+ return this.filterUnwidgetized(elements); | |
+ } | |
+ else { | |
+ var unwidgetizedElements = []; | |
+ // most likely this will not catch all youtube players on the page | |
+ var embeds = goog.dom.getElementsByTagNameAndClass('embed'); | |
+ for (var i = 0; i < embeds.length; i++) { | |
+ if (this.isVimeoEmbed_(embeds[i]) && this.isUnwidgetized(embeds[i])) | |
+ unwidgetizedElements.push(embeds[i]); | |
+ } | |
+ var objects = document.getElementsByTagName('object'); | |
+ for (var i = 0; i < objects.length; i++) | |
+ if (!this.objectContainsEmbed_(objects[i]) && | |
+ this.isVimeoObject_(objects[i]) && | |
+ this.isUnwidgetized(objects[i])) | |
+ unwidgetizedElements.push(objects[i]); | |
+ return unwidgetizedElements; | |
} | |
-}; | |
\ No newline at end of file | |
+}; | |
diff --git a/media/js/widgetizer/widgetizer.js b/media/js/widgetizer/widgetizer.js | |
index 17f9cc1..bb090b1 100644 | |
--- a/media/js/widgetizer/widgetizer.js | |
+++ b/media/js/widgetizer/widgetizer.js | |
@@ -34,6 +34,7 @@ mirosubs.Widgetizer = function() { | |
mirosubs.DEBUG = true; | |
} | |
this.makers_ = [ | |
+ new mirosubs.widgetizer.Vimeo(), | |
new mirosubs.widgetizer.Youtube(), | |
new mirosubs.widgetizer.HTML5() | |
]; | |
diff --git a/settings.py b/settings.py | |
index 77908aa..4e9a753 100644 | |
--- a/settings.py | |
+++ b/settings.py | |
@@ -233,6 +233,7 @@ JS_WIDGETIZER_CORE.extend([ | |
"widget/widgetdecorator.js", | |
"widgetizer/videoplayermaker.js", | |
"widgetizer/widgetizer.js", | |
+ "widgetizer/vimeo.js", | |
"widgetizer/youtube.js", | |
"widgetizer/html5.js"]) | |
diff --git a/templates/widget/widgetize_demo/vimeo_nojs.html b/templates/widget/widgetize_demo/vimeo_nojs.html | |
new file mode 100644 | |
index 0000000..5498e88 | |
--- /dev/null | |
+++ b/templates/widget/widgetize_demo/vimeo_nojs.html | |
@@ -0,0 +1,21 @@ | |
+{% extends "widget/widgetize_demo/base_widgetize_demo.html" %} | |
+ | |
+{% block contents %} | |
+ | |
+<object width="400" height="225"> | |
+ <param name="allowfullscreen" value="true" /> | |
+ <param name="allowscriptaccess" value="always" /> | |
+ <param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12953301&server=vimeo.com&show_title=1&show_byline=1&show_portrait=1&color=00ADEF&fullscreen=1&autoplay=0&loop=0" /> | |
+ | |
+<embed src="http://vimeo.com/moogaloop.swf?clip_id=12953301&server=vimeo.com&show_title=1&show_byline=1&show_portrait=1&color=00ADEF&fullscreen=1&autoplay=0&loop=0" | |
+ type="application/x-shockwave-flash" | |
+ allowfullscreen="true" | |
+ allowscriptaccess="always" | |
+ width="400" | |
+ height="225"> | |
+ </embed> | |
+ </object> | |
+ <p><a href="http://vimeo.com/12953301">The Shock of Peak Oil</a> from <a href="http://vimeo.com/onthechase">ON THE CHASE!</a> on <a href="http://vimeo.com">Vimeo</a>.</p> | |
+ | |
+ | |
+{% endblock %} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment