diff --git a/src/common/utils/external-stream-redirect-helper.js b/src/common/utils/external-stream-redirect-helper.js new file mode 100644 index 000000000..e53def7c7 --- /dev/null +++ b/src/common/utils/external-stream-redirect-helper.js @@ -0,0 +1,61 @@ +// @flow +import {Env, Utils} from 'playkit-js' + +/** + * JSONP handler function, returns the direct manifest uri. + * @param {Object} data - The json object that returns from the server. + * @param {string} uri - Original request uri. + * @returns {string} - The direct uri. + */ +function getDirectManifestUri(data: Object, uri: string): string { + const getHostName = uri => { + const parser = document.createElement('a'); + parser.href = uri; + return parser.hostname + }; + // if the json contains one url, it means it is a redirect url. if it contains few urls, it means its the flavours + // so we should use the original url. + const uriHost = getHostName(uri); + const hasOneFlavor = data && data.flavors && (data.flavors.length === 1); + const flavorUriHost = hasOneFlavor && getHostName(data.flavors[0].url); + if (hasOneFlavor && (uriHost !== flavorUriHost)) { + return data.flavors[0].url; + } + return uri; +} + +/** + * Whether we should use our JSONP http plugin. + * @returns {boolean} - Should use external stream requests redirect on manifests. + */ +function shouldUseExternalStreamRedirect(): boolean { + const affectedBrowsers = ['IE', 'Edge']; + const affectedVendors = ['panasonic']; + return (affectedBrowsers.includes(Env.browser.name) || + (Env.device && affectedVendors.includes(Env.device.vendor))); +} + +/** + * Add JSONP configuration to the general config. + * @param {Object} config - Configuration relevant to JSONP. + * @returns {void} + */ +function configureExternalStreamRedirect(config: Object): void { + let sourceOptions = Utils.Object.getPropertyPath(config, 'sources.options'); + if (!sourceOptions) { + Utils.Object.mergeDeep(config, { + sources: { + options: {} + } + }); + sourceOptions = config.sources.options; + } + if (typeof sourceOptions.forceRedirectExternalStreams !== "boolean") { + sourceOptions.forceRedirectExternalStreams = shouldUseExternalStreamRedirect(); + } + if (typeof sourceOptions.redirectExternalStreamsHandler !== "function") { + sourceOptions.redirectExternalStreamsHandler = getDirectManifestUri; + } +} + +export {configureExternalStreamRedirect}; diff --git a/src/common/utils/setup-helpers.js b/src/common/utils/setup-helpers.js index 88711d448..69796a815 100644 --- a/src/common/utils/setup-helpers.js +++ b/src/common/utils/setup-helpers.js @@ -7,6 +7,7 @@ import StorageManager from '../storage/storage-manager' import {setLogLevel as _setLogLevel, LogLevel} from './logger' import type {LogLevelObject} from './logger' import {DEFAULT_THUMBS_SLICES, DEFAULT_THUMBS_WIDTH, getThumbSlicesUrl} from './thumbs' +import {configureExternalStreamRedirect} from './external-stream-redirect-helper' const CONTAINER_CLASS_NAME: string = 'kaltura-player-container'; const KALTURA_PLAYER_DEBUG_QS: string = 'debugKalturaPlayer'; @@ -239,6 +240,7 @@ function getDefaultOptions(options: PartialKalturaPlayerOptionsObject): KalturaP checkNativeHlsSupport(defaultOptions.player); checkNativeTextTracksSupport(defaultOptions.player); setDefaultAnalyticsPlugin(defaultOptions.player); + configureExternalStreamRedirect(defaultOptions.player); return defaultOptions; } diff --git a/src/kaltura-player.js b/src/kaltura-player.js index b33234f2a..09b84e759 100644 --- a/src/kaltura-player.js +++ b/src/kaltura-player.js @@ -4,12 +4,7 @@ import {UIManager} from 'playkit-js-ui' import {Provider} from 'playkit-js-providers' import getLogger from './common/utils/logger' import {addKalturaParams} from './common/utils/kaltura-params' -import { - addKalturaPoster, - setUISeekbarConfig, - setUITouchConfig, - setUIErrorOverlayConfig -} from './common/utils/setup-helpers' +import {addKalturaPoster, setUISeekbarConfig, setUIErrorOverlayConfig} from './common/utils/setup-helpers' import {evaluatePluginsConfig} from './common/plugins/plugins-config' import './assets/style.css'