# HG changeset patch # User Edwin Razafimahatratra # Date 1340964758 -7200 # Node ID ed1126cd2b803d07726bd76041f840189cb09e49 # Parent 4f1b7aa04ec791ab439792e1a8aba08f8c342e7a test de bout à bout en éditant le .json diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/fonts/DINBd.ttf Binary file metadataplayer edwin/fonts/DINBd.ttf has changed diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/fonts/DINRg.ttf Binary file metadataplayer edwin/fonts/DINRg.ttf has changed diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/images/apollo.jpg Binary file metadataplayer edwin/images/apollo.jpg has changed diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/images/atlas.jpg Binary file metadataplayer edwin/images/atlas.jpg has changed diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/images/background.png Binary file metadataplayer edwin/images/background.png has changed diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/images/barbg.png Binary file metadataplayer edwin/images/barbg.png has changed diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/images/bunny.png Binary file metadataplayer edwin/images/bunny.png has changed diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/images/mashupbar.png Binary file metadataplayer edwin/images/mashupbar.png has changed diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/images/melies.jpg Binary file metadataplayer edwin/images/melies.jpg has changed diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/images/title.png Binary file metadataplayer edwin/images/title.png has changed diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/json/moon.json --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/metadataplayer edwin/json/moon.json Fri Jun 29 12:12:38 2012 +0200 @@ -0,0 +1,258 @@ +{ + "views": null, + "tags": null, + "lists": [ + { + "items": ["segment-bunny-003", "segment-melies-001", "segment-bunny-001", "segment-melies-002", "segment-bunny-002"], + "meta": { + "dc:contributor": "IRI", + "dc:creator": "IRI", + "dc:title": "Bout à bout Lunaire", + "dc:modified": "2012-06-22T15:04:17.752880", + "dc:created": "2012-06-22T15:04:17.752880", + "listtype": "mashup", + "dc:description": "" + }, + "id": "mashup-001" + } + ], + "medias": [ + { + "origin": "0", + "url": "melies.webm", + "http://advene.liris.cnrs.fr/ns/frame_of_reference/ms": "o=0", + "meta": { + "dc:contributor": "IRI", + "dc:created": "2011-09-19T13:17:56.656743", + "dc:duration": 674000, + "dc:creator": "IRI", + "dc:created.contents": "2012-02-13", + "dc:title": "Le Voyage dans la Lune de Méliès", + "dc:creator.contents": "IRI", + "dc:modified": "2012-02-13T11:55:33.052583", + "dc:description": "Georges Méliès, 1902. Domaine public.", + "url": "http://en.wikipedia.org/wiki/File:Le_Voyage_dans_la_Lune_%28Georges_M%C3%A9li%C3%A8s,_1902%29.ogv", + "img": { + "src": "images/melies.jpg" + } + }, + "id": "media-melies", + "unit": "ms" + }, { + "origin": "0", + "url": "big_buck_bunny.ogv", + "http://advene.liris.cnrs.fr/ns/frame_of_reference/ms": "o=0", + "meta": { + "dc:contributor": "IRI", + "dc:created": "2011-09-19T13:17:56.656743", + "dc:duration": 87000, + "dc:creator": "IRI", + "dc:created.contents": "2012-02-13", + "dc:title": "Bick Buck Bunny", + "dc:creator.contents": "IRI", + "dc:modified": "2012-02-13T11:55:33.052583", + "dc:description": "Animation movie", + "url": "http://www.nasa.gov/multimedia/videogallery/index.html?media_id=11463015", + "img": { + "src": "images/bunny.png" + } + }, + "id": "media-bunny", + "unit": "ms" + } + ], + "meta": { + "dc:contributor": "admin", + "dc:created": "2012-05-11T16:26:53.787298", + "dc:creator": "admin", + "main_media": { + "id-ref": "mashup-001" + }, + "dc:description": "", + "dc:title": "To the Moon, feat. Méliès + NASA", + "id": "5afd8bbe-9b75-11e1-9e5d-00145ea4a2be", + "dc:modified": "2012-05-11T16:37:30.246796" + }, + "annotations": [ + { + "content": { + "mimetype": "application/x-ldt-structured", + "description": "Le Voyage dans la Lune, Segment 1", + "img": { + "src": "" + }, + "title": "La capsule lunaire est chargée dans le canon permettant son lancement", + "color": "16763904", + "polemics": [], + "audio": { + "mimetype": "audio/mp3", + "src": "", + "href": null + } + }, + "begin": 0, + "end": 30000, + "meta": { + "dc:contributor": "perso", + "id-ref": "decoupage-melies", + "dc:created": "2012-05-11T15:08:00.348480", + "dc:modified": "2012-05-11T15:08:00.348480", + "dc:creator": "perso" + }, + "tags": [], + "color": "10485760", + "media": "media-melies", + "id": "segment-melies-001" + }, + { + "content": { + "mimetype": "application/x-ldt-structured", + "description": "Le Voyage dans la Lune, Segment 1", + "img": { + "src": "" + }, + "title": "La capsule lunaire est chargée dans le canon permettant son lancement", + "color": "16763904", + "polemics": [], + "audio": { + "mimetype": "audio/mp3", + "src": "", + "href": null + } + }, + "begin": 50000, + "end": 60000, + "meta": { + "dc:contributor": "perso", + "id-ref": "decoupage-melies", + "dc:created": "2012-05-11T15:08:00.348480", + "dc:modified": "2012-05-11T15:08:00.348480", + "dc:creator": "perso" + }, + "tags": [], + "color": "10485760", + "media": "media-melies", + "id": "segment-melies-002" + }, + + { + "content": { + "mimetype": "application/x-ldt-structured", + "description": "Bunny Part I", + "img": { + "src": "" + }, + "title": "Le debut", + "color": "16763904", + "polemics": [], + "audio": { + "mimetype": "audio/mp3", + "src": "", + "href": null + } + }, + "begin": 0, + "end": 23000, + "meta": { + "dc:contributor": "perso", + "id-ref": "decoupage-apollo", + "dc:created": "2012-05-11T15:08:00.348480", + "dc:modified": "2012-05-11T15:08:00.348480", + "dc:creator": "perso" + }, + "tags": [], + "color": "16763904", + "media": "media-bunny", + "id": "segment-bunny-001" + }, + + { + "content": { + "mimetype": "application/x-ldt-structured", + "description": "Bunny Part II", + "img": { + "src": "" + }, + "title": "La suite", + "color": "16763904", + "polemics": [], + "audio": { + "mimetype": "audio/mp3", + "src": "", + "href": null + } + }, + "begin": 50000, + "end": 86000, + "meta": { + "dc:contributor": "perso", + "id-ref": "decoupage-apollo", + "dc:created": "2012-05-11T15:08:00.348480", + "dc:modified": "2012-05-11T15:08:00.348480", + "dc:creator": "perso" + }, + "tags": [], + "color": "16763904", + "media": "media-bunny", + "id": "segment-bunny-002" + }, + + { + "content": { + "mimetype": "application/x-ldt-structured", + "description": "Small part", + "img": { + "src": "" + }, + "title": "court", + "color": "16763904", + "polemics": [], + "audio": { + "mimetype": "audio/mp3", + "src": "", + "href": null + } + }, + "begin": 10000, + "end": 12000, + "meta": { + "dc:contributor": "perso", + "id-ref": "decoupage-apollo", + "dc:created": "2012-05-11T15:08:00.348480", + "dc:modified": "2012-05-11T15:08:00.348480", + "dc:creator": "perso" + }, + "tags": [], + "color": "16763904", + "media": "media-bunny", + "id": "segment-bunny-003" + } + ], + "annotation-types": [ + { + "dc:contributor": "perso", + "dc:creator": "perso", + "dc:title": "Segments du Voyage sur la Lune", + "id": "decoupage-melies", + "dc:created": "2012-05-11T15:08:00.348480", + "dc:description": "", + "dc:modified": "2012-05-11T15:08:00.348480" + }, { + "dc:contributor": "perso", + "dc:creator": "perso", + "dc:title": "Segments du Lancement de Juno", + "id": "decoupage-atlas", + "dc:created": "2012-05-11T15:08:00.348480", + "dc:description": "", + "dc:modified": "2012-05-11T15:08:00.348480" + }, { + "dc:contributor": "perso", + "dc:creator": "perso", + "dc:title": "Segments d'Apollo 11", + "id": "decoupage-apollo", + "dc:created": "2012-05-11T15:08:00.348480", + "dc:description": "", + "dc:modified": "2012-05-11T15:08:00.348480" + } + ] +} \ No newline at end of file diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/melies.mp4 Binary file metadataplayer edwin/melies.mp4 has changed diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/melies.webm Binary file metadataplayer edwin/melies.webm has changed diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/metadataplayer/Annotation.js --- a/metadataplayer edwin/metadataplayer/Annotation.js Tue Jun 26 15:53:42 2012 +0200 +++ b/metadataplayer edwin/metadataplayer/Annotation.js Fri Jun 29 12:12:38 2012 +0200 @@ -77,7 +77,7 @@ this.lastAnnotation = _annotation.id; var _url = (typeof _annotation.url !== "undefined" ? _annotation.url - : (document.location.href.replace(/#.*$/,'') + '#id=' + _annotation.namespacedId.name)); + : (document.location.href.replace(/#.*$/,'') + '#id=' + _annotation.id)); var _text = this.l10n.watching + _annotation.title + (this.site_name ? this.l10n.on_site + this.site_name : ''); var _tags = _annotation.getTagTexts(); if (_tags.length) { diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/metadataplayer/AnnotationsList.js --- a/metadataplayer edwin/metadataplayer/AnnotationsList.js Tue Jun 26 15:53:42 2012 +0200 +++ b/metadataplayer edwin/metadataplayer/AnnotationsList.js Fri Jun 29 12:12:38 2012 +0200 @@ -84,7 +84,7 @@ this.lastAjaxQuery = _currentTime; _currentTime = Math.floor(1000 * _currentTime); var _url = Mustache.to_html(this.ajax_url, { - media : this.source.currentMedia.namespacedId.name, + media : this.source.currentMedia.id, begin : Math.max(0, _currentTime - this.ajax_granularity), end : Math.min(_duration.milliseconds, _currentTime + this.ajax_granularity) }); @@ -99,15 +99,14 @@ _currentTime = 0; } var _currentAnnotation = this.source.currentMedia.getAnnotationAtTime(_currentTime * 1000); - if (typeof _currentAnnotation !== "undefined" && _currentAnnotation.namespacedId.name !== this.lastMashupAnnotation) { - this.lastMashupAnnotation = _currentAnnotation.namespacedId.name; + if (typeof _currentAnnotation !== "undefined" && _currentAnnotation.id !== this.lastMashupAnnotation) { + this.lastMashupAnnotation = _currentAnnotation.id; var _currentMedia = _currentAnnotation.getMedia(), _url = Mustache.to_html(this.ajax_url, { - media : _currentMedia.namespacedId.name, + media : _currentMedia.id, begin : Math.max(0, _currentAnnotation.annotation.begin.milliseconds - this.ajax_granularity), end : Math.min(_currentMedia.duration.milliseconds, _currentAnnotation.annotation.end.milliseconds + this.ajax_granularity) }); - console.log("Getting", _url); this.currentSource = this.player.loadMetadata(IriSP._.defaults({ "url" : _url }, this.metadata)); @@ -129,9 +128,9 @@ var _currentAnnotation = this.source.currentMedia.getAnnotationAtTime(_currentTime * 1000); if (typeof _currentAnnotation !== "undefined") { _currentTime = _currentTime - _currentAnnotation.begin.getSeconds() + _currentAnnotation.annotation.begin.getSeconds(); - var _mediaId = _currentAnnotation.getMedia().namespacedId.name; + var _mediaId = _currentAnnotation.getMedia().id; _list = _list.filter(function(_annotation) { - return _annotation.getMedia().namespacedId.name === _mediaId; + return _annotation.getMedia().id === _mediaId; }); } } @@ -169,15 +168,15 @@ { project : _annotation.project, media : _annotation.media.id.replace(/^.*:/,''), - annotation : _annotation.namespacedId.name, + annotation : _annotation.id, annotationType : _annotation.annotationType.id.replace(/^.*:/,'') } ) - : '#id=' + _annotation.namespacedId.name + : '#id=' + _annotation.id ) ); var _res = { - id : _annotation.namespacedId.name, + id : _annotation.id, title : _annotation.title.replace(_annotation.description,''), description : _annotation.description, begin : _annotation.begin.toString(), diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/metadataplayer/Controller.js --- a/metadataplayer edwin/metadataplayer/Controller.js Tue Jun 26 15:53:42 2012 +0200 +++ b/metadataplayer edwin/metadataplayer/Controller.js Fri Jun 29 12:12:38 2012 +0200 @@ -92,6 +92,7 @@ this.bindPopcorn("volumechange","volumeUpdater"); this.bindPopcorn("timeupdate","timeDisplayUpdater"); this.bindPopcorn("loadedmetadata","timeDisplayUpdater"); + this.bindPopcorn("loadedmetadata","volumeUpdater"); this.bindPopcorn("IriSP.search.matchFound","searchMatch"); this.bindPopcorn("IriSP.search.noMatchFound","searchNoMatch"); this.bindPopcorn("IriSP.search.triggeredSearch","triggeredSearch"); @@ -139,8 +140,10 @@ function() { _this.player.popcorn.trigger("IriSP.Player.MouseOut"); }); - setTimeout(this.functionWrapper("volumeUpdater"), 1000); /* some players - including jwplayer - save the state of the mute button between sessions */ + + window.setTimeout(this.functionWrapper("volumeUpdater"), 1000); + }; /* Update the elasped time div */ @@ -196,7 +199,7 @@ }; IriSP.Widgets.Controller.prototype.muteHandler = function() { - this.player.popcorn.mute(!this.player.popcorn.muted()); + this.player.popcorn.muted(!this.player.popcorn.muted()); }; IriSP.Widgets.Controller.prototype.volumeUpdater = function() { diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/metadataplayer/CreateAnnotation.js --- a/metadataplayer edwin/metadataplayer/CreateAnnotation.js Tue Jun 26 15:53:42 2012 +0200 +++ b/metadataplayer edwin/metadataplayer/CreateAnnotation.js Fri Jun 29 12:12:38 2012 +0200 @@ -216,9 +216,14 @@ var _exportedAnnotations = new IriSP.Model.List(this.player.sourceManager); _export = this.player.sourceManager.newLocalSource({serializer: IriSP.serializers[this.api_serializer]}), _annotation = new IriSP.Model.Annotation(false, _export), - _annotationType = new IriSP.Model.AnnotationType(false, _export), + _annotationTypes = this.source.getAnnotationTypes().searchByTitle(this.annotation_type), + _annotationType = (_annotationTypes.length ? _annotationTypes[0] : new IriSP.Model.AnnotationType(false, _export)), _url = Mustache.to_html(this.api_endpoint_template, {id: this.source.projectId}); + if (!_annotationTypes.length) { + _annotationType.dont_send_id = true; + } + _annotationType.title = this.annotation_type; _annotation.setBegin(this.begin); _annotation.setEnd(this.end); @@ -254,6 +259,7 @@ }, error: function(_xhr, _error, _thrown) { IriSP.log("Error when sending annotation", _thrown); + _export.getAnnotations().removeElement(_annotation, true); _this.showScreen('Error'); window.setTimeout(function(){ _this.showScreen("Main") diff -r 4f1b7aa04ec7 -r ed1126cd2b80 metadataplayer edwin/metadataplayer/LdtPlayer-core.js --- a/metadataplayer edwin/metadataplayer/LdtPlayer-core.js Tue Jun 26 15:53:42 2012 +0200 +++ b/metadataplayer edwin/metadataplayer/LdtPlayer-core.js Fri Jun 29 12:12:38 2012 +0200 @@ -77,8 +77,13 @@ .script(IriSP.getLib("underscore")) .script(IriSP.getLib("Mustache")) .script(IriSP.getLib("jQuery")) - .script(IriSP.getLib("swfObject")) - .wait() + .script(IriSP.getLib("swfObject")); + + if (typeof JSON == "undefined") { + $L.script(IriSP.getLib("json")); + } + + $L.wait() .script(IriSP.getLib("jQueryUI")); if (this.config.player.type === "jwplayer" || this.config.player.type === "auto") { @@ -147,8 +152,32 @@ IriSP.Metadataplayer.prototype.onVideoDataLoaded = function() { if (typeof this.videoData !== "undefined" && typeof this.config.player.video === "undefined") { - var _media = this.videoData.currentMedia; - if (typeof _media !== "undefined") { + + var _media; + + if (typeof this.videoData.mainMedia !== "undefined") { + _media = this.videoData.getElement(this.videoData.mainMedia); + } + + if (this.config.player.type === "mashup" || this.config.player.type === "mashup-html") { + if (typeof _media === "undefined" || _media.elementType !== "mashup") { + var _mashups = this.videoData.getMashups(); + if (_mashups.length) { + _media = _mashups[0]; + } + } + } else { + if (typeof _media === "undefined" || _media.elementType !== "media") { + var _medias = this.videoData.getMedias(); + if (_medias.length) { + _media = _medias[0]; + } + } + } + + this.videoData.currentMedia = _media; + + if (typeof _media !== "undefined" && typeof _media.video !== "undefined") { this.config.player.video = _media.video; if (typeof _media.streamer !== "undefined") { this.config.player.streamer = _media.streamer; @@ -197,7 +226,7 @@ IriSP.Metadataplayer.prototype.configurePopcorn = function() { IriSP.log("IriSP.Metadataplayer.prototype.configurePopcorn"); var pop, - ret = this.layoutDivs("video"), + ret = this.layoutDivs("video",this.config.player.height || undefined), containerDiv = ret[0], spacerDiv = ret[1], _this = this, @@ -307,6 +336,10 @@ pop = new IriSP.PopcornReplacement.allocine("#" + containerDiv, this.config.player); break; + case "mashup-html": + pop = new IriSP.PopcornReplacement.htmlMashup("#" + containerDiv, this.config.player, this.videoData); + break; + default: pop = undefined; }; @@ -318,7 +351,7 @@ @param widgetName the name of the widget. @return an array of the form [createdivId, spacerdivId]. */ -IriSP.Metadataplayer.prototype.layoutDivs = function(_name) { +IriSP.Metadataplayer.prototype.layoutDivs = function(_name, _height) { if (typeof(_name) === "undefined") { _name = ""; } @@ -339,6 +372,9 @@ position: "relative", clear: "both" }); + if (typeof _height !== "undefined") { + divHtml.css("height", _height); + } this.$.append(divHtml); this.$.append(spacerHtml); @@ -384,60 +420,47 @@ /* wrapper that simulates popcorn.js because popcorn is a bit unstable at the time */ +/* Popcorn.code replacement has been disabled. It didn't work properly and was not even used */ + IriSP.PopcornReplacement = { }; /** 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 this way */ - if (typeof IriSP._ === "undefined") { - return; - } + + this.media = { + "paused": true, + "muted": false + }; - this.callbacks = { - onReady: IriSP._.bind(this.__initApi, this), - onTime: IriSP._.bind(this.__timeHandler, this), - onPlay: IriSP._.bind(this.__playHandler, this), - onPause: IriSP._.bind(this.__pauseHandler, this), - onSeek: IriSP._.bind(this.__seekHandler, this) - }; - - this.media = { - "paused": true, - "muted": false - }; - - this.container = container.replace(/^#/,''); //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). */ - - this._options = options; - + this.container = container.replace(/^#/,''); //remove '#' at beginning + this.msgPump = {}; /* dictionnary used to receive and send messages */ + this._options = options; + }; IriSP.PopcornReplacement.player.prototype.listen = function(msg, callback) { - if (!this.msgPump.hasOwnProperty(msg)) - this.msgPump[msg] = []; + if (!this.msgPump.hasOwnProperty(msg)) { + this.msgPump[msg] = []; + } + this.msgPump[msg].push(callback); +}; - this.msgPump[msg].push(callback); -}; +IriSP.PopcornReplacement.player.prototype.on = IriSP.PopcornReplacement.player.prototype.listen; IriSP.PopcornReplacement.player.prototype.trigger = function(msg, params) { - if (!this.msgPump.hasOwnProperty(msg)) - return; - - var d = this.msgPump[msg]; - - for(var i = 0; i < d.length; i++) { - d[i].call(window, params); - } - + if (!this.msgPump.hasOwnProperty(msg)) { + return; + } + var d = this.msgPump[msg]; + for(var i = 0; i < d.length; i++) { + d[i].call(window, params); + } }; +IriSP.PopcornReplacement.player.prototype.emit = IriSP.PopcornReplacement.player.prototype.trigger; +/* 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); @@ -449,12 +472,12 @@ /** 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. this.media.muted = this.playerFns.getMute(); - /* some programmed segments are supposed to be run at the beginning */ + /* some programmed segments are supposed to be run at the beginning var i = 0; for(i = 0; i < this.__codes.length; i++) { var c = this.__codes[i]; @@ -466,7 +489,9 @@ c.onEnd(); } } + }; +*/ IriSP.PopcornReplacement.player.prototype.currentTime = function(time) { if (typeof(time) === "undefined") { @@ -481,16 +506,13 @@ IriSP.PopcornReplacement.player.prototype.play = function() { this.media.paused = false; this.trigger("play"); - //IriSP.PopcornReplacement.trigger("playing"); this.playerFns.play(); }; IriSP.PopcornReplacement.player.prototype.pause = function() { -// if ( !this.media.paused ) { this.media.paused = true; - this.trigger( "pause" ); + this.trigger("pause"); this.playerFns.pause(); -// } }; IriSP.PopcornReplacement.player.prototype.muted = function(val) { @@ -530,89 +552,47 @@ return _vol; }; -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.player.prototype.__timeHandler = function(event) { - var pos = event.position; - - var i = 0; - for(i = 0; i < this.__codes.length; i++) { - var c = this.__codes[i]; - - if (pos >= c.start && pos < c.end && - pos - 1 <= c.start) { - c.onStart(); - } - - if (pos > c.start && pos > c.end && - pos - 1 <= c.end) { - c.onEnd(); - } - - } - - this.trigger("timeupdate"); -}; +IriSP.PopcornReplacement.player.prototype.mute = function() { + this.muted(true); +} -IriSP.PopcornReplacement.player.prototype.__seekHandler = function(event) { - var i = 0; - - 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 < this.__codes.length; i++) { - var c = this.__codes[i]; +IriSP.PopcornReplacement.player.prototype.unmute = function() { + this.muted(false); +} - if (typeof(event.offset) === "undefined") - event.offset = 0; - - if (event.offset >= c.start && event.offset < c.end) { - c.onStart(); - } - - } - - /* this signal sends as an extra argument the position in the video. - As far as I know, this argument is not provided by popcorn */ - this.trigger("seeked", event.offset); -}; - -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.player.prototype.roundTime = function() { var currentTime = this.currentTime(); return Math.round(currentTime); -};/* model.js is where data is stored in a standard form, whatever the serializer */ +};/* TODO: Separate Project-specific data from Source */ + +/* model.js is where data is stored in a standard form, whatever the serializer */ IriSP.Model = { _SOURCE_STATUS_EMPTY : 0, _SOURCE_STATUS_WAITING : 1, _SOURCE_STATUS_READY : 2, _ID_AUTO_INCREMENT : 0, + _ID_BASE : (function(_d) { + function pad(n){return n<10 ? '0'+n : n} + function fillrand(n) { + var _res = '' + for (var i=0; i 1) { - _matches = IriSP._(_matches.slice(1)).reject(function(_txt) { - return /\?$/.test(_txt); - }); - } - if (_matches.length > 0) { - _url += '?' + _matches.join('&'); - } - this.namespaceUrl = _url; - } - } - if (typeof this.namespaceUrl === "undefined") { - this.namespaceUrl = "http://ldt.iri.centrepompidou.fr/"; - } - this.directory.addNamespace(this.namespace, this.namespaceUrl); this.get(); } } -IriSP.Model.Source.prototype.getNamespaced = function(_id) { - var _tab = _id.split(':'); - if (_tab.length > 1) { - return { - namespace : _tab[0], - name : _tab[1], - fullname : _id - } - } else { - return { - namespace : this.namespace, - name : _id, - fullname : this.namespace + ':' + _id - } - } -} - -IriSP.Model.Source.prototype.unNamespace = function(_id) { - if (typeof _id !== "undefined") { - return _id.replace(this.namespace + ':', ''); - } -} - IriSP.Model.Source.prototype.addList = function(_listId, _contents) { if (typeof this.contents[_listId] === "undefined") { this.contents[_listId] = new IriSP.Model.List(this.directory); @@ -1291,34 +1223,7 @@ } IriSP.Model.Source.prototype.getElement = function(_elId) { - return this.directory.getElement(this.getNamespaced(_elId).fullname); -} - -IriSP.Model.Source.prototype.setCurrentMediaId = function(_idRef) { - if (typeof _idRef !== "undefined") { - this.currentMedia = this.getElement(_idRef); - } -} - -IriSP.Model.Source.prototype.setDefaultCurrentMedia = function() { - if (typeof this.currentMedia === "undefined" && this.getMedias().length) { - this.currentMedia = this.getMedias()[0]; - } -} - -IriSP.Model.Source.prototype.listNamespaces = function(_excludeSelf) { - var _this = this, - _nsls = [], - _excludeSelf = (typeof _excludeSelf !== "undefined" && _excludeSelf); - this.forEach(function(_list) { - IriSP._(_list).forEach(function(_el) { - var _ns = _el.id.replace(/:.*$/,''); - if (IriSP._(_nsls).indexOf(_ns) === -1 && (!_excludeSelf || _ns !== _this.namespace)) { - _nsls.push(_ns); - } - }) - }); - return _nsls; + return this.directory.getElement(_elId); } IriSP.Model.Source.prototype.get = function() { @@ -1427,14 +1332,12 @@ IriSP.Model.Directory = function() { this.remoteSources = {}; this.elements = {}; - this.namespaces = {}; -} - -IriSP.Model.Directory.prototype.addNamespace = function(_namespace, _url) { - this.namespaces[_namespace] = _url; } IriSP.Model.Directory.prototype.remoteSource = function(_properties) { + if (typeof _properties !== "object" || typeof _properties.url === "undefined") { + throw "Error : IriSP.Model.Directory.remoteSource(configuration): configuration.url is undefined"; + } var _config = IriSP._({ directory: this }).extend(_properties); if (typeof this.remoteSources[_properties.url] === "undefined") { this.remoteSources[_properties.url] = new IriSP.Model.RemoteSource(_config); @@ -1478,7 +1381,8 @@ jwplayer : "jwplayer.js", raphael : "raphael-min.js", tracemanager : "tracemanager.js", - jwPlayerSWF : "player.swf" + jwPlayerSWF : "player.swf", + json : "json2.js" }, locations : { // use to define locations outside defautl_dir @@ -1584,7 +1488,15 @@ } } - this.l10n = (typeof this.messages[IriSP.language] !== "undefined" ? this.messages[IriSP.language] : this.messages["en"]); + this.l10n = ( + typeof this.messages[IriSP.language] !== "undefined" + ? this.messages[IriSP.language] + : ( + IriSP.language.length > 2 && typeof this.messages[IriSP.language.substr(0,2)] !== "undefined" + ? this.messages[IriSP.language.substr(0,2)] + : this.messages["en"] + ) + ); }; @@ -1707,13 +1619,11 @@ this.player = document.getElementById(this.container); this.player.addEventListener("onStateChange", "onAllocineStateChange"); this.player.cueVideoByUrl(this._options.video); - this.callbacks.onReady(); + this.trigger("loadedmetadata"); }; IriSP.PopcornReplacement.allocine.prototype.progressHandler = function(progressInfo) { - this.callbacks.onTime({ - position: progressInfo.mediaTime - }); + this.trigger("timeupdate"); } @@ -1735,27 +1645,18 @@ } IriSP.PopcornReplacement.allocine.prototype.stateHandler = function(state) { - console.log("stateHandler"); switch(state) { case 1: - this.callbacks.onPlay(); + this.trigger("play"); break; case 2: - this.callbacks.onPause(); + this.trigger("pause"); break; case 3: - this.callbacks.onSeek({ - position: this.player.getCurrentTime() - }); + this.trigger("seeked"); break; - - /* - case 5: - this.callbacks.onReady(); - break; - */ } };/* To wrap a player the develop should create a new class derived from @@ -1869,31 +1770,26 @@ this.player.addEventListener("onVideoProgress", "onDailymotionVideoProgress"); this.player.cueVideoByUrl(this._options.video); - this.callbacks.onReady(); + this.trigger("loadedmetadata"); }; IriSP.PopcornReplacement.dailymotion.prototype.onProgress = function(progressInfo) { - - this.callbacks.onTime({ - position: progressInfo.mediaTime - }); + this.trigger("timeupdate"); } IriSP.PopcornReplacement.dailymotion.prototype.onStateChange = function(state) { switch(state) { case 1: - this.callbacks.onPlay(); + this.trigger("play"); break; case 2: - this.callbacks.onPause(); + this.trigger("pause"); break; case 3: - this.callbacks.onSeek({ - position: this.player.getCurrentTime() - }); + this.trigger("seeked"); break; } @@ -1907,12 +1803,13 @@ this.media.duration = options.duration; /* optional */ - var _player = jwplayer(this.container); + var _player = jwplayer(this.container), + _this = this; /* Définition des fonctions de l'API - */ this.playerFns = { - play: function() { return _player.play(); }, - pause: function() { return _player.pause(); }, + play: function() { return _player.play(true); }, + pause: function() { return _player.pause(true); }, getPosition: function() { return _player.getPosition(); }, seek: function(pos) { return _player.seek(pos); }, getMute: function() { return _player.getMute() }, @@ -1921,12 +1818,209 @@ setVolume: function(p) { return _player.setVolume(Math.floor(100*p)); } } - options.events = this.callbacks; + options.events = { + onReady: function() { + _this.trigger("loadedmetadata"); + }, + onTime: function() { + _this.trigger("timeupdate"); + }, + onPlay: function() { + _this.trigger("play"); + }, + onPause: function() { + _this.trigger("pause"); + }, + onSeek: function() { + _this.trigger("seeked"); + } + }; _player.setup(options); }; IriSP.PopcornReplacement.jwplayer.prototype = new IriSP.PopcornReplacement.player("", {}); +/* To wrap a player the develop should create a new class derived from + the IriSP.PopcornReplacement.player and defining the correct functions */ + +/** jwplayer player wrapper */ +IriSP.PopcornReplacement.htmlMashup = function(container, options, metadata) { + /* appel du parent pour initialiser les structures communes à tous les players */ + IriSP.PopcornReplacement.player.call(this, container, options); + + this.mashup = metadata.currentMedia; + this.$ = IriSP.jQuery(container); + + var _w = this.$.width(), + _h = this.$.height(), + _this = this; + + IriSP._(metadata.currentMedia.medias).each(function(_media) { + var _tmpId = Popcorn.guid("video"), + _videoEl = IriSP.jQuery('