UNPKG

npaw-plugin-adapters

Version:
532 lines (488 loc) 15.7 kB
import ShakaTech from "./additionalContexts/ShakaTech"; import HlsJsTech from "./additionalContexts/HlsJsTech"; import DashShakaTech from "./additionalContexts/DashShakaTech"; import DashTech from "./additionalContexts/DashTech"; import ContribHlsTech from "./additionalContexts/ContribHlsTech"; import GenericAdsAdapter from "./ads/GenericAdsAdapter"; import BcoveImaAdsAdapter from "./ads/BcoveImaAdsAdapter"; import BcoveAdsAdapter from "./ads/BcoveAdsAdapter"; export default class BrightcoveAdapter { adsAdapters = { bcoveAdsAdapter: BcoveAdsAdapter, bcoveImaAdsAdapter: BcoveImaAdsAdapter, genericAdsAdapter: GenericAdsAdapter }; additionalContexts = { contribHlsTech: ContribHlsTech, dashTech: DashTech, dashShakaTech: DashShakaTech, hlsJsTech: HlsJsTech, shakaTech: ShakaTech }; isInAds() { try { return (this.player.ads && this.player.ads.inAdBreak && (typeof this.player.ads.inAdBreak === 'function') && this.player.ads.inAdBreak()); } catch (e) { return false; } } getBitrate() { var ret = null; var tech = this.getUsedTech(); if (tech && tech.getBitrate) { ret = tech.getBitrate(this); } return ret; } checkExistsPlayer() { try { return this.checkExistsObjectOnPage(this.player.el()); } catch (err) { return true; } } pauseListener(e) { this.firePlayerLog('pauseListener', {}); this.firePause({}, 'pauseListener'); } bufferingListener(e) { this.firePlayerLog('bufferingListener', {}); if (!this.flags.isSeeking) { this.fireBufferBegin({}, false, 'bufferingListener'); } } getRendition() { var ret = null; var tech = this.getUsedTech(); if (tech && tech.getRendition) { ret = tech.getRendition(this); } return ret; } getPlayerVersion() { var ret = null; if (typeof videojs !== 'undefined') { ret = videojs.VERSION; } return ret; } playListener(e) { this.firePlayerLog('playListener', {}); if (this.isInAds()) { return; } if (!this.flags.isStarted) { this.lastSrc = this.getResource(); this._startEvent('playListenerNotStarted') } else { if (this.lastSrc && this.lastSrc !== this.getResource()) { this.fireStop({}, 'playListenerNewResource'); this.acumBytesFunc(); this.lastPlayhead = undefined; this._startEvent('playListenerNewResource'); this.lastSrc = this.getResource(); } } } loadAdsAdapter() { if (this.plugin.getAdsAdapter() === null) { var adapter; if (this.getAdapterClass('bcoveImaAdsAdapter').isUsed()) { adapter = this.getAdapterClass('bcoveImaAdsAdapter'); if (adapter) { this.plugin.setAdsAdapter(adapter, this.getVideo().getVideoKey()); const adsAdapters = Object.keys(this.getAdapterClasses()).filter(el => el.toLowerCase().includes('ads')); for (const adapter of adsAdapters) { this.getAdapterClass(adapter).unregisterListeners(); } this.getVideo().getAdsAdapter().registerListeners(); } } else { this.loadVideoJSAdsAdapter(); } } } loadVideoJSAdsAdapter() { if (this.getVideo()) { if (!this.getVideo().getAdsAdapter() || this.getVideo().getAdsAdapter().isGeneric) { var adapter = null; if (this.getAdapterClass('bcoveAdsAdapter').isUsed()) { adapter = this.getAdapterClass('bcoveAdsAdapter'); } else if (this.getVideo().getAdsAdapter() === null) { adapter = this.getAdapterClass('genericAdsAdapter'); adapter.initProperties() } if (adapter) { this.plugin.setAdsAdapter(adapter, this.getVideo().getVideoKey()); const adsAdapters = Object.keys(this.getAdapterClasses()).filter(el => el.toLowerCase().includes('ads')); for (const adapter of adsAdapters) { this.getAdapterClass(adapter).unregisterListeners(); } this.getVideo().getAdsAdapter().registerListeners(); } } else { if (this.getVideo().getAdsAdapter().registerImaEvents) this.getVideo().getAdsAdapter().registerImaEvents(); } } } errorModifyer(fatal, nonfatal, ignore) { this.fatalList = fatal || []; this.nonFatalList = nonfatal || []; this.ignoreList = ignore || []; } getPlayrate() { return this.player.playbackRate(); } timeupdateListener(e) { if (this.isInAds()) { return; } if (this.getPlayhead() > 0.1) { this.fireJoin({}, 'timeupdateListener'); if (this.joinPolling) this.joinPolling.stop(); if (!this.flags.isPaused && this.lastSeekPlayhead && this.lastSeekPlayhead !== this.getPlayhead()) { this.fireSeekEnd({}, 'timeupdateListener'); this.lastSeekPlayhead = false; } } if (!this.flags.isJoined) { if (this.lastPlayhead === undefined) { this.lastPlayhead = this.getPlayhead(); } if (this.lastPlayhead !== this.getPlayhead()) { if (this.player.options_ && this.plugin && !this.getVideo().options['content.id']) { this.getVideo().options['content.id'] = this.player.options_['data-video-id'] }; this.fireStart({}, 'timeupdateListener'); this.fireJoin({}, 'timeupdateListener'); if (this.joinPolling) this.joinPolling.stop(); this.lastPlayhead = undefined; } } if (this.getVideo()._adsAdapter && !this.getVideo()._adsAdapter.flags.isStarted) { this.lastPlayhead = this.getPlayhead(); } } getPlayhead() { return this.player.currentTime(); } getDuration() { if (this.player.mediainfo && typeof this.player.mediainfo.duration !== 'undefined') { return this.player.mediainfo.duration; } else { return this.getVideoJSDuration(); } } getVideoJSDuration() { var ret = this.player.duration(); if (this.player.mediainfo && typeof this.player.mediainfo.duration !== 'undefined') { ret = this.player.mediainfo.duration; } return ret; } aderrorListener(e) { this.loadAdsAdapter(); if (this.getVideo().getAdsAdapter() && this.getVideo().getAdsAdapter().adPlayerErrorListener) { this.getVideo().getAdsAdapter().adPlayerErrorListener(e); } } _jointimePolling(e) { if (this.getVideo()) { if (!this.getVideo().getAdsAdapter() || !this.getVideo().getAdsAdapter().flags.isStarted) { if (this.lastPlayhead !== 0 && typeof this.lastPlayhead === 'number' && this.lastPlayhead !== this.getPlayhead()) { this.fireJoin({}, 'jointimePolling'); if (this.joinPolling) { this.joinPolling.stop(); } } this.lastPlayhead = this.getPlayhead(); } } else if (this.joinPolling) { this.joinPolling.stop(); } } acumBytesFunc() { this.acumBytes += this.getTotalBytes() || 0; } adsEndedListener(e) { this.firePlayerLog('adsEndedListener', {}); this.adsEnded = true; if (this.getVideo().requestBuilder.lastSent.adPosition === this.getNpawReference().Constants.AdPosition.Postroll) { this.getVideo().fireStop({}, 'adsEndedListener'); this.acumBytesFunc(); this.lastPlayhead = undefined; } } getVersion() { return '7.0.4-brightcove-videojs-jsclass'; } seekedListener(e) { this.firePlayerLog('seekedListener', {}); this.lastSeekPlayhead = this.getPlayhead(); } getTech() { return this.player.tech({ IWillNotUseThisInPlugins: true }); } unregisterListeners() { if (this.monitor) this.monitor.stop(); if (this.player && this.references) { try { for (var key in this.references) { this.player.off(key, this.references[key]); } } catch (err) { }; delete this.references; } } _startEvent(triggerListener) { this.loadAdsAdapter(); if (this.player.options_ && this.plugin && !this.plugin.options['content.id']) { this.plugin.options['content.id'] = this.player.options_['data-video-id']; } this.fireStart({}, triggerListener); if (!this.flags.isJoined) { if (!this.joinPolling) { this.joinPolling = new (this.getNpawReference()).Timer(this._jointimePolling.bind(this), 500); } this.joinPolling.start(); } } getIsLive() { var ret = null; if (this.player.mediainfo) { ret = true; if (typeof this.player.mediainfo.duration === 'number') { ret = (this.player.mediainfo.duration < 1 || this.player.mediainfo.duration === Infinity); } } if (this.player.duration && (typeof this.player.duration === 'function')) { ret = true; var duration = this.player.duration(); if (typeof duration === 'number') { ret = (duration < 1 || duration === Infinity); } } if (this.player.isLive && this.player.isLive === 'function') { ret = this.player.isLive(); } return ret; } conditionalStop(e) { this.firePlayerLog('conditionalStop', {}); if (this.isInAds()) { return; } if (this.plugin) { this.adsEnded = false; this.fireStop({}, 'conditionalStop'); if (this.plugin && !this.getVideo().options['content.id']) { this.getVideo().options['content.id'] = null; } this.acumBytesFunc(); this.lastPlayhead = undefined; } } getTitle() { if (this.player.mediainfo) { return this.player.mediainfo.name; } else { return this.getVideoJSTitle(); } } getVideoJSTitle() { var ret = null; if (this.player.mediainfo) { ret = this.player.mediainfo.name; } return ret; } getTotalBytes() { var ret = null; var tech = this.getUsedTech(); if (tech && tech.getTotalBytes) { ret = tech.getTotalBytes(this); } return ret; } registerListeners() { this.monitorPlayhead(false, false, 1200); this.acumBytes = 0; this.ignoreList = []; this.fatalList = []; this.nonFatalList = []; this.references = { loadstart: this.loadstartListener.bind(this), adsready: this.loadAdsAdapter.bind(this), play: this.playListener.bind(this), timeupdate: this.timeupdateListener.bind(this), pause: this.pauseListener.bind(this), playing: this.playingListener.bind(this), ended: this.conditionalStop.bind(this), dispose: this.disposeListener.bind(this), seeking: this.seekingListener.bind(this), seeked: this.seekedListener.bind(this), error: this.errorListener.bind(this), adserror: this.aderrorListener.bind(this), adsEnded: this.adsEndedListener.bind(this), texttrackchange: this.textListener.bind(this), waiting: this.bufferingListener.bind(this) }; if (this.player) { for (var key in this.references) { this.player.on(key, this.references[key]); } } setTimeout(this.loadAdsAdapter.bind(this), 50); } getResource() { var ret = null; var tech = this.getUsedTech(); if (tech && tech.getResource) { ret = tech.getResource(this); } if (!ret) { ret = this.player.currentSrc(); } return ret; } textListener(e) { if (this.player.textTracks) { var tracks = this.player.textTracks(); var len = tracks.length; for (var i = 0; i < len; ++i) { if (tracks[i] && tracks[i].mode === 'showing') { this.getVideo().options['content.subtitles'] = tracks[i].label || tracks[i].language; } } } } seekingListener(e) { this.firePlayerLog('seekingListener', {}); this.fireSeekBegin({}, false, 'seekingListener'); } disposeListener(e) { this.firePlayerLog('disposeListener', {}); if (this.plugin) { this.getVideo().fireStop({}, 'disposeListener'); this.getVideo().removeAdsAdapter(); this.getVideo().removeAdapter(); } } loadstartListener(e) { this.firePlayerLog('loadstartListener', {}); this.loadAdsAdapter(); } getPlayerName() { var name = this.getVideoJSPlayerName(); if (this.player && this.player.mediainfo) { name += '-bcove'; } return name; } getVideoJSPlayerName() { var name = 'videojs'; if (this.getAdapterClass('contribHlsTech').isUsed(this)) { name += '-hls'; } else if (this.getAdapterClass('hlsJsTech').isUsed(this)) { name += '-hlsjs'; } else if (this.getAdapterClass('shakaTech').isUsed(this)) { name += '-shaka'; } else if (this.getAdapterClass('dashShakaTech').isUsed(this)) { name += '-dash-shaka'; } else if (this.getAdapterClass('dashTech').isUsed(this)) { name += '-dash'; } if (this.player.FreeWheelPlugin) { name += '-fw'; } if (this.player.mediainfo) { name += '-bcove'; } return name; } playingListener(e) { this.firePlayerLog('playingListener', {}); this._startEvent('playingListener'); this.fireResume({}, 'playingListener'); if (this.getPlayhead() < 1) { this.fireSeekEnd({}, 'playingListener'); } this.fireBufferEnd({}, 'playingListener'); } getUsedTech() { var ret = null; if (this.getPlugin().getAdaptersProperties().usedTech) { switch (this.getPlugin().getAdaptersProperties().usedTech.toLowerCase()) { case 'hls': if (this.getAdapterClass('contribHlsTech').isUsed(this)) { ret = this.getAdapterClass('contribHlsTech'); } break; case 'hlsjs': if (this.getAdapterClass('hlsJsTech').isUsed(this)) { ret = this.getAdapterClass('hlsJsTech'); } break; case 'shaka': if (this.getAdapterClass('shakaTech').isUsed(this)) { ret = this.getAdapterClass('shakaTech'); } break; case 'dashshaka': if (this.getAdapterClass('dashShakaTech').isUsed(this)) { ret = this.getAdapterClass('dashShakaTech'); } break; case 'dash': if (this.getAdapterClass('dashTech').isUsed(this)) { ret = this.getAdapterClass('dashTech'); } break; } if (ret != null) { return ret; } } if (this.getAdapterClass('contribHlsTech').isUsed(this)) { ret = this.getAdapterClass('contribHlsTech'); } else if (this.getAdapterClass('hlsJsTech').isUsed(this)) { ret = this.getAdapterClass('hlsJsTech'); } else if (this.getAdapterClass('shakaTech').isUsed(this)) { ret = this.getAdapterClass('shakaTech'); } else if (this.getAdapterClass('dashShakaTech').isUsed(this)) { ret = this.getAdapterClass('dashShakaTech'); } else if (this.getAdapterClass('dashTech').isUsed(this)) { ret = this.getAdapterClass('dashTech'); } return ret; } errorListener(e) { this.firePlayerLog('errorListener', {}); var ignore = false; var fatal = false; var code = null; var msg = null; if (code !== null) { if (this.ignoreList.includes(code)) { ignore = true; } if (!fatal && this.fatalList.includes(code)) { fatal = true; } else if (fatal && this.nonFatalList.includes(code)) { fatal = false; } } if (!ignore) { if (fatal) { this.fireFatalError(code, msg, undefined, undefined, 'errorListener'); this.acumBytesFunc(); this.lastPlayhead = undefined; this.crashed = true; } else { this.fireError(code, msg, undefined, undefined, 'errorListener'); } } } }