videojs-contrib-ads
Version:
A framework that provides common functionality needed by video advertisement libraries working with video.js.
3 lines • 8.27 kB
JavaScript
/*! videojs-contrib-ads - v3.2.0 - 2016-04-20
* Copyright (c) 2016 Brightcove; Licensed */
!function(a,b,c){"use strict";var d=b.getComponent("Html5").Events,e=function(b){b.ads.cancelPlayTimeout||(b.ads.cancelPlayTimeout=a.setTimeout(function(){b.ads.cancelPlayTimeout=null,b.paused()||b.pause(),b.one("contentplayback",function(){b.paused()&&b.play()})},1))},f=function(a){return a.duration()===1/0?!0:"8"===b.browser.IOS_VERSION&&0===a.duration()?!0:!1},g=function(a){var c;c=b.browser.IS_IOS&&f(a)?a.currentTime()-a.seekable().end(0):a.currentTime();var d,e,g=a.$(".vjs-tech"),h=a.remoteTextTracks?a.remoteTextTracks():[],i=[],j={ended:a.ended(),currentSrc:a.currentSrc(),src:a.src(),currentTime:c,type:a.currentType()};for(g&&(j.nativePoster=g.poster,j.style=g.getAttribute("style")),e=h.length;e--;)d=h[e],i.push({track:d,mode:d.mode}),d.mode="disabled";return j.suppressedTracks=i,j},h=function(d,e){if(d.ads.disableNextSnapshotRestore===!0)return void(d.ads.disableNextSnapshotRestore=!1);var g,h,i=d.$(".vjs-tech"),j=20,k=e.suppressedTracks,l=function(){for(var a=k.length;a--;)g=k[a],g.track.mode=g.mode},m=function(){var c,g=!1,h=function(){g=!0};b.browser.IS_IOS&&f(d)?e.currentTime<0&&(c=d.seekable().end(0)+e.currentTime,d.currentTime(c)):d.currentTime(e.currentTime),e.ended?(d.ads.resumeEndedTimeout=a.setTimeout(function(){g||d.play(),d.off("ended",h),d.ads.resumeEndedTimeout=null},250),d.on("ended",h),d.on("dispose",function(){a.clearTimeout(d.ads.resumeEndedTimeout)})):d.play()},n=function(){return d.off("contentcanplay",n),d.ads.tryToResumeTimeout_&&(d.clearTimeout(d.ads.tryToResumeTimeout_),d.ads.tryToResumeTimeout_=null),i=d.el().querySelector(".vjs-tech"),i.readyState>1?m():i.seekable===c?m():i.seekable.length>0?m():void(j--?a.setTimeout(n,50):!function(){try{m()}catch(a){b.log.warn("Failed to resume the content after an advertisement",a)}}())};e.nativePoster&&(i.poster=e.nativePoster),"style"in e&&i.setAttribute("style",e.style||""),h=d.src()!==e.src||d.currentSrc()!==e.currentSrc,h?(d.one("contentloadedmetadata",l),d.src({src:e.currentSrc,type:e.type}),d.load(),d.one("contentcanplay",n),d.ads.tryToResumeTimeout_=d.setTimeout(n,2e3)):d.ended()&&e.ended||(l(),d.play())},i=function(a){var b=a.$(".vjs-tech");b&&b.removeAttribute("poster")},j={timeout:5e3,prerollTimeout:100,postrollTimeout:100,debug:!1},k=function(c){var f,k=this,l=b.mergeOptions(j,c);!function(){var a=d.concat(["firstplay","loadedalldata"]),b=function(){return!0},c=function(a,c){c.isImmediatePropagationStopped=b,c.cancelBubble=!0,c.isPropagationStopped=b,k.trigger({type:a+c.type,state:k.ads.state,originalEvent:c})};k.on(a,function(a){if("ad-playback"===k.ads.state)c("ad",a);else if("content-playback"===k.ads.state&&"ended"===a.type)c("content",a);else if("content-resuming"===k.ads.state){if(k.ads.snapshot){if(k.currentSrc()!==k.ads.snapshot.currentSrc){if("loadstart"===a.type)return;return c("content",a)}if(k.ads.snapshot.ended)return"pause"===a.type||"ended"===a.type?void k.addClass("vjs-has-started"):c("content",a)}"playing"!==a.type&&c("content",a)}})}(),k.on(["addurationchange","adcanplay"],function(){k.currentSrc()!==k.ads.snapshot.currentSrc&&k.play()}),k.on("nopreroll",function(){k.ads.nopreroll_=!0}),k.on("nopostroll",function(){k.ads.nopostroll_=!0}),k.ads={state:"content-set",disableNextSnapshotRestore:!1,startLinearAdMode:function(){("preroll?"===k.ads.state||"content-playback"===k.ads.state||"postroll?"===k.ads.state)&&k.trigger("adstart")},endLinearAdMode:function(){"ad-playback"===k.ads.state&&k.trigger("adend")},skipLinearAdMode:function(){"ad-playback"!==k.ads.state&&k.trigger("adskip")}},f=function(c){var d={"content-set":{events:{adscanceled:function(){this.state="content-playback"},adsready:function(){this.state="ads-ready"},play:function(){this.state="ads-ready?",e(k),i(k)},adserror:function(){this.state="content-playback"},adskip:function(){this.state="content-playback"}}},"ads-ready":{events:{play:function(){this.state="preroll?",e(k)},adskip:function(){this.state="content-playback"},adserror:function(){this.state="content-playback"}}},"preroll?":{enter:function(){k.ads.nopreroll_?(k.trigger("readyforpreroll"),k.trigger("nopreroll")):(k.addClass("vjs-ad-loading"),k.ads.adTimeoutTimeout=a.setTimeout(function(){k.trigger("adtimeout")},l.prerollTimeout),k.trigger("readyforpreroll"))},leave:function(){a.clearTimeout(k.ads.adTimeoutTimeout),k.removeClass("vjs-ad-loading")},events:{play:function(){e(k)},adstart:function(){this.state="ad-playback"},adskip:function(){this.state="content-playback"},adtimeout:function(){this.state="content-playback"},adserror:function(){this.state="content-playback"},nopreroll:function(){this.state="content-playback"}}},"ads-ready?":{enter:function(){k.addClass("vjs-ad-loading"),k.ads.adTimeoutTimeout=a.setTimeout(function(){k.trigger("adtimeout")},l.timeout)},leave:function(){a.clearTimeout(k.ads.adTimeoutTimeout),k.removeClass("vjs-ad-loading")},events:{play:function(){e(k)},adscanceled:function(){this.state="content-playback"},adsready:function(){this.state="preroll?"},adskip:function(){this.state="content-playback"},adtimeout:function(){this.state="content-playback"},adserror:function(){this.state="content-playback"}}},"ad-playback":{enter:function(){(b.browser.IS_IOS||k.duration()!==1/0)&&(this.snapshot=g(k)),b.browser.IS_IOS||k.duration()!==1/0||(this.preAdVolume_=k.volume(),k.volume(0)),k.addClass("vjs-ad-playing"),i(k),k.ads.cancelPlayTimeout&&(a.clearTimeout(k.ads.cancelPlayTimeout),k.ads.cancelPlayTimeout=null)},leave:function(){k.removeClass("vjs-ad-playing"),(b.browser.IS_IOS||k.duration()!==1/0)&&h(k,this.snapshot),b.browser.IS_IOS||k.duration()!==1/0||k.volume(this.preAdVolume_),"adend"!==k.ads.triggerevent&&k.trigger("adend")},events:{adend:function(){this.state="content-resuming"},adserror:function(){this.state="content-resuming"}}},"content-resuming":{enter:function(){this.snapshot&&this.snapshot.ended&&(a.clearTimeout(k.ads._fireEndedTimeout),k.ads._fireEndedTimeout=a.setTimeout(function(){k.trigger("ended")},1e3))},leave:function(){a.clearTimeout(k.ads._fireEndedTimeout)},events:{contentupdate:function(){this.state="content-set"},contentresumed:function(){this.state="content-playback"},playing:function(){this.state="content-playback"},ended:function(){this.state="content-playback"}}},"postroll?":{enter:function(){this.snapshot=g(k),k.ads.nopostroll_?(k.ads.state="content-resuming",a.setTimeout(function(){k.trigger("ended")},1)):(k.addClass("vjs-ad-loading"),k.ads.adTimeoutTimeout=a.setTimeout(function(){k.trigger("adtimeout")},l.postrollTimeout))},leave:function(){a.clearTimeout(k.ads.adTimeoutTimeout),k.removeClass("vjs-ad-loading")},events:{adstart:function(){this.state="ad-playback"},adskip:function(){this.state="content-resuming",a.setTimeout(function(){k.trigger("ended")},1)},adtimeout:function(){this.state="content-resuming",a.setTimeout(function(){k.trigger("ended")},1)},adserror:function(){this.state="content-resuming",a.setTimeout(function(){k.trigger("ended")},1)}}},"content-playback":{enter:function(){k.ads.cancelPlayTimeout&&(a.clearTimeout(k.ads.cancelPlayTimeout),k.ads.cancelPlayTimeout=null),k.trigger({type:"contentplayback",triggerevent:k.ads.triggerevent})},events:{adsready:function(){k.trigger("readyforpreroll")},adstart:function(){this.state="ad-playback"},contentupdate:function(){k.paused()?this.state="content-set":this.state="ads-ready?"},contentended:function(){this.state="postroll?"}}}};!function(a){var e=function(){};((d[a].events||{})[c.type]||e).apply(k.ads),a!==k.ads.state&&(k.ads.triggerevent=c.type,(d[a].leave||e).apply(k.ads),(d[k.ads.state].enter||e).apply(k.ads),l.debug&&b.log("ads",k.ads.triggerevent+" triggered: "+a+" -> "+k.ads.state))}(k.ads.state)},k.on(d.concat(["adtimeout","contentupdate","contentplaying","contentended","contentresumed","adsready","adserror","adscanceled","adstart","adend","adskip","nopreroll"]),f),k.ads.contentSrc=k.currentSrc(),function(){var b=function(){var a;"ad-playback"!==k.ads.state&&(a=k.currentSrc(),a!==k.ads.contentSrc&&(k.trigger({type:"contentupdate",oldValue:k.ads.contentSrc,newValue:a}),k.ads.contentSrc=a))};k.on("loadstart",b),a.setTimeout(b,1)}(),k.paused()||f({type:"play"})};b.plugin("ads",k)}(window,videojs);