/* Viewer Script */ (function (ctx) { const plugins = { /** * Viewer * @param vcplayer * @param options */ viewer: async function (vcplayer, options = {}) { const { VCViewerPlugin, VCViewerPluginConfig, VCViewerPluginDataSource, VCViewerListener, } = ctx.VCPlayerPluginSDK; const fpPromise = await import( 'https://openfpcdn.io/fingerprintjs/v3' ).then((FingerprintJS) => FingerprintJS.load()); const fp = await fpPromise; const fpResult = await fp.get(); let uniqueId = "" if(fpResult && fpResult.visitorId) { uniqueId = fpResult.visitorId } const { config, source, listeners } = options; const dataConfig = new VCViewerPluginConfig(); Object.assign(dataConfig, config); const dataSource = new VCViewerPluginDataSource(); dataSource.setDataSource( Object.assign({}, source, {uniqueId,}), ); const plugin = new VCViewerPlugin(dataConfig, dataSource); for (const i in listeners) { if ( listeners.hasOwnProperty(i) && listeners[i] instanceof VCViewerListener ) {plugin.addListener(listeners[i]);} } await vcplayer.addPlugin(plugin); }, /** * IMA * @param vcplayer * @param options */ ima: async (vcplayer, options = {}) => { const { VCImaPlugin, VCImaPluginAutoPlay, VCImaPluginConfig, VCImaEventListener } = ctx.VCPlayerPluginSDK; const { config, source, listeners } = options; const Plugin = VCImaPlugin || VCImaPluginAutoPlay; const dataConfig = new VCImaPluginConfig(); Object.assign(dataConfig, config); const plugin = new Plugin(dataConfig); for (const i in listeners) { if ( listeners.hasOwnProperty(i) && listeners[i] instanceof VCImaEventListener ) {plugin.addListener(listeners[i]);} } // const companionListener = new (class extends VCImaEventListener { // onAdLoaded(ad) { // let adPlugin = null; // const vcPlugins = vcplayer.getPlugin(); // for (const p in vcPlugins) { // if (vcPlugins[p] instanceof VCImaPlugin) { // adPlugin = vcPlugins[p].adsManager_; // } // } // console.log('on ad loaded from listener', { ad, adPlugin }); // if (adPlugin) { // // res.on('ima3-ads-manager-loaded', function () { // _log('ads manager loaded!!'); // adPlugin.addEventListener( // google.ima.AdEvent.Type.STARTED, // onAdEvent, // ); // // }); // function onAdEvent(adEvent) { // _log('onAdEvent'); // stopLastCall(); // googletag.cmd.push(function () { // switch (adEvent.type) { // case google.ima.AdEvent.Type.STARTED: // // Get the ad from the event. // var ad = adEvent.getAd(); // var selectionCriteria = // new google.ima.CompanionAdSelectionSettings(); // selectionCriteria.resourceType = // google.ima.CompanionAdSelectionSettings.ResourceType.ALL; // selectionCriteria.creativeType = // google.ima.CompanionAdSelectionSettings.CreativeType.ALL; // selectionCriteria.sizeCriteria = // google.ima.CompanionAdSelectionSettings.SizeCriteria.SELECT_EXACT_MATCH; // // Get a list of companion ads for an ad slot size and CompanionAdSelectionSettings // const cm = new CompanionBuilder(ad, selectionCriteria); // if (mobileCheck()) { // _log('companion 320x50'); // cm.displayCompanion([320, 50], 'skin'); // _log('companion 300x251'); // cm.displayCompanion([300, 251], 'skin'); // _log('companion 300x250'); // cm.displayCompanion([300, 250], '300'); // } else { // if (window.innerWidth >= 1400) { // _log('companion 1400x600'); // cm.displayCompanion([1400, 600], 'skin'); // } else if (window.innerWidth >= 728) { // _log('companion 728x90'); // cm.displayCompanion([728, 90], 'skin'); // // add custom class for 728 // try { // document // .querySelector('#frame') // .classList.add('companion-728'); // } catch (error) { // _log('add custom class skin error'); // } // } // _log('companion 300x250'); // cm.displayCompanion([300, 250], '300'); // } // break; // } // }); // } // class CompanionBuilder { // constructor(ad, criteria) { // this.ad = ad; // this.criteria = criteria; // } // displayCompanion(companionSize = [0, 0], position = '300') { // const companion = this.ad.getCompanionAds( // companionSize[0], // companionSize[1], // this.criteria, // ); // const findCompanionPostion = companionPosition.find( // (el) => el.key == position, // ); // if (findCompanionPostion) { // this.checkCompanionAdAndDisplay( // companion, // position, // findAvaiableDiv(findCompanionPostion.id), // ); // } else { // _log('postion ads not found'); // } // } // checkCompanionAdAndDisplay(companionAd, position, id) { // if (Array.isArray(companionAd) && companionAd.length > 0) { // const companionContent = companionAd[0].getContent(); // const div = document.getElementById(id); // if (companionContent) { // const positionIdx = companionPosition.findIndex(function ( // el, // ) { // return el.key == position; // }); // _log('position = ' + position); // companionPosition[positionIdx].available = true; // } // if (div) { // div.style.removeProperty('display'); // div.innerHTML = companionContent; // } // } // } // } // } // } // })(); // // companion // plugin.addListener(companionListener); await vcplayer.addPlugin(plugin); }, /** * DCR * @param vcplayer * @param options */ dcr: async (vcplayer, options = {}) => { const { VCDCREventListener, VCDCRPlugin, VCDCRPluginConfig, VCDCRPluginDataSource, } = ctx.VCPlayerPluginSDK; const { config, source, listeners } = options; const dataConfig = new VCDCRPluginConfig(); Object.assign(dataConfig, config); const dataSource = new VCDCRPluginDataSource(); dataSource.setDataSource(Object.assign({}, source)); const plugin = new VCDCRPlugin(dataConfig, dataSource); for (const i in listeners) { if ( listeners.hasOwnProperty(i) && listeners[i] instanceof VCDCREventListener ) {plugin.addListener(listeners[i]);} } await vcplayer.addPlugin(plugin); }, maepeng: async (vcplayer, options = {}) => { const { VCMeapengEventListener, VCMeapengAnalyticPlugin, VCMeapengAnalyticPluginConfig, VCMeapengAnalyticPluginDataSource, } = ctx.VCPlayerPluginSDK; const { config, source, listeners } = options; const dataConfig = new VCMeapengAnalyticPluginConfig(); Object.assign( dataConfig, { endpoint: 'https://www.maepeng.com/api/v1/Ms/ptk', }, config, ); const dataSource = new VCMeapengAnalyticPluginDataSource(); dataSource.setDataSource(Object.assign({}, source)); const plugin = new VCMeapengAnalyticPlugin(dataConfig, dataSource); for (const i in listeners) { if ( listeners.hasOwnProperty(i) && listeners[i] instanceof VCMeapengEventListener ) {plugin.addListener(listeners[i]);} } await vcplayer.addPlugin(plugin); }, data_analytic: async (vcplayer, options = {}) => { const { VCDataAnalyticPlugin, VCDataAnalyticPluginConfig, VCDataAnalyticEventListener, } = ctx.VCPlayerPluginSDK; const { config, source, listeners } = options; const dataConfig = new VCDataAnalyticPluginConfig(); Object.assign(dataConfig, config); const plugin = new VCDataAnalyticPlugin(dataConfig); for (const i in listeners) { if ( listeners.hasOwnProperty(i) && listeners[i] instanceof VCDataAnalyticEventListener ) {plugin.addListener(listeners[i]);} } await vcplayer.addPlugin(plugin); }, }; ctx.__vc_plugins = plugins; ctx.notEmptyObject = function (obj) { return typeof obj === 'object' && Object.keys(obj).length > 0; }; ctx.__fetchPlayback = async function (id, token = '') { return fetch('https://videocloud-api.bugaboo.tv/api/playback/playback/' + id,{ headers: { 'Authorization': 'Bearer ' + token } }) .then((r) => r.json()) .then((response) => response && response.data); }; ctx.__vcBeforeInit = function (config) { for (const i in ctx.__vcBefore) { if ( ctx.__vcBefore.hasOwnProperty(i) && typeof ctx.__vcBefore[i] === 'function' ) {ctx.__vcBefore[i](config);} } }; ctx.__vcAfterInit = function (player) { for (const i in ctx.__vcAfter) { if ( ctx.__vcAfter.hasOwnProperty(i) && typeof ctx.__vcAfter[i] === 'function' ) {ctx.__vcAfter[i](player);} } }; ctx.findGetParameter = function (parameterName) { var result = null, tmp = []; location.search .substr(1) .split('&') .forEach(function (item) { tmp = item.split('='); if (tmp[0] === parameterName) result = decodeURIComponent(tmp[1]); }); return result; }; ctx.__getDFP = function () { const getAge = (dateString) => { var today = new Date(); var birthDate = new Date(dateString); var age = today.getFullYear() - birthDate.getFullYear(); var m = today.getMonth() - birthDate.getMonth(); if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {age--;} return age; }; const getYear = (dateString) => { if (dateString) { return new Date(dateString).getFullYear(); } return null; }; /** * test ads */ // return '//pubads.g.doubleclick.net/gampad/ads?sz=400x300&iu=%2F6062%2Fiab_vast_samples&ciu_szs=300x250%2C728x90&gdfp_req=1&env=vp&output=xml_vast2&unviewed_position_start=1&url=[referrer_url]&correlator=[timestamp]&cust_params=iab_vast_samples%3Dlinear'; // return 'https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124319096/external/ad_rule_samples&ciu_szs=300x250&ad_rule=1&impl=s&gdfp_req=1&env=vp&output=vmap&unviewed_position_start=1&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpost&cmsid=496&vid=short_onecue&correlator='; var cmsid = '2569114'; var vid = '0'; var iu = ''; var sz = '640x360'; var ciu_szs = '728x90%2C300x250%2C300x251%2C300x50%2C180x150%2C120x60%2C88x31%2C300x60%2C300x100%2C320x50%2C468x60%2C300x600%2C160x600%2C1400x600'; var metadataDFP = {}; var _keyValue; var keyValue = ((_keyValue = { fingerprint: 'unknown', age: 'unknown', gender: 'unknown', year: 'unknown', }), (_keyValue['year'] = 'unknown'), _keyValue); const userData = window.userData; if (userData && userData.isAllowAllianceMarketing) { const age = getAge(userData.dateOfBirth); const year = getYear(userData.dateOfBirth); keyValue["fingerprint"] = userData.userId || "unknown"; keyValue["age"] = age || "unknown"; keyValue["gender"] = userData.gender || "unknown"; keyValue["year"] = year || "unknown"; } var cust_params = ''; if (typeof window.metadataDFP !== 'undefined') { if (typeof metadataDFP == 'undefined') { metadataDFP = {};} if (typeof window.metadataDFP.adUnit !== 'undefined') { metadataDFP.adUnit = window.metadataDFP.adUnit; } if (typeof window.metadataDFP.size !== 'undefined') { metadataDFP.size = window.metadataDFP.size; } // merge a keyValue if (typeof window.metadataDFP.keyValue !== 'undefined') { if (typeof metadataDFP.keyValue !== 'undefined') { for (var key in window.metadataDFP.keyValue) { if (window.metadataDFP.keyValue.hasOwnProperty(key)) { metadataDFP.keyValue[key] = window.metadataDFP.keyValue[key]; } } } else { metadataDFP.keyValue = window.metadataDFP.keyValue; } } } if ( Object.keys(metadataDFP).length !== 0 && metadataDFP.constructor === Object && typeof metadataDFP.adUnit !== 'undefined' ) { // = metadataDFP.adUnit; var path = metadataDFP.adUnit.split('/'); if ( (path.length === 5 || path.length === 6) && (typeof path[5] === 'undefined' || path[5] === '') ) { path[5] = 'Instream'; } iu = path.join('/'); var debugIu = findGetParameter('vast_ads_unit'); if (debugIu !== null) { iu = debugIu; } if (typeof metadataDFP.size !== 'undefined') { sz = metadataDFP.size; } if (typeof metadataDFP.keyValue !== 'undefined') { for (var k in metadataDFP.keyValue) { if (metadataDFP.keyValue.hasOwnProperty(k)) { keyValue[k] = metadataDFP.keyValue[k]; } } } var listKey = []; for (var _key2 in keyValue) { if (keyValue.hasOwnProperty(_key2)) { var val = keyValue[_key2] + ''; //val = val.replace(/s*/g, ''); val = val.replace("https", ""); val = val.replace(/,/g, '%2C'); listKey.push(_key2 + '%3D' + val); } } if (listKey.length > 0) { cust_params = '&cust_params=' + listKey.join('%26'); } var vastUrl = 'https://pubads.g.doubleclick.net/gampad/ads?sz=' + sz + '&iu=' + iu + cust_params + '&impl=s&gdfp_req=1&env=vp&output=vast&unviewed_position_start=1&url=[referrer_url]&description_url=[description_url]&correlator=[timestamp]&ciu_szs=' + ciu_szs; // console.log(vastUrl); if (cmsid !== '') { vastUrl += '&cmsid=' + cmsid; } if (vid !== '') { vastUrl += '&vid=' + vid; } return vastUrl; } return ''; }; })(window);