Author: andre Date: 2010-03-10 23:03:05 +0100 (Wed, 10 Mar 2010) New Revision: 41320
Modified: openimages/trunk/src/main/webapp/oiplayer/js/jquery.oiplayer.js Log: improved slider and tracking Modified: openimages/trunk/src/main/webapp/oiplayer/js/jquery.oiplayer.js =================================================================== --- openimages/trunk/src/main/webapp/oiplayer/js/jquery.oiplayer.js 2010-03-10 08:38:36 UTC (rev 41319) +++ openimages/trunk/src/main/webapp/oiplayer/js/jquery.oiplayer.js 2010-03-10 22:03:05 UTC (rev 41320) @@ -21,7 +21,7 @@ * 'server' : server url (think only for ie) * 'jar' : JAR file of Cortado * 'flash' : location of flowplayer.swf - * 'controls' : to show and use controls or not + * 'controls' : to show and use controls or not (make sure to include jquery-ui-1.7.2.slider.js when true) * * @changes: added seek, fullscreen and mute * @version: '$Id$' @@ -36,7 +36,7 @@ flash : '/player/plugins/flowplayer-3.1.1.swf', controls : true }, conf); - + var mediatags = $(this).find('video, audio'); $.each(mediatags, function(i, mt) { var sources = $(mt).find('source'); @@ -57,7 +57,7 @@ if ($.browser.msie) { //$('p.oiplayer-warn').hide(); // MSIE places stuff partly outside mediatag } - + $(div).find('img.oipreview').click(function(ev) { ev.preventDefault(); start(player, div); @@ -75,7 +75,8 @@ if ($(ctrls).find('li.pause').length == 0) { $(ctrls).find('li.play').addClass('pause'); } - $.oiplayer.follow(player, timer); + var slider = $(ctrls).find("li.slider > div"); + $.oiplayer.follow(player, timer, slider); } else if (player.state == 'play') { player.pause(); $(ctrls).find('li.play').removeClass('pause'); @@ -84,6 +85,7 @@ } //console.log("player state: " + player.state); }); + $(ctrls).find('li.sound a').click(function(ev){ if (player.state != 'init') { player.mute(); @@ -94,6 +96,26 @@ ev.preventDefault(); fullscreen(player, div); }); + + console.log("duration: " + player.duration + ", start: " + player.start); + if (player.duration) { // else no use + $(ctrls).find("li.slider > div").slider({ + animate: 'fast', + range: 'min', + value: (player.start ? player.start : 0), + max: Math.floor(player.duration), + step: 1 + }); + $(ctrls).find("li.slider > div").bind('slide', function(ev, ui) { + newPos(player, ui.value); + }); + $(ctrls).find("li.slider > div").bind('slidechange', function(ev, ui) { + if (ev.originalEvent.type == "mouseup") { + newPos(player, ui.value); + } + }); + } + } }); @@ -101,6 +123,12 @@ return this; // plugin convention }); + function newPos(player, pos) { + player.seek(pos); + $('li.position').text($.oiplayer.totime(pos)); + $('#value').text("positie: " + pos); + } + /* Mainly user interface stuff on first start of playing */ function start(player, div) { if (player.type == 'video') { @@ -121,7 +149,8 @@ if ($(ctrls).find('li.pause').length == 0) { $(ctrls).find('li.play').addClass('pause'); } - $.oiplayer.follow(player, timer); + var slider = $(ctrls).find("li.slider > div"); + $.oiplayer.follow(player, timer, slider); } } @@ -131,7 +160,7 @@ player.oheight = player.height; } var window_w = $(window).width(); - var window_h = $(window).height() - 25; + var window_h = $(window).height() - 35; var multi_w = window_w / player.owidth; var multi_h = window_h / player.oheight; var half = 0; @@ -298,17 +327,6 @@ } } - function findTag(el) { - var o = new Object(); - o.type = "video"; - o.element = $(el).find('video')[0]; - if (o.element == undefined) { - o.type = "audio"; - o.element = $(el).find('audio')[0]; - } - return o; - } - function supportMimetype(mt) { var support = false; /* navigator.mimeTypes is unsupported by MSIE ! */ if (navigator.mimeTypes && navigator.mimeTypes.length > 0) { @@ -334,6 +352,7 @@ function createControls() { var html = '<div class="controls"><ul class="controls">' + '<li class="play"><a title="play" href="#play">play</a></li>' + + '<li class="slider"> <div> </div> </li>' + '<li class="position">00:00</li>' + '<li class="sound"><a title="mute" href="#sound">mute</a></li>' + '<li class="screen"><a title="fullscreen" href="#fullscreen">fullscreen</a></li>' + @@ -341,7 +360,7 @@ return html; } - function showInfo() { + function showInfo(player) { var text = player.info; var id = player.id; if ($('#' + id).find('div.playerinfo').length > 0) $('#' + id).find('div.playerinfo').remove(); @@ -359,23 +378,39 @@ /* * Updates the provided html element with progress time of player * @param player Object of player - * @param el HTML element + * @param el HTML element to display status + * @param slider jquery.ui.slider to update */ - follow: function (player, el) { - var pos = player.duration; + follow: function (player, el, slider) { + var pos = 0; var progress = null; + var sec = player.start; + var now; + var i = 0; clearInterval(progress); progress = setInterval(function() { pos = player.position(); - if (!isNaN(pos) && pos > 0) { - $(el).text(toTime(pos)); + sec = Math.floor(pos); + //console.log("n: " + now + ", s: " + sec + ", pos: " + pos); + if (!isNaN(pos) && pos > 0 && sec != now) { + $(el).text( $.oiplayer.totime(pos) ); + $(slider).slider('option', 'value', sec); + i = 0; + now = sec; } - if (pos == undefined) { + if (now == sec) { + i++; + } + if (pos == undefined || i > 9) { + console.log("stopping... " + i); + player.pause(); // maybe stop? clearInterval(progress); return; } }, 200); - + }, + + totime: function (pos) { function toTime(sec) { var h = Math.floor(sec / 3600); var min = Math.floor(sec / 60); @@ -386,15 +421,17 @@ } return addZero(min) + ":" + addZero(sec); } - + function addZero(time) { time = parseInt(time, 10); return time < 10 ? "0" + time : time; } - + return toTime(pos); } } + + // ------------------------------------------------------------------------------------------------ // Prototypes of several players // ------------------------------------------------------------------------------------------------ @@ -425,7 +462,8 @@ if (this.controls == undefined) this.controls = false; this.width = $(this.player).attr('width') > 0 ? $(this.player).attr('width') : 320; this.height = $(this.player).attr('height') > 0 ? $(this.player).attr('height') : 240;; - this.duration = $("head meta[name=media-duration]").attr("content"); // not a mediatag attr. + //this.duration = $("head meta[name=media-duration]").attr("content"); // not a mediatag attr. + this.duration = $(el).find("span.duration").text(); // not a mediatag attr. this.state = 'init'; this.pos = 0; @@ -441,12 +479,21 @@ this.url = url; var self = this; var timer = $(el).next('ul.controls li.position'); + var slider = $(el).next('ul.controls li.slider > div'); this.player.addEventListener("playing", - function(ev) { - self.state = 'play'; - $.oiplayer.follow(self, timer); - }, - false); + function(ev) { + self.state = 'play'; + $.oiplayer.follow(self, timer, slider); + }, false); + + this.player.addEventListener("durationchange", + function(ev) { + // console.log("dur: " + self.player.duration); + /* bug in FF? still NaN after durationchange */ + if (!isNaN(self.player.duration) && self.player.duration > 0) { + self.duration = self.player.duration; + } + }, false); return this.player; } MediaPlayer.prototype.play = function() { @@ -476,7 +523,7 @@ MediaPlayer.prototype.seek = function(pos) { this.player.currentTime = pos; // float if (!this.player.paused) { - this.player.play(); + //this.player.play(); } } MediaPlayer.prototype.info = function() { @@ -613,6 +660,13 @@ var flwplayer = config.server + config.flash; var duration = (this.duration == undefined ? 0 : Math.round(this.duration)); + var ctrls; + if (this.controls) { + ctrls = { height: 24, autoHide: 'always', hideDelay: 2000, fullscreen: false }; + } else { + ctrls = null; + } + var div = document.createElement('div'); // TODO: add (random) id: adding flowplayer and returning it impossible without id $(el).closest('div.oiplayer').html(div); $(div).addClass('player'); @@ -625,7 +679,7 @@ autoBuffering: this.autobuffer, bufferLength: 5 }, - plugins: { controls: { height: 24, autoHide: 'always', hideDelay: 2000, fullscreen: false } } + plugins: { controls: ctrls } }); return this.player; } _______________________________________________ Cvs mailing list Cvs@lists.mmbase.org http://lists.mmbase.org/mailman/listinfo/cvs