1 /** The minplayer namespace. */ 2 var minplayer = minplayer || {}; 3 4 /** All the media player implementations */ 5 minplayer.players = minplayer.players || {}; 6 7 /** 8 * @constructor 9 * @extends minplayer.players.base 10 * @class The vimeo media player. 11 * 12 * @param {object} context The jQuery context. 13 * @param {object} options This components options. 14 * @param {object} queue The event queue to pass events around. 15 */ 16 minplayer.players.vimeo = function(context, options, queue) { 17 18 // Derive from players base. 19 minplayer.players.base.call(this, context, options, queue); 20 }; 21 22 /** Derive from minplayer.players.base. */ 23 minplayer.players.vimeo.prototype = new minplayer.players.base(); 24 25 /** Reset the constructor. */ 26 minplayer.players.vimeo.prototype.constructor = minplayer.players.vimeo; 27 28 /** 29 * @see minplayer.plugin.construct 30 * @this minplayer.players.vimeo 31 */ 32 minplayer.players.vimeo.prototype.construct = function() { 33 34 // Call the players.flash constructor. 35 minplayer.players.base.prototype.construct.call(this); 36 37 // Set the plugin name within the options. 38 this.options.pluginName = 'vimeo'; 39 }; 40 41 /** 42 * @see minplayer.players.base#getPriority 43 * @param {object} file A {@link minplayer.file} object. 44 * @return {number} The priority of this media player. 45 */ 46 minplayer.players.vimeo.getPriority = function(file) { 47 return 10; 48 }; 49 50 /** 51 * @see minplayer.players.base#canPlay 52 * @return {boolean} If this player can play this media type. 53 */ 54 minplayer.players.vimeo.canPlay = function(file) { 55 56 // Check for the mimetype for vimeo. 57 if (file.mimetype === 'video/vimeo') { 58 return true; 59 } 60 61 // If the path is a vimeo path, then return true. 62 return (file.path.search(/^http(s)?\:\/\/(www\.)?vimeo\.com/i) === 0); 63 }; 64 65 /** 66 * Determines if the player should show the playloader. 67 * 68 * @param {string} preview The preview image. 69 * @return {bool} If this player implements its own playLoader. 70 */ 71 minplayer.players.vimeo.prototype.hasPlayLoader = function(preview) { 72 return minplayer.hasTouch || !preview; 73 }; 74 75 /** 76 * Determines if the player should show the playloader. 77 * 78 * @return {bool} If this player implements its own playLoader. 79 */ 80 minplayer.players.vimeo.prototype.hasController = function() { 81 return minplayer.hasTouch; 82 }; 83 84 /** 85 * Return the ID for a provided media file. 86 * 87 * @param {object} file A {@link minplayer.file} object. 88 * @return {string} The ID for the provided media. 89 */ 90 minplayer.players.vimeo.getMediaId = function(file) { 91 var regex = /^http[s]?\:\/\/(www\.)?vimeo\.com\/(\?v\=)?([0-9]+)/i; 92 if (file.path.search(regex) === 0) { 93 return file.path.match(regex)[3]; 94 } 95 else { 96 return file.path; 97 } 98 }; 99 100 /** 101 * Returns a preview image for this media player. 102 * 103 * @param {object} file A {@link minplayer.file} object. 104 * @param {string} type The type of image. 105 * @param {function} callback Called when the image is retrieved. 106 */ 107 minplayer.players.vimeo.getImage = function(file, type, callback) { 108 jQuery.ajax({ 109 url: 'http://vimeo.com/api/v2/video/' + file.id + '.json', 110 dataType: 'jsonp', 111 success: function(data) { 112 callback(data[0].thumbnail_large); 113 } 114 }); 115 }; 116 117 /** 118 * @see minplayer.players.base#reset 119 */ 120 minplayer.players.vimeo.prototype.reset = function() { 121 122 // Reset the flash variables.. 123 minplayer.players.base.prototype.reset.call(this); 124 }; 125 126 /** 127 * @see minplayer.players.base#create 128 * @return {object} The media player entity. 129 */ 130 minplayer.players.vimeo.prototype.create = function() { 131 minplayer.players.base.prototype.create.call(this); 132 133 // Insert the Vimeo Froogaloop player. 134 var tag = document.createElement('script'); 135 tag.src = 'http://a.vimeocdn.com/js/froogaloop2.min.js'; 136 var firstScriptTag = document.getElementsByTagName('script')[0]; 137 firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); 138 139 // Create the iframe for this player. 140 var iframe = document.createElement('iframe'); 141 iframe.setAttribute('id', this.options.id + '-player'); 142 iframe.setAttribute('type', 'text/html'); 143 iframe.setAttribute('width', '100%'); 144 iframe.setAttribute('height', '100%'); 145 iframe.setAttribute('frameborder', '0'); 146 jQuery(iframe).addClass('vimeo-player'); 147 148 // Get the source. 149 var src = 'http://player.vimeo.com/video/'; 150 src += this.mediaFile.id + '?'; 151 152 // Add the parameters to the src. 153 src += jQuery.param({ 154 'wmode': 'opaque', 155 'api': 1, 156 'player_id': this.options.id + '-player', 157 'title': 0, 158 'byline': 0, 159 'portrait': 0, 160 'autoplay': this.options.autoplay, 161 'loop': this.options.loop 162 }); 163 164 // Set the source of the iframe. 165 iframe.setAttribute('src', src); 166 167 // Now register this player when the froogaloop code is loaded. 168 this.poll((function(player) { 169 return function() { 170 if (window.Froogaloop) { 171 player.player = window.Froogaloop(iframe); 172 var playerTimeout = 0; 173 player.player.addEvent('ready', function() { 174 clearTimeout(playerTimeout); 175 player.onReady(); 176 player.onError(''); 177 }); 178 playerTimeout = setTimeout(function() { 179 player.onReady(); 180 player.onError('Unable to play video.'); 181 }, 2000); 182 } 183 return !window.Froogaloop; 184 }; 185 })(this), 200); 186 187 // Trigger that the load has started. 188 this.trigger('loadstart'); 189 190 // Return the player. 191 return iframe; 192 }; 193 194 /** 195 * @see minplayer.players.base#onReady 196 */ 197 minplayer.players.vimeo.prototype.onReady = function(player_id) { 198 199 // Add the other listeners. 200 this.player.addEvent('loadProgress', (function(player) { 201 return function(progress) { 202 player.duration.set(parseFloat(progress.duration)); 203 player.bytesLoaded.set(progress.bytesLoaded); 204 player.bytesTotal.set(progress.bytesTotal); 205 }; 206 })(this)); 207 208 this.player.addEvent('playProgress', (function(player) { 209 return function(progress) { 210 player.duration.set(parseFloat(progress.duration)); 211 player.currentTime.set(parseFloat(progress.seconds)); 212 }; 213 })(this)); 214 215 this.player.addEvent('play', (function(player) { 216 return function() { 217 player.onPlaying(); 218 }; 219 })(this)); 220 221 this.player.addEvent('pause', (function(player) { 222 return function() { 223 player.onPaused(); 224 }; 225 })(this)); 226 227 this.player.addEvent('finish', (function(player) { 228 return function() { 229 player.onComplete(); 230 }; 231 })(this)); 232 233 minplayer.players.base.prototype.onReady.call(this); 234 this.onLoaded(); 235 }; 236 237 /** 238 * Clears the media player. 239 */ 240 minplayer.players.vimeo.prototype.clear = function() { 241 if (this.player) { 242 this.player.api('unload'); 243 } 244 minplayer.players.base.prototype.clear.call(this); 245 }; 246 247 /** 248 * @see minplayer.players.base#load 249 * @return {boolean} If this action was performed. 250 */ 251 minplayer.players.vimeo.prototype.load = function(file) { 252 if (minplayer.players.base.prototype.load.call(this, file)) { 253 this.construct(); 254 return true; 255 } 256 return false; 257 }; 258 259 /** 260 * @see minplayer.players.base#play 261 * @return {boolean} If this action was performed. 262 */ 263 minplayer.players.vimeo.prototype.play = function() { 264 if (minplayer.players.base.prototype.play.call(this)) { 265 this.player.api('play'); 266 return true; 267 } 268 269 return false; 270 }; 271 272 /** 273 * @see minplayer.players.base#pause 274 * @return {boolean} If this action was performed. 275 */ 276 minplayer.players.vimeo.prototype.pause = function() { 277 if (minplayer.players.base.prototype.pause.call(this)) { 278 this.player.api('pause'); 279 return true; 280 } 281 282 return false; 283 }; 284 285 /** 286 * @see minplayer.players.base#stop 287 * @return {boolean} If this action was performed. 288 */ 289 minplayer.players.vimeo.prototype.stop = function() { 290 if (minplayer.players.base.prototype.stop.call(this)) { 291 this.player.api('unload'); 292 return true; 293 } 294 295 return false; 296 }; 297 298 /** 299 * @see minplayer.players.base#seek 300 * @return {boolean} If this action was performed. 301 */ 302 minplayer.players.vimeo.prototype.seek = function(pos) { 303 if (minplayer.players.base.prototype.seek.call(this, pos)) { 304 this.player.api('seekTo', pos); 305 return true; 306 } 307 308 return false; 309 }; 310 311 /** 312 * @see minplayer.players.base#setVolume 313 * @return {boolean} If this action was performed. 314 */ 315 minplayer.players.vimeo.prototype.setVolume = function(vol) { 316 if (minplayer.players.base.prototype.setVolume.call(this, vol)) { 317 this.volume.set(vol); 318 this.player.api('setVolume', vol); 319 return true; 320 } 321 322 return false; 323 }; 324 325 /** 326 * @see minplayer.players.base#getVolume 327 */ 328 minplayer.players.vimeo.prototype.getVolume = function(callback) { 329 this.player.api('getVolume', function(vol) { 330 callback(vol); 331 }); 332 }; 333 334 /** 335 * @see minplayer.players.base#getDuration. 336 */ 337 minplayer.players.vimeo.prototype.getDuration = function(callback) { 338 if (this.isReady()) { 339 if (this.duration.value) { 340 callback(this.duration.value); 341 } 342 else { 343 this.player.api('getDuration', function(duration) { 344 callback(duration); 345 }); 346 } 347 } 348 }; 349