UNPKG

@lahzenegar/video-react

Version:

Video-React is a web video player built from the ground up for an HTML5 world using React library.

227 lines (200 loc) 7.73 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = initIMA; exports.adsResize = adsResize; // Copyright 2017 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. var adsManager; var adsLoader; var adDisplayContainer; var adContainer; var videoContent; var intervalTimer; var adsInitialized; var autoplayAllowed; var autoplayRequiresMuted; function initIMA(videoEl, containerEl) { videoContent = videoEl; adContainer = containerEl; setUpIMA(); // Check if autoplay is supported. checkAutoplaySupport(); } function checkAutoplaySupport() { // Test for autoplay support with our content player. var playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(onAutoplayWithSoundSuccess).catch(onAutoplayWithSoundFail); } } function onAutoplayWithSoundSuccess() { // If we make it here, unmuted autoplay works. videoContent.pause(); autoplayAllowed = true; autoplayRequiresMuted = false; autoplayChecksResolved(); } function onAutoplayWithSoundFail() { // Unmuted autoplay failed. Now try muted autoplay. checkMutedAutoplaySupport(); } function checkMutedAutoplaySupport() { videoContent.volume = 0; videoContent.muted = true; var playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(onMutedAutoplaySuccess).catch(onMutedAutoplayFail); } } function onMutedAutoplaySuccess() { // If we make it here, muted autoplay works but unmuted autoplay does not. videoContent.pause(); autoplayAllowed = true; autoplayRequiresMuted = true; autoplayChecksResolved(); } function onMutedAutoplayFail() { // Both muted and unmuted autoplay failed. Fall back to click to play. videoContent.volume = 1; videoContent.muted = false; autoplayAllowed = false; autoplayRequiresMuted = false; autoplayChecksResolved(); } function setUpIMA() { // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. videoContent.onended = contentEndedListener; } function contentEndedListener() { videoContent.onended = null; if (adsLoader) { adsLoader.contentComplete(); } } function autoplayChecksResolved() { // Request video ads. var adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = 'https://pubads.g.doubleclick.net/gampad/ads?' + 'sz=640x480&iu=/124319096/external/single_ad_samples&ciu_szs=300x250&' + 'impl=s&gdfp_req=1&env=vp&output=vast&unviewed_position_start=1&' + 'cust_params=deployment%3Ddevsite%26sample_ct%3Dlinear&correlator='; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. adsRequest.linearAdSlotWidth = 640; adsRequest.linearAdSlotHeight = 400; adsRequest.nonLinearAdSlotWidth = 640; adsRequest.nonLinearAdSlotHeight = 150; adsRequest.setAdWillAutoPlay(autoplayAllowed); adsRequest.setAdWillPlayMuted(autoplayRequiresMuted); adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. adContainer.style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer(adContainer, videoContent); } function playAds() { try { adDisplayContainer.initialize(); adsInitialized = true; // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(videoContent.clientWidth, videoContent.clientHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. videoContent.play(); } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. var adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener(google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener(google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener(google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); if (autoplayAllowed) { playAds(); } } function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED) // don't have ad object associated. var ad = adEvent.getAd(); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { videoContent.play(); } break; case google.ima.AdEvent.Type.STARTED: // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. adContainer.style.display = 'block'; if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval(function () { var remainingTime = adsManager.getRemainingTime(); }, 300); // every 300ms } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. adContainer.style.display = 'none'; if (ad.isLinear()) { clearInterval(intervalTimer); } break; } } function adsResize() { adsManager.resize(videoContent.clientWidth, videoContent.clientHeight, google.ima.ViewMode.FULLSCREEN); } function onAdError(adErrorEvent) { // Handle the error logging. adContainer.style.display = 'none'; adsManager.destroy(); } function onContentPauseRequested() { videoContent.pause(); videoContent.onended = null; } function onContentResumeRequested() { videoContent.play(); adContainer.style.display = 'none'; videoContent.onended = contentEndedListener; }