Skip to content

Commit

Permalink
fix(FEC-7815): Support playManifest redirects for external streams (#85)
Browse files Browse the repository at this point in the history
  • Loading branch information
odedhutzler authored and Dan Ziv committed Mar 6, 2018
1 parent ca2550c commit cac2bb6
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 6 deletions.
61 changes: 61 additions & 0 deletions src/common/utils/external-stream-redirect-helper.js
Original file line number Diff line number Diff line change
@@ -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};
2 changes: 2 additions & 0 deletions src/common/utils/setup-helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -239,6 +240,7 @@ function getDefaultOptions(options: PartialKalturaPlayerOptionsObject): KalturaP
checkNativeHlsSupport(defaultOptions.player);
checkNativeTextTracksSupport(defaultOptions.player);
setDefaultAnalyticsPlugin(defaultOptions.player);
configureExternalStreamRedirect(defaultOptions.player);
return defaultOptions;
}

Expand Down
7 changes: 1 addition & 6 deletions src/kaltura-player.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'

Expand Down

0 comments on commit cac2bb6

Please sign in to comment.