- Created complete documentation in docs/ directory - Added PROJECT_OVERVIEW.md with feature highlights and getting started guide - Added ARCHITECTURE.md with system design and technical details - Added SECURITY.md with comprehensive security implementation guide - Added DEVELOPMENT.md with development workflows and best practices - Added DEPLOYMENT.md with production deployment instructions - Added API.md with complete REST API documentation - Added CONTRIBUTING.md with contribution guidelines - Added CHANGELOG.md with version history and migration notes - Reorganized all documentation files into docs/ directory for better organization - Updated README.md with proper documentation links and quick navigation - Enhanced project structure with professional documentation standards
1 line
10 KiB
JavaScript
1 line
10 KiB
JavaScript
(function(window,videojs,undefined){"use strict";var VIDEO_EVENTS=videojs.getComponent("Html5").Events,cancelContentPlay=function(player){if(player.ads.cancelPlayTimeout){return}player.ads.cancelPlayTimeout=window.setTimeout(function(){player.ads.cancelPlayTimeout=null;if(!player.paused()){player.pause()}player.one("contentplayback",function(){if(player.paused()){player.play()}})},1)},isLive=function(player){if(player.duration()===Infinity){return true}else if(videojs.browser.IOS_VERSION==="8"&&player.duration()===0){return true}return false},getPlayerSnapshot=function(player){var currentTime;if(videojs.browser.IS_IOS&&isLive(player)){currentTime=player.currentTime()-player.seekable().end(0)}else{currentTime=player.currentTime()}var tech=player.$(".vjs-tech"),tracks=player.remoteTextTracks?player.remoteTextTracks():[],track,i,suppressedTracks=[],snapshot={ended:player.ended(),currentSrc:player.currentSrc(),src:player.src(),currentTime:currentTime,type:player.currentType()};if(tech){snapshot.nativePoster=tech.poster;snapshot.style=tech.getAttribute("style")}i=tracks.length;while(i--){track=tracks[i];suppressedTracks.push({track:track,mode:track.mode});track.mode="disabled"}snapshot.suppressedTracks=suppressedTracks;return snapshot},restorePlayerSnapshot=function(player,snapshot){var tech=player.$(".vjs-tech"),attempts=20,suppressedTracks=snapshot.suppressedTracks,trackSnapshot,restoreTracks=function(){var i=suppressedTracks.length;while(i--){trackSnapshot=suppressedTracks[i];trackSnapshot.track.mode=trackSnapshot.mode}},resume=function(){var ended=false;var updateEnded=function(){ended=true};var currentTime;if(videojs.browser.IS_IOS&&isLive(player)){if(snapshot.currentTime<0){currentTime=player.seekable().end(0)+snapshot.currentTime;player.currentTime(currentTime)}}else{player.currentTime(snapshot.currentTime)}if(!snapshot.ended){player.play()}else{player.ads.resumeEndedTimeout=window.setTimeout(function(){if(!ended){player.play()}player.off("ended",updateEnded);player.ads.resumeEndedTimeout=null},250);player.on("ended",updateEnded);player.on("dispose",function(){window.clearTimeout(player.ads.resumeEndedTimeout)})}},tryToResume=function(){player.off("contentcanplay",tryToResume);if(player.ads.tryToResumeTimeout_){player.clearTimeout(player.ads.tryToResumeTimeout_);player.ads.tryToResumeTimeout_=null}tech=player.el().querySelector(".vjs-tech");if(tech.readyState>1){return resume()}if(tech.seekable===undefined){return resume()}if(tech.seekable.length>0){return resume()}if(attempts--){window.setTimeout(tryToResume,50)}else{(function(){try{resume()}catch(e){videojs.log.warn("Failed to resume the content after an advertisement",e)}})()}},srcChanged;if(snapshot.nativePoster){tech.poster=snapshot.nativePoster}if("style"in snapshot){tech.setAttribute("style",snapshot.style||"")}srcChanged=player.src()!==snapshot.src||player.currentSrc()!==snapshot.currentSrc;if(srcChanged){player.one("contentloadedmetadata",restoreTracks);player.src({src:snapshot.currentSrc,type:snapshot.type});player.load();player.one("contentcanplay",tryToResume);player.ads.tryToResumeTimeout_=player.setTimeout(tryToResume,2e3)}else if(!player.ended()||!snapshot.ended){restoreTracks();player.play()}},removeNativePoster=function(player){var tech=player.$(".vjs-tech");if(tech){tech.removeAttribute("poster")}},defaults={timeout:5e3,prerollTimeout:100,postrollTimeout:100,debug:false},adFramework=function(options){var player=this;var settings=videojs.mergeOptions(defaults,options);var fsmHandler;(function(){var videoEvents=VIDEO_EVENTS.concat(["firstplay","loadedalldata"]);var returnTrue=function(){return true};var triggerEvent=function(type,event){event.isImmediatePropagationStopped=returnTrue;event.cancelBubble=true;event.isPropagationStopped=returnTrue;player.trigger({type:type+event.type,state:player.ads.state,originalEvent:event})};player.on(videoEvents,function redispatch(event){if(player.ads.state==="ad-playback"){triggerEvent("ad",event)}else if(player.ads.state==="content-playback"&&event.type==="ended"){triggerEvent("content",event)}else if(player.ads.state==="content-resuming"){if(player.ads.snapshot){if(player.currentSrc()!==player.ads.snapshot.currentSrc){if(event.type==="loadstart"){return}return triggerEvent("content",event)}else if(player.ads.snapshot.ended){if(event.type==="pause"||event.type==="ended"){player.addClass("vjs-has-started");return}return triggerEvent("content",event)}}if(event.type!=="playing"){triggerEvent("content",event)}}})})();player.on(["addurationchange","adcanplay"],function(){if(typeof player.ads.snapshot!=="undefined"&&player.currentSrc()===player.ads.snapshot.currentSrc){return}player.play()});player.on("nopreroll",function(){player.ads.nopreroll_=true});player.on("nopostroll",function(){player.ads.nopostroll_=true});player.ads={state:"content-set",startLinearAdMode:function(){if(player.ads.state==="preroll?"||player.ads.state==="content-playback"||player.ads.state==="postroll?"){player.trigger("adstart")}},endLinearAdMode:function(){if(player.ads.state==="ad-playback"){player.trigger("adend")}},skipLinearAdMode:function(){if(player.ads.state!=="ad-playback"){player.trigger("adskip")}}};fsmHandler=function(event){var fsm={"content-set":{events:{adscanceled:function(){this.state="content-playback"},adsready:function(){this.state="ads-ready"},play:function(){this.state="ads-ready?";cancelContentPlay(player);removeNativePoster(player)},adserror:function(){this.state="content-playback"},adskip:function(){this.state="content-playback"}}},"ads-ready":{events:{play:function(){this.state="preroll?";cancelContentPlay(player)},adskip:function(){this.state="content-playback"},adserror:function(){this.state="content-playback"}}},"preroll?":{enter:function(){if(player.ads.nopreroll_){player.trigger("readyforpreroll");player.trigger("nopreroll")}else{player.addClass("vjs-ad-loading");player.ads.adTimeoutTimeout=window.setTimeout(function(){player.trigger("adtimeout")},settings.prerollTimeout);player.trigger("readyforpreroll")}},leave:function(){window.clearTimeout(player.ads.adTimeoutTimeout);player.removeClass("vjs-ad-loading")},events:{play:function(){cancelContentPlay(player)},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(){player.addClass("vjs-ad-loading");player.ads.adTimeoutTimeout=window.setTimeout(function(){player.trigger("adtimeout")},settings.timeout)},leave:function(){window.clearTimeout(player.ads.adTimeoutTimeout);player.removeClass("vjs-ad-loading")},events:{play:function(){cancelContentPlay(player)},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(){if(videojs.browser.IS_IOS||player.duration()!==Infinity){this.snapshot=getPlayerSnapshot(player)}if(!videojs.browser.IS_IOS&&player.duration()===Infinity){this.preAdVolume_=player.volume();player.volume(0)}player.addClass("vjs-ad-playing");removeNativePoster(player);if(player.ads.cancelPlayTimeout){window.clearTimeout(player.ads.cancelPlayTimeout);player.ads.cancelPlayTimeout=null}},leave:function(){player.removeClass("vjs-ad-playing");if(videojs.browser.IS_IOS||player.duration()!==Infinity){restorePlayerSnapshot(player,this.snapshot)}if(!videojs.browser.IS_IOS&&player.duration()===Infinity){player.volume(this.preAdVolume_)}if(player.ads.triggerevent!=="adend"){player.trigger("adend")}},events:{adend:function(){this.state="content-resuming"},adserror:function(){this.state="content-resuming"}}},"content-resuming":{enter:function(){if(this.snapshot&&this.snapshot.ended){window.clearTimeout(player.ads._fireEndedTimeout);player.ads._fireEndedTimeout=window.setTimeout(function(){player.trigger("ended")},1e3)}},leave:function(){window.clearTimeout(player.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=getPlayerSnapshot(player);if(player.ads.nopostroll_){player.ads.state="content-resuming";window.setTimeout(function(){player.trigger("ended")},1)}else{player.addClass("vjs-ad-loading");player.ads.adTimeoutTimeout=window.setTimeout(function(){player.trigger("adtimeout")},settings.postrollTimeout)}},leave:function(){window.clearTimeout(player.ads.adTimeoutTimeout);player.removeClass("vjs-ad-loading")},events:{adstart:function(){this.state="ad-playback"},adskip:function(){this.state="content-resuming";window.setTimeout(function(){player.trigger("ended")},1)},adtimeout:function(){this.state="content-resuming";window.setTimeout(function(){player.trigger("ended")},1)},adserror:function(){this.state="content-resuming";window.setTimeout(function(){player.trigger("ended")},1)}}},"content-playback":{enter:function(){if(player.ads.cancelPlayTimeout){window.clearTimeout(player.ads.cancelPlayTimeout);player.ads.cancelPlayTimeout=null}player.trigger({type:"contentplayback",triggerevent:player.ads.triggerevent})},events:{adsready:function(){player.trigger("readyforpreroll")},adstart:function(){this.state="ad-playback"},contentupdate:function(){if(player.paused()){this.state="content-set"}else{this.state="ads-ready?"}},contentended:function(){this.state="postroll?"}}}};(function(state){var noop=function(){};((fsm[state].events||{})[event.type]||noop).apply(player.ads);if(state!==player.ads.state){player.ads.triggerevent=event.type;(fsm[state].leave||noop).apply(player.ads);(fsm[player.ads.state].enter||noop).apply(player.ads);if(settings.debug){videojs.log("ads",player.ads.triggerevent+" triggered: "+state+" -> "+player.ads.state)}}})(player.ads.state)};player.on(VIDEO_EVENTS.concat(["adtimeout","contentupdate","contentplaying","contentended","contentresumed","adsready","adserror","adscanceled","adstart","adend","adskip","nopreroll"]),fsmHandler);player.ads.contentSrc=player.currentSrc();(function(){var checkSrc=function(){var src;if(player.ads.state!=="ad-playback"){src=player.currentSrc();if(src!==player.ads.contentSrc){player.trigger({type:"contentupdate",oldValue:player.ads.contentSrc,newValue:src});player.ads.contentSrc=src}}};player.on("loadstart",checkSrc);window.setTimeout(checkSrc,1)})();if(!player.paused()){fsmHandler({type:"play"})}};videojs.plugin("ads",adFramework)})(window,videojs); |