diff --git a/dist/clappr-stats.js b/dist/clappr-stats.js index 98e483a..fb46916 100644 --- a/dist/clappr-stats.js +++ b/dist/clappr-stats.js @@ -1 +1 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("Clappr")):"function"==typeof define&&define.amd?define(["Clappr"],e):"object"==typeof exports?exports.ClapprStats=e(require("Clappr")):t.ClapprStats=e(t.Clappr)}(this,function(t){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=6)}([function(t,e,n){"use strict";var r,i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};r=function(){return this}();try{r=r||Function("return this")()||(0,eval)("this")}catch(t){"object"===("undefined"==typeof window?"undefined":i(window))&&(r=window)}t.exports=r},function(t,e,n){"use strict";t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,n){"use strict";function r(t,e){e=o(e,t)?[e]:i(e);for(var n=0,r=e.length;null!=t&&n-1}function m(t,e){var n=this.__data__,r=P(n,t);return r<0?n.push([t,e]):n[r][1]=e,this}function v(t){var e=-1,n=t?t.length:0;for(this.clear();++e0){var r=this._metrics.extra.bitratesHistory[this._metrics.extra.bitratesHistory.length-1];r.end=n,r.time=n-r.start}this._metrics.extra.bitratesHistory.push({start:this._now(),bitrate:e}),this._inc("changeLevel")}},{key:"stopReporting",value:function(){this._buildReport(),clearInterval(this._intervalId),this._newMetrics(),this.stopListening(),this.bindEvents()}},{key:"startTimers",value:function(){this._intervalId=setInterval(this._buildReport.bind(this),this._runEach),this._start("session"),this._start("startup")}},{key:"onFirstPlaying",value:function(){this.listenTo(this.container,a.Events.CONTAINER_TIMEUPDATE,this.onContainerUpdateWhilePlaying),this._start("watch"),this._stop("startup")}},{key:"playAfterPause",value:function(){this._stop("pause"),this._start("watch")}},{key:"onPlay",value:function(){this._inc("play")}},{key:"onPause",value:function(){this._stop("watch"),this._start("pause"),this._inc("pause"),this.listenToOnce(this.container,a.Events.CONTAINER_PLAY,this.playAfterPause)}},{key:"onSeek",value:function(t){this._inc("seek"),this._metrics.extra.watchHistory.push([1e3*t,1e3*t])}},{key:"onTimeUpdate",value:function(t){var e=1e3*t.current,n=1e3*t.total,r=this._metrics.extra.watchHistory.length;this._metrics.extra.duration=n,this._metrics.extra.currentTime=e,this._metrics.extra.watchedPercentage=e/n*100,0===r?this._metrics.extra.watchHistory.push([e,e]):this._metrics.extra.watchHistory[r-1][1]=e,this._onCompletion()}},{key:"onContainerUpdateWhilePlaying",value:function(){this.container.playback.isPlaying()&&(this._stop("watch"),this._start("watch"))}},{key:"onBuffering",value:function(){this._inc("buffering"),this._start("buffering"),this.listenToOnce(this.container,a.Events.CONTAINER_STATE_BUFFERFULL,this.onBufferfull)}},{key:"onBufferfull",value:function(){this._stop("buffering"),this.listenToOnce(this.container,a.Events.CONTAINER_STATE_BUFFERING,this.onBuffering)}},{key:"onProgress",value:function(t){this._metrics.extra.buffersize=1e3*t.current}},{key:"_newMetrics",value:function(){this._metrics={counters:{play:0,pause:0,error:0,buffering:0,decodedFrames:0,droppedFrames:0,fps:0,changeLevel:0,seek:0,fullscreen:0,dvrUsage:0},timers:{startup:0,watch:0,pause:0,buffering:0,session:0,latency:0},extra:{playbackName:"",playbackType:"",bitratesHistory:[],bitrateWeightedMean:0,bitrateMostUsed:0,buffersize:0,watchHistory:[],watchedPercentage:0,bufferingPercentage:0,bandwidth:0,duration:0,currentTime:0}}}},{key:"_onCompletion",value:function(){var t=this._metrics.extra.watchedPercentage,n=this._completion.watch,r=t<=this._completion.lastCalled;-1==n.indexOf(t)||r||(a.Log.info(this.name+" PERCENTAGE_EVENT: "+t),this._completion.lastCalled=t,this.trigger(e.PERCENTAGE_EVENT,t))}},{key:"_buildReport",value:function(){this._stop("session"),this._start("session"),this._metrics.extra.playbackName=this._playbackName,this._metrics.extra.playbackType=this._playbackType,this._calculateBitrates(),this._calculatePercentages(),this._fetchFPS(),this._measureLatency(),this._measureBandwidth(),this.trigger(e.REPORT_EVENT,JSON.parse(JSON.stringify(this._metrics)))}},{key:"_fetchFPS",value:function(){var t={html5_video:this._html5FetchFPS,hls:this._html5FetchFPS,dash_shaka_playback:this._html5FetchFPS};t[this._playbackName]&&t[this._playbackName].call(this)}},{key:"_calculateBitrates",value:function(){var t=this,e=0;this._metrics.extra.bitrateWeightedMean=this._metrics.extra.bitratesHistory.map(function(n){e+=n.time||0;var r=n.time||t._metrics.timers.watch-e;return n.bitrate*r}).reduce(function(t,e){return t+e},0)/this._metrics.timers.watch,this._metrics.extra.bitrateMostUsed=this._metrics.extra.bitratesHistory.sort(function(t,e){return t.time0&&(this._metrics.extra.bufferingPercentage=this._metrics.timers.buffering/this._metrics.extra.duration*100)}},{key:"_html5FetchFPS",value:function(){var t=this.container.playback.el,e=t.webkitDecodedFrameCount||t.mozDecodedFrames||0,n=t.webkitDroppedFrameCount||t.mozParsedFrames-t.mozDecodedFrames||0,r=e-(this._lastDecodedFramesCount||0);this._metrics.counters.decodedFrames=e,this._metrics.counters.droppedFrames=n,this._metrics.counters.fps=r/(this._runEach/1e3),this._lastDecodedFramesCount=e}},{key:"_measureLatency",value:function(){var t=this;if(this._uriToMeasureLatency){var e,n=[],r=function(){e=n[2]-n[1],t._metrics.timers.latency=e};!function e(){if(n.push(t._now()),n.length>2)r();else{var i=new Image;i.onload=e,i.src=t._uriToMeasureLatency+"?"+Math.random()+"="+t._now()}}()}}},{key:"_measureBandwidth",value:function(){var t=this;if(this._urisToMeasureBandwidth&&this._bwMeasureCount%this._runBandwidthTestEvery==0){var e=0,n=function(n){var r=(t._urisToMeasureBandwidth[e-1].end-t._urisToMeasureBandwidth[e-1].start)/1e3,i=8*n.loaded/r,o=i/1e3;t._metrics.extra.bandwidth=o,t._urisToMeasureBandwidth.forEach(function(t){t.start=0,t.end=0,t.expired=!1,clearTimeout(t.timer)})};!function r(i){if(e>0&&(t._urisToMeasureBandwidth[e-1].end=t._now(),clearTimeout(t._urisToMeasureBandwidth[e-1].timer)),e>=t._urisToMeasureBandwidth.length||e>0&&t._urisToMeasureBandwidth[e-1].expired)n(i);else{var o=new XMLHttpRequest;o.open("GET",t._urisToMeasureBandwidth[e].url,!0),o.responseType="arraybuffer",o.onload=o.onabort=r,t._urisToMeasureBandwidth[e].start=t._now(),t._urisToMeasureBandwidth[e].timer=setTimeout(function(e){t._urisToMeasureBandwidth[e].expired=!0,o.abort()},t._urisToMeasureBandwidth[e].timeout,e),o.send()}e++}()}this._bwMeasureCount++}}]),e}(a.ContainerPlugin);e.default=l,l.REPORT_EVENT="clappr:stats:report",l.PERCENTAGE_EVENT="clappr:stats:percentage",t.exports=e.default}])}); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("Clappr")):"function"==typeof define&&define.amd?define(["Clappr"],e):"object"==typeof exports?exports.ClapprStats=e(require("Clappr")):t.ClapprStats=e(t.Clappr)}(this,function(t){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=6)}([function(t,e,n){"use strict";var r,i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};r=function(){return this}();try{r=r||Function("return this")()||(0,eval)("this")}catch(t){"object"===("undefined"==typeof window?"undefined":i(window))&&(r=window)}t.exports=r},function(t,e,n){"use strict";t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e,n){"use strict";function r(t,e){e=o(e,t)?[e]:i(e);for(var n=0,r=e.length;null!=t&&n-1}function m(t,e){var n=this.__data__,r=P(n,t);return r<0?n.push([t,e]):n[r][1]=e,this}function b(t){var e=-1,n=t?t.length:0;for(this.clear();++e0){var r=this._metrics.extra.bitratesHistory[this._metrics.extra.bitratesHistory.length-1];r.end=n,r.time=n-r.start}this._metrics.extra.bitratesHistory.push({start:this._now(),bitrate:e}),this._inc("changeLevel")}},{key:"stopReporting",value:function(){this._buildReport(),clearInterval(this._intervalId),this._newMetrics(),this.stopListening(),this.bindEvents()}},{key:"startTimers",value:function(){this._intervalId=setInterval(this._buildReport.bind(this),this._runEach),this._start("session"),this._start("startup")}},{key:"onFirstPlaying",value:function(){this.listenTo(this.container,a.Events.CONTAINER_TIMEUPDATE,this.onContainerUpdateWhilePlaying),this._start("watch"),this._stop("startup")}},{key:"playAfterPause",value:function(){this._stop("pause"),this._start("watch")}},{key:"onPlay",value:function(){this._inc("play")}},{key:"onPause",value:function(){this._stop("watch"),this._start("pause"),this._inc("pause"),this.listenToOnce(this.container,a.Events.CONTAINER_PLAY,this.playAfterPause)}},{key:"onSeek",value:function(t){this._inc("seek"),this._metrics.extra.watchHistory.push([1e3*t,1e3*t])}},{key:"onTimeUpdate",value:function(t){var e=1e3*t.current,n=1e3*t.total,r=this._metrics.extra.watchHistory.length;if(this._metrics.extra.duration=n,this._metrics.extra.currentTime=e,this._metrics.extra.watchedPercentage=e/n*100,0===r?this._metrics.extra.watchHistory.push([e,e]):this._metrics.extra.watchHistory[r-1][1]=e,this._metrics.extra.bitratesHistory.length>0){var i=this._metrics.extra.bitratesHistory[this._metrics.extra.bitratesHistory.length-1];i.end||(i.time=this._now()-i.start)}this._onCompletion()}},{key:"onContainerUpdateWhilePlaying",value:function(){this.container.playback.isPlaying()&&(this._stop("watch"),this._start("watch"))}},{key:"onBuffering",value:function(){this._inc("buffering"),this._start("buffering"),this.listenToOnce(this.container,a.Events.CONTAINER_STATE_BUFFERFULL,this.onBufferfull)}},{key:"onBufferfull",value:function(){this._stop("buffering"),this.listenToOnce(this.container,a.Events.CONTAINER_STATE_BUFFERING,this.onBuffering)}},{key:"onProgress",value:function(t){this._metrics.extra.buffersize=1e3*t.current}},{key:"_newMetrics",value:function(){this._metrics={counters:{play:0,pause:0,error:0,buffering:0,decodedFrames:0,droppedFrames:0,fps:0,changeLevel:0,seek:0,fullscreen:0,dvrUsage:0},timers:{startup:0,watch:0,pause:0,buffering:0,session:0,latency:0},extra:{playbackName:"",playbackType:"",bitratesHistory:[],bitrateWeightedMean:0,bitrateMostUsed:0,buffersize:0,watchHistory:[],watchedPercentage:0,bufferingPercentage:0,bandwidth:0,duration:0,currentTime:0}}}},{key:"_onCompletion",value:function(){var t=this._metrics.extra.watchedPercentage,n=this._completion.watch,r=t<=this._completion.lastCalled;-1==n.indexOf(t)||r||(a.Log.info(this.name+" PERCENTAGE_EVENT: "+t),this._completion.lastCalled=t,this.trigger(e.PERCENTAGE_EVENT,t))}},{key:"_buildReport",value:function(){this._stop("session"),this._start("session"),this._metrics.extra.playbackName=this._playbackName,this._metrics.extra.playbackType=this._playbackType,this._calculateBitrates(),this._calculatePercentages(),this._fetchFPS(),this._measureLatency(),this._measureBandwidth(),this.trigger(e.REPORT_EVENT,JSON.parse(JSON.stringify(this._metrics)))}},{key:"_fetchFPS",value:function(){var t={html5_video:this._html5FetchFPS,hls:this._html5FetchFPS,dash_shaka_playback:this._html5FetchFPS};t[this._playbackName]&&t[this._playbackName].call(this)}},{key:"_calculateBitrates",value:function(){this._metrics.extra.bitrateWeightedMean=this._metrics.extra.bitratesHistory.map(function(t){return t.bitrate*t.time}).reduce(function(t,e){return t+e},0)/this._metrics.timers.watch,this._metrics.extra.bitrateMostUsed=this._metrics.extra.bitratesHistory.slice().sort(function(t,e){return t.time0&&(this._metrics.extra.bufferingPercentage=this._metrics.timers.buffering/this._metrics.extra.duration*100)}},{key:"_html5FetchFPS",value:function(){var t=this.container.playback.el,e=t.webkitDecodedFrameCount||t.mozDecodedFrames||0,n=t.webkitDroppedFrameCount||t.mozParsedFrames-t.mozDecodedFrames||0,r=e-(this._lastDecodedFramesCount||0);this._metrics.counters.decodedFrames=e,this._metrics.counters.droppedFrames=n,this._metrics.counters.fps=r/(this._runEach/1e3),this._lastDecodedFramesCount=e}},{key:"_measureLatency",value:function(){var t=this;if(this._uriToMeasureLatency){var e,n=[],r=function(){e=n[2]-n[1],t._metrics.timers.latency=e};!function e(){if(n.push(t._now()),n.length>2)r();else{var i=new Image;i.onload=e,i.src=t._uriToMeasureLatency+"?"+Math.random()+"="+t._now()}}()}}},{key:"_measureBandwidth",value:function(){var t=this;if(this._urisToMeasureBandwidth&&this._bwMeasureCount%this._runBandwidthTestEvery==0){var e=0,n=function(n){var r=(t._urisToMeasureBandwidth[e-1].end-t._urisToMeasureBandwidth[e-1].start)/1e3,i=8*n.loaded/r,o=i/1e3;t._metrics.extra.bandwidth=o,t._urisToMeasureBandwidth.forEach(function(t){t.start=0,t.end=0,t.expired=!1,clearTimeout(t.timer)})};!function r(i){if(e>0&&(t._urisToMeasureBandwidth[e-1].end=t._now(),clearTimeout(t._urisToMeasureBandwidth[e-1].timer)),e>=t._urisToMeasureBandwidth.length||e>0&&t._urisToMeasureBandwidth[e-1].expired)n(i);else{var o=new XMLHttpRequest;o.open("GET",t._urisToMeasureBandwidth[e].url,!0),o.responseType="arraybuffer",o.onload=o.onabort=r,t._urisToMeasureBandwidth[e].start=t._now(),t._urisToMeasureBandwidth[e].timer=setTimeout(function(e){t._urisToMeasureBandwidth[e].expired=!0,o.abort()},t._urisToMeasureBandwidth[e].timeout,e),o.send()}e++}()}this._bwMeasureCount++}}]),e}(a.ContainerPlugin);e.default=l,l.REPORT_EVENT="clappr:stats:report",l.PERCENTAGE_EVENT="clappr:stats:percentage",t.exports=e.default}])}); \ No newline at end of file diff --git a/package.json b/package.json index 37e0306..4605808 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clappr-stats", - "version": "0.1.0", + "version": "0.1.1", "description": "clappr playback stats report plugin", "main": "src/clappr-stats.js", "repository": {