Added volume support popcorn-port
authorveltr
Wed, 28 Mar 2012 17:37:49 +0200
branchpopcorn-port
changeset 839 4357aac4eb19
parent 838 03b03865eb9b
child 840 ac66e2240e1e
Added volume support
src/css/LdtPlayer.css
src/css/imgs/player-sprites.png
src/js/players/player.allocine.js
src/js/players/player.dailymotion.js
src/js/players/player.jwplayer.js
src/js/pop.js
src/js/widgets/playerWidget.js
src/templates/player.html
test/integration/allocine_dossier_independant/css/LdtPlayer.css
test/integration/allocine_dossier_independant/css/img-cinecast/player-sprites.png
test/integration/allocine_dossier_independant/polemic-allocine.htm
--- a/src/css/LdtPlayer.css	Mon Mar 26 19:18:04 2012 +0200
+++ b/src/css/LdtPlayer.css	Wed Mar 28 17:37:49 2012 +0200
@@ -161,6 +161,7 @@
   background:url('imgs/player_gradient.png') repeat-x transparent ;
   height: 25px;
   border: 1px solid #b6b8b8;
+  position: relative;
 }
 
 
@@ -274,30 +275,69 @@
   margin: 0 2px;
 }
 
-.Ldt-CtrlSound-SoundState {
+.Ldt-CtrlSound-Full {
   background-position: -120px 0;
 }
 
-.Ldt-CtrlSound-SoundState:hover {
+.Ldt-CtrlSound-Full:hover {
   background-position: -120px -25px;
 }
 
-.Ldt-CtrlSound-SoundState:active {
+.Ldt-CtrlSound-Full:active {
   background-position: -120px -50px;
 }
 
-.Ldt-CtrlSound-MuteState {
+.Ldt-CtrlSound-Mute {
   background-position: -150px 0;
 }
 
-.Ldt-CtrlSound-MuteState:hover {
+.Ldt-CtrlSound-Mute:hover {
   background-position: -150px -25px;
 }
 
-.Ldt-CtrlSound-MuteState:active {
+.Ldt-CtrlSound-Mute:active {
   background-position: -150px -50px;
 }
 
+.Ldt-CtrlSound-Half {
+  background-position: -180px 0;
+}
+
+.Ldt-CtrlSound-Half:hover {
+  background-position: -180px -25px;
+}
+
+.Ldt-CtrlSound-Half:active {
+  background-position: -180px -50px;
+}
+
+.Ldt-Ctrl-Volume-Control {
+    display: none;
+  position: absolute;
+  background:url('imgs/player_gradient.png') repeat-x transparent ;
+  height: 25px;
+  width: 100px; top: 25px; right: -1px; z-index: 100;
+  padding: 0 2px;
+  border: 1px solid #b6b8b8;
+}
+
+.Ldt-Ctrl-Volume-Bar { 
+    height: 5px; margin: 9px 3px 0; background: #cccccc; border: 1px solid #999999; border-radius: 2px;
+}
+
+.Ldt-Ctrl-Volume-Cursor {
+    position: absolute; top: 2px; width: 6px; height: 19px; background: #a8a8a8; border: 1px solid #999999; border-radius: 2px;
+    cursor: pointer;
+}
+
+.Ldt-Ctrl-Volume-Cursor:hover {
+     background: #cccccc;
+}
+
+.Ldt-Ctrl-Volume-Cursor.ui-draggable-dragging {
+    background: #999999;
+}
+
 .Ldt-cleaner {
   clear:both;
 }
Binary file src/css/imgs/player-sprites.png has changed
--- a/src/js/players/player.allocine.js	Mon Mar 26 19:18:04 2012 +0200
+++ b/src/js/players/player.allocine.js	Wed Mar 28 17:37:49 2012 +0200
@@ -60,7 +60,7 @@
     }
 
     window.onReady = IriSP.wrap(this, this.ready);
-    //NOT CALLED window.onAllocineStateChange = IriSP.wrap(this, this.stateHandler);
+    window.onAllocineStateChange = IriSP.wrap(this, this.stateHandler);
     window.onTime = IriSP.wrap(this, this.progressHandler);
     
     var _videoUrl = (
@@ -102,7 +102,7 @@
 
 
 IriSP.PopcornReplacement.allocine.prototype.stateHandler = function(state) {
-    
+    console.log("stateHandler");
     switch(state) {
         case 1:
             this.callbacks.onPlay();
--- a/src/js/players/player.dailymotion.js	Mon Mar 26 19:18:04 2012 +0200
+++ b/src/js/players/player.dailymotion.js	Wed Mar 28 17:37:49 2012 +0200
@@ -49,11 +49,26 @@
         },
         setMute : function(p) {
             if (_this.player) {
-                return p ? _this.player.mute() : _this.player.unMute();
+                if (p) {
+                    _this.player.mute();
+                }
+                else {
+                    _this.player.unMute();
+                }
+            }
+        },
+        getVolume : function() {
+            if (_this.player) {
+                return _this.player.getVolume() / 100;
             } else {
                 return false;
             }
-        }
+        },
+        setVolume : function(p) {
+            if (_this.player) {
+                _this.player.setVolume(Math.floor(100 * p));
+            }
+        },
     }
 
     window.onDailymotionPlayerReady = IriSP.wrap(this, this.ready);
--- a/src/js/players/player.jwplayer.js	Mon Mar 26 19:18:04 2012 +0200
+++ b/src/js/players/player.jwplayer.js	Wed Mar 28 17:37:49 2012 +0200
@@ -3,7 +3,6 @@
 
 /** jwplayer player wrapper */
 IriSP.PopcornReplacement.jwplayer = function(container, options) {
-
   /* appel du parent pour initialiser les structures communes à tous les players */
   IriSP.PopcornReplacement.player.call(this, container, options);
   
@@ -16,7 +15,9 @@
     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); }
+    setMute: function(p) { return jwplayer(this.container).setMute(p); },
+    getVolume: function() { return jwplayer(this.container).getVolume() / 100; },
+    setVolume: function(p) { return jwplayer(this.container).setVolume(Math.floor(100*p)); }
   }
 
   options.events = this.callbacks;
--- a/src/js/pop.js	Mon Mar 26 19:18:04 2012 +0200
+++ b/src/js/pop.js	Wed Mar 28 17:37:49 2012 +0200
@@ -144,6 +144,22 @@
   }
 };
 
+IriSP.PopcornReplacement.player.prototype.volume = function(val) {
+    if (typeof this.playerFns.getVolume == "undefined" || typeof this.playerFns.setVolume == "undefined") {
+        return false;
+    }
+    var _vol = this.playerFns.getVolume();
+    if (typeof(val) !== "undefined" && parseFloat(val) !== NaN) {
+        val = Math.max(0, Math.min(1, val));
+        if (parseFloat(val) != parseFloat(_vol)) {
+            this.playerFns.setVolume(val);
+            this.trigger("volumechange");
+            _vol = this.playerFns.getVolume();
+        }
+    }
+    return _vol;
+};
+
 IriSP.PopcornReplacement.player.prototype.mute = IriSP.PopcornReplacement.player.prototype.muted;
 
 IriSP.PopcornReplacement.player.prototype.code = function(options) {
--- a/src/js/widgets/playerWidget.js	Mon Mar 26 19:18:04 2012 +0200
+++ b/src/js/widgets/playerWidget.js	Wed Mar 28 17:37:49 2012 +0200
@@ -12,7 +12,9 @@
             "annotate": "Annotate",
             "search": "Search",
             "elapsed_time": "Elapsed time",
-            "total_time": "Total time"
+            "total_time": "Total time",
+            "volume": "Volume",
+            "volume_control": "Volume control"
         },
         "fr": {
             "play_pause": "Lecture/Pause",
@@ -24,7 +26,9 @@
             "annotate": "Annoter",
             "search": "Rechercher",
             "elapsed_time": "Durée écoulée",
-            "total_time": "Durée totale"
+            "total_time": "Durée totale",
+            "volume": "Niveau sonore",
+            "volume_control": "Réglage du niveau sonore"
         }
     }
 );
@@ -54,7 +58,7 @@
   this._Popcorn.listen("play", IriSP.wrap(this, this.playButtonUpdater));
   this._Popcorn.listen("pause", IriSP.wrap(this, this.playButtonUpdater));
   
-  this._Popcorn.listen("volumechange", IriSP.wrap(this, this.muteButtonUpdater));
+  this._Popcorn.listen("volumechange", IriSP.wrap(this, this.volumeUpdater));
 
   this._Popcorn.listen("timeupdate", IriSP.wrap(this, this.timeDisplayUpdater));  
   // update the time display for the first time.
@@ -70,7 +74,20 @@
                                             { self._Popcorn.trigger("IriSP.PlayerWidget.AnnotateButton.clicked"); });
   this.selector.find(".Ldt-CtrlSearch").click(function() { self.searchButtonHandler.call(self); });
   
-  this.selector.find('.Ldt-CtrlSound').click(function() { self.muteHandler.call(self); } );
+	var _volctrl = this.selector.find(".Ldt-Ctrl-Volume-Control");
+    this.selector.find('.Ldt-CtrlSound')
+        .click(function() { self.muteHandler.call(self); } )
+        .mouseover(function() {
+            _volctrl.show();
+        })
+        .mouseout(function() {
+            _volctrl.hide();
+        });
+    _volctrl.mouseover(function() {
+        _volctrl.show();
+    }).mouseout(function() {
+        _volctrl.hide();
+    });
   
   /*
   var searchButtonPos = this.selector.find(".Ldt-CtrlSearch").position();
@@ -81,8 +98,19 @@
   // trigger an IriSP.PlayerWidget.MouseOver to the widgets that are interested (i.e : sliderWidget)
   this.selector.hover(function() { self._Popcorn.trigger("IriSP.PlayerWidget.MouseOver"); }, 
                       function() { self._Popcorn.trigger("IriSP.PlayerWidget.MouseOut"); });
+  this.selector.find(".Ldt-Ctrl-Volume-Cursor").draggable({
+      axis: "x",
+      drag: function(event, ui) {
+          var _vol = Math.max(0, Math.min( 1, ui.position.left / (ui.helper.parent().width() - ui.helper.outerWidth())));
+          ui.helper.attr("title",IriSP.i18n.getMessage('volume')+': ' + Math.floor(100*_vol) + '%');
+          self._Popcorn.volume(_vol);
+      },
+      containment: "parent"
+  });
  
-  this.muteButtonUpdater(); /* some player - jwplayer notable - save the state of the mute button between sessions */
+ setTimeout(function() {
+     self.volumeUpdater();
+ }, 1000); /* some player - jwplayer notable - save the state of the mute button between sessions */
 };
 
 /* Update the elasped time div */
@@ -139,25 +167,28 @@
 };
 
 IriSP.PlayerWidget.prototype.muteHandler = function() {
-  if (!this._Popcorn.muted()) {    
-      this._Popcorn.mute(true);
-    } else {
-      this._Popcorn.mute(false);
-    }
+  this._Popcorn.mute(!this._Popcorn.muted());
 };
 
-IriSP.PlayerWidget.prototype.muteButtonUpdater = function() {
-  var status = this._Popcorn.media.muted;
-  
-  if ( status == true ){        
-    this.selector.find(".Ldt-CtrlSound").attr("title", IriSP.i18n.getMessage('unmute'));
-    this.selector.find(".Ldt-CtrlSound").removeClass("Ldt-CtrlSound-MuteState").addClass("Ldt-CtrlSound-SoundState");    
-  } else {
-    this.selector.find(".Ldt-CtrlSound").attr("title", IriSP.i18n.getMessage('mute'));
-    this.selector.find(".Ldt-CtrlSound").removeClass("Ldt-CtrlSound-SoundState").addClass("Ldt-CtrlSound-MuteState");
-  }  
-
-  return;
+IriSP.PlayerWidget.prototype.volumeUpdater = function() {
+    var _muted = this._Popcorn.muted(),
+        _vol = this._Popcorn.volume();
+    if (_vol === false) {
+        _vol = .5;
+    }
+    var _soundCtl = this.selector.find(".Ldt-CtrlSound");
+    _soundCtl.removeClass("Ldt-CtrlSound-Mute Ldt-CtrlSound-Half Ldt-CtrlSound-Full");
+    if (_muted) {        
+        _soundCtl.attr("title", IriSP.i18n.getMessage('unmute'))
+            .addClass("Ldt-CtrlSound-Mute");    
+    } else {
+        _soundCtl.attr("title", IriSP.i18n.getMessage('mute'))
+            .addClass(_vol < .5 ? "Ldt-CtrlSound-Half" : "Ldt-CtrlSound-Full" )
+    }
+    var _cursor = this.selector.find(".Ldt-Ctrl-Volume-Cursor");
+    _cursor.css({
+        "left": ( _muted ? 0 : Math.floor(_vol * (_cursor.parent().width() - _cursor.outerWidth())) ) + "px"
+    })
 };
 
 IriSP.PlayerWidget.prototype.showSearchBlock = function() {
--- a/src/templates/player.html	Mon Mar 26 19:18:04 2012 +0200
+++ b/src/templates/player.html	Wed Mar 28 17:37:49 2012 +0200
@@ -23,6 +23,10 @@
           <div class='Ldt-TotalTime' title='{{l10n.total_time}}'>00:00</div>
         </div>
         <div class='Ldt-Ctrl-spacer'></div>
-		<div class='Ldt-Ctrl-button Ldt-CtrlSound Ldt-CtrlSound-MuteState Ldt-TraceMe' title='{{l10n.mute_unmute}}'></div>
+		<div class='Ldt-Ctrl-button Ldt-CtrlSound Ldt-CtrlSound-Full Ldt-TraceMe' title='{{l10n.mute_unmute}}'></div>
+	</div>
+	<div class='Ldt-Ctrl-Volume-Control' title='{{l10n.volume_control}}'>
+	    <div class='Ldt-Ctrl-Volume-Bar'></div>
+	    <div class='Ldt-Ctrl-Volume-Cursor'></div>
 	</div>
 </div>
--- a/test/integration/allocine_dossier_independant/css/LdtPlayer.css	Mon Mar 26 19:18:04 2012 +0200
+++ b/test/integration/allocine_dossier_independant/css/LdtPlayer.css	Wed Mar 28 17:37:49 2012 +0200
@@ -480,14 +480,14 @@
 
 .Ldt-createAnnotation-userAvatar { 
   float: right; 
-  width: 64px;
+  width: 80px;
   height: 64px;
   border: 1px #ffffff;
   margin: 5px 0;
 }
 
 .Ldt-createAnnotation-userAvatar img { 
-  float: right; 
+  margin: 0 auto; 
   display: block;
   max-width: 100%;
   max-height: 100%;
@@ -512,26 +512,26 @@
 /* */
 
 .Ldt-createAnnotation-btnblock {
-   float: left; width: 450px; margin: 5px 0;
+   float: left; width: 480px; margin: 5px 0;
 }
 
 .Ldt-createAnnotation-btnblock label {
-    float: left; margin: 2px 8px 2px 0;
+    float: left; margin-top: 8px; width: 120px; font-size: 12px; height: 20px;
 }
 
 /* CINECAST SPECIFIC TAG BUTTONS */
 
 .Ldt-createAnnotation-keywords li {
-    border: none; margin: 0 0 0 5px; height: 23px; padding: 0 0 0 20px;
+    border: none; margin: 5px 10px 0 0; height: 23px; padding: 0 0 0 15px;
     background: url(img-cinecast/tag.png) left top no-repeat;
     cursor: pointer;
 }
 
 .Ldt-createAnnotation-keyword-button {
-  font-size: 14px; color: #ffffff;
+  font-size: 13px; color: #ffffff; width: 95px;
   height: 23px; padding: 0 5px 0 0; border: none; margin: 0;
   background: url(img-cinecast/tag.png) right top no-repeat;
-    cursor: pointer;
+  cursor: pointer;
 }
 
 .Ldt-createAnnotation-keywords li:hover {
@@ -543,11 +543,11 @@
 }
 
 .Ldt-createAnnotation-keywords li.Ldt-createAnnotation-active-button {
-  background-position: left -46px;
+  background-position: left -46px; margin: 5px 0 0 0;
 }
 
 .Ldt-createAnnotation-keywords li.Ldt-createAnnotation-active-button .Ldt-createAnnotation-keyword-button {
-  background-position: right -46px; padding: 0 15px 0 0;
+  background-position: right -46px; padding: 0 15px 0 0; width: 105px;
 }
 /* */
 
Binary file test/integration/allocine_dossier_independant/css/img-cinecast/player-sprites.png has changed
--- a/test/integration/allocine_dossier_independant/polemic-allocine.htm	Mon Mar 26 19:18:04 2012 +0200
+++ b/test/integration/allocine_dossier_independant/polemic-allocine.htm	Wed Mar 28 17:37:49 2012 +0200
@@ -21,7 +21,7 @@
                 name : 'awesome_user_name',
                 avatar : 'allocine_test/avatar.png'
             };
-            IriSP.libdir = "js/libs/";
+            IriSP.libdir = "/metadataplayer/src/js/libs/";
             IriSP.defaults.user = function() {
                 return IriSP.user;
             };
@@ -65,15 +65,15 @@
                     }, {
                         type : "createAnnotationWidget",
                         polemic_mode : false,
-                        keywords : ['#vodkaster', '#allocine', '#universcine'],
+                        keywords : ['#vodkaster', '#allocine', '#universcine', '#FauxRaccord', '#SceneCulte', '#navet'],
                         api_endpoint_template : "coucou/{{id}}.json",
                         api_method : 'POST'
-                    } /*, {
+                    }, {
                         type: "TraceWidget",
                         url: "http://192.168.56.101:5000/",
                         requestmode: 'GET',
                         syncmode: "sync"
-                    } */]
+                    }]
                 },
                 player : {
                     type : 'allocine', // player type