Skip to content

Instantly share code, notes, and snippets.

@arthur-debert
Created June 22, 2018 03:26
Show Gist options
  • Save arthur-debert/1c7e54de5efe02d9ef0477ef29bf7097 to your computer and use it in GitHub Desktop.
Save arthur-debert/1c7e54de5efe02d9ef0477ef29bf7097 to your computer and use it in GitHub Desktop.
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&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" />
+
+<embed src="http://vimeo.com/moogaloop.swf?clip_id=12953301&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;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