diff --git a/src/common/utils/external-stream-redirect-helper.js b/src/common/utils/external-stream-redirect-helper.js index aab5ee6f6..5eb93da41 100644 --- a/src/common/utils/external-stream-redirect-helper.js +++ b/src/common/utils/external-stream-redirect-helper.js @@ -1,5 +1,4 @@ // @flow -import {Utils} from '@playkit-js/playkit-js'; /** * JSONP handler function, returns the direct manifest uri. @@ -36,26 +35,4 @@ function getDirectManifestUri(data: Object, uri: string): string { } return uri; } - -/** - * Add external stream redirect configuration to the general config. - * @private - * @param {KPOptionsObject} options - kaltura player options. - * @returns {void} - */ -function configureExternalStreamRedirect(options: KPOptionsObject): void { - let sourceOptions = Utils.Object.getPropertyPath(options, 'sources.options'); - if (!sourceOptions) { - Utils.Object.mergeDeep(options, { - sources: { - options: {} - } - }); - sourceOptions = options.sources && options.sources.options; - } - if (sourceOptions && typeof sourceOptions.redirectExternalStreamsHandler !== 'function') { - sourceOptions.redirectExternalStreamsHandler = getDirectManifestUri; - } -} - -export {configureExternalStreamRedirect}; +export {getDirectManifestUri}; diff --git a/src/common/utils/setup-helpers.js b/src/common/utils/setup-helpers.js index 1d10500d7..943074421 100644 --- a/src/common/utils/setup-helpers.js +++ b/src/common/utils/setup-helpers.js @@ -15,7 +15,6 @@ import { } from '@playkit-js/playkit-js'; import {ValidationErrorType} from './validation-error'; import StorageManager from '../storage/storage-manager'; -import {configureExternalStreamRedirect} from './external-stream-redirect-helper'; import {RemotePlayerManager} from '../cast/remote-player-manager'; import {RemoteControl} from '../cast/remote-control'; import {KalturaPlayer} from '../../kaltura-player'; @@ -299,7 +298,6 @@ function getDefaultOptions(options: PartialKPOptionsObject): KPOptionsObject { configureIMADefaultOptions(defaultOptions); configureDAIDefaultOptions(defaultOptions); configureBumperDefaultOptions(defaultOptions); - configureExternalStreamRedirect(defaultOptions); maybeSetFullScreenConfig(defaultOptions); maybeSetCapabilitiesForIos(defaultOptions); return defaultOptions; diff --git a/src/kaltura-player.js b/src/kaltura-player.js index 0990df6a9..6a7abff1c 100644 --- a/src/kaltura-player.js +++ b/src/kaltura-player.js @@ -16,6 +16,7 @@ import {RemoteSession} from './common/cast/remote-session'; import {ControllerProvider, AdsController} from './common/controllers'; import {BasePlugin} from './common/plugins'; import {PluginManager} from './common/plugins'; +import {getDefaultRedirectOptions} from 'player-defaults'; import { Error, EventManager, @@ -106,6 +107,7 @@ class KalturaPlayer extends FakeEventTarget { } mediaConfig.sources = Utils.Object.mergeDeep(mediaConfig.sources, mediaOptions); } + this.configure(getDefaultRedirectOptions(this.config, mediaConfig)); this.setMedia(mediaConfig); }, e => diff --git a/src/ott/player-defaults.js b/src/ott/player-defaults.js index 05bea3563..81d94f2f8 100644 --- a/src/ott/player-defaults.js +++ b/src/ott/player-defaults.js @@ -27,3 +27,12 @@ export function setDefaultAnalyticsPlugin(options: KPOptionsObject): void { }); } } + +/** + * get the default config for forcing external stream redirect. + * @public + * @returns {Object} - config object + */ +export function getDefaultRedirectOptions(): Object { + return {}; +} diff --git a/src/ovp/player-defaults.js b/src/ovp/player-defaults.js index a80a55efa..76170a85c 100644 --- a/src/ovp/player-defaults.js +++ b/src/ovp/player-defaults.js @@ -1,5 +1,6 @@ // @flow -import {Utils} from '@playkit-js/playkit-js'; +import {Env, Utils, MediaType} from '@playkit-js/playkit-js'; +import {getDirectManifestUri} from '../common/utils/external-stream-redirect-helper'; /** * Sets the default analytics plugin for the ovp player. @@ -17,3 +18,39 @@ export function setDefaultAnalyticsPlugin(options: KPOptionsObject): void { }); } } + +/** + * get the default config for forcing external stream redirect. + * @public + * @param {KPOptionsObject} playerOptions - The player config. + * @param {KPOptionsObject} mediaOptions - The media config. + * @returns {Object} - config object + */ +export function getDefaultRedirectOptions(playerOptions: KPOptionsObject, mediaOptions: KPOptionsObject = {}): Object { + const configObj = {}; + if (mediaOptions.sources && mediaOptions.sources.type === MediaType.LIVE && (Env.browser.name === 'IE' || Env.device.model === 'Chromecast')) { + const playerForceRedirectExternalStreams = Utils.Object.getPropertyPath(playerOptions, 'sources.options.forceRedirectExternalStreams'); + const mediaForceRedirectExternalStreams = Utils.Object.getPropertyPath(mediaOptions, 'sources.options.forceRedirectExternalStreams'); + if (typeof playerForceRedirectExternalStreams !== 'boolean' && typeof mediaForceRedirectExternalStreams !== 'boolean') { + Utils.Object.mergeDeep(configObj, { + sources: { + options: { + forceRedirectExternalStreams: true + } + } + }); + } + } + const playerRedirectExternalStreamsHandler = Utils.Object.getPropertyPath(playerOptions, 'sources.options.redirectExternalStreamsHandler'); + const mediaRedirectExternalStreamsHandler = Utils.Object.getPropertyPath(mediaOptions, 'sources.options.redirectExternalStreamsHandler'); + if (typeof playerRedirectExternalStreamsHandler !== 'function' && typeof mediaRedirectExternalStreamsHandler !== 'function') { + Utils.Object.mergeDeep(configObj, { + sources: { + options: { + redirectExternalStreamsHandler: getDirectManifestUri + } + } + }); + } + return configObj; +} diff --git a/test/src/ovp/player-defaults.spec.js b/test/src/ovp/player-defaults.spec.js new file mode 100644 index 000000000..cd6fc8901 --- /dev/null +++ b/test/src/ovp/player-defaults.spec.js @@ -0,0 +1,84 @@ +import {getDefaultRedirectOptions} from './../../../src/ovp/player-defaults'; +import {Env, MediaType} from '@playkit-js/playkit-js'; + +describe('getDefaultRedirectOptions', function () { + let sandbox; + beforeEach(function () { + sandbox = sinon.createSandbox(); + }); + + afterEach(function () { + sandbox.restore(); + }); + describe('forceRedirectExternalStreams', function () { + it('should return void for vod on ie11', function () { + sandbox.stub(Env, 'browser').get(() => ({name: 'IE'})); + const defaultConfig = getDefaultRedirectOptions({}, {sources: {type: MediaType.VOD}}); + (defaultConfig.sources.options.forceRedirectExternalStreams === undefined).should.be.true; + }); + + it('should return void for vod on chromecast', function () { + sandbox.stub(Env, 'device').get(() => ({model: 'Chromecast'})); + const defaultConfig = getDefaultRedirectOptions({}, {sources: {type: MediaType.VOD}}); + (defaultConfig.sources.options.forceRedirectExternalStreams === undefined).should.be.true; + }); + + it('should return void for live chrome', function () { + const defaultConfig = getDefaultRedirectOptions({}, {sources: {type: MediaType.LIVE}}); + (defaultConfig.sources.options.forceRedirectExternalStreams === undefined).should.be.true; + }); + + it('should return true for live on ie11', function () { + sandbox.stub(Env, 'browser').get(() => ({name: 'IE'})); + const defaultConfig = getDefaultRedirectOptions({}, {sources: {type: MediaType.LIVE}}); + defaultConfig.sources.options.forceRedirectExternalStreams.should.be.true; + }); + + it('should return true for live on chromecast', function () { + sandbox.stub(Env, 'device').get(() => ({model: 'Chromecast'})); + const defaultConfig = getDefaultRedirectOptions({}, {sources: {type: MediaType.LIVE}}); + defaultConfig.sources.options.forceRedirectExternalStreams.should.be.true; + }); + + it('should return void for live on ie11 if already configured on player config', function () { + sandbox.stub(Env, 'browser').get(() => ({name: 'IE'})); + const defaultConfig = getDefaultRedirectOptions({sources: {options: {forceRedirectExternalStreams: false}}}, {sources: {type: MediaType.LIVE}}); + (defaultConfig.sources.options.forceRedirectExternalStreams === undefined).should.be.true; + }); + + it('should return void for live on ie11 if already configured on media config', function () { + sandbox.stub(Env, 'browser').get(() => ({name: 'IE'})); + const defaultConfig = getDefaultRedirectOptions({}, {sources: {type: MediaType.LIVE, options: {forceRedirectExternalStreams: false}}}); + (defaultConfig.sources.options.forceRedirectExternalStreams === undefined).should.be.true; + }); + + it('should return void for live on chromecast if already configured on player config', function () { + sandbox.stub(Env, 'device').get(() => ({model: 'Chromecast'})); + const defaultConfig = getDefaultRedirectOptions({sources: {options: {forceRedirectExternalStreams: false}}}, {sources: {type: MediaType.LIVE}}); + (defaultConfig.sources.options.forceRedirectExternalStreams === undefined).should.be.true; + }); + + it('should return void for live on chromecast if already configured on media config', function () { + sandbox.stub(Env, 'device').get(() => ({model: 'Chromecast'})); + const defaultConfig = getDefaultRedirectOptions({}, {sources: {type: MediaType.LIVE, options: {forceRedirectExternalStreams: false}}}); + (defaultConfig.sources.options.forceRedirectExternalStreams === undefined).should.be.true; + }); + }); + + describe('redirectExternalStreamsHandler', function () { + it('should return the default', function () { + const defaultConfig = getDefaultRedirectOptions({}); + (typeof defaultConfig.sources.options.redirectExternalStreamsHandler === 'function').should.be.true; + }); + + it('should return void if already configured on player config', function () { + const defaultConfig = getDefaultRedirectOptions({sources: {options: {redirectExternalStreamsHandler: () => {}}}}); + (defaultConfig.sources === undefined).should.be.true; + }); + + it('should return void if already configured on media config', function () { + const defaultConfig = getDefaultRedirectOptions({}, {sources: {options: {redirectExternalStreamsHandler: () => {}}}}); + (defaultConfig.sources === undefined).should.be.true; + }); + }); +});