# HG changeset patch # User hamidouk # Date 1327502326 -3600 # Node ID 05ae2aa10d24c60cffc6e624df309518e1cc1f4c # Parent 329333e072675569bbad4097f1e464df5c573eb6# Parent a4ae99d593e0e22a0c2e374bf64a069d8b82bcc3 Fusion avec embed-playerapi-rewrite. Added new player api to the mainline. diff -r 329333e07267 -r 05ae2aa10d24 sbin/build/client.xml --- a/sbin/build/client.xml Mon Jan 23 17:27:37 2012 +0100 +++ b/sbin/build/client.xml Wed Jan 25 15:38:46 2012 +0100 @@ -59,7 +59,7 @@ - + diff -r 329333e07267 -r 05ae2aa10d24 src/js/init.js --- a/src/js/init.js Mon Jan 23 17:27:37 2012 +0100 +++ b/src/js/init.js Wed Jan 25 15:38:46 2012 +0100 @@ -47,14 +47,15 @@ delete opts.container; delete opts.type; - if (options.provider === "rtmp") { + + /* Try to guess options.file and options.streamer only if file and streamer + are not already defined in the configuration */ + if (options.provider === "rtmp" && !opts.hasOwnProperty("file") && !opts.hasOwnProperty("streamer")) { /* exit if we can't access the metadata */ if (typeof(IriSP.__jsonMetadata) === "undefined") { break; }; - - // the json format is totally illogical //opts.streamer = IriSP.__jsonMetadata["medias"][0]["meta"]["item"]["value"]; //var source = IriSP.__jsonMetadata["medias"][0]["href"]; @@ -81,8 +82,7 @@ if (i < pathSplit.length - 1) opts.file += "/"; } - } - + } } else { /* other providers type, video for instance - pass everything as is */ @@ -96,7 +96,7 @@ opts["controlbar.position"] = "none"; } - pop = IriSP.PopcornReplacement.jwplayer("#" + containerDiv, opts); + pop = new IriSP.PopcornReplacement.jwplayer("#" + containerDiv, opts); break; case "youtube": @@ -112,6 +112,11 @@ pop = Popcorn.youtube("#" + containerDiv, opts.video, opts); break; + case "allocine": + /* pass the options as-is to the allocine player and let it handle everything */ + pop = new IriSP.PopcornReplacement.allocine("#" + containerDiv, options); + break; + default: pop = undefined; }; diff -r 329333e07267 -r 05ae2aa10d24 src/js/pop.js --- a/src/js/pop.js Mon Jan 23 17:27:37 2012 +0100 +++ b/src/js/pop.js Wed Jan 25 15:38:46 2012 +0100 @@ -1,31 +1,47 @@ /* wrapper that simulates popcorn.js because popcorn is a bit unstable at the time */ -IriSP.PopcornReplacement = { - msgPump : {} /* used by jquery to receive and send messages */, - __delay_seek_signal : false -}; - -IriSP.PopcornReplacement.media = { - "paused": true, - "muted": false +IriSP.PopcornReplacement = { }; -IriSP.PopcornReplacement.listen = function(msg, callback) { -// IriSP.jQuery(IriSP.PopcornReplacement.msgPump).bind(msg, function(event, rest) { callback(rest); }); - if (!IriSP.PopcornReplacement.msgPump.hasOwnProperty(msg)) - IriSP.PopcornReplacement.msgPump[msg] = []; - - IriSP.PopcornReplacement.msgPump[msg].push(callback); +/** base class for our popcorn-compatible players. + */ +IriSP.PopcornReplacement.player = function(container, options) { + /* the jwplayer calls the callbacks in the global space so we need to + preserve them using IriSP.wrap */ + this.callbacks = { + onReady: IriSP.wrap(this, this.__initApi), + onTime: IriSP.wrap(this, this.__timeHandler), + onPlay: IriSP.wrap(this, this.__playHandler), + onPause: IriSP.wrap(this, this.__pauseHandler), + onSeek: IriSP.wrap(this, this.__seekHandler) + }; + + this.media = { + "paused": true, + "muted": false + }; + + this.container = container.slice(1); //eschew the '#' + + this.msgPump = {}; /* dictionnary used to receive and send messages */ + this.__codes = []; /* used to schedule the execution of a piece of code in + a segment (similar to the popcorn.code plugin). */ + }; -IriSP.PopcornReplacement.trigger = function(msg, params) { -// IriSP.jQuery(IriSP.PopcornReplacement.msgPump).trigger(msg, params); - - if (!IriSP.PopcornReplacement.msgPump.hasOwnProperty(msg)) +IriSP.PopcornReplacement.player.prototype.listen = function(msg, callback) { + if (!this.msgPump.hasOwnProperty(msg)) + this.msgPump[msg] = []; + + this.msgPump[msg].push(callback); +}; + +IriSP.PopcornReplacement.player.prototype.trigger = function(msg, params) { + if (!this.msgPump.hasOwnProperty(msg)) return; - var d = IriSP.PopcornReplacement.msgPump[msg]; + var d = this.msgPump[msg]; for(var i = 0; i < d.length; i++) { d[i].call(window, params); @@ -33,7 +49,7 @@ }; -IriSP.PopcornReplacement.guid = function(prefix) { +IriSP.PopcornReplacement.player.prototype.guid = function(prefix) { var str = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); return v.toString(16); @@ -42,15 +58,17 @@ return prefix + str; }; -IriSP.PopcornReplacement.__initApi = function() { - IriSP.PopcornReplacement.trigger("loadedmetadata"); // we've done more than loading metadata of course, +/** init the api after that flash player has been setup - called by the callback + defined by the embedded flash player +*/ +IriSP.PopcornReplacement.player.prototype.__initApi = function() { + this.trigger("loadedmetadata"); // we've done more than loading metadata of course, // but popcorn doesn't need to know more. - IriSP.PopcornReplacement.media.muted = jwplayer(IriSP.PopcornReplacement._container).getMute(); - + this.media.muted = this.playerFns.getMute(); /* some programmed segments are supposed to be run at the beginning */ var i = 0; - for(i = 0; i < IriSP.PopcornReplacement.__codes.length; i++) { - var c = IriSP.PopcornReplacement.__codes[i]; + for(i = 0; i < this.__codes.length; i++) { + var c = this.__codes[i]; if (0 == c.start) { c.onStart(); } @@ -61,6 +79,7 @@ } }; +/* IriSP.PopcornReplacement.jwplayer = function(container, options) { IriSP.PopcornReplacement._container = container.slice(1); //eschew the '#' options.events = { @@ -75,73 +94,73 @@ IriSP.PopcornReplacement.media.duration = options.duration; return IriSP.PopcornReplacement; }; +*/ -IriSP.PopcornReplacement.currentTime = function(time) { +IriSP.PopcornReplacement.player.prototype.currentTime = function(time) { if (typeof(time) === "undefined") { - return jwplayer(IriSP.PopcornReplacement._container).getPosition(); + return this.playerFns.getPosition(); } else { var currentTime = +time; - jwplayer( IriSP.PopcornReplacement._container ).seek( currentTime ); - IriSP.PopcornReplacement.__delay_seek_signal = true; - IriSP.PopcornReplacement.trigger("seeked"); + this.playerFns.seek( currentTime ); + this.__delay_seek_signal = true; /* FIXME : useless ? */ + this.trigger("seeked"); return currentTime; } }; -IriSP.PopcornReplacement.play = function() { - IriSP.PopcornReplacement.media.paused = false; - IriSP.PopcornReplacement.trigger("play"); -// IriSP.PopcornReplacement.trigger("playing"); - jwplayer( IriSP.PopcornReplacement._container ).play(); +IriSP.PopcornReplacement.player.prototype.play = function() { + this.media.paused = false; + this.trigger("play"); + //IriSP.PopcornReplacement.trigger("playing"); + this.playerFns.play(); }; -IriSP.PopcornReplacement.pause = function() { - if ( !IriSP.PopcornReplacement.media.paused ) { - IriSP.PopcornReplacement.media.paused = true; - IriSP.PopcornReplacement.trigger( "pause" ); - jwplayer( IriSP.PopcornReplacement._container ).pause(); - } -}; - -IriSP.PopcornReplacement.muted = function(val) { - if (typeof(val) !== "undefined") { - - if (jwplayer(IriSP.PopcornReplacement._container).getMute() !== val) { - if (val) { - jwplayer(IriSP.PopcornReplacement._container).setMute(true); - IriSP.PopcornReplacement.media.muted = true; - } else { - jwplayer( IriSP.PopcornReplacement._container ).setMute(false); - IriSP.PopcornReplacement.media.muted = false; - } - - IriSP.PopcornReplacement.trigger( "volumechange" ); - } - - return jwplayer( IriSP.PopcornReplacement._container ).getMute(); - } else { - return jwplayer( IriSP.PopcornReplacement._container ).getMute(); +IriSP.PopcornReplacement.player.prototype.pause = function() { + if ( !this.media.paused ) { + this.media.paused = true; + this.trigger( "pause" ); + this.playerFns.pause(); } }; -IriSP.PopcornReplacement.mute = IriSP.PopcornReplacement.muted; +IriSP.PopcornReplacement.player.prototype.muted = function(val) { + if (typeof(val) !== "undefined") { + + if (this.playerFns.getMute() !== val) { + if (val) { + this.playerFns.setMute(true); + this.media.muted = true; + } else { + this.playerFns.setMute(false); + this.media.muted = false; + } -IriSP.PopcornReplacement.__codes = []; -IriSP.PopcornReplacement.code = function(options) { - IriSP.PopcornReplacement.__codes.push(options); - return IriSP.PopcornReplacement; + this.trigger( "volumechange" ); + } + + return this.playerFns.getMute(); + } else { + return this.playerFns.getMute(); + } +}; + +IriSP.PopcornReplacement.player.prototype.mute = IriSP.PopcornReplacement.player.prototype.muted; + +IriSP.PopcornReplacement.player.prototype.code = function(options) { + this.__codes.push(options); + return this; }; /* called everytime the player updates itself (onTime event) */ -IriSP.PopcornReplacement.__timeHandler = function(event) { +IriSP.PopcornReplacement.player.prototype.__timeHandler = function(event) { var pos = event.position; - + var i = 0; - for(i = 0; i < IriSP.PopcornReplacement.__codes.length; i++) { - var c = IriSP.PopcornReplacement.__codes[i]; + for(i = 0; i < this.__codes.length; i++) { + var c = this.__codes[i]; if (pos >= c.start && pos < c.end && pos - 1 <= c.start) { @@ -155,22 +174,22 @@ } - IriSP.PopcornReplacement.trigger("timeupdate"); + this.trigger("timeupdate"); }; -IriSP.PopcornReplacement.__seekHandler = function(event) { +IriSP.PopcornReplacement.player.prototype.__seekHandler = function(event) { var i = 0; - - for(i = 0; i < IriSP.PopcornReplacement.__codes.length; i++) { - var c = IriSP.PopcornReplacement.__codes[i]; + + for(i = 0; i < this.__codes.length; i++) { + var c = this.__codes[i]; if (event.position >= c.start && event.position < c.end) { c.onEnd(); } } - for(i = 0; i < IriSP.PopcornReplacement.__codes.length; i++) { - var c = IriSP.PopcornReplacement.__codes[i]; + for(i = 0; i < this.__codes.length; i++) { + var c = this.__codes[i]; if (typeof(event.offset) === "undefined") event.offset = 0; @@ -181,21 +200,48 @@ } - IriSP.PopcornReplacement.trigger("timeupdate"); + this.trigger("timeupdate"); +}; + +IriSP.PopcornReplacement.player.prototype.__playHandler = function(event) { + this.media.paused = false; + this.trigger("play"); }; +IriSP.PopcornReplacement.player.prototype.__pauseHandler = function(event) { + this.media.paused = true; + this.trigger("pause"); +}; -IriSP.PopcornReplacement.__playHandler = function(event) { - IriSP.PopcornReplacement.media.paused = false; - IriSP.PopcornReplacement.trigger("play"); +IriSP.PopcornReplacement.player.prototype.roundTime = function() { + var currentTime = this.currentTime(); + return Math.round(currentTime); }; -IriSP.PopcornReplacement.__pauseHandler = function(event) { - IriSP.PopcornReplacement.media.paused = true; - IriSP.PopcornReplacement.trigger("pause"); +/* To wrap a player the develop should create a new class derived from + the IriSP.PopcornReplacement.player and defining the correct functions */ + +/* Exemple with jwplayer */ +IriSP.PopcornReplacement.jwplayer = function(container, options) { + + /* appel du parent pour initialiser les structures communes à tous les players */ + IriSP.PopcornReplacement.player.call(this, container, options); + + this.media.duration = options.duration; /* optional */ + + /* Définition des fonctions de l'API - */ + this.playerFns = { + play: function() { return jwplayer(this.container).play(); }, + pause: function() { return jwplayer(this.container).pause(); }, + getPosition: function() { return jwplayer(this.container).getPosition(); }, + seek: function(pos) { return jwplayer(this.container).seek(pos); }, + getMute: function() { return jwplayer(this.container).getMute() }, + setMute: function(p) { return jwplayer(this.container).setMute(p); } + } + + options.events = this.callbacks; + + jwplayer(this.container).setup(options); }; -IriSP.PopcornReplacement.roundTime = function() { - var currentTime = IriSP.PopcornReplacement.currentTime(); - return Math.round(currentTime); -}; +IriSP.PopcornReplacement.jwplayer.prototype = new IriSP.PopcornReplacement.player("", {}); diff -r 329333e07267 -r 05ae2aa10d24 src/js/widgets/annotationsListWidget.js --- a/src/js/widgets/annotationsListWidget.js Mon Jan 23 17:27:37 2012 +0100 +++ b/src/js/widgets/annotationsListWidget.js Wed Jan 25 15:38:46 2012 +0100 @@ -123,8 +123,7 @@ for (i = 0; i < annotations.length; i++) { var annotation = annotations[i]; - console.log(annotation); - console.log(view_types, annotation.meta["id-ref"]); + /* filter the annotations whose type is not the one we want */ /* We want _all_ the annotations. if (typeof(annotation.meta) !== "undefined" && typeof(annotation.meta["id-ref"]) !== "undefined" @@ -143,7 +142,7 @@ obj["url"] = document.location.href.split("#")[0] + "/" + annotation.meta["project"]; l.push(obj); } - console.log(l); + this.do_redraw(l); }; IriSP.AnnotationsListWidget.prototype.draw = function() { diff -r 329333e07267 -r 05ae2aa10d24 test/integration/polemic-platform.htm --- a/test/integration/polemic-platform.htm Mon Jan 23 17:27:37 2012 +0100 +++ b/test/integration/polemic-platform.htm Wed Jan 25 15:38:46 2012 +0100 @@ -22,10 +22,10 @@