@playkit-js/playkit-js-providers 2.39.4-canary.0-01cf5d8 → 2.39.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["./providers/webpack/universalModuleDefinition","./providers/webpack/bootstrap","./providers/./util/error/error.js","./providers/./util/error/severity.js","./providers/./util/error/category.js","./providers/./util/error/code.js","./providers/./entities/media-entry.js","./providers/./util/logger.js","./providers/./util/request-builder.js","./providers/./k-provider/common/base-service-result.js","./providers/./entities/media-format.js","./providers/./k-provider/common/response-types/kaltura-drm-playback-plugin-data.js","./providers/./k-provider/common/response-types/kaltura-access-control-message.js","./providers/./entities/media-sources.js","./providers/./entities/media-source.js","./providers/./k-provider/common/data-loader-manager.js","./providers/./k-provider/common/multi-request-builder.js","./providers/./entities/drm.js","./providers/./entities/image-source.js","./providers/./k-provider/common/base-provider.js","./providers/./util/clone.js","./providers/./entities/entry-list.js","./providers/./entities/bumper.js","./providers/./k-provider/ovp/config.js","./providers/./k-provider/ovp/response-types/kaltura-playback-source.js","./providers/./k-provider/ovp/response-types/kaltura-rule-action.js","./providers/./k-provider/ovp/response-types/kaltura-access-control-modify-request-host-regex-action.js","./providers/./k-provider/ovp/response-types/kaltura-flavor-asset.js","./providers/./k-provider/ovp/response-types/kaltura-bumper.js","./providers/./k-provider/ovp/response-types/kaltura-playback-context.js","./providers/./k-provider/ovp/response-types/kaltura-metadata.js","./providers/./k-provider/ovp/response-types/kaltura-metadata-list-response.js","./providers/./k-provider/ovp/response-types/kaltura-media-entry.js","./providers/./k-provider/ovp/play-source-url-builder.js","./providers/./util/xml-parser.js","./providers/./entities/playlist.js","./providers/./k-provider/ovp/external-captions-builder.js","./providers/./k-provider/ovp/provider-parser.js","./providers/./k-provider/ovp/services/ovp-service.js","./providers/./k-provider/ovp/request-params/base-entry-response-profile.js","./providers/./k-provider/ovp/services/base-entry-service.js","./providers/./k-provider/ovp/services/meta-data-service.js","./providers/./k-provider/ovp/response-types/kaltura-base-entry-list-response.js","./providers/./k-provider/ovp/loaders/media-entry-loader.js","./providers/./k-provider/ovp/services/session-service.js","./providers/./k-provider/ovp/loaders/session-loader.js","./providers/./k-provider/ovp/loaders/data-loader-manager.js","./providers/./k-provider/ovp/services/playlist-service.js","./providers/./k-provider/ovp/response-types/kaltura-playlist.js","./providers/./k-provider/ovp/response-types/kaltura-media-entries.js","./providers/./k-provider/ovp/loaders/playlist-loader.js","./providers/./k-provider/ovp/loaders/entry-list-loader.js","./providers/./k-provider/ovp/response-types/kaltura-ui-conf-response.js","./providers/./k-provider/ovp/regex-action-handler.js","./providers/./k-provider/ovp/provider.js","./providers/./k-provider/ovp/index.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Error","severity","category","code","data","this","_logger","error","RECOVERABLE","CRITICAL","NETWORK","SERVICE","PROVIDER","UNSUPPORTED_SCHEME","BAD_HTTP_STATUS","HTTP_ERROR","TIMEOUT","MALFORMED_DATA_URI","BAD_SERVER_RESPONSE","MULTIREQUEST_API_ERROR","API_RESPONSE_MISMATCH","ERROR","BLOCK_ACTION","MEDIA_STATUS_NOT_READY","MISSING_MANDATORY_PARAMS","MISSING_PLAY_SOURCE","METHOD_NOT_IMPLEMENTED","getLogger","MediaEntry","metadata","Map","sources","MediaSources","type","Type","UNKNOWN","toJSON","id","duration","dvrStatus","status","poster","assetReferenceType","VOD","LIVE","IMAGE","AUDIO","ON","OFF","JsLogger","VERSION","DEBUG","INFO","TIME","TRACE","WARN","createDefaultHandler","debug","enabledFor","getLevel","info","log","setHandler","setLevel","time","timeEnd","trace","useDefaults","warn","LogLevel","setLogger","logger","getLogLevel","setLogLevel","level","RequestBuilder","headers","async","timeout","maxAttempts","getUrl","serviceUrl","service","action","doHttpRequest","promise","Promise","resolve","reject","_requestPromise","url","Severity","Category","Code","_createXHR","request","XMLHttpRequest","onreadystatechange","readyState","response","JSON","parse","responseText","responseHeaders","_getResponseHeaders","_createError","text","open","method","retryConfig","requestTime","performance","now","ontimeout","_handleError","statusText","onerror","onabort","forEach","setRequestHeader","send","params","getAllResponseHeaders","split","filter","header","toLowerCase","indexOf","_attemptCounter","assign","attempt","ServiceResult","objectType","hasError","ServiceError","message","MediaFormat","DASH","mimeType","pathExt","HLS","WVM","MP4","MP3","SupportedStreamFormat","isProgressiveSource","formatName","sourceFormat","KalturaDrmPlaybackPluginData","drm","scheme","licenseURL","certificate","WIDEVINE_CENC","PLAYREADY_CENC","FAIRPLAY","KalturaAccessControlMessage","progressive","dash","hls","image","map","source","mediaFormat","push","h","MediaSource","mimetype","bandwidth","width","height","label","drmData","length","Array","isArray","DataLoaderManager","networkRetryConfig","_networkRetryConfig","add","loader","ks","execution_loader","isValid","_loaders","set","startIndex","_multiRequest","requests","executionLoaderResponseMap","from","val","index","_loadersResponseMap","fetchData","requestsMustSucceed","execute","then","_multiResponse","prepareData","success","err","loaderDataIndexes","results","slice","MultiRequestBuilder","requestParams","serviceDef","stringify","FAILED_PARSING_REQUEST","multiRequestResult","MultiRequestResult","result","errorResults","serviceResult","Drm","licenseUrl","ImageSource","entry","extractBaseThumbnailUrl","dataUrl","match","BaseProvider","options","playerVersion","_partnerId","partnerId","_widgetId","widgetId","_uiConfId","uiConfId","_isAnonymous","_ks","_playerVersion","defaultWidgetId","getMediaConfig","mediaInfo","getPlaylistConfig","playlistInfo","getEntryListConfig","entryListInfo","_verifyHasSources","concat","messages","clone","node","e","keys","EntryList","items","Bumper","clickThroughUrl","defaultConfig","cdnUrl","serviceParams","apiVersion","format","useApiCaptions","loadThumbnailWithKs","replaceHostOnlyManifestUrls","OVPConfiguration","clientConfig","KalturaPlaybackSource","deliveryProfileId","protocols","flavorIds","hasDrmData","hasFlavorIds","getProtocol","protocol","returnValue","KalturaRuleAction","DRM_POLICY","BLOCK","PREVIEW","LIMIT_FLAVORS","ADD_TO_STORAGE","LIMIT_DELIVERY_PROFILES","SERVE_FROM_REMOTE_SERVER","REQUEST_HOST_REGEX","LIMIT_THUMBNAIL_CAPTURE","KalturaAccessControlModifyRequestHostRegexAction","pattern","replacement","replacmenServerNodeId","checkAliveTimeoutMs","KalturaFlavorAsset","flavorParamsId","fileExt","bitrate","frameRate","isOriginal","isWeb","containerFormat","videoCodecId","language","QUEUED","CONVERTING","READY","DELETED","NOT_APPLICABLE","TEMP","WAIT_FOR_CONVERT","IMPORTING","VALIDATING","EXPORTING","KalturaBumper","entryId","KalturaPlaybackContext","actions","flavorAssets","flavor","bumperData","bumper","hasBlockAction","undefined","getBlockAction","find","getErrorMessages","getRequestHostRegexAction","KalturaMetadata","metadataProfileId","metadataProfileVersion","metadataObjectType","objectId","version","created","Date","setUTCSeconds","createdAt","updated","updatedAt","xml","AD_CUE_POINT","ANNOTATION","CODE_CUE_POINT","THUMB_CUE_POINT","ENTRY","CATEGORY","USER","PARTNER","DYNAMIC_OBJECT","VALID","INVALID","KalturaMetadataListResponse","responseObj","totalCount","metas","objects","meta","KalturaMediaEntry","referenceId","externalSourceType","description","entryType","mediaType","flavorParamsIds","thumbnailUrl","tags","AUTOMATIC","EXTERNAL_MEDIA","MEDIA_CLIP","MIX","PLAYLIST","DATA","LIVE_STREAM","LIVE_CHANNEL","DOCUMENT","VIDEO","LIVE_STREAM_FLASH","LIVE_STREAM_WINDOWS_MEDIA","LIVE_STREAM_REAL_MEDIA","LIVE_STREAM_QUICK_TIME","ERROR_IMPORTING","ERROR_CONVERTING","SCAN_FAILURE","IMPORT","INFECTED","PRECONVERT","PENDING","MODERATE","BLOCKED","NO_CONTENT","PENDING_MODERATION","APPROVED","REJECTED","FLAGGED_FOR_REVIEW","AUTO_APPROVED","PlaySourceUrlBuilder","build","urlParams","config","serviceUrlOrigin","substr","lastIndexOf","extension","isNaN","Number","parseInt","playUrl","endsWith","XmlParser","xmlToJson","obj","nodeType","attributes","j","attribute","item","nodeName","nodeValue","hasChildNodes","childNodes","old","Playlist","KalturaCaptionType","SRT","DFXP","WEBVTT","CAP","CaptionsFormatsMap","ExternalCaptionsBuilder","createConfig","captions","caption","includes","webVttUrl","addKsToUrl","default","isDefault","languageCode","OVPProviderParser","getMediaEntry","mediaEntryResponse","mediaEntry","playbackContext","playBackContextResult","metadataList","metadataListResult","kalturaSources","_getParsedSources","_fillBaseData","playbackCaptions","ksParam","replace","getPlaylist","playlistResponse","playlist","playlistData","playlistItems","entries","getEntryList","entryList","getBumper","assetResponse","progressiveBumper","parsedSources","_parseProgressiveSources","_parseMetadata","_getEntryType","entryTypeEnum","typeEnum","MediaType","EntryType","progressiveSource","mediaSource","addAdaptiveSource","parsedSource","_parseAdaptiveSource","_getBaseProtocol","kalturaSource","drmParams","Scheme","videoSources","audioSources","sourceId","metaXml","domParser","DOMParser","parseFromString","metasObj","exec","document","location","OVPService","getMultiRequest","ovpParams","clientTag","multiReq","BaseEntryResponseProfile","responseProfile","INCLUDE_FIELDS","fields","EXCLUDE_FIELDS","OVPBaseEntryService","getPlaybackContext","serviceEntryId","tag","contextDataParams","flavorTags","list","redirectFromEntryId","getEntryListReqParams","filterParams","idEqual","referenceIdEqual","OVPMetadataService","objectIdEqual","metadataObjectTypeEqual","KalturaBaseEntryListResponse","OVPMediaEntryLoader","buildRequests","_entryId","_referenceId","_requests","_response","OVPSessionService","anonymousSession","OVPSessionLoader","OVPDataLoaderManager","OVPPlaylistService","playlistId","SERVICE_NAME","KalturaPlaylist","KalturaMediaEntries","OVPPlaylistLoader","_playlistId","OVPEntryListLoader","_entries","KalturaUIConfResponse","objTypeAsString","htmlParams","swfUrl","confFilePath","confFile","confFileFeatures","confVars","useCdn","swfUrlVersion","html5Url","partnerTags","objType","creationMode","PLAYER","CONTRIBUTION_WIZARD","SIMPLE_EDITOR","ADVANCED_EDITOR","APP_STUDIO","KRECORD","PLAYER_V3","KMC_ACCOUNT","KMC_ANALYTICS","KMC_CONTENT","KMC_DASHBOARD","KMC_LOGIN","PLAYER_SL","CLIENTSIDE_ENCODER","KMC_GENERAL","KMC_ROLES_AND_PERMISSIONS","CLIPPER","KSR","KUPLOAD","WEBCASTING","WIZARD","ADVANCED","RegexActionHandler","_applyRegexAction","regexAction","regex","RegExp","_isECDNUrlAlive","urlPing","req","handleRegexAction","mediaConfig","rawResponse","_extractRegexActionFromData","regExp","_getRegExp","_replaceHostUrls","src","OVPProvider","env","_setFilterOptionsConfig","filterOptions","networkRetryParameters","_dataLoader","_getEntryRedirectFilter","_parseDataFromResponse","doRequest","loaders","theKs","dataLoader","loaderRequest","_filterOptionsConfig","session","isAnonymous","_getDefaultSourcesObject","plugins","has","sessionLoader","mediaLoader","_getSourcesObject","_verifyMediaStatus","EntryStatus","_parsePlaylistDataFromResponse","playlistConfig","_getPlaylistObject","playlistLoader","_parseEntryListDataFromResponse","dvr","vr","sourcesObject","mediaSources","NAME","__NAME__","__VERSION__"],"mappings":"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","file":"playkit-ovp-provider.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ovp\"] = factory();\n\telse\n\t\troot[\"playkit\"] = root[\"playkit\"] || {}, root[\"playkit\"][\"providers\"] = root[\"playkit\"][\"providers\"] || {}, root[\"playkit\"][\"providers\"][\"ovp\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 18);\n","//@flow\nimport getLogger from '../logger';\nimport {Severity} from './severity';\nimport type {SeverityType} from './severity';\nimport {Code} from './code';\nimport type {CodeType} from './code';\nimport {Category} from './category';\nimport type {CategoryType} from './category';\n\nconst CLASS_NAME: string = 'Error';\n\n/**\n * @classdesc This is a description of the error class.\n */\nexport default class Error {\n severity: number;\n category: number;\n code: number;\n data: any;\n /**\n * @enum {number}\n */\n static Severity: SeverityType = Severity;\n /**\n * @enum {number}\n */\n static Category: CategoryType = Category;\n /**\n * @enum {number}\n */\n static Code: CodeType = Code;\n static _logger: any = getLogger(CLASS_NAME);\n\n /**\n * @constructor\n * @param {number} severity - error's severity\n * @param {number} category - error's category.\n * @param {number} code - error's code.\n * @param {any} data - additional data for the error.\n */\n constructor(severity: number, category: number, code: number, data: any = {}) {\n this.severity = severity;\n this.category = category;\n this.code = code;\n this.data = data;\n Error._logger.error(`Category:${category} | Code:${code} |`, data);\n }\n}\n","//@flow\n\ntype SeverityType = {[severity: string]: number};\n\nconst Severity: SeverityType = {\n /**\n * An error occurred, but the Player is attempting to recover from the error.\n *\n * If the Player cannot ultimately recover, it still may not throw a CRITICAL\n * error. For example, retrying for a media segment will never result in\n * a CRITICAL error (the Player will just retry forever).\n */\n RECOVERABLE: 1,\n /**\n * A critical error that the library cannot recover from. These usually cause\n * the Player to stop loading or updating. A new manifest must be loaded\n * to reset the library.\n */\n CRITICAL: 2\n};\n\nexport {Severity};\nexport type {SeverityType};\n","//@flow\ntype CategoryType = {[category: string]: number};\n\nconst Category: CategoryType = {\n /** Errors from the network stack. */\n NETWORK: 1,\n SERVICE: 2,\n PROVIDER: 3\n};\n\nexport {Category};\nexport type {CategoryType};\n","//@flow\n\ntype CodeType = {[code: string]: number};\n\nconst Code: CodeType = {\n /**\n * A network request was made using an unsupported URI scheme.\n */\n UNSUPPORTED_SCHEME: 1000,\n\n /**\n * An HTTP network request returned an HTTP status that indicated a failure.\n */\n BAD_HTTP_STATUS: 1001,\n\n /**\n * An HTTP network request failed with an error, but not from the server.\n */\n HTTP_ERROR: 1002,\n\n /**\n * A network request timed out.\n */\n TIMEOUT: 1003,\n\n /**\n * A network request was made with a malformed data URI.\n */\n MALFORMED_DATA_URI: 1004,\n\n /**\n * The server responsded with 2xx response, but it couldn't be parsed\n */\n BAD_SERVER_RESPONSE: 1005,\n\n /**\n * The server response had a valid structure but contained an error from the API\n */\n MULTIREQUEST_API_ERROR: 1006,\n\n /**\n * The server response had a valid structure and valid API result, but it did not match the request\n */\n API_RESPONSE_MISMATCH: 1007,\n\n /**\n * The server responded with an error\n */\n ERROR: 2000,\n\n /**\n * The server responded with a block action\n */\n BLOCK_ACTION: 2001,\n\n /**\n * The server responded with status import or pre convert\n */\n MEDIA_STATUS_NOT_READY: 2002,\n\n /**\n * The provider is missing mandatory parameter/s\n */\n\n MISSING_MANDATORY_PARAMS: 3000,\n\n /**\n * The server responded with empty sources objects (for HLS, Dash and progressive)\n */\n MISSING_PLAY_SOURCE: 3001,\n\n /**\n * The provider doesn't implement the called api\n */\n METHOD_NOT_IMPLEMENTED: 3002\n};\n\nexport {Code};\nexport type {CodeType};\n","//@flow\nimport MediaSources from './media-sources';\n\nexport default class MediaEntry {\n static Type: {[type: string]: string} = {\n VOD: 'Vod',\n LIVE: 'Live',\n IMAGE: 'Image',\n AUDIO: 'Audio',\n UNKNOWN: 'Unknown'\n };\n static DvrStatus: {[type: string]: number} = {\n ON: 1,\n OFF: 0\n };\n\n /**\n * @member - entry id\n * @type {string}\n */\n id: string;\n /**\n * @member - entry name\n * @type {string}\n */\n name: string;\n /**\n * @member - entry sources\n * @type {MediaSources}\n */\n sources: MediaSources;\n /**\n * @member - entry duration\n * @type {number}\n */\n duration: number;\n /**\n * @member - entry type\n * @type {string}\n */\n type: string;\n /**\n * @member - entry metadata\n * @type {Object}\n */\n metadata: Object;\n /**\n * @member - DVR status\n * @type {number}\n */\n dvrStatus: number;\n /**\n * @member - media status\n * @type {number}\n */\n status: number;\n /**\n * @member - media poster\n * @type {string | Array<Object>}\n */\n poster: string | Array<Object>;\n\n /**\n * @member - assetReferenceType\n * @type {string }\n */\n assetReferenceType: string;\n\n /**\n * @constructor\n */\n constructor() {\n this.metadata = new Map();\n this.sources = new MediaSources();\n this.type = MediaEntry.Type.UNKNOWN;\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaEntryObject} - The json class object.\n */\n toJSON(): ProviderMediaEntryObject {\n return {\n id: this.id,\n name: this.name,\n sources: this.sources.toJSON(),\n duration: this.duration,\n dvrStatus: this.dvrStatus,\n status: this.status,\n metadata: this.metadata,\n type: this.type,\n poster: this.poster,\n assetReferenceType: this.assetReferenceType\n };\n }\n}\n","//@flow\nexport type LogLevelObject = {value: number, name: string};\nexport type LogLevelType = {[level: string]: LogLevelObject};\nexport type loggerFunctionType = {\n VERSION: String,\n DEBUG: LogLevelObject,\n ERROR: LogLevelObject,\n INFO: LogLevelObject,\n OFF: LogLevelObject,\n TIME: LogLevelObject,\n TRACE: LogLevelObject,\n WARN: LogLevelObject,\n createDefaultHandler: Function,\n debug: Function,\n enabledFor: Function,\n error: Function,\n get: Function,\n getLevel: Function,\n info: Function,\n log: Function,\n setHandler: Function,\n setLevel: Function,\n time: Function,\n timeEnd: Function,\n trace: Function,\n useDefaults: Function,\n warn: Function\n};\n\nexport type LoggerType = {\n getLogger: loggerFunctionType,\n LogLevel: LogLevelType\n};\n\nlet JsLogger = {\n get: () => ({\n VERSION: '',\n DEBUG: {value: '', name: ''},\n ERROR: {value: '', name: ''},\n INFO: {value: '', name: ''},\n OFF: {value: '', name: ''},\n TIME: {value: '', name: ''},\n TRACE: {value: '', name: ''},\n WARN: {value: '', name: ''},\n createDefaultHandler: () => {},\n debug: () => {},\n enabledFor: () => {},\n error: () => {},\n get: () => {},\n getLevel: () => {},\n info: () => {},\n log: () => {},\n setHandler: () => {},\n setLevel: () => {},\n time: () => {},\n timeEnd: () => {},\n trace: () => {},\n useDefaults: () => {},\n warn: () => {}\n })\n};\n\nlet LogLevel: LogLevelType = {};\n/**\n * set logger\n * @param {LoggerType} logger - the logger\n * @returns {void}\n */\nfunction setLogger(logger: ?LoggerType): void {\n if (logger && typeof logger.getLogger === 'function') {\n JsLogger.get = logger.getLogger;\n }\n if (logger && logger.LogLevel) {\n LogLevel = logger.LogLevel;\n }\n}\n\n/**\n * get a logger\n * @param {?string} name - the logger name\n * @returns {Object} - the logger class\n */\nfunction getLogger(name?: string): Object {\n //$FlowFixMe\n return JsLogger.get(name);\n}\n\n/**\n * get the log level\n * @param {?string} name - the logger name\n * @returns {LogLevelObject} - the log level\n */\nfunction getLogLevel(name?: string): LogLevelObject {\n return getLogger(name).getLevel();\n}\n\n/**\n * sets the logger level\n * @param {LogLevelObject} level - the log level\n * @param {?string} name - the logger name\n * @returns {void}\n */\nfunction setLogLevel(level: LogLevelObject, name?: string): void {\n getLogger(name).setLevel(level);\n}\n\nexport default getLogger;\nexport {getLogLevel, setLogLevel, setLogger, LogLevel};\n","//@flow\nimport Error from './error/error';\n\nconst KALTURA_HEADER_PREFIX: string = 'x-';\n\nexport default class RequestBuilder {\n /**\n * @member - Service name\n * @type {string}\n */\n service: string;\n /**\n * @member - Service action\n * @type {string}\n */\n action: string;\n /**\n * @member - Service params\n * @type {any}\n */\n params: any;\n /**\n * @memberof - Service headers\n * @type {Map<string, string>}\n */\n headers: Map<string, string>;\n /**\n * @memberof - Service URL\n * @type {string}\n */\n url: string;\n /**\n * @memberof - Service method (POST,GET,DELETE etc..)\n * @type {string}\n */\n method: string;\n /**\n * @memberof - Service tag\n * @type {string}\n */\n tag: string;\n /**\n * @memberof - the response headers of the arra\n * @type {Array<string>}\n */\n responseHeaders: Array<string>;\n /**\n * @description network retry configuration\n * @memberof RequestBuilder\n * @type {ProviderNetworkRetryParameters}\n */\n retryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n /**\n * @description number of xhr attempts for the same multi - request.\n * @memberof RequestBuilder\n * @type {number}\n * @private\n */\n _attemptCounter: number = 1;\n\n /**\n * @description hold the promise result of the XHR request(s) - if all tries fails, it rejects with the error.\n * @memberof RequestBuilder\n * @type {Object}\n * @private\n */\n _requestPromise: Object;\n\n /**\n * @constructor\n * @param {Map<string, string>} headers The request headers\n */\n constructor(headers: Map<string, string> = new Map()) {\n this.headers = headers;\n }\n\n /**\n * Builds restful service URL\n * @function getUrl\n * @param {string} serviceUrl - The service base URL\n * @returns {string} The service URL\n */\n getUrl(serviceUrl: string): string {\n return serviceUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : '');\n }\n\n /**\n * Executes service\n * @function doHttpRequest\n * @returns {Promise.<any>} Service response as promise\n */\n doHttpRequest(): Promise<any> {\n const promise = new Promise((resolve, reject) => {\n this._requestPromise = {\n resolve,\n reject\n };\n });\n if (!this.url) {\n this._requestPromise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MALFORMED_DATA_URI, {\n url: this.url\n })\n );\n }\n this._createXHR();\n return promise;\n }\n\n _createXHR(): void {\n let request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n try {\n const response = JSON.parse(request.responseText);\n this.responseHeaders = this._getResponseHeaders(request);\n // the promise returns the response for backwards compatibility\n return this._requestPromise.resolve(response);\n } catch (error) {\n this._requestPromise.reject(\n this._createError(request, Error.Code.BAD_SERVER_RESPONSE, {\n text: request.responseText\n })\n );\n }\n }\n }\n };\n request.open(this.method, this.url, this.retryConfig.async);\n if (this.retryConfig.async && this.retryConfig.timeout) {\n request.timeout = this.retryConfig.timeout;\n }\n const requestTime = performance.now();\n request.ontimeout = () => {\n this._handleError(request, Error.Code.TIMEOUT, {\n timeout: (performance.now() - requestTime) / 1000,\n statusText: request.statusText\n });\n };\n request.onerror = request.onabort = () => {\n this._handleError(request, Error.Code.HTTP_ERROR, {\n text: request.responseText,\n statusText: request.statusText\n });\n };\n this.headers.forEach((value, key) => {\n request.setRequestHeader(key, value);\n });\n request.send(this.params);\n }\n\n _getResponseHeaders(request: XMLHttpRequest): Array<string> {\n return request\n .getAllResponseHeaders()\n .split('\\n')\n .filter(header => header.toLowerCase().indexOf(KALTURA_HEADER_PREFIX) === 0);\n }\n\n _handleError(request: XMLHttpRequest, code: number, data: Object): Promise<*> | void {\n const error = this._createError(request, code, data);\n request.onreadystatechange = function () {};\n request.onerror = function () {};\n request.ontimeout = function () {};\n request.onabort = function () {};\n if (this.retryConfig.maxAttempts && this._attemptCounter < this.retryConfig.maxAttempts) {\n this._attemptCounter++;\n this._createXHR();\n } else {\n return this._requestPromise.reject(error);\n }\n }\n\n _createError(request: XMLHttpRequest, code: number, data: Object): Error {\n Object.assign(data, {\n url: this.url,\n headers: this._getResponseHeaders(request),\n attempt: this._attemptCounter\n });\n return new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, code, data);\n }\n}\n","//@flow\nexport default class ServiceResult {\n /**\n * @member - Is service returned an error\n * @type {boolean}\n */\n hasError: boolean = false;\n /**\n * @member - The service error\n * @type {ServiceError}\n */\n error: ServiceError;\n /**\n * @member - The service result data\n * @type {Object}\n */\n data: Object;\n\n /**\n * @constructor\n * @param {Object} response - Service response\n */\n constructor(response: Object) {\n if (response.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.code, response.message);\n } else if (response.error && response.error.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.error.code, response.error.message);\n } else {\n this.data = response;\n }\n }\n}\n\nclass ServiceError {\n /**\n * @member - The error code\n * @type {string}\n */\n code: string;\n /**\n * @member - The error message\n * @type {string}\n */\n message: string;\n\n /**\n * @constructor\n * @param {string} code - The result code\n * @param {string} message - The result message\n */\n constructor(code: string, message: string) {\n this.code = code;\n this.message = message;\n }\n}\n","//@flow\nexport const MediaFormat: {[name: string]: ProviderMediaFormatType} = {\n DASH: {\n name: 'dash',\n mimeType: 'application/dash+xml',\n pathExt: 'mpd'\n },\n HLS: {\n name: 'hls',\n mimeType: 'application/x-mpegURL',\n pathExt: 'm3u8'\n },\n WVM: {\n name: 'wvm',\n mimeType: 'video/wvm',\n pathExt: 'wvm'\n },\n MP4: {\n name: 'mp4',\n mimeType: 'video/mp4',\n pathExt: 'mp4'\n },\n MP3: {\n name: 'mp3',\n mimeType: 'audio/mpeg',\n pathExt: 'mp3'\n }\n};\n\nexport const SupportedStreamFormat: Map<string, ProviderMediaFormatType> = new Map([\n ['mpegdash', MediaFormat.DASH],\n ['applehttp', MediaFormat.HLS],\n ['url', MediaFormat.MP4]\n]);\n\n/**\n * returns a boolean whether a source is progressive or not\n * @param {string} formatName - the format name\n * @returns {boolean} - if source is progressive or not\n */\nfunction isProgressiveSource(formatName: string): boolean {\n const sourceFormat = SupportedStreamFormat.get(formatName);\n return !!sourceFormat && sourceFormat.name === MediaFormat.MP4.name;\n}\n\nexport {isProgressiveSource};\n","//@flow\nexport class KalturaDrmPlaybackPluginData {\n static Scheme: {[scheme: string]: string} = {\n 'drm.PLAYREADY_CENC': 'com.microsoft.playready',\n 'drm.WIDEVINE_CENC': 'com.widevine.alpha',\n 'fairplay.FAIRPLAY': 'com.apple.fairplay',\n WIDEVINE_CENC: 'com.widevine.alpha',\n PLAYREADY_CENC: 'com.microsoft.playready',\n FAIRPLAY: 'com.apple.fairplay'\n };\n\n /**\n * @member - The drm scheme\n * @type {string}\n */\n scheme: string;\n\n /**\n * @member - The license URL\n * @type {string}\n */\n licenseURL: string;\n\n /**\n * @member - The drm certificate\n * @type {?string}\n */\n certificate: ?string;\n\n /**\n * @constructor\n * @param {Object} drm The json response\n */\n constructor(drm: any) {\n this.scheme = drm.scheme;\n this.licenseURL = drm.licenseURL;\n this.certificate = drm.certificate;\n }\n}\n","//@flow\nexport class KalturaAccessControlMessage {\n /**\n * @member - The access control message\n * @type {string}\n */\n message: string;\n /**\n * @member - The access control message code\n * @@type {string}\n */\n code: string;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: Object) {\n this.message = data.message;\n this.code = data.code;\n }\n}\n","// @flow\nimport MediaSource from './media-source';\nimport {MediaFormat} from './media-format';\nimport ImageSource from './image-source';\n\nexport default class MediaSources {\n /**\n * Progressive download media sources container.\n * @type {Array<MediaSource>}\n * @public\n */\n progressive: Array<MediaSource>;\n /**\n * Dash media sources container.\n * @type {Array<MediaSource>}\n * @public\n */\n dash: Array<MediaSource>;\n /**\n * Hls media sources container.\n * @type {Array<MediaSource>}\n * @public\n */\n hls: Array<MediaSource>;\n image: Array<ImageSource>;\n captions: Array<PKExternalCaptionObject>;\n\n /**\n * @constructor\n */\n constructor() {\n this.progressive = [];\n this.dash = [];\n this.hls = [];\n this.image = [];\n }\n\n /**\n * Maps the source to one of the containers according to his media format.\n * @param {MediaSource} source - The source to add to one of the containers.\n * @param {MediaFormat} mediaFormat - The media format of the source.\n * @returns {void}\n */\n map(source: MediaSource, mediaFormat: ?ProviderMediaFormatType) {\n if (mediaFormat) {\n switch (mediaFormat.name) {\n case MediaFormat.MP4.name:\n this.progressive.push(source);\n break;\n case MediaFormat.DASH.name:\n this.dash.push(source);\n break;\n case MediaFormat.HLS.name:\n this.hls.push(source);\n break;\n default:\n break;\n }\n }\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaSourcesObject} - The json class object.\n */\n toJSON(): ProviderMediaSourcesObject {\n const response: ProviderMediaSourcesObject = {\n progressive: [],\n dash: [],\n hls: [],\n image: []\n };\n this.progressive.forEach(p => response.progressive.push(p.toJSON()));\n this.hls.forEach(h => response.hls.push(h.toJSON()));\n this.dash.forEach(d => response.dash.push(d.toJSON()));\n response.image = this.image;\n return response;\n }\n}\n","//@flow\nimport Drm from './drm';\n\nexport default class MediaSource {\n /**\n * @member - media source id\n * @type {string}\n */\n id: string;\n /**\n * @member - media source url\n * @type {string}\n */\n url: string;\n /**\n * @member - media source mimetype\n * @type {string}\n */\n mimetype: string;\n /**\n * @member - media source drm data\n * @type {Array<Drm>}\n */\n drmData: Array<Drm>;\n /**\n * @member - media source bandwidth\n * @type {number}\n */\n bandwidth: number;\n /**\n * @member - media source width\n * @type {number}\n */\n width: number;\n /**\n * @member - media source height\n * @type {number}\n */\n height: number;\n /**\n * @member - media source label\n * @type {string}\n */\n label: string;\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaSourceObject} - The json class object.\n */\n toJSON(): ProviderMediaSourceObject {\n const response: ProviderMediaSourceObject = {\n id: this.id,\n url: this.url,\n mimetype: this.mimetype\n };\n if (this.bandwidth) response.bandwidth = this.bandwidth;\n if (this.width) response.width = this.width;\n if (this.height) response.height = this.height;\n if (this.label) response.label = this.label;\n if (this.drmData && this.drmData.length > 0) {\n response.drmData = [];\n this.drmData.forEach(d => {\n if (Array.isArray(response.drmData)) {\n response.drmData.push(d.toJSON());\n }\n });\n }\n return response;\n }\n}\n","// @flow\nimport MultiRequestBuilder, {MultiRequestResult} from './multi-request-builder';\nimport Error from '../../util/error/error';\n\nexport default class DataLoaderManager {\n /**\n * @member - Loaders response map index\n * @type {Map<string,Array<number>>}\n * @private\n */\n _loadersResponseMap: Map<string, Array<number>> = new Map();\n /**\n * @member - Loaders multi request\n * @type {MultiRequestBuilder}\n * @protected\n */\n _multiRequest: MultiRequestBuilder;\n /**\n * @member - Loaders multi response\n * @type {MultiRequestResult}\n * @private\n */\n _multiResponse: MultiRequestResult;\n /**\n * @member - Loaders to execute\n * @type {Map<string,Function>}\n * @private\n */\n _loaders: Map<string, ILoader> = new Map();\n\n _networkRetryConfig: ProviderNetworkRetryParameters;\n\n constructor(networkRetryConfig: ProviderNetworkRetryParameters) {\n this._networkRetryConfig = networkRetryConfig;\n }\n\n /**\n * Add loader to execution loaders map\n * @function\n * @param {Function} loader Loader to add\n * @param {Object} params Loader params\n * @param {string} ks ks\n * @returns {void}\n */\n add(loader: Function, params: Object, ks?: string): void {\n let execution_loader = new loader(params);\n if (execution_loader.isValid()) {\n this._loaders.set(loader.id, execution_loader);\n // Get the start index from the multiReqeust before adding current execution_loader requests\n let startIndex = this._multiRequest.requests.length;\n // Get the requests\n let requests = execution_loader.requests;\n this._multiRequest.retryConfig = this._networkRetryConfig;\n // Add requests to multiRequest queue\n requests.forEach(request => {\n request.params = request.params || {};\n request.params.ks = request.params.ks || ks;\n this._multiRequest.add(request);\n });\n // Create range array of current execution_loader requests\n let executionLoaderResponseMap = Array.from(new Array(requests.length), (val, index) => index + startIndex);\n // Add to map\n this._loadersResponseMap.set(loader.id, executionLoaderResponseMap);\n }\n }\n\n /**\n * Get data from all loaders using multi request\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @function\n * @returns {Promise} Promise\n */\n fetchData(requestsMustSucceed?: boolean): Promise<any> {\n return new Promise((resolve, reject) => {\n this._multiRequest.execute(requestsMustSucceed).then(\n data => {\n this._multiResponse = data.response;\n let preparedData: Object = this.prepareData(data.response);\n if (preparedData.success) {\n resolve(this._loaders);\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.API_RESPONSE_MISMATCH, {\n headers: data.headers\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n\n /**\n * Prepare fetched data\n * @function\n * @param {MultiRequestResult} response - The multi request result\n * @returns {Object} - The prepared data\n */\n prepareData(response: MultiRequestResult): Object {\n this._loaders.forEach((loader, name) => {\n let loaderDataIndexes = this._loadersResponseMap.get(name);\n try {\n if (loaderDataIndexes && loaderDataIndexes.length > 0) {\n loader.response = response.results.slice(loaderDataIndexes[0], loaderDataIndexes[loaderDataIndexes.length - 1] + 1);\n }\n } catch (err) {\n return {success: false, error: err};\n }\n });\n return {success: true, data: this._loaders};\n }\n}\n","//@flow\nimport RequestBuilder from '../../util/request-builder';\nimport getLogger from '../../util/logger';\nimport ServiceResult from './base-service-result';\nimport Error from '../../util/error/error';\n\nexport default class MultiRequestBuilder extends RequestBuilder {\n static _logger = getLogger('MultiRequestBuilder');\n /**\n * @memberof - MultiRequestBuilder\n * @type {Array<RequestBuilder>}\n */\n requests: Array<RequestBuilder> = [];\n /**\n * Adds request to requests array\n * @function add\n * @param {RequestBuilder} request The request\n * @returns {MultiRequestBuilder} The multiRequest\n */\n add(request: RequestBuilder): MultiRequestBuilder {\n this.requests.push(request);\n const requestParams = {};\n const serviceDef: Object = {service: request.service, action: request.action};\n Object.assign(requestParams, {[this.requests.length]: Object.assign(serviceDef, request.params)});\n Object.assign(requestParams, this.params);\n this.params = requestParams;\n return this;\n }\n\n /**\n * Executes a multi request\n * @function execute\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @returns {Promise} The multirequest execution promise\n */\n execute(requestsMustSucceed?: boolean): Promise<Object> {\n return new Promise((resolve, reject) => {\n try {\n this.params = JSON.stringify(this.params);\n } catch (err) {\n MultiRequestBuilder._logger.error(`${err.message}`);\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.FAILED_PARSING_REQUEST, {\n error: err,\n params: this.params\n })\n );\n }\n this.doHttpRequest().then(\n data => {\n const multiRequestResult = new MultiRequestResult(data, requestsMustSucceed);\n if (multiRequestResult.success) {\n resolve({\n headers: this.responseHeaders,\n response: multiRequestResult\n });\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MULTIREQUEST_API_ERROR, {\n url: this.url,\n headers: this.responseHeaders,\n results: multiRequestResult.results\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n}\n\nexport class MultiRequestResult {\n static _logger = getLogger('MultiRequestResult');\n /**\n * @memberof MultiRequestResult\n * @type {boolean}\n */\n success: boolean;\n /**\n * @memberof MultiRequestResult\n * @type {Object}\n */\n results: Array<ServiceResult> = [];\n /**\n * @constructor\n * @param {Object} response data\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed\n */\n constructor(response: Object, requestsMustSucceed?: boolean = true) {\n const result = response.result ? response.result : response;\n const responseArr = Array.isArray(result) ? result : [result];\n const results = responseArr.map(result => new ServiceResult(result));\n const errorResults = results.filter(serviceResult => serviceResult.hasError);\n\n errorResults.forEach(serviceResult => {\n MultiRequestResult._logger.error(\n `Service returned an error with error code: ${serviceResult.error.code} and message: ${serviceResult.error.message}.`\n );\n });\n\n this.results = results;\n if ((requestsMustSucceed && errorResults.length) || errorResults.length === this.results.length) {\n this.success = false;\n } else {\n this.results = this.results.filter(serviceResult => !serviceResult.hasError);\n this.success = true;\n }\n }\n}\n","//@flow\nexport default class Drm {\n /**\n * @member - license url\n * @type {string}\n */\n licenseUrl: string;\n /**\n * @member - drm scheme\n * @type {string}\n */\n scheme: string;\n\n /**\n * @member - drm certificate\n * @type {string}\n */\n certificate: string;\n\n /**\n * @constructor\n * @param {string} licenseUrl - the license url\n * @param {string} scheme - the drm scheme\n * @param {?string} certificate - the drm certificate\n */\n constructor(licenseUrl: string, scheme: string, certificate: ?string) {\n this.licenseUrl = licenseUrl;\n this.scheme = scheme;\n if (certificate) {\n this.certificate = certificate;\n }\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderDrmDataObject} - The json class object.\n */\n toJSON(): ProviderDrmDataObject {\n const response: ProviderDrmDataObject = {\n licenseUrl: this.licenseUrl,\n scheme: this.scheme\n };\n if (this.certificate) response.certificate = this.certificate;\n return response;\n }\n}\n","//@flow\n\nconst BASE_THUMBNAIL_URL_TEMPLATE = '.+entry_id/[a-zA-Z0-9_]+/';\n\nexport default class ImageSource {\n /**\n * @member - media source id\n * @type {string}\n */\n id: string;\n /**\n * @member - media source url\n * @type {string}\n */\n url: string;\n /**\n * @member - media source mimetype\n * @type {string}\n */\n mimetype: string;\n\n constructor(entry: Object) {\n this.id = entry.id;\n this.url = ImageSource.extractBaseThumbnailUrl(entry.dataUrl);\n this.mimetype = '';\n }\n\n /**\n * Extract the base thumbnail url.\n * @param {string} url - dataUrl.\n * @returns {string} - The base thumbnail url.\n */\n static extractBaseThumbnailUrl(url: string): string {\n // $FlowFixMe\n return url.match(BASE_THUMBNAIL_URL_TEMPLATE)[0].slice(0, -1);\n }\n}\n","// @flow\nimport {getLogLevel, setLogLevel, setLogger, type LogLevelType, LogLevel} from '../../util/logger';\nimport DataLoaderManager from './data-loader-manager';\nimport Error from '../../util/error/error';\n\nexport default class BaseProvider<MI> {\n _partnerId: number;\n _widgetId: ?string;\n _ks: string;\n _uiConfId: ?number;\n _dataLoader: DataLoaderManager;\n _playerVersion: string;\n _logger: any;\n _isAnonymous: boolean;\n _networkRetryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n get partnerId(): number {\n return this._partnerId;\n }\n\n get widgetId(): string {\n return this._widgetId || this.defaultWidgetId;\n }\n\n get defaultWidgetId(): string {\n return '_' + this._partnerId;\n }\n\n get uiConfId(): ?number {\n return this._uiConfId;\n }\n\n get ks(): string {\n return this._ks;\n }\n\n set ks(value: string): void {\n this._ks = value;\n }\n\n get playerVersion(): string {\n return this._playerVersion;\n }\n\n get isAnonymous(): boolean {\n return this._isAnonymous;\n }\n\n constructor(options: ProviderOptionsObject, playerVersion: string) {\n setLogger(options.logger);\n this._partnerId = options.partnerId;\n this._widgetId = options.widgetId;\n this._uiConfId = options.uiConfId;\n this._isAnonymous = !options.ks;\n this._ks = options.ks || '';\n this._playerVersion = playerVersion;\n }\n\n // eslint-disable-next-line no-unused-vars\n getMediaConfig(mediaInfo: MI): Promise<ProviderMediaConfigObject> {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'getMediaConfig method must be implement by the derived class'\n })\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise<ProviderPlaylistObject> {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'The provider does not support loading playlist by id'\n })\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise<ProviderPlaylistObject> {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'The provider does not support loading entry list'\n })\n );\n }\n\n _verifyHasSources(sources: ProviderMediaConfigSourcesObject) {\n if (sources.hls.concat(sources.dash, sources.progressive, sources.image).length === 0) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MISSING_PLAY_SOURCE, {\n action: '',\n messages: `No play source for entry id: ${sources.id}`\n });\n }\n }\n\n get LogLevel(): LogLevelType {\n return LogLevel;\n }\n\n getLogLevel(name?: string): Object {\n return getLogLevel(name);\n }\n\n setLogLevel(level: Object, name?: string): void {\n setLogLevel(level, name);\n }\n}\n","const clone = data => {\n let node;\n if (Array.isArray(data)) {\n node = data.length > 0 ? data.slice(0) : [];\n node.forEach((e, i) => {\n if ((typeof e === 'object' && e !== {}) || (Array.isArray(e) && e.length > 0)) {\n node[i] = clone(e);\n }\n });\n } else if (typeof data === 'object') {\n node = Object.assign({}, data);\n Object.keys(node).forEach(key => {\n if ((typeof node[key] === 'object' && node[key] !== {}) || (Array.isArray(node[key]) && node[key].length > 0)) {\n node[key] = clone(node[key]);\n }\n });\n } else {\n node = data;\n }\n return node;\n};\n\nexport {clone};\n","//@flow\n\nimport MediaEntry from '../entities/media-entry';\n\nexport default class EntryList {\n /**\n * @member - entry list items\n * @type {Array<MediaEntry>}\n */\n items: Array<MediaEntry>;\n\n constructor() {\n this.items = [];\n }\n}\n","//@flow\n\nexport default class Bumper {\n /**\n * @member - bumper url\n * @type {string}\n */\n url: string;\n /**\n * @member - bumper click through url\n * @type {string}\n */\n clickThroughUrl: string;\n\n /**\n * @constructor\n * @param {Object} data - The bumper response\n */\n constructor(data: Object) {\n this.url = data.url;\n this.clickThroughUrl = data.clickThroughUrl;\n }\n}\n","//@flow\nimport {clone} from '../../util/clone';\n\nconst defaultConfig: Object = {\n serviceUrl: 'https://cdnapisec.kaltura.com/api_v3',\n cdnUrl: 'https://cdnapisec.kaltura.com',\n serviceParams: {\n apiVersion: '3.3.0',\n format: 1\n },\n useApiCaptions: true,\n loadThumbnailWithKs: false,\n replaceHostOnlyManifestUrls: false\n};\n\nexport default class OVPConfiguration {\n static set(clientConfig?: ProviderEnvConfigObject) {\n if (clientConfig) {\n Object.assign(defaultConfig, clientConfig);\n }\n }\n\n static get(): Object {\n return clone(defaultConfig);\n }\n}\n\nexport {OVPConfiguration};\n","//@flow\nimport {KalturaDrmPlaybackPluginData} from '../../common/response-types/kaltura-drm-playback-plugin-data';\n\nexport type OVPKalturaPlaybackSource = KalturaPlaybackSource;\n\nexport class KalturaPlaybackSource {\n /**\n * @member - source format according to delivery profile streamer type (applehttp, mpegdash etc.)\n * @type {string}\n */\n format: string;\n /**\n * @member - delivery profile Id\n * @type {string}\n */\n deliveryProfileId: string;\n /**\n * @member - The source URL\n * @type {string}\n */\n url: string;\n /**\n * @member - comma separated string according to deliveryProfile media protocols ('http,https' etc.)\n * @type {string}\n */\n protocols: string;\n /**\n * @member - comma separated string of flavor ids\n * @type {string}\n */\n flavorIds: string;\n /**\n * @member - drm data object containing relevant license url ,scheme name and certificate\n * @type {Array<KalturaDrmPlaybackPluginData>}\n */\n drm: Array<KalturaDrmPlaybackPluginData> = [];\n\n /**\n * @constructor\n * @param {Object} source The response\n */\n constructor(source: Object) {\n this.format = source.format;\n this.deliveryProfileId = source.deliveryProfileId;\n this.url = source.url;\n this.protocols = source.protocols;\n this.flavorIds = source.flavorIds;\n if (source.drm) {\n source.drm.map(drm => this.drm.push(new KalturaDrmPlaybackPluginData(drm)));\n }\n }\n\n /**\n * Checks if source has DRM data\n * @function hasDrmData\n * @returns {boolean} Is source has DRM\n */\n hasDrmData(): boolean {\n return this.drm && this.drm.length > 0;\n }\n\n /**\n * Checks if source has flavor IDs\n * @function hasFlavorIds\n * @returns {boolean} Is source ha flavor IDs\n */\n hasFlavorIds(): boolean {\n return !!this.flavorIds && this.flavorIds.length > 0;\n }\n\n /**\n * Returns source desired protocol if supported\n * @param {string} protocol - the desired protocol for the source (base play url protocol)\n * @returns {string} - protocol if protocol is in the protocols list - if not empty string returned\n */\n getProtocol(protocol: string): string {\n let returnValue: string = '';\n if (this.protocols && this.protocols.length > 0) {\n let protocolsArr: Array<string> = this.protocols.split(',');\n protocolsArr.forEach(p => {\n if (p === protocol) {\n returnValue = p;\n }\n });\n } else if (protocol === 'http') {\n return protocol;\n }\n return returnValue;\n }\n}\n","//@flow\nexport class KalturaRuleAction {\n static Type: {[type: string]: string | number} = {\n DRM_POLICY: 'drm.DRM_POLICY',\n BLOCK: 1,\n PREVIEW: 2,\n LIMIT_FLAVORS: 3,\n ADD_TO_STORAGE: 4,\n LIMIT_DELIVERY_PROFILES: 5,\n SERVE_FROM_REMOTE_SERVER: 6,\n REQUEST_HOST_REGEX: 7,\n LIMIT_THUMBNAIL_CAPTURE: 8\n };\n\n /**\n * @member - The type of the action\n * @type {string|number}\n */\n type: string | number;\n\n /**\n * @constructor\n * @param {Object} data - The response\n */\n constructor(data: Object) {\n this.type = data.type;\n }\n}\n","//@flow\nimport {KalturaRuleAction} from './kaltura-rule-action';\n\nexport class KalturaAccessControlModifyRequestHostRegexAction extends KalturaRuleAction {\n /**\n * @member - Request host regex pattern\n * @type {string}\n */\n pattern: string;\n /**\n * @member - Request host regex replacement\n * @type {string}\n */\n replacement: string;\n /**\n * @member - serverNodeId to generate replacment host from\n * @type {number}\n */\n replacmenServerNodeId: number;\n /**\n * @member - checkAliveTimeout in milliseconds\n * @type {number}\n */\n checkAliveTimeoutMs: number;\n /**\n * @constructor\n * @param {Object} data - The response\n */\n constructor(data: Object) {\n super(data);\n this.pattern = data.pattern;\n this.replacement = data.replacement;\n this.replacmenServerNodeId = data.replacmenServerNodeId;\n this.checkAliveTimeoutMs = data.checkAliveTimeoutMs;\n }\n}\n","//@flow\nexport class KalturaFlavorAsset {\n static Status: {[status: string]: number} = {\n ERROR: -1,\n QUEUED: 0,\n CONVERTING: 1,\n READY: 2,\n DELETED: 3,\n NOT_APPLICABLE: 4,\n TEMP: 5,\n WAIT_FOR_CONVERT: 6,\n IMPORTING: 7,\n VALIDATING: 8,\n EXPORTING: 9\n };\n\n /**\n * @member - The ID of the Flavor Asset\n * @type {string}\n */\n id: string;\n /**\n * @member -The Flavor Params used to create this Flavor Asset\n * @type {string}\n */\n flavorParamsId: string;\n /**\n * @member -The file extension\n * @type {string}\n */\n fileExt: string;\n /**\n * @member - The overall bitrate (in KBits) of the Flavor Asset\n * @type {string}\n */\n bitrate: number;\n /**\n * @member - The width of the Flavor Asset\n * @type {number}\n */\n width: number;\n /**\n * @member - The height of the Flavor Asset\n * @type {number}\n */\n height: number;\n /**\n * @member - The frame rate (in FPS) of the Flavor Asset\n * @type {number}\n */\n frameRate: number;\n /**\n * @member - True if this Flavor Asset is the original source\n * @type {number}\n */\n isOriginal: boolean;\n /**\n * @member - True if this Flavor Asset is playable in KDP\n * @type {boolean}\n */\n isWeb: boolean;\n /**\n * @member - The container format\n * @type {boolean}\n */\n containerFormat: string;\n /**\n *@member - The video codec\n * @type {boolean}\n */\n videoCodecId: string;\n /**\n * @member - The status of the Flavor Asset\n * @type {number}\n */\n status: number;\n /**\n * @member - The language of the flavor asset\n * @type {Status}\n */\n language: string;\n /**\n * @member - The label of the flavor asset\n * @type {string}\n */\n label: string;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: any) {\n this.id = data.id;\n this.flavorParamsId = data.flavorParamsId;\n this.fileExt = data.fileExt;\n this.bitrate = data.bitrate;\n this.width = data.width;\n this.height = data.height;\n this.id = data.id;\n this.frameRate = data.frameRate;\n this.isOriginal = data.isOriginal;\n this.isWeb = data.isWeb;\n this.containerFormat = data.containerFormat;\n this.videoCodecId = data.videoCodecId;\n this.status = data.status;\n this.language = data.language;\n this.label = data.label;\n }\n}\n","//@flow\nimport {KalturaPlaybackSource} from './kaltura-playback-source';\n\nexport class KalturaBumper {\n /**\n * @member - The bumper entry ID\n * @type {string}\n */\n entryId: string;\n /**\n * @member - The bumper click through url\n * @type {string}\n */\n clickThroughUrl: string;\n /**\n * @member - The bumper sources\n * @type {Array<KalturaPlaybackSource>}\n */\n sources: Array<KalturaPlaybackSource>;\n\n constructor(data: any) {\n this.entryId = data.entryId;\n this.clickThroughUrl = data.url;\n this.sources = data.sources ? data.sources.map(source => new KalturaPlaybackSource(source)) : [];\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaAccessControlMessage} from '../../common/response-types/kaltura-access-control-message';\nimport {KalturaPlaybackSource} from './kaltura-playback-source';\nimport {KalturaAccessControlModifyRequestHostRegexAction} from './kaltura-access-control-modify-request-host-regex-action';\nimport {KalturaRuleAction} from './kaltura-rule-action';\nimport {KalturaFlavorAsset} from './kaltura-flavor-asset';\nimport {KalturaBumper} from './kaltura-bumper';\n\nexport class KalturaPlaybackContext extends ServiceResult {\n /**\n * @member - The playback sources\n * @type {Array<KalturaPlaybackSource>}\n */\n sources: Array<KalturaPlaybackSource> = [];\n /**\n * @member - Array of actions as received from the rules that invalidated\n * @type {Array<KalturaRuleAction>}\n */\n actions: Array<KalturaRuleAction> = [];\n /**\n * @member - Array of actions as received from the rules that invalidated\n * @type {Array<KalturaAccessControlMessage>}\n */\n messages: Array<KalturaAccessControlMessage> = [];\n /**\n * @member - The flavor assets\n * @type {Array<KalturaFlavorAsset>}\n */\n flavorAssets: Array<KalturaFlavorAsset> = [];\n /**\n * @member - The bumper data\n * @type {Array<KalturaBumper>}\n */\n bumperData: Array<KalturaBumper> = [];\n\n /**\n * @constructor\n * @param {Object} response The response\n */\n constructor(response: Object) {\n super(response);\n if (!this.hasError) {\n const messages = response.messages;\n if (messages) {\n messages.map(message => this.messages.push(new KalturaAccessControlMessage(message)));\n }\n const actions = response.actions;\n if (actions) {\n actions.map(action => {\n if (action.type === KalturaRuleAction.Type.REQUEST_HOST_REGEX) {\n this.actions.push(new KalturaAccessControlModifyRequestHostRegexAction(action));\n } else {\n this.actions.push(new KalturaRuleAction(action));\n }\n });\n }\n const sources = response.sources;\n if (sources) {\n sources.map(source => this.sources.push(new KalturaPlaybackSource(source)));\n }\n const flavorAssets = response.flavorAssets;\n if (flavorAssets) {\n flavorAssets.map(flavor => this.flavorAssets.push(new KalturaFlavorAsset(flavor)));\n }\n const bumperData = response.bumperData;\n if (bumperData) {\n bumperData.map(bumper => this.bumperData.push(new KalturaBumper(bumper)));\n }\n }\n }\n\n hasBlockAction(): boolean {\n return this.getBlockAction() !== undefined;\n }\n\n getBlockAction(): ?KalturaRuleAction {\n return this.actions.find(action => action.type === KalturaRuleAction.Type.BLOCK);\n }\n\n getErrorMessages(): Array<KalturaAccessControlMessage> {\n return this.messages;\n }\n\n /**\n * Get the KalturaAccessControlModifyRequestHostRegexAction action\n * @function getRequestHostRegexAction\n * @returns {?KalturaAccessControlModifyRequestHostRegexAction} The action\n * */\n getRequestHostRegexAction(): ?KalturaAccessControlModifyRequestHostRegexAction {\n const action = this.actions.find(action => action.type === KalturaRuleAction.Type.REQUEST_HOST_REGEX);\n if (action instanceof KalturaAccessControlModifyRequestHostRegexAction) {\n return action;\n }\n }\n}\n","//@flow\nexport class KalturaMetadata {\n static ObjectType: {[type: string]: string | number} = {\n AD_CUE_POINT: 'adCuePointMetadata.AdCuePoint',\n ANNOTATION: 'annotationMetadata.Annotation',\n CODE_CUE_POINT: 'codeCuePointMetadata.CodeCuePoint',\n THUMB_CUE_POINT: 'thumbCuePointMetadata.thumbCuePoint',\n ENTRY: 1,\n CATEGORY: 2,\n USER: 3,\n PARTNER: 4,\n DYNAMIC_OBJECT: 5\n };\n\n static Status: {[status: string]: number} = {\n VALID: 1,\n INVALID: 2,\n DELETED: 3\n };\n\n id: number;\n metadataProfileId: number;\n metadataProfileVersion: number;\n metadataObjectType: string | number;\n objectId: string;\n version: number;\n created: Date;\n updated: Date;\n status: number;\n xml: string;\n\n /**\n * @constructor\n * @param {Object} data The response\n */\n constructor(data: Object) {\n this.id = data.id;\n this.metadataProfileId = data.metadataProfileId;\n this.metadataProfileVersion = data.metadataProfileVersion;\n this.metadataProfileId = data.metadataProfileId;\n this.metadataObjectType = data.metadataObjectType;\n this.objectId = data.objectId;\n this.version = data.version;\n this.created = new Date(0);\n this.created.setUTCSeconds(data.createdAt);\n this.updated = new Date(0);\n this.updated.setUTCSeconds(data.updatedAt);\n this.status = data.status;\n this.xml = data.xml;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaMetadata} from './kaltura-metadata';\n\nexport class KalturaMetadataListResponse extends ServiceResult {\n totalCount: number;\n metas: Array<KalturaMetadata>;\n\n /**\n * @constructor\n * @param {Object} responseObj The response\n */\n constructor(responseObj: Object) {\n super(responseObj);\n if (!this.hasError) {\n this.totalCount = responseObj.totalCount;\n if (this.totalCount > 0) {\n this.metas = [];\n responseObj.objects.map(meta => this.metas.push(new KalturaMetadata(meta)));\n }\n }\n }\n}\n","//@flow\nexport class KalturaMediaEntry {\n static EntryType: {[entryType: string]: {value: number | string}} = {\n AUTOMATIC: {value: -1},\n EXTERNAL_MEDIA: {value: 'externalMedia.externalMedia'},\n MEDIA_CLIP: {value: 1},\n MIX: {value: 2},\n PLAYLIST: {value: 5},\n DATA: {value: 6},\n LIVE_STREAM: {value: 7},\n LIVE_CHANNEL: {value: 8},\n DOCUMENT: {value: 10}\n };\n\n static MediaType: {[mediaType: string]: {value: number}} = {\n VIDEO: {value: 1},\n IMAGE: {value: 2},\n AUDIO: {value: 5},\n LIVE_STREAM_FLASH: {value: 201},\n LIVE_STREAM_WINDOWS_MEDIA: {value: 202},\n LIVE_STREAM_REAL_MEDIA: {value: 203},\n LIVE_STREAM_QUICK_TIME: {value: 204}\n };\n\n static EntryStatus: {[status: string]: string | number} = {\n ERROR_IMPORTING: -2,\n ERROR_CONVERTING: -1,\n SCAN_FAILURE: 'virusScan.ScanFailure',\n IMPORT: 0,\n INFECTED: 'virusScan.Infected',\n PRECONVERT: 1,\n READY: 2,\n DELETED: 3,\n PENDING: 4,\n MODERATE: 5,\n BLOCKED: 6,\n NO_CONTENT: 7\n };\n\n static EntryModerationStatus: {[status: string]: number} = {\n PENDING_MODERATION: 1,\n APPROVED: 2,\n REJECTED: 3,\n FLAGGED_FOR_REVIEW: 4,\n MODERATE: 5,\n AUTO_APPROVED: 6\n };\n\n /**\n * @member - The entry id\n * @type {string}\n */\n id: string;\n /**\n * @member - The entry referenceId\n * @type {string}\n */\n referenceId: string;\n /**\n * @member - The entry externalSourceType\n * @type {string}\n */\n externalSourceType: string;\n /**\n * @member - Entry name (Min 1 chars)\n * @type {string}\n */\n name: string;\n /**\n * @member - Entry description\n * @type {string}\n */\n description: string;\n /**\n * @member - The URL used for playback. This is not the download URL.\n * @type {string}\n */\n dataUrl: string;\n /**\n * @member - Comma separated flavor params ids that exists for this media entry\n * @type {string}\n */\n flavorParamsIds: string;\n /**\n * @member - The entry duration\n * @type {number}\n */\n duration: number;\n /**\n * @member - The type of the entry, this is auto filled by the derived entry object\n * @type {string | number}\n */\n type: string | number;\n /**\n * @member - The type of the entry, this is auto filled by the derived entry object (Image, Audio etc.)\n * @type {number}\n */\n entryType: number;\n /**\n * @member - Entry poster image\n * @type {string}\n */\n poster: string;\n /**\n * @member - DVR status\n * @type {number}\n */\n dvrStatus: number;\n /**\n * @member - Entry tags\n * @type {string}\n */\n tags: string;\n\n /**\n * @member - Entry status\n * @type {number}\n */\n status: number;\n\n /**\n * @constructor\n * @param {Object} entry The json response\n */\n constructor(entry: Object) {\n this.id = entry.id;\n this.referenceId = entry.referenceId;\n this.externalSourceType = entry.externalSourceType;\n this.name = entry.name;\n this.description = entry.description;\n this.dataUrl = entry.dataUrl;\n this.type = entry.type;\n this.entryType = entry.mediaType;\n this.flavorParamsIds = entry.flavorParamsIds;\n this.duration = entry.duration;\n this.poster = entry.thumbnailUrl;\n this.status = entry.status;\n this.dvrStatus = entry.dvrStatus;\n this.tags = entry.tags;\n }\n}\n","//@flow\nimport OVPConfiguration from './config';\n\ntype urlParamsType = {\n partnerId: number,\n entryId: string,\n ks: string,\n uiConfId: ?number,\n format: string,\n protocol: string,\n extension: string,\n flavorIds: ?string\n};\n\nexport default class PlaySourceUrlBuilder {\n /**\n * Returns source url by given url params\n * @function build\n * @param {urlParamsType} urlParams The params\n * @returns {string} The URL\n * @static\n */\n static build(urlParams: urlParamsType): string {\n const config = OVPConfiguration.get();\n const serviceUrlOrigin: string = config.serviceUrl.substr(0, config.serviceUrl.lastIndexOf('/'));\n const {partnerId, entryId, ks, uiConfId, format, protocol, extension, flavorIds} = urlParams;\n\n //verify mandatory params\n //$FlowFixMe\n if (!serviceUrlOrigin || isNaN(Number.parseInt(partnerId)) || !entryId || !format || !protocol) {\n return '';\n }\n\n let playUrl = serviceUrlOrigin;\n if (!serviceUrlOrigin.endsWith('/')) {\n playUrl += '/';\n }\n playUrl += 'p/' + partnerId + '/sp/' + partnerId + '00' + '/playManifest/entryId/' + entryId + '/protocol/' + protocol + '/format/' + format;\n\n if (flavorIds) {\n playUrl += '/flavorIds/' + flavorIds;\n } else if (uiConfId) {\n playUrl += '/uiConfId/' + uiConfId;\n }\n\n if (ks !== '') {\n playUrl += '/ks/' + ks;\n }\n\n if (extension !== '') {\n playUrl += '/a.' + extension;\n }\n\n if (uiConfId && flavorIds !== '') {\n playUrl += '?uiConfId=' + uiConfId;\n }\n\n return playUrl;\n }\n}\n","//@flow\nexport default class XmlParser {\n /**\n * Parses xml string to json object\n * @param {string} xml The xml to parse\n * @returns {{}} The parsed xml as Json object\n * @static\n */\n static xmlToJson(xml: Object) {\n let obj = {};\n if (xml.nodeType === 1) {\n if (xml.attributes.length > 0) {\n obj['@attributes'] = {};\n for (let j = 0; j < xml.attributes.length; j++) {\n let attribute = xml.attributes.item(j);\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\n }\n }\n } else if (xml.nodeType === 3) {\n obj = xml.nodeValue;\n }\n if (xml.hasChildNodes()) {\n for (let i = 0; i < xml.childNodes.length; i++) {\n let item = xml.childNodes.item(i);\n let nodeName = item.nodeName;\n if (typeof obj[nodeName] === 'undefined') {\n obj[nodeName] = this.xmlToJson(item);\n } else {\n if (typeof obj[nodeName].push === 'undefined') {\n let old = obj[nodeName];\n obj[nodeName] = [];\n obj[nodeName].push(old);\n }\n obj[nodeName].push(this.xmlToJson(item));\n }\n }\n }\n return obj;\n }\n}\n","//@flow\n\nimport MediaEntry from '../entities/media-entry';\n\nexport default class Playlist {\n /**\n * @member - playlist id\n * @type {string}\n */\n id: string;\n /**\n * @member - playlist name\n * @type {string}\n */\n name: string;\n /**\n * @member - playlist description\n * @type {string}\n */\n description: string;\n\n /**\n * @member - playlist poster\n * @type {string}\n */\n poster: string;\n\n /**\n * @member - playlist items\n * @type {Array<MediaEntry>}\n */\n items: Array<MediaEntry>;\n\n constructor() {\n this.items = [];\n }\n}\n","// @flow\n\nimport {addKsToUrl} from './provider-parser';\n\nconst KalturaCaptionType: CaptionType = {\n SRT: '1',\n DFXP: '2',\n WEBVTT: '3',\n CAP: '4'\n};\n\nconst CaptionsFormatsMap: {[format: string]: string} = {\n '3': 'vtt',\n '1': 'srt'\n};\n\nclass ExternalCaptionsBuilder {\n static createConfig(captions: Array<Object>, ks: string): Array<PKExternalCaptionObject> {\n return captions.map(caption => {\n let url = caption.url;\n let type = CaptionsFormatsMap[caption.format];\n if ([KalturaCaptionType.DFXP, KalturaCaptionType.CAP].includes(caption.format)) {\n url = caption.webVttUrl;\n type = CaptionsFormatsMap[KalturaCaptionType.WEBVTT];\n }\n url = addKsToUrl(url, ks);\n return {\n default: !!caption.isDefault,\n type: type,\n language: caption.languageCode,\n label: caption.label,\n url: url\n };\n });\n }\n}\n\nexport {ExternalCaptionsBuilder};\n","//@flow\nimport {KalturaPlaybackContext} from './response-types/kaltura-playback-context';\nimport {KalturaMetadataListResponse} from './response-types/kaltura-metadata-list-response';\nimport {KalturaMediaEntry} from './response-types/kaltura-media-entry';\nimport {KalturaPlaybackSource} from './response-types/kaltura-playback-source';\nimport {KalturaBumper} from './response-types/kaltura-bumper';\nimport {KalturaDrmPlaybackPluginData} from '../common/response-types/kaltura-drm-playback-plugin-data';\nimport PlaySourceUrlBuilder from './play-source-url-builder';\nimport XmlParser from '../../util/xml-parser';\nimport getLogger from '../../util/logger';\nimport OVPConfiguration from './config';\nimport MediaEntry from '../../entities/media-entry';\nimport Drm from '../../entities/drm';\nimport MediaSource from '../../entities/media-source';\nimport MediaSources from '../../entities/media-sources';\nimport {SupportedStreamFormat, isProgressiveSource} from '../../entities/media-format';\nimport Playlist from '../../entities/playlist';\nimport EntryList from '../../entities/entry-list';\nimport Bumper from '../../entities/bumper';\nimport {KalturaRuleAction} from './response-types/kaltura-rule-action';\nimport {KalturaAccessControlMessage} from '../common/response-types/kaltura-access-control-message';\nimport type {OVPMediaEntryLoaderResponse} from './loaders/media-entry-loader';\nimport {ExternalCaptionsBuilder} from './external-captions-builder';\nimport ImageSource from '../../entities/image-source';\n\nclass OVPProviderParser {\n static _logger = getLogger('OVPProviderParser');\n\n /**\n * Returns parsed media entry by given OVP response objects\n * @function getMediaEntry\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {any} mediaEntryResponse - The media entry response\n * @returns {MediaEntry} - The media entry\n * @static\n * @public\n */\n static getMediaEntry(ks: string, partnerId: number, uiConfId: ?number, mediaEntryResponse: any): MediaEntry {\n const mediaEntry = new MediaEntry();\n const entry = mediaEntryResponse.entry;\n const playbackContext = mediaEntryResponse.playBackContextResult;\n const metadataList = mediaEntryResponse.metadataListResult;\n const kalturaSources = playbackContext.sources;\n\n mediaEntry.sources = OVPProviderParser._getParsedSources(kalturaSources, ks, partnerId, uiConfId, entry, playbackContext);\n OVPProviderParser._fillBaseData(mediaEntry, entry, metadataList);\n if (mediaEntry.type !== MediaEntry.Type.LIVE && OVPConfiguration.get().useApiCaptions && playbackContext.data.playbackCaptions) {\n mediaEntry.sources.captions = ExternalCaptionsBuilder.createConfig(playbackContext.data.playbackCaptions, ks);\n }\n return mediaEntry;\n }\n\n /**\n * Returns the url with KS\n * @function addKsToUrl\n * @param {String} url - The url to add the KS\n * @param {string} ks - The ks\n * @returns {string} - The url with KS\n * @static\n * @public\n */\n static addKsToUrl(url: string, ks: string): string {\n const hasUrlExtension = path => {\n const pathWithoutQuery = path.split('?')[0];\n const pathAfterLastSlash = pathWithoutQuery.replace(/^.*[\\\\/]/, '');\n return pathAfterLastSlash.indexOf('.') !== -1;\n };\n let ksParam;\n if (ks) {\n if (hasUrlExtension(url)) {\n ksParam = url.indexOf('?') === -1 ? '?ks=' : '&ks=';\n } else {\n ksParam = '/ks/';\n }\n return url + ksParam + ks;\n }\n return url;\n }\n\n /**\n * Returns parsed playlist by given OVP response objects\n * @function getPlaylist\n * @param {any} playlistResponse - The playlist response\n * @returns {Playlist} - The playlist\n * @static\n * @public\n */\n static getPlaylist(playlistResponse: any): Playlist {\n const playlist = new Playlist();\n const playlistData = playlistResponse.playlistData;\n const playlistItems = playlistResponse.playlistItems.entries;\n playlist.id = playlistData.id;\n playlist.name = playlistData.name;\n playlist.description = playlistData.description;\n playlist.poster = playlistData.poster;\n playlistItems.forEach((entry: KalturaMediaEntry) => {\n const mediaEntry = new MediaEntry();\n OVPProviderParser._fillBaseData(mediaEntry, entry);\n playlist.items.push(mediaEntry);\n });\n return playlist;\n }\n\n /**\n * Returns parsed entry list by given OVP response objects\n * @function getEntryList\n * @param {any} playlistResponse - response\n * @returns {Playlist} - The entry list\n * @static\n * @public\n */\n static getEntryList(playlistResponse: any): EntryList {\n const entryList = new EntryList();\n const playlistItems = playlistResponse.playlistItems.entries;\n playlistItems.forEach(entry => {\n const mediaEntry = new MediaEntry();\n OVPProviderParser._fillBaseData(mediaEntry, entry);\n entryList.items.push(mediaEntry);\n });\n return entryList;\n }\n\n /**\n * Returns parsed bumper by given OTT response objects.\n * @function getBumper\n * @param {any} assetResponse - The asset response.\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @returns {?Bumper} - The bumper\n * @static\n * @public\n */\n static getBumper(assetResponse: any, ks: string, partnerId: number): ?Bumper {\n const playbackContext = assetResponse.playBackContextResult;\n const bumperData: KalturaBumper = playbackContext.bumperData[0];\n if (bumperData) {\n const bumperSources = bumperData && bumperData.sources;\n const progressiveBumper = bumperSources.find(bumper => isProgressiveSource(bumper.format));\n if (progressiveBumper) {\n const parsedSources = OVPProviderParser._parseProgressiveSources(progressiveBumper, playbackContext, ks, partnerId, 0, bumperData.entryId);\n if (parsedSources[0]) {\n return new Bumper({url: parsedSources[0].url, clickThroughUrl: bumperData.clickThroughUrl});\n }\n }\n }\n }\n\n static _fillBaseData(mediaEntry: MediaEntry, entry: KalturaMediaEntry, metadataList: ?KalturaMetadataListResponse) {\n mediaEntry.poster = entry.poster;\n mediaEntry.id = entry.id;\n mediaEntry.duration = entry.duration;\n mediaEntry.metadata = OVPProviderParser._parseMetadata(metadataList);\n mediaEntry.metadata.description = entry.description || '';\n mediaEntry.metadata.entryId = entry.id || '';\n mediaEntry.metadata.name = entry.name || '';\n mediaEntry.metadata.tags = entry.tags || '';\n mediaEntry.status = entry.status;\n\n mediaEntry.type = OVPProviderParser._getEntryType(entry.entryType, entry.type);\n if (mediaEntry.type === MediaEntry.Type.LIVE) {\n mediaEntry.dvrStatus = entry.dvrStatus;\n }\n\n return mediaEntry;\n }\n\n static _getEntryType(entryTypeEnum: number, typeEnum: number | string): string {\n let type = MediaEntry.Type.UNKNOWN;\n switch (entryTypeEnum) {\n case KalturaMediaEntry.MediaType.IMAGE.value:\n type = MediaEntry.Type.IMAGE;\n break;\n case KalturaMediaEntry.MediaType.AUDIO.value:\n type = MediaEntry.Type.AUDIO;\n break;\n default:\n switch (typeEnum) {\n case KalturaMediaEntry.EntryType.MEDIA_CLIP.value:\n type = MediaEntry.Type.VOD;\n break;\n case KalturaMediaEntry.EntryType.LIVE_STREAM.value:\n case KalturaMediaEntry.EntryType.LIVE_CHANNEL.value:\n type = MediaEntry.Type.LIVE;\n break;\n default:\n type = MediaEntry.Type.UNKNOWN;\n }\n }\n return type;\n }\n\n /**\n * Returns the parsed sources\n * @function _getParsedSources\n * @param {Array<KalturaPlaybackSource>} kalturaSources - The kaltura sources\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {Object} entry - The entry\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @return {MediaSources} - A media sources\n * @static\n * @private\n */\n static _getParsedSources(\n kalturaSources: Array<KalturaPlaybackSource>,\n ks: string,\n partnerId: number,\n uiConfId: ?number,\n entry: Object,\n playbackContext: KalturaPlaybackContext\n ): MediaSources {\n const sources = new MediaSources();\n const addAdaptiveSource = (source: KalturaPlaybackSource) => {\n const parsedSource = OVPProviderParser._parseAdaptiveSource(source, playbackContext, ks, partnerId, uiConfId, entry.id);\n if (parsedSource) {\n const sourceFormat = SupportedStreamFormat.get(source.format);\n sources.map(parsedSource, sourceFormat);\n }\n };\n const parseAdaptiveSources = () => {\n kalturaSources.filter(source => !isProgressiveSource(source.format)).forEach(addAdaptiveSource);\n };\n const parseProgressiveSources = () => {\n const progressiveSource = kalturaSources.find(source => {\n //match progressive source with supported protocol(http/s)\n return isProgressiveSource(source.format) && source.getProtocol(OVPProviderParser._getBaseProtocol()) !== '';\n });\n sources.progressive = OVPProviderParser._parseProgressiveSources(progressiveSource, playbackContext, ks, partnerId, uiConfId, entry.id);\n };\n\n const parseImageSources = () => {\n sources.image.push(new ImageSource(entry));\n };\n\n const parseExternalMedia = () => {\n const mediaSource = new MediaSource();\n mediaSource.mimetype = 'video/youtube';\n mediaSource.url = entry.referenceId;\n mediaSource.id = entry.id + '_youtube';\n sources.progressive.push(mediaSource);\n };\n\n if (entry.type === KalturaMediaEntry.EntryType.EXTERNAL_MEDIA.value) {\n parseExternalMedia();\n } else if (entry.entryType === KalturaMediaEntry.MediaType.IMAGE.value) {\n parseImageSources();\n } else if (kalturaSources && kalturaSources.length > 0) {\n parseAdaptiveSources();\n parseProgressiveSources();\n }\n return sources;\n }\n\n /**\n * Returns a parsed adaptive source\n * @function _parseAdaptiveSource\n * @param {KalturaPlaybackSource} kalturaSource - A kaltura source\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {string} entryId - The entry id\n * @returns {?MediaSource} - The parsed adaptive kalturaSource\n * @static\n * @private\n */\n static _parseAdaptiveSource(\n kalturaSource: ?KalturaPlaybackSource,\n playbackContext: KalturaPlaybackContext,\n ks: string,\n partnerId: number,\n uiConfId: ?number,\n entryId: string\n ): ?MediaSource {\n const mediaSource: MediaSource = new MediaSource();\n if (kalturaSource) {\n let playUrl: string = '';\n const mediaFormat = SupportedStreamFormat.get(kalturaSource.format);\n const protocol = kalturaSource.getProtocol(OVPProviderParser._getBaseProtocol());\n const deliveryProfileId = kalturaSource.deliveryProfileId;\n const format = kalturaSource.format;\n let extension: string = '';\n if (mediaFormat) {\n extension = mediaFormat.pathExt;\n mediaSource.mimetype = mediaFormat.mimeType;\n }\n // in case playbackSource doesn't have flavors we don't need to build the url and we'll use the provided one.\n if (kalturaSource.hasFlavorIds()) {\n if (!extension && playbackContext.flavorAssets && playbackContext.flavorAssets.length > 0) {\n extension = playbackContext.flavorAssets[0].fileExt;\n }\n playUrl = PlaySourceUrlBuilder.build({\n entryId,\n flavorIds: kalturaSource.flavorIds,\n format,\n ks,\n partnerId,\n uiConfId,\n extension,\n protocol\n });\n } else {\n playUrl = OVPProviderParser.addKsToUrl(kalturaSource.url, ks);\n }\n if (!playUrl) {\n const message = `failed to create play url from source, discarding source: (${entryId}_${deliveryProfileId}), ${format}`;\n OVPProviderParser._logger.warn(message);\n return null;\n }\n mediaSource.url = playUrl;\n mediaSource.id = entryId + '_' + deliveryProfileId + ',' + format;\n if (kalturaSource.hasDrmData()) {\n const drmParams: Array<Drm> = [];\n kalturaSource.drm.forEach(drm => {\n drmParams.push(new Drm(drm.licenseURL, KalturaDrmPlaybackPluginData.Scheme[drm.scheme], drm.certificate));\n });\n mediaSource.drmData = drmParams;\n }\n }\n return mediaSource;\n }\n\n /**\n * Returns parsed progressive sources\n * @function _parseProgressiveSources\n * @param {KalturaPlaybackSource} kalturaSource - A kaltura source\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {string} entryId - The entry id\n * @returns {Array<MediaSource>} - The parsed progressive kalturaSources\n * @static\n * @private\n */\n static _parseProgressiveSources(\n kalturaSource: ?KalturaPlaybackSource,\n playbackContext: KalturaPlaybackContext,\n ks: string,\n partnerId: number,\n uiConfId: ?number,\n entryId: string\n ): Array<MediaSource> {\n const videoSources: Array<MediaSource> = [];\n const audioSources: Array<MediaSource> = [];\n if (kalturaSource) {\n const protocol = kalturaSource.getProtocol(OVPProviderParser._getBaseProtocol());\n const format = kalturaSource.format;\n const deliveryProfileId = kalturaSource.deliveryProfileId;\n const sourceId = deliveryProfileId + ',' + format;\n playbackContext.flavorAssets.map(flavor => {\n const mediaSource: MediaSource = new MediaSource();\n mediaSource.id = flavor.id + sourceId;\n mediaSource.mimetype = flavor.fileExt === 'mp3' ? 'audio/mp3' : 'video/mp4';\n mediaSource.height = flavor.height;\n mediaSource.width = flavor.width;\n mediaSource.bandwidth = flavor.bitrate * 1024;\n mediaSource.label = flavor.label || flavor.language;\n const playUrl = PlaySourceUrlBuilder.build({\n entryId,\n flavorIds: flavor.id,\n format,\n ks,\n partnerId: partnerId,\n uiConfId: uiConfId,\n extension: flavor.fileExt,\n protocol\n });\n if (playUrl === '') {\n OVPProviderParser._logger.warn(`failed to create play url from source, discarding source: (${entryId}_${deliveryProfileId}), ${format}.`);\n return null;\n } else {\n mediaSource.url = playUrl;\n if (flavor.height && flavor.width) {\n videoSources.push(mediaSource);\n } else {\n audioSources.push(mediaSource);\n }\n }\n });\n }\n //If we have only audio flavors return them, otherwise return video flavors\n return audioSources.length && !videoSources.length ? audioSources : videoSources;\n }\n\n /**\n * Ovp metadata parser\n * @function _parseMetaData\n * @param {KalturaMetadataListResponse} metadataList The metadata list\n * @returns {Object} Parsed metadata\n * @static\n * @private\n */\n static _parseMetadata(metadataList: ?KalturaMetadataListResponse): Object {\n const metadata = {};\n if (metadataList && metadataList.metas && metadataList.metas.length > 0) {\n metadataList.metas.forEach(meta => {\n if (meta.xml) {\n let metaXml: Object;\n const domParser: DOMParser = new DOMParser();\n meta.xml = meta.xml.replace(/\\r?\\n|\\r/g, '');\n meta.xml = meta.xml.replace(/>\\s*/g, '>');\n meta.xml = meta.xml.replace(/>\\s*/g, '>');\n metaXml = domParser.parseFromString(meta.xml, 'text/xml');\n const metasObj: Object = XmlParser.xmlToJson(metaXml);\n const metaKeys = Object.keys(metasObj.metadata);\n metaKeys.forEach(key => {\n metadata[key] = metasObj.metadata[key]['#text'];\n });\n }\n });\n }\n return metadata;\n }\n\n /**\n * Returns the base protocol\n * @function _getBaseProtocol\n * @returns {string} - The base protocol\n * @static\n * @private\n */\n static _getBaseProtocol(): string {\n const config = OVPConfiguration.get();\n const protocolRegex = /^https?:/;\n const result = protocolRegex.exec(config.cdnUrl);\n const protocol = result ? result[0] : document.location.protocol;\n if (typeof protocol === 'string') {\n return protocol.slice(0, -1); // remove ':' from the end\n }\n return 'https';\n }\n\n static hasBlockAction(response: OVPMediaEntryLoaderResponse): boolean {\n return response.playBackContextResult.hasBlockAction();\n }\n\n static getBlockAction(response: OVPMediaEntryLoaderResponse): ?KalturaRuleAction {\n return response.playBackContextResult.getBlockAction();\n }\n\n static getErrorMessages(response: OVPMediaEntryLoaderResponse): Array<KalturaAccessControlMessage> {\n return response.playBackContextResult.getErrorMessages();\n }\n}\n\nexport const addKsToUrl = OVPProviderParser.addKsToUrl;\nexport default OVPProviderParser;\n","//@flow\nimport MultiRequestBuilder from '../../common/multi-request-builder';\nimport OVPConfiguration from '../config';\n\nconst SERVICE_NAME: string = 'multirequest';\n\nexport default class OVPService {\n /**\n * Gets a new instance of MultiRequestBuilder with ovp params\n * @function getMultiRequest\n * @param {string} playerVersion The player version\n * @param {string} ks The ks\n * @param {string} partnerId The partner ID\n * @returns {MultiRequestBuilder} The multi request builder\n * @static\n */\n static getMultiRequest(playerVersion: string, ks: string, partnerId?: number): MultiRequestBuilder {\n const config = OVPConfiguration.get();\n const ovpParams = config.serviceParams;\n Object.assign(ovpParams, {ks: ks, clientTag: 'html5:v' + playerVersion});\n if (partnerId) {\n Object.assign(ovpParams, {partnerId: partnerId});\n }\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const multiReq = new MultiRequestBuilder(headers);\n multiReq.method = 'POST';\n multiReq.service = SERVICE_NAME;\n multiReq.url = multiReq.getUrl(config.serviceUrl);\n multiReq.params = ovpParams;\n return multiReq;\n }\n}\n","//@flow\nconst FIELDS =\n 'id,referenceId,name,description,thumbnailUrl,dataUrl,duration,msDuration,flavorParamsIds,mediaType,type,tags,dvrStatus,externalSourceType,status';\nconst RESPONSE_PROFILE_TYPE = {\n INCLUDE_FIELDS: 1,\n EXCLUDE_FIELDS: 2\n};\nexport class BaseEntryResponseProfile {\n static Type: {[type: string]: number} = RESPONSE_PROFILE_TYPE;\n /**\n * @member - the response profile type\n * @type {number}\n */\n type: number;\n /**\n * @member - Comma separated fields list to be included or excluded\n * @type {string}\n */\n fields: string;\n\n /**\n * @constructor\n * @param {Object} responseProfile -\n */\n constructor(responseProfile: Object = {}) {\n this.type = responseProfile.type || BaseEntryResponseProfile.Type.INCLUDE_FIELDS;\n this.fields = responseProfile.fields || FIELDS;\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\nimport {BaseEntryResponseProfile} from '../request-params/base-entry-response-profile';\n\nconst SERVICE_NAME: string = 'baseEntry';\n\nexport default class OVPBaseEntryService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for baseentry.getPlaybackContext\n * @function getPlaybackContext\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The ks\n * @param {serviceEntryId} serviceEntryId The entry id from the request result (to support loading by referenceId)\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static getPlaybackContext(serviceUrl: string, ks: string, serviceEntryId: string): RequestBuilder {\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'getPlaybackContext';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'baseEntry-getPlaybackContext';\n const contextDataParams = {objectType: 'KalturaContextDataParams', flavorTags: 'all'};\n request.params = {entryId: serviceEntryId, ks: ks, contextDataParams: contextDataParams};\n return request;\n }\n\n /**\n * Creates an instance of RequestBuilder for baseentry.list\n * @function list\n * @param {string} serviceUrl The base URL\n * @param {string} ks The ks\n * @param {string} entryId The entry ID\n * @param {boolean} redirectFromEntryId whether the live entry should continue and play the VOD one after the live stream ends.\n * @param {string} referenceId a Reference id instead of an entry id\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static list(serviceUrl: string, ks: string, entryId: string, redirectFromEntryId: boolean, referenceId: string): RequestBuilder {\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'list';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'list';\n request.params = OVPBaseEntryService.getEntryListReqParams(entryId, ks, redirectFromEntryId, referenceId);\n return request;\n }\n\n /**\n * Gets baseentry.list service params\n * @function getEntryListReqParams\n * @param {string} entryId The entry ID\n * @param {string} ks The ks\n * @param {boolean} redirectFromEntryId whether the live entry should continue and play the VOD one after the live stream ends.\n * @param {string} referenceId a Reference id instead of an entry id\n * @returns {{ks: string, filter: {redirectFromEntryId: string}, responseProfile: {fields: string, type: number}}} The service params object\n * @static\n */\n static getEntryListReqParams(entryId: string, ks: string, redirectFromEntryId: boolean, referenceId: string): any {\n let filterParams = {};\n if (entryId) {\n filterParams = redirectFromEntryId ? {redirectFromEntryId: entryId} : {idEqual: entryId};\n } else if (referenceId) {\n filterParams = {objectType: 'KalturaBaseEntryFilter', referenceIdEqual: referenceId};\n }\n\n return {ks: ks, filter: filterParams, responseProfile: new BaseEntryResponseProfile()};\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\n\nconst SERVICE_NAME: string = 'metadata_metadata';\n\nexport default class OVPMetadataService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for metadata_metadata.list\n * @function getPlaybackContext\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The ks\n * @param {string} entryId The entry ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static list(serviceUrl: string, ks: string, entryId: string): RequestBuilder {\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'list';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'metadata_metadata-list';\n const filter = {objectType: 'KalturaMetadataFilter', objectIdEqual: entryId, metadataObjectTypeEqual: '1'};\n request.params = {filter: filter, ks: ks};\n return request;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaMediaEntry} from './kaltura-media-entry';\n\nexport class KalturaBaseEntryListResponse extends ServiceResult {\n /**\n * @member - The total count\n * @type {number}\n */\n totalCount: number;\n /**\n * @member - The entries\n * @type {Array<KalturaMediaEntry>}\n */\n entries: Array<KalturaMediaEntry>;\n\n /**\n * @constructor\n * @param {Object} responseObj The json response\n */\n constructor(responseObj: Object) {\n super(responseObj);\n if (!this.hasError) {\n this.totalCount = responseObj.totalCount;\n if (this.totalCount > 0) {\n this.entries = [];\n responseObj.objects.map(entry => this.entries.push(new KalturaMediaEntry(entry)));\n }\n }\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OVPBaseEntryService from '../services/base-entry-service';\nimport OVPMetadataService from '../services/meta-data-service';\nimport OVPConfiguration from '../config';\nimport {KalturaPlaybackContext} from '../response-types/kaltura-playback-context';\nimport {KalturaMetadataListResponse} from '../response-types/kaltura-metadata-list-response';\nimport {KalturaBaseEntryListResponse} from '../response-types/kaltura-base-entry-list-response';\nimport {KalturaMediaEntry} from '../response-types/kaltura-media-entry';\n\ntype OVPMediaEntryLoaderResponse = {\n entry: KalturaMediaEntry,\n playBackContextResult: KalturaPlaybackContext,\n metadataListResult: KalturaMetadataListResponse\n};\nexport type {OVPMediaEntryLoaderResponse};\n\nexport default class OVPMediaEntryLoader implements ILoader {\n _entryId: string;\n _referenceId: string;\n _requests: Array<RequestBuilder>;\n _response: any = {};\n\n static get id(): string {\n return 'media';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n * @boolean {boolean} useExternalCaptions - if we should add captions request to the multirequests.\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._entryId = params.entryId;\n this._referenceId = params.referenceId;\n }\n\n set requests(requests: Array<RequestBuilder>) {\n this._requests = requests;\n }\n\n get requests(): Array<RequestBuilder> {\n return this._requests;\n }\n\n set response(response: any) {\n let mediaEntryResponse: KalturaBaseEntryListResponse = new KalturaBaseEntryListResponse(response[0].data);\n this._response.entry = mediaEntryResponse.entries[0];\n this._response.playBackContextResult = new KalturaPlaybackContext(response[1].data);\n this._response.metadataListResult = new KalturaMetadataListResponse(response[2].data);\n }\n\n get response(): OVPMediaEntryLoaderResponse {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array<RequestBuilder> {\n const config = OVPConfiguration.get();\n const requests: Array<RequestBuilder> = [];\n requests.push(OVPBaseEntryService.list(config.serviceUrl, params.ks, params.entryId, params.redirectFromEntryId, params.referenceId));\n // Use the entry id from the request result to support loading by referenceId\n const serviceEntryId = params.ks === '{1:result:ks}' ? '{2:result:objects:0:id}' : '{1:result:objects:0:id}';\n requests.push(OVPBaseEntryService.getPlaybackContext(config.serviceUrl, params.ks, serviceEntryId));\n requests.push(OVPMetadataService.list(config.serviceUrl, params.ks, serviceEntryId));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!(this._entryId || this._referenceId);\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\n\nconst SERVICE_NAME: string = 'session';\n\nexport default class OVPSessionService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for session.startWidgetSession\n * @function anonymousSession\n * @param {string} serviceUrl The service base URL\n * @param {string} widgetId The widget ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static anonymousSession(serviceUrl: string, widgetId: string): RequestBuilder {\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'startWidgetSession';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'session-startWidget';\n request.params = {widgetId};\n return request;\n }\n}\n","//@flow\nimport OVPSessionService from '../services/session-service';\nimport OVPConfiguration from '../config';\nimport RequestBuilder from '../../../util/request-builder';\n\nexport default class OVPSessionLoader implements ILoader {\n _widgetId: string;\n _requests: Array<RequestBuilder>;\n _response: any = {};\n\n static get id(): string {\n return 'session';\n }\n\n set requests(requests: Array<RequestBuilder>) {\n this._requests = requests;\n }\n\n get requests(): Array<RequestBuilder> {\n return this._requests;\n }\n\n set response(response: any) {\n this._response.ks = response[0].data.ks;\n }\n\n get response(): any {\n return this._response.ks;\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._widgetId = params.widgetId;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array<RequestBuilder> {\n const config = OVPConfiguration.get();\n const requests: Array<RequestBuilder> = [];\n requests.push(OVPSessionService.anonymousSession(config.serviceUrl, params.widgetId));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!this._widgetId;\n }\n}\n","// @flow\nimport DataLoaderManager from '../../common/data-loader-manager';\nimport OVPService from '../services/ovp-service';\n\n/**\n * OTTDataLoaderManager is a class that handles the OVP data loading\n * @param {string} playerVersion - player version\n * @param {string} partnerId - partner id\n * @param {string} ks - ks\n * @param {ProviderNetworkRetryParameters} [networkRetryConfig] - network retry configuration\n */\nexport default class OVPDataLoaderManager extends DataLoaderManager {\n constructor(playerVersion: string, partnerId: number, ks: string = '', networkRetryConfig: ProviderNetworkRetryParameters) {\n super(networkRetryConfig);\n this._multiRequest = OVPService.getMultiRequest(playerVersion, ks, partnerId);\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\nimport {BaseEntryResponseProfile} from '../request-params/base-entry-response-profile';\n\nconst SERVICE_NAME: string = 'playlist';\n\nexport default class OVPPlaylistService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for playlist.getPlaybackContext\n * @function getPlaybackContext\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The ks\n * @param {string} playlistId The playlist ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static execute(serviceUrl: string, ks: string, playlistId: string): RequestBuilder {\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'execute';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = `${SERVICE_NAME}-execute`;\n request.params = {\n ks: ks,\n id: playlistId,\n responseProfile: new BaseEntryResponseProfile()\n };\n return request;\n }\n\n /**\n * Creates an instance of RequestBuilder for playlist.list\n * @function list\n * @param {string} serviceUrl The base URL\n * @param {string} ks The ks\n * @param {string} playlistId The playlist ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static get(serviceUrl: string, ks: string, playlistId: string): RequestBuilder {\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'get';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = `${SERVICE_NAME}-get`;\n request.params = {\n ks: ks,\n id: playlistId,\n responseProfile: {\n fields: 'id,name,description,thumbnailUrl',\n type: 1\n }\n };\n return request;\n }\n}\n","//@flow\n\nexport class KalturaPlaylist {\n /**\n * @member - playlist id\n * @type {string}\n */\n id: string;\n /**\n * @member - playlist name\n * @type {string}\n */\n name: string;\n /**\n * @member - playlist description\n * @type {string}\n */\n description: string;\n /**\n * @member - playlist poster image\n * @type {string}\n */\n poster: string;\n\n /**\n * @constructor\n * @param {Object} playlist - The json response\n */\n constructor(playlist: Object) {\n this.id = playlist.id;\n this.name = playlist.name;\n this.description = playlist.description;\n this.poster = playlist.thumbnailUrl;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaMediaEntry} from './kaltura-media-entry';\n\nexport class KalturaMediaEntries extends ServiceResult {\n /**\n * @member - The entries\n * @type {Array<KalturaMediaEntry>}\n */\n entries: Array<KalturaMediaEntry>;\n\n /**\n * @constructor\n * @param {Object} responseObj The json response\n */\n constructor(responseObj: Object) {\n super(responseObj);\n if (!this.hasError) {\n this.entries = [];\n responseObj.map(entry => this.entries.push(new KalturaMediaEntry(entry)));\n }\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OVPPlaylistService from '../services/playlist-service';\nimport OVPConfiguration from '../config';\nimport {KalturaPlaylist} from '../response-types/kaltura-playlist';\nimport {KalturaMediaEntries} from '../response-types/kaltura-media-entries';\n\nexport default class OVPPlaylistLoader implements ILoader {\n _playlistId: string;\n _requests: Array<RequestBuilder>;\n _response: any = {};\n\n static get id(): string {\n return 'playlist';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._playlistId = params.playlistId;\n }\n\n set requests(requests: Array<RequestBuilder>) {\n this._requests = requests;\n }\n\n get requests(): Array<RequestBuilder> {\n return this._requests;\n }\n\n set response(response: any) {\n this._response.playlistData = new KalturaPlaylist(response[0].data);\n this._response.playlistItems = new KalturaMediaEntries(response[1].data);\n }\n\n get response(): any {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array<RequestBuilder> {\n const config = OVPConfiguration.get();\n const requests: Array<RequestBuilder> = [];\n requests.push(OVPPlaylistService.get(config.serviceUrl, params.ks, params.playlistId));\n requests.push(OVPPlaylistService.execute(config.serviceUrl, params.ks, params.playlistId));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!this._playlistId;\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OVPConfiguration from '../config';\nimport OVPBaseEntryService from '../services/base-entry-service';\nimport {KalturaBaseEntryListResponse} from '../response-types/kaltura-base-entry-list-response';\n\nexport default class OVPEntryListLoader implements ILoader {\n _entries: Array<string>;\n _requests: Array<RequestBuilder>;\n _response: any = {playlistItems: {entries: []}};\n\n static get id(): string {\n return 'entry_list';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._entries = params.entries;\n }\n\n set requests(requests: Array<RequestBuilder>) {\n this._requests = requests;\n }\n\n get requests(): Array<RequestBuilder> {\n return this._requests;\n }\n\n set response(response: any) {\n let mediaEntryResponse: KalturaBaseEntryListResponse;\n response.forEach(item => {\n mediaEntryResponse = new KalturaBaseEntryListResponse(item.data);\n this._response.playlistItems.entries.push(mediaEntryResponse.entries[0]);\n });\n }\n\n get response(): any {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array<RequestBuilder> {\n const config = OVPConfiguration.get();\n const requests: Array<RequestBuilder> = [];\n params.entries.forEach(entry => {\n requests.push(OVPBaseEntryService.list(config.serviceUrl, params.ks, entry.entryId || entry, params.redirectFromEntryId, entry.referenceId));\n });\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!(this._entries && this._entries.length);\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\n\nexport class KalturaUIConfResponse extends ServiceResult {\n static Type: {[type: string]: number} = {\n PLAYER: 1,\n CONTRIBUTION_WIZARD: 2,\n SIMPLE_EDITOR: 3,\n ADVANCED_EDITOR: 4,\n PLAYLIST: 5,\n APP_STUDIO: 6,\n KRECORD: 7,\n PLAYER_V3: 8,\n KMC_ACCOUNT: 9,\n KMC_ANALYTICS: 10,\n KMC_CONTENT: 11,\n KMC_DASHBOARD: 12,\n KMC_LOGIN: 13,\n PLAYER_SL: 14,\n CLIENTSIDE_ENCODER: 15,\n KMC_GENERAL: 16,\n KMC_ROLES_AND_PERMISSIONS: 17,\n CLIPPER: 18,\n KSR: 19,\n KUPLOAD: 20,\n WEBCASTING: 21\n };\n\n static CreationMode: {[mode: string]: number} = {\n WIZARD: 2,\n ADVANCED: 3\n };\n\n description: string;\n objTypeAsString: string;\n width: number;\n height: number;\n htmlParams: string;\n swfUrl: string;\n confFilePath: string;\n confFile: string;\n confFileFeatures: string;\n name: string;\n config: string;\n confVars: string;\n useCdn: boolean;\n tags: string;\n swfUrlVersion: string;\n created: Date;\n updated: Date;\n html5Url: string;\n version: string;\n partnerTags: string;\n objType: number;\n creationMode: number;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: Object) {\n super(data);\n if (!this.hasError) {\n this.name = data.name;\n this.description = data.description;\n this.objTypeAsString = data.objTypeAsString;\n this.width = data.width;\n this.height = data.height;\n this.htmlParams = data.htmlParams;\n this.swfUrl = data.swfUrl;\n this.confFilePath = data.confFilePath;\n this.confFile = data.confFile;\n this.confFileFeatures = data.confFileFeatures;\n this.config = data.config;\n this.confVars = data.confVars;\n this.useCdn = data.useCdn;\n this.tags = data.tags;\n this.swfUrlVersion = data.swfUrlVersion;\n this.created = new Date(0);\n this.created.setUTCSeconds(data.createdAt);\n this.updated = new Date(0);\n this.updated.setUTCSeconds(data.updatedAt);\n this.html5Url = data.description;\n this.version = data.description;\n this.partnerTags = data.description;\n this.objType = data.description;\n this.creationMode = data.description;\n }\n }\n}\n","//@flow\nimport getLogger from '../../util/logger';\nimport OVPConfiguration from './config';\nimport {KalturaAccessControlModifyRequestHostRegexAction} from './response-types';\nimport OVPMediaEntryLoader from './loaders/media-entry-loader';\n\nclass RegexActionHandler {\n static _logger = getLogger('RegexActionHandler');\n\n /**\n * Applies the request host regex on the url\n * @function _applyRegexAction\n * @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action\n * @param {string} url - The url to modify\n * @returns {string} - The request host regex applied url\n * @static\n * @private\n */\n static _applyRegexAction(regexAction: KalturaAccessControlModifyRequestHostRegexAction, url: string): string {\n if (regexAction) {\n const regex = new RegExp(regexAction.pattern, 'i');\n if (url.match(regex)) {\n return url.replace(regex, regexAction.replacement + '/');\n }\n }\n return url;\n }\n\n /**\n * Ping the ECDN url to check if alive\n * @function _pingECDNUrl\n * @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action\n * @param {string} cdnUrl - The CDN url\n * @returns {Promise<boolean>} - Whether the media config sources urls should be modified or not\n * @static\n * @private\n */\n static async _isECDNUrlAlive(regexAction: KalturaAccessControlModifyRequestHostRegexAction, cdnUrl: string) {\n const urlPing = cdnUrl + '/api_v3/service/system/action/ping/format/1';\n const req = new XMLHttpRequest();\n req.open('GET', urlPing);\n req.timeout = regexAction.checkAliveTimeoutMs;\n req.onreadystatechange = () => {\n if (req.readyState === 4) {\n if (req.status === 200) {\n return true;\n }\n return false;\n }\n };\n req.ontimeout = () => {\n RegexActionHandler._logger.warn(`Got timeout while pinging the ECDN url. the ping url: ${urlPing}`);\n return false;\n };\n req.send();\n }\n\n /**\n * Handles regex action\n * @function handleRegexAction\n * @param {ProviderMediaConfigObject} mediaConfig - The media config\n * @param {Map<string, Function>} rawResponse - The raw response data from backend\n * @returns {Promise<ProviderMediaConfigObject>} - The media config with old or modified urls\n * @static\n */\n static async handleRegexAction(mediaConfig: ProviderMediaConfigObject, rawResponse: Map<string, Function>): Promise<ProviderMediaConfigObject> {\n let cdnUrl = OVPConfiguration.get().cdnUrl;\n const regexAction = RegexActionHandler._extractRegexActionFromData(rawResponse);\n const regExp = RegexActionHandler._getRegExp(regexAction);\n\n if (\n cdnUrl &&\n regexAction &&\n regExp &&\n cdnUrl.match(regExp) &&\n // we need to make the replacement in all cases except for when the checkAliveTimeoutMs > 0 && the ping has failed\n !(\n regexAction.checkAliveTimeoutMs > 0 &&\n !(await RegexActionHandler._isECDNUrlAlive(regexAction, cdnUrl.replace(regExp, regexAction.replacement)))\n )\n ) {\n RegexActionHandler._replaceHostUrls(mediaConfig, regexAction);\n return mediaConfig;\n }\n\n RegexActionHandler._logger.debug('exiting handleRegexAction - not applying regex action.');\n return mediaConfig;\n }\n\n /**\n * Modify the host urls - injects the configured cdn before the original host, to route requests\n * @function _replaceHostUrls\n * @param {ProviderMediaConfigObject} mediaConfig - The media config\n * @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action\n * @returns {void}\n * @static\n * @private\n */\n static _replaceHostUrls(mediaConfig: ProviderMediaConfigObject, regexAction: KalturaAccessControlModifyRequestHostRegexAction) {\n RegexActionHandler._logger.debug(`Starting to modify urls...`);\n const sources = mediaConfig.sources;\n const {hls, dash, progressive, image} = sources;\n\n [...hls, ...dash, ...progressive, ...image].forEach(src => (src.url = RegexActionHandler._applyRegexAction(regexAction, src.url)));\n\n if (!OVPConfiguration.get().replaceHostOnlyManifestUrls) {\n RegexActionHandler._logger.debug(`replaceHostOnlyManifestUrls flag is off - modifying captions and poster URLs`);\n if (sources.captions) {\n sources.captions.forEach(src => (src.url = RegexActionHandler._applyRegexAction(regexAction, src.url)));\n }\n\n // fix flow - poster can also be an array, but only for ott.\n if (typeof sources.poster === 'string') {\n sources.poster = RegexActionHandler._applyRegexAction(regexAction, sources.poster);\n }\n }\n RegexActionHandler._logger.debug(`Finished modifying urls`);\n }\n\n /**\n * Extracts the regex action from the data response\n * @function _extractRegexActionFromData\n * @param {Map<string, Function>} data - The response data\n * @returns {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action\n * @static\n * @private\n */\n static _extractRegexActionFromData(data: Map<string, Function>): ?KalturaAccessControlModifyRequestHostRegexAction {\n return data.get(OVPMediaEntryLoader.id)?.response?.playBackContextResult.getRequestHostRegexAction();\n }\n\n /**\n * Extracts the regex action from the data response\n * @function _extractRegexActionFromData\n * @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action\n * @returns {RegExp} The regex expression\n * @static\n * @private\n */\n static _getRegExp(regexAction: KalturaAccessControlModifyRequestHostRegexAction): ?RegExp {\n if (regexAction && regexAction.pattern && regexAction.replacement) {\n return new RegExp(regexAction.pattern, 'i');\n }\n }\n}\n\nexport default RegexActionHandler;\n","//@flow\nimport getLogger from '../../util/logger';\nimport OVPConfiguration from './config';\nimport OVPProviderParser from './provider-parser';\nimport {KalturaMediaEntry} from './response-types/kaltura-media-entry';\nimport OVPMediaEntryLoader from './loaders/media-entry-loader';\nimport OVPSessionLoader from './loaders/session-loader';\nimport OVPDataLoaderManager from './loaders/data-loader-manager';\nimport OVPPlaylistLoader from './loaders/playlist-loader';\nimport BaseProvider from '../common/base-provider';\nimport MediaEntry from '../../entities/media-entry';\nimport OVPEntryListLoader from './loaders/entry-list-loader';\nimport Error from '../../util/error/error';\nimport RegexActionHandler from './regex-action-handler';\n\nexport default class OVPProvider extends BaseProvider<OVPProviderMediaInfoObject> {\n _filterOptionsConfig: ProviderFilterOptionsObject = {redirectFromEntryId: true};\n /**\n * @constructor\n * @param {ProviderOptionsObject} options - provider options\n * @param {string} playerVersion - player version\n */\n constructor(options: ProviderOptionsObject, playerVersion: string) {\n super(options, playerVersion);\n this._logger = getLogger('OVPProvider');\n OVPConfiguration.set(options.env);\n this._setFilterOptionsConfig(options.filterOptions);\n this._networkRetryConfig = Object.assign(this._networkRetryConfig, options.networkRetryParameters);\n }\n\n get env() {\n return OVPConfiguration.get();\n }\n\n /**\n * Gets the backend media config object.\n * @param {OVPProviderMediaInfoObject} mediaInfo - ovp media info\n * @returns {Promise<ProviderMediaConfigObject>} - The provider media config\n */\n getMediaConfig(mediaInfo: OVPProviderMediaInfoObject): Promise<ProviderMediaConfigObject> {\n if (mediaInfo.ks) {\n this.ks = mediaInfo.ks;\n this._isAnonymous = false;\n }\n if (this.widgetId !== this.defaultWidgetId) {\n this._isAnonymous = false;\n }\n this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const entryId = mediaInfo.entryId;\n const referenceId = mediaInfo.referenceId;\n if (entryId || referenceId) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n const redirectFromEntryId = this._getEntryRedirectFilter(mediaInfo);\n this._dataLoader.add(OVPMediaEntryLoader, {entryId, ks, redirectFromEntryId, referenceId});\n return this._dataLoader.fetchData().then(\n response => {\n try {\n const mediaConfig = this._parseDataFromResponse(response);\n RegexActionHandler.handleRegexAction(mediaConfig, response).then(resolve);\n } catch (err) {\n reject(err);\n }\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject(new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.MISSING_MANDATORY_PARAMS, {message: 'missing entry id'}));\n }\n });\n }\n\n doRequest(loaders: Array<RequestLoader>, ks?: string): Promise<any> {\n let theKs: string = ks || this.ks;\n const dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, theKs, this._networkRetryConfig);\n\n return new Promise((resolve, reject) => {\n if (!theKs) {\n dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n loaders.forEach((loaderRequest: RequestLoader) => {\n dataLoader.add(loaderRequest.loader, loaderRequest.params, theKs || '{1:result:ks}');\n });\n return dataLoader.fetchData().then(\n response => {\n try {\n resolve(response);\n } catch (err) {\n reject(err);\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n\n _getEntryRedirectFilter(mediaInfo: Object): boolean {\n return typeof mediaInfo.redirectFromEntryId === 'boolean'\n ? mediaInfo.redirectFromEntryId\n : typeof this._filterOptionsConfig.redirectFromEntryId === 'boolean'\n ? this._filterOptionsConfig.redirectFromEntryId\n : true;\n }\n\n _setFilterOptionsConfig(options?: ProviderFilterOptionsObject): void {\n if (options && typeof options.redirectFromEntryId == 'boolean') {\n this._filterOptionsConfig.redirectFromEntryId = options.redirectFromEntryId;\n }\n }\n\n _parseDataFromResponse(data: Map<string, Function>): ProviderMediaConfigObject {\n this._logger.debug('Data parsing started');\n const mediaConfig: ProviderMediaConfigObject = {\n session: {\n isAnonymous: this._isAnonymous,\n partnerId: this.partnerId\n },\n sources: this._getDefaultSourcesObject(),\n plugins: {}\n };\n\n if (this.uiConfId) {\n mediaConfig.session.uiConfId = this.uiConfId;\n }\n\n if (data) {\n if (data.has(OVPSessionLoader.id)) {\n const sessionLoader = data.get(OVPSessionLoader.id);\n if (sessionLoader && sessionLoader.response) {\n mediaConfig.session.ks = sessionLoader.response;\n if (this.widgetId !== this.defaultWidgetId) {\n this.ks = mediaConfig.session.ks;\n }\n }\n } else {\n mediaConfig.session.ks = this.ks;\n }\n if (data.has(OVPMediaEntryLoader.id)) {\n const mediaLoader = data.get(OVPMediaEntryLoader.id);\n if (mediaLoader && mediaLoader.response) {\n const response = (mediaLoader: OVPMediaEntryLoader).response;\n if (OVPProviderParser.hasBlockAction(response)) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.BLOCK_ACTION, {\n action: OVPProviderParser.getBlockAction(response),\n messages: OVPProviderParser.getErrorMessages(response)\n });\n }\n const mediaEntry = OVPProviderParser.getMediaEntry(this.isAnonymous ? '' : this.ks, this.partnerId, this.uiConfId, response);\n Object.assign(mediaConfig.sources, this._getSourcesObject(mediaEntry));\n this._verifyMediaStatus(mediaEntry);\n this._verifyHasSources(mediaConfig.sources);\n const bumper = OVPProviderParser.getBumper(response, this.isAnonymous ? '' : this.ks, this.partnerId);\n if (bumper) {\n Object.assign(mediaConfig.plugins, {bumper});\n }\n }\n }\n }\n this._logger.debug('Data parsing finished', mediaConfig);\n return mediaConfig;\n }\n\n /**\n * Checks if media is ready for playback (not being imported or converted)\n * @param {MediaEntry} mediaEntry - the media entry info\n * @returns {void}\n */\n _verifyMediaStatus(mediaEntry: MediaEntry) {\n if ([KalturaMediaEntry.EntryStatus.IMPORT, KalturaMediaEntry.EntryStatus.PRECONVERT].includes(mediaEntry.status)) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MEDIA_STATUS_NOT_READY, {\n messages: `Status of entry id ${mediaEntry.id} is ${mediaEntry.status} and is still being imported or converted`,\n data: {status}\n });\n }\n }\n /**\n * Gets the backend playlist config.\n * @param {ProviderPlaylistInfoObject} playlistInfo - ovp playlist info\n * @returns {Promise<ProviderPlaylistObject>} - The provider playlist config\n */\n getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise<ProviderPlaylistObject> {\n if (playlistInfo.ks) {\n this.ks = playlistInfo.ks;\n this._isAnonymous = false;\n }\n if (this.widgetId !== this.defaultWidgetId) {\n this._isAnonymous = false;\n }\n this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const playlistId = playlistInfo.playlistId;\n if (playlistId) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n this._dataLoader.add(OVPPlaylistLoader, {playlistId, ks});\n this._dataLoader.fetchData().then(\n response => {\n resolve(this._parsePlaylistDataFromResponse(response));\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject({success: false, data: 'Missing mandatory parameter'});\n }\n });\n }\n\n _parsePlaylistDataFromResponse(data: Map<string, Function>): ProviderPlaylistObject {\n this._logger.debug('Data parsing started');\n const playlistConfig: ProviderPlaylistObject = this._getPlaylistObject();\n if (data && data.has(OVPPlaylistLoader.id)) {\n const playlistLoader = data.get(OVPPlaylistLoader.id);\n if (playlistLoader && playlistLoader.response) {\n const playlist = OVPProviderParser.getPlaylist(playlistLoader.response);\n playlistConfig.id = playlist.id;\n playlistConfig.poster = playlist.poster;\n playlistConfig.metadata.name = playlist.name;\n playlistConfig.metadata.description = playlist.description;\n playlist.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));\n }\n }\n this._logger.debug('Data parsing finished', playlistConfig);\n return playlistConfig;\n }\n\n /**\n * Gets playlist config from entry list.\n * @param {ProviderEntryListObject} entryListInfo - ovp entry list info\n * @returns {Promise<ProviderPlaylistObject>} - The provider playlist config\n */\n getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise<ProviderPlaylistObject> {\n if (entryListInfo.ks) {\n this.ks = entryListInfo.ks;\n this._isAnonymous = false;\n }\n if (this.widgetId !== this.defaultWidgetId) {\n this._isAnonymous = false;\n }\n this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const entries = entryListInfo.entries;\n if (entries && entries.length) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n const redirectFromEntryId = this._getEntryRedirectFilter(entryListInfo);\n this._dataLoader.add(OVPEntryListLoader, {entries, ks, redirectFromEntryId});\n this._dataLoader.fetchData(false).then(\n response => {\n resolve(this._parseEntryListDataFromResponse(response));\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject({success: false, data: 'Missing mandatory parameter'});\n }\n });\n }\n\n _parseEntryListDataFromResponse(data: Map<string, Function>): ProviderPlaylistObject {\n this._logger.debug('Data parsing started');\n const playlistConfig: ProviderPlaylistObject = this._getPlaylistObject();\n if (data && data.has(OVPEntryListLoader.id)) {\n const playlistLoader = data.get(OVPEntryListLoader.id);\n if (playlistLoader && playlistLoader.response) {\n const entryList = OVPProviderParser.getEntryList(playlistLoader.response);\n entryList.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));\n }\n }\n this._logger.debug('Data parsing finished', playlistConfig);\n return playlistConfig;\n }\n\n _getPlaylistObject(): ProviderPlaylistObject {\n return {\n id: '',\n metadata: {\n name: '',\n description: ''\n },\n poster: '',\n items: []\n };\n }\n\n _getDefaultSourcesObject(): ProviderMediaConfigSourcesObject {\n return {\n hls: [],\n dash: [],\n progressive: [],\n image: [],\n id: '',\n duration: 0,\n type: MediaEntry.Type.UNKNOWN,\n poster: '',\n dvr: false,\n vr: null,\n metadata: {\n name: '',\n description: '',\n tags: ''\n }\n };\n }\n\n _getSourcesObject(mediaEntry: MediaEntry) {\n const sourcesObject: ProviderMediaConfigSourcesObject = this._getDefaultSourcesObject();\n const mediaSources = mediaEntry.sources.toJSON();\n sourcesObject.hls = mediaSources.hls;\n sourcesObject.dash = mediaSources.dash;\n sourcesObject.progressive = mediaSources.progressive;\n sourcesObject.image = mediaSources.image;\n sourcesObject.id = mediaEntry.id;\n sourcesObject.duration = mediaEntry.duration;\n sourcesObject.type = mediaEntry.type;\n sourcesObject.dvr = !!mediaEntry.dvrStatus;\n sourcesObject.poster = mediaEntry.poster;\n if (mediaEntry.sources.captions) {\n sourcesObject.captions = mediaEntry.sources.captions;\n }\n if (mediaEntry.metadata && typeof mediaEntry.metadata.tags === 'string' && mediaEntry.metadata.tags.split(', ').includes('360')) {\n sourcesObject.vr = {};\n }\n Object.assign(sourcesObject.metadata, mediaEntry.metadata);\n return sourcesObject;\n }\n}\n","// @flow\nimport OVPProvider from './provider';\nimport OVPProviderParser from './provider-parser';\nimport RequestBuilder from '../../util/request-builder';\nimport * as ResponseTypes from './response-types';\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst NAME = __NAME__ + '-ovp';\nconst VERSION = __VERSION__;\n\nexport {OVPProvider as Provider, OVPProviderParser as ProviderParser, NAME, VERSION, RequestBuilder, ResponseTypes};\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["./providers/webpack/universalModuleDefinition","./providers/webpack/bootstrap","./providers/./util/error/error.js","./providers/./util/error/severity.js","./providers/./util/error/category.js","./providers/./util/error/code.js","./providers/./entities/media-entry.js","./providers/./util/logger.js","./providers/./util/request-builder.js","./providers/./k-provider/common/base-service-result.js","./providers/./entities/media-format.js","./providers/./k-provider/common/response-types/kaltura-drm-playback-plugin-data.js","./providers/./k-provider/common/response-types/kaltura-access-control-message.js","./providers/./entities/media-sources.js","./providers/./entities/media-source.js","./providers/./k-provider/common/data-loader-manager.js","./providers/./k-provider/common/multi-request-builder.js","./providers/./entities/drm.js","./providers/./entities/image-source.js","./providers/./k-provider/common/base-provider.js","./providers/./util/clone.js","./providers/./entities/entry-list.js","./providers/./entities/bumper.js","./providers/./k-provider/ovp/config.js","./providers/./k-provider/ovp/response-types/kaltura-playback-source.js","./providers/./k-provider/ovp/response-types/kaltura-rule-action.js","./providers/./k-provider/ovp/response-types/kaltura-access-control-modify-request-host-regex-action.js","./providers/./k-provider/ovp/response-types/kaltura-flavor-asset.js","./providers/./k-provider/ovp/response-types/kaltura-bumper.js","./providers/./k-provider/ovp/response-types/kaltura-playback-context.js","./providers/./k-provider/ovp/response-types/kaltura-metadata.js","./providers/./k-provider/ovp/response-types/kaltura-metadata-list-response.js","./providers/./k-provider/ovp/response-types/kaltura-media-entry.js","./providers/./k-provider/ovp/play-source-url-builder.js","./providers/./util/xml-parser.js","./providers/./entities/playlist.js","./providers/./k-provider/ovp/external-captions-builder.js","./providers/./k-provider/ovp/provider-parser.js","./providers/./k-provider/ovp/services/ovp-service.js","./providers/./k-provider/ovp/request-params/base-entry-response-profile.js","./providers/./k-provider/ovp/services/base-entry-service.js","./providers/./k-provider/ovp/services/meta-data-service.js","./providers/./k-provider/ovp/response-types/kaltura-base-entry-list-response.js","./providers/./k-provider/ovp/loaders/media-entry-loader.js","./providers/./k-provider/ovp/services/session-service.js","./providers/./k-provider/ovp/loaders/session-loader.js","./providers/./k-provider/ovp/loaders/data-loader-manager.js","./providers/./k-provider/ovp/services/playlist-service.js","./providers/./k-provider/ovp/response-types/kaltura-playlist.js","./providers/./k-provider/ovp/response-types/kaltura-media-entries.js","./providers/./k-provider/ovp/loaders/playlist-loader.js","./providers/./k-provider/ovp/loaders/entry-list-loader.js","./providers/./k-provider/ovp/response-types/kaltura-ui-conf-response.js","./providers/./k-provider/ovp/regex-action-handler.js","./providers/./k-provider/ovp/provider.js","./providers/./k-provider/ovp/index.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Error","severity","category","code","data","this","_logger","error","RECOVERABLE","CRITICAL","NETWORK","SERVICE","PROVIDER","UNSUPPORTED_SCHEME","BAD_HTTP_STATUS","HTTP_ERROR","TIMEOUT","MALFORMED_DATA_URI","BAD_SERVER_RESPONSE","MULTIREQUEST_API_ERROR","API_RESPONSE_MISMATCH","ERROR","BLOCK_ACTION","MEDIA_STATUS_NOT_READY","MISSING_MANDATORY_PARAMS","MISSING_PLAY_SOURCE","METHOD_NOT_IMPLEMENTED","getLogger","MediaEntry","metadata","Map","sources","MediaSources","type","Type","UNKNOWN","toJSON","id","duration","dvrStatus","status","poster","assetReferenceType","VOD","LIVE","IMAGE","AUDIO","ON","OFF","JsLogger","VERSION","DEBUG","INFO","TIME","TRACE","WARN","createDefaultHandler","debug","enabledFor","getLevel","info","log","setHandler","setLevel","time","timeEnd","trace","useDefaults","warn","LogLevel","setLogger","logger","getLogLevel","setLogLevel","level","RequestBuilder","headers","async","timeout","maxAttempts","getUrl","serviceUrl","service","action","doHttpRequest","promise","Promise","resolve","reject","_requestPromise","url","Severity","Category","Code","_createXHR","request","XMLHttpRequest","onreadystatechange","readyState","response","JSON","parse","responseText","responseHeaders","_getResponseHeaders","_createError","text","open","method","retryConfig","requestTime","performance","now","ontimeout","_handleError","statusText","onerror","onabort","forEach","setRequestHeader","send","params","getAllResponseHeaders","split","filter","header","toLowerCase","indexOf","_attemptCounter","assign","attempt","ServiceResult","objectType","hasError","ServiceError","message","MediaFormat","DASH","mimeType","pathExt","HLS","WVM","MP4","MP3","SupportedStreamFormat","isProgressiveSource","formatName","sourceFormat","KalturaDrmPlaybackPluginData","drm","scheme","licenseURL","certificate","WIDEVINE_CENC","PLAYREADY_CENC","FAIRPLAY","KalturaAccessControlMessage","progressive","dash","hls","image","map","source","mediaFormat","push","h","MediaSource","mimetype","bandwidth","width","height","label","drmData","length","Array","isArray","DataLoaderManager","networkRetryConfig","_networkRetryConfig","add","loader","ks","execution_loader","isValid","_loaders","set","startIndex","_multiRequest","requests","executionLoaderResponseMap","from","val","index","_loadersResponseMap","fetchData","requestsMustSucceed","execute","then","_multiResponse","prepareData","success","err","loaderDataIndexes","results","slice","MultiRequestBuilder","requestParams","serviceDef","stringify","FAILED_PARSING_REQUEST","multiRequestResult","MultiRequestResult","result","errorResults","serviceResult","Drm","licenseUrl","ImageSource","entry","extractBaseThumbnailUrl","dataUrl","match","BaseProvider","options","playerVersion","_partnerId","partnerId","_widgetId","widgetId","_uiConfId","uiConfId","_isAnonymous","_ks","_playerVersion","defaultWidgetId","getMediaConfig","mediaInfo","getPlaylistConfig","playlistInfo","getEntryListConfig","entryListInfo","_verifyHasSources","concat","messages","clone","node","e","keys","EntryList","items","Bumper","clickThroughUrl","defaultConfig","cdnUrl","serviceParams","apiVersion","format","useApiCaptions","loadThumbnailWithKs","replaceHostOnlyManifestUrls","OVPConfiguration","clientConfig","KalturaPlaybackSource","deliveryProfileId","protocols","flavorIds","hasDrmData","hasFlavorIds","getProtocol","protocol","returnValue","KalturaRuleAction","DRM_POLICY","BLOCK","PREVIEW","LIMIT_FLAVORS","ADD_TO_STORAGE","LIMIT_DELIVERY_PROFILES","SERVE_FROM_REMOTE_SERVER","REQUEST_HOST_REGEX","LIMIT_THUMBNAIL_CAPTURE","KalturaAccessControlModifyRequestHostRegexAction","pattern","replacement","replacmenServerNodeId","checkAliveTimeoutMs","KalturaFlavorAsset","flavorParamsId","fileExt","bitrate","frameRate","isOriginal","isWeb","containerFormat","videoCodecId","language","QUEUED","CONVERTING","READY","DELETED","NOT_APPLICABLE","TEMP","WAIT_FOR_CONVERT","IMPORTING","VALIDATING","EXPORTING","KalturaBumper","entryId","KalturaPlaybackContext","actions","flavorAssets","flavor","bumperData","bumper","hasBlockAction","undefined","getBlockAction","find","getErrorMessages","getRequestHostRegexAction","KalturaMetadata","metadataProfileId","metadataProfileVersion","metadataObjectType","objectId","version","created","Date","setUTCSeconds","createdAt","updated","updatedAt","xml","AD_CUE_POINT","ANNOTATION","CODE_CUE_POINT","THUMB_CUE_POINT","ENTRY","CATEGORY","USER","PARTNER","DYNAMIC_OBJECT","VALID","INVALID","KalturaMetadataListResponse","responseObj","totalCount","metas","objects","meta","KalturaMediaEntry","referenceId","externalSourceType","description","entryType","mediaType","flavorParamsIds","thumbnailUrl","tags","endDate","AUTOMATIC","EXTERNAL_MEDIA","MEDIA_CLIP","MIX","PLAYLIST","DATA","LIVE_STREAM","LIVE_CHANNEL","DOCUMENT","VIDEO","LIVE_STREAM_FLASH","LIVE_STREAM_WINDOWS_MEDIA","LIVE_STREAM_REAL_MEDIA","LIVE_STREAM_QUICK_TIME","ERROR_IMPORTING","ERROR_CONVERTING","SCAN_FAILURE","IMPORT","INFECTED","PRECONVERT","PENDING","MODERATE","BLOCKED","NO_CONTENT","PENDING_MODERATION","APPROVED","REJECTED","FLAGGED_FOR_REVIEW","AUTO_APPROVED","PlaySourceUrlBuilder","build","urlParams","config","serviceUrlOrigin","substr","lastIndexOf","extension","isNaN","Number","parseInt","playUrl","endsWith","XmlParser","xmlToJson","obj","nodeType","attributes","j","attribute","item","nodeName","nodeValue","hasChildNodes","childNodes","old","Playlist","KalturaCaptionType","SRT","DFXP","WEBVTT","CAP","CaptionsFormatsMap","ExternalCaptionsBuilder","createConfig","captions","caption","includes","webVttUrl","addKsToUrl","default","isDefault","languageCode","OVPProviderParser","getMediaEntry","mediaEntryResponse","mediaEntry","playbackContext","playBackContextResult","metadataList","metadataListResult","kalturaSources","_getParsedSources","_fillBaseData","playbackCaptions","ksParam","replace","getPlaylist","playlistResponse","playlist","playlistData","playlistItems","entries","getEntryList","entryList","getBumper","assetResponse","progressiveBumper","parsedSources","_parseProgressiveSources","_parseMetadata","_getEntryType","entryTypeEnum","typeEnum","MediaType","EntryType","progressiveSource","mediaSource","addAdaptiveSource","parsedSource","_parseAdaptiveSource","_getBaseProtocol","kalturaSource","drmParams","Scheme","videoSources","audioSources","sourceId","metaXml","domParser","DOMParser","parseFromString","metasObj","exec","document","location","OVPService","getMultiRequest","ovpParams","clientTag","multiReq","BaseEntryResponseProfile","responseProfile","INCLUDE_FIELDS","fields","EXCLUDE_FIELDS","OVPBaseEntryService","getPlaybackContext","serviceEntryId","tag","contextDataParams","flavorTags","list","redirectFromEntryId","getEntryListReqParams","filterParams","idEqual","referenceIdEqual","OVPMetadataService","objectIdEqual","metadataObjectTypeEqual","KalturaBaseEntryListResponse","OVPMediaEntryLoader","buildRequests","_entryId","_referenceId","_requests","_response","OVPSessionService","anonymousSession","OVPSessionLoader","OVPDataLoaderManager","OVPPlaylistService","playlistId","SERVICE_NAME","KalturaPlaylist","KalturaMediaEntries","OVPPlaylistLoader","_playlistId","OVPEntryListLoader","_entries","KalturaUIConfResponse","objTypeAsString","htmlParams","swfUrl","confFilePath","confFile","confFileFeatures","confVars","useCdn","swfUrlVersion","html5Url","partnerTags","objType","creationMode","PLAYER","CONTRIBUTION_WIZARD","SIMPLE_EDITOR","ADVANCED_EDITOR","APP_STUDIO","KRECORD","PLAYER_V3","KMC_ACCOUNT","KMC_ANALYTICS","KMC_CONTENT","KMC_DASHBOARD","KMC_LOGIN","PLAYER_SL","CLIENTSIDE_ENCODER","KMC_GENERAL","KMC_ROLES_AND_PERMISSIONS","CLIPPER","KSR","KUPLOAD","WEBCASTING","WIZARD","ADVANCED","RegexActionHandler","_applyRegexAction","regexAction","regex","RegExp","_isECDNUrlAlive","urlPing","req","handleRegexAction","mediaConfig","rawResponse","_extractRegexActionFromData","regExp","_getRegExp","_replaceHostUrls","src","OVPProvider","env","_setFilterOptionsConfig","filterOptions","networkRetryParameters","_dataLoader","_getEntryRedirectFilter","_parseDataFromResponse","doRequest","loaders","theKs","dataLoader","loaderRequest","_filterOptionsConfig","session","isAnonymous","_getDefaultSourcesObject","plugins","has","sessionLoader","mediaLoader","_getSourcesObject","_verifyMediaStatus","EntryStatus","_parsePlaylistDataFromResponse","playlistConfig","_getPlaylistObject","playlistLoader","_parseEntryListDataFromResponse","dvr","vr","sourcesObject","mediaSources","NAME","__NAME__","__VERSION__"],"mappings":"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","file":"playkit-ovp-provider.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ovp\"] = factory();\n\telse\n\t\troot[\"playkit\"] = root[\"playkit\"] || {}, root[\"playkit\"][\"providers\"] = root[\"playkit\"][\"providers\"] || {}, root[\"playkit\"][\"providers\"][\"ovp\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 18);\n","//@flow\nimport getLogger from '../logger';\nimport {Severity} from './severity';\nimport type {SeverityType} from './severity';\nimport {Code} from './code';\nimport type {CodeType} from './code';\nimport {Category} from './category';\nimport type {CategoryType} from './category';\n\nconst CLASS_NAME: string = 'Error';\n\n/**\n * @classdesc This is a description of the error class.\n */\nexport default class Error {\n severity: number;\n category: number;\n code: number;\n data: any;\n /**\n * @enum {number}\n */\n static Severity: SeverityType = Severity;\n /**\n * @enum {number}\n */\n static Category: CategoryType = Category;\n /**\n * @enum {number}\n */\n static Code: CodeType = Code;\n static _logger: any = getLogger(CLASS_NAME);\n\n /**\n * @constructor\n * @param {number} severity - error's severity\n * @param {number} category - error's category.\n * @param {number} code - error's code.\n * @param {any} data - additional data for the error.\n */\n constructor(severity: number, category: number, code: number, data: any = {}) {\n this.severity = severity;\n this.category = category;\n this.code = code;\n this.data = data;\n Error._logger.error(`Category:${category} | Code:${code} |`, data);\n }\n}\n","//@flow\n\ntype SeverityType = {[severity: string]: number};\n\nconst Severity: SeverityType = {\n /**\n * An error occurred, but the Player is attempting to recover from the error.\n *\n * If the Player cannot ultimately recover, it still may not throw a CRITICAL\n * error. For example, retrying for a media segment will never result in\n * a CRITICAL error (the Player will just retry forever).\n */\n RECOVERABLE: 1,\n /**\n * A critical error that the library cannot recover from. These usually cause\n * the Player to stop loading or updating. A new manifest must be loaded\n * to reset the library.\n */\n CRITICAL: 2\n};\n\nexport {Severity};\nexport type {SeverityType};\n","//@flow\ntype CategoryType = {[category: string]: number};\n\nconst Category: CategoryType = {\n /** Errors from the network stack. */\n NETWORK: 1,\n SERVICE: 2,\n PROVIDER: 3\n};\n\nexport {Category};\nexport type {CategoryType};\n","//@flow\n\ntype CodeType = {[code: string]: number};\n\nconst Code: CodeType = {\n /**\n * A network request was made using an unsupported URI scheme.\n */\n UNSUPPORTED_SCHEME: 1000,\n\n /**\n * An HTTP network request returned an HTTP status that indicated a failure.\n */\n BAD_HTTP_STATUS: 1001,\n\n /**\n * An HTTP network request failed with an error, but not from the server.\n */\n HTTP_ERROR: 1002,\n\n /**\n * A network request timed out.\n */\n TIMEOUT: 1003,\n\n /**\n * A network request was made with a malformed data URI.\n */\n MALFORMED_DATA_URI: 1004,\n\n /**\n * The server responsded with 2xx response, but it couldn't be parsed\n */\n BAD_SERVER_RESPONSE: 1005,\n\n /**\n * The server response had a valid structure but contained an error from the API\n */\n MULTIREQUEST_API_ERROR: 1006,\n\n /**\n * The server response had a valid structure and valid API result, but it did not match the request\n */\n API_RESPONSE_MISMATCH: 1007,\n\n /**\n * The server responded with an error\n */\n ERROR: 2000,\n\n /**\n * The server responded with a block action\n */\n BLOCK_ACTION: 2001,\n\n /**\n * The server responded with status import or pre convert\n */\n MEDIA_STATUS_NOT_READY: 2002,\n\n /**\n * The provider is missing mandatory parameter/s\n */\n\n MISSING_MANDATORY_PARAMS: 3000,\n\n /**\n * The server responded with empty sources objects (for HLS, Dash and progressive)\n */\n MISSING_PLAY_SOURCE: 3001,\n\n /**\n * The provider doesn't implement the called api\n */\n METHOD_NOT_IMPLEMENTED: 3002\n};\n\nexport {Code};\nexport type {CodeType};\n","//@flow\nimport MediaSources from './media-sources';\n\nexport default class MediaEntry {\n static Type: {[type: string]: string} = {\n VOD: 'Vod',\n LIVE: 'Live',\n IMAGE: 'Image',\n AUDIO: 'Audio',\n UNKNOWN: 'Unknown'\n };\n static DvrStatus: {[type: string]: number} = {\n ON: 1,\n OFF: 0\n };\n\n /**\n * @member - entry id\n * @type {string}\n */\n id: string;\n /**\n * @member - entry name\n * @type {string}\n */\n name: string;\n /**\n * @member - entry sources\n * @type {MediaSources}\n */\n sources: MediaSources;\n /**\n * @member - entry duration\n * @type {number}\n */\n duration: number;\n /**\n * @member - entry type\n * @type {string}\n */\n type: string;\n /**\n * @member - entry metadata\n * @type {Object}\n */\n metadata: Object;\n /**\n * @member - DVR status\n * @type {number}\n */\n dvrStatus: number;\n /**\n * @member - media status\n * @type {number}\n */\n status: number;\n /**\n * @member - media poster\n * @type {string | Array<Object>}\n */\n poster: string | Array<Object>;\n\n /**\n * @member - assetReferenceType\n * @type {string }\n */\n assetReferenceType: string;\n\n /**\n * @constructor\n */\n constructor() {\n this.metadata = new Map();\n this.sources = new MediaSources();\n this.type = MediaEntry.Type.UNKNOWN;\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaEntryObject} - The json class object.\n */\n toJSON(): ProviderMediaEntryObject {\n return {\n id: this.id,\n name: this.name,\n sources: this.sources.toJSON(),\n duration: this.duration,\n dvrStatus: this.dvrStatus,\n status: this.status,\n metadata: this.metadata,\n type: this.type,\n poster: this.poster,\n assetReferenceType: this.assetReferenceType\n };\n }\n}\n","//@flow\nexport type LogLevelObject = {value: number, name: string};\nexport type LogLevelType = {[level: string]: LogLevelObject};\nexport type loggerFunctionType = {\n VERSION: String,\n DEBUG: LogLevelObject,\n ERROR: LogLevelObject,\n INFO: LogLevelObject,\n OFF: LogLevelObject,\n TIME: LogLevelObject,\n TRACE: LogLevelObject,\n WARN: LogLevelObject,\n createDefaultHandler: Function,\n debug: Function,\n enabledFor: Function,\n error: Function,\n get: Function,\n getLevel: Function,\n info: Function,\n log: Function,\n setHandler: Function,\n setLevel: Function,\n time: Function,\n timeEnd: Function,\n trace: Function,\n useDefaults: Function,\n warn: Function\n};\n\nexport type LoggerType = {\n getLogger: loggerFunctionType,\n LogLevel: LogLevelType\n};\n\nlet JsLogger = {\n get: () => ({\n VERSION: '',\n DEBUG: {value: '', name: ''},\n ERROR: {value: '', name: ''},\n INFO: {value: '', name: ''},\n OFF: {value: '', name: ''},\n TIME: {value: '', name: ''},\n TRACE: {value: '', name: ''},\n WARN: {value: '', name: ''},\n createDefaultHandler: () => {},\n debug: () => {},\n enabledFor: () => {},\n error: () => {},\n get: () => {},\n getLevel: () => {},\n info: () => {},\n log: () => {},\n setHandler: () => {},\n setLevel: () => {},\n time: () => {},\n timeEnd: () => {},\n trace: () => {},\n useDefaults: () => {},\n warn: () => {}\n })\n};\n\nlet LogLevel: LogLevelType = {};\n/**\n * set logger\n * @param {LoggerType} logger - the logger\n * @returns {void}\n */\nfunction setLogger(logger: ?LoggerType): void {\n if (logger && typeof logger.getLogger === 'function') {\n JsLogger.get = logger.getLogger;\n }\n if (logger && logger.LogLevel) {\n LogLevel = logger.LogLevel;\n }\n}\n\n/**\n * get a logger\n * @param {?string} name - the logger name\n * @returns {Object} - the logger class\n */\nfunction getLogger(name?: string): Object {\n //$FlowFixMe\n return JsLogger.get(name);\n}\n\n/**\n * get the log level\n * @param {?string} name - the logger name\n * @returns {LogLevelObject} - the log level\n */\nfunction getLogLevel(name?: string): LogLevelObject {\n return getLogger(name).getLevel();\n}\n\n/**\n * sets the logger level\n * @param {LogLevelObject} level - the log level\n * @param {?string} name - the logger name\n * @returns {void}\n */\nfunction setLogLevel(level: LogLevelObject, name?: string): void {\n getLogger(name).setLevel(level);\n}\n\nexport default getLogger;\nexport {getLogLevel, setLogLevel, setLogger, LogLevel};\n","//@flow\nimport Error from './error/error';\n\nconst KALTURA_HEADER_PREFIX: string = 'x-';\n\nexport default class RequestBuilder {\n /**\n * @member - Service name\n * @type {string}\n */\n service: string;\n /**\n * @member - Service action\n * @type {string}\n */\n action: string;\n /**\n * @member - Service params\n * @type {any}\n */\n params: any;\n /**\n * @memberof - Service headers\n * @type {Map<string, string>}\n */\n headers: Map<string, string>;\n /**\n * @memberof - Service URL\n * @type {string}\n */\n url: string;\n /**\n * @memberof - Service method (POST,GET,DELETE etc..)\n * @type {string}\n */\n method: string;\n /**\n * @memberof - Service tag\n * @type {string}\n */\n tag: string;\n /**\n * @memberof - the response headers of the arra\n * @type {Array<string>}\n */\n responseHeaders: Array<string>;\n /**\n * @description network retry configuration\n * @memberof RequestBuilder\n * @type {ProviderNetworkRetryParameters}\n */\n retryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n /**\n * @description number of xhr attempts for the same multi - request.\n * @memberof RequestBuilder\n * @type {number}\n * @private\n */\n _attemptCounter: number = 1;\n\n /**\n * @description hold the promise result of the XHR request(s) - if all tries fails, it rejects with the error.\n * @memberof RequestBuilder\n * @type {Object}\n * @private\n */\n _requestPromise: Object;\n\n /**\n * @constructor\n * @param {Map<string, string>} headers The request headers\n */\n constructor(headers: Map<string, string> = new Map()) {\n this.headers = headers;\n }\n\n /**\n * Builds restful service URL\n * @function getUrl\n * @param {string} serviceUrl - The service base URL\n * @returns {string} The service URL\n */\n getUrl(serviceUrl: string): string {\n return serviceUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : '');\n }\n\n /**\n * Executes service\n * @function doHttpRequest\n * @returns {Promise.<any>} Service response as promise\n */\n doHttpRequest(): Promise<any> {\n const promise = new Promise((resolve, reject) => {\n this._requestPromise = {\n resolve,\n reject\n };\n });\n if (!this.url) {\n this._requestPromise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MALFORMED_DATA_URI, {\n url: this.url\n })\n );\n }\n this._createXHR();\n return promise;\n }\n\n _createXHR(): void {\n let request = new XMLHttpRequest();\n request.onreadystatechange = () => {\n if (request.readyState === 4) {\n if (request.status === 200) {\n try {\n const response = JSON.parse(request.responseText);\n this.responseHeaders = this._getResponseHeaders(request);\n // the promise returns the response for backwards compatibility\n return this._requestPromise.resolve(response);\n } catch (error) {\n this._requestPromise.reject(\n this._createError(request, Error.Code.BAD_SERVER_RESPONSE, {\n text: request.responseText\n })\n );\n }\n }\n }\n };\n request.open(this.method, this.url, this.retryConfig.async);\n if (this.retryConfig.async && this.retryConfig.timeout) {\n request.timeout = this.retryConfig.timeout;\n }\n const requestTime = performance.now();\n request.ontimeout = () => {\n this._handleError(request, Error.Code.TIMEOUT, {\n timeout: (performance.now() - requestTime) / 1000,\n statusText: request.statusText\n });\n };\n request.onerror = request.onabort = () => {\n this._handleError(request, Error.Code.HTTP_ERROR, {\n text: request.responseText,\n statusText: request.statusText\n });\n };\n this.headers.forEach((value, key) => {\n request.setRequestHeader(key, value);\n });\n request.send(this.params);\n }\n\n _getResponseHeaders(request: XMLHttpRequest): Array<string> {\n return request\n .getAllResponseHeaders()\n .split('\\n')\n .filter(header => header.toLowerCase().indexOf(KALTURA_HEADER_PREFIX) === 0);\n }\n\n _handleError(request: XMLHttpRequest, code: number, data: Object): Promise<*> | void {\n const error = this._createError(request, code, data);\n request.onreadystatechange = function () {};\n request.onerror = function () {};\n request.ontimeout = function () {};\n request.onabort = function () {};\n if (this.retryConfig.maxAttempts && this._attemptCounter < this.retryConfig.maxAttempts) {\n this._attemptCounter++;\n this._createXHR();\n } else {\n return this._requestPromise.reject(error);\n }\n }\n\n _createError(request: XMLHttpRequest, code: number, data: Object): Error {\n Object.assign(data, {\n url: this.url,\n headers: this._getResponseHeaders(request),\n attempt: this._attemptCounter\n });\n return new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, code, data);\n }\n}\n","//@flow\nexport default class ServiceResult {\n /**\n * @member - Is service returned an error\n * @type {boolean}\n */\n hasError: boolean = false;\n /**\n * @member - The service error\n * @type {ServiceError}\n */\n error: ServiceError;\n /**\n * @member - The service result data\n * @type {Object}\n */\n data: Object;\n\n /**\n * @constructor\n * @param {Object} response - Service response\n */\n constructor(response: Object) {\n if (response.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.code, response.message);\n } else if (response.error && response.error.objectType === 'KalturaAPIException') {\n this.hasError = true;\n this.error = new ServiceError(response.error.code, response.error.message);\n } else {\n this.data = response;\n }\n }\n}\n\nclass ServiceError {\n /**\n * @member - The error code\n * @type {string}\n */\n code: string;\n /**\n * @member - The error message\n * @type {string}\n */\n message: string;\n\n /**\n * @constructor\n * @param {string} code - The result code\n * @param {string} message - The result message\n */\n constructor(code: string, message: string) {\n this.code = code;\n this.message = message;\n }\n}\n","//@flow\nexport const MediaFormat: {[name: string]: ProviderMediaFormatType} = {\n DASH: {\n name: 'dash',\n mimeType: 'application/dash+xml',\n pathExt: 'mpd'\n },\n HLS: {\n name: 'hls',\n mimeType: 'application/x-mpegURL',\n pathExt: 'm3u8'\n },\n WVM: {\n name: 'wvm',\n mimeType: 'video/wvm',\n pathExt: 'wvm'\n },\n MP4: {\n name: 'mp4',\n mimeType: 'video/mp4',\n pathExt: 'mp4'\n },\n MP3: {\n name: 'mp3',\n mimeType: 'audio/mpeg',\n pathExt: 'mp3'\n }\n};\n\nexport const SupportedStreamFormat: Map<string, ProviderMediaFormatType> = new Map([\n ['mpegdash', MediaFormat.DASH],\n ['applehttp', MediaFormat.HLS],\n ['url', MediaFormat.MP4]\n]);\n\n/**\n * returns a boolean whether a source is progressive or not\n * @param {string} formatName - the format name\n * @returns {boolean} - if source is progressive or not\n */\nfunction isProgressiveSource(formatName: string): boolean {\n const sourceFormat = SupportedStreamFormat.get(formatName);\n return !!sourceFormat && sourceFormat.name === MediaFormat.MP4.name;\n}\n\nexport {isProgressiveSource};\n","//@flow\nexport class KalturaDrmPlaybackPluginData {\n static Scheme: {[scheme: string]: string} = {\n 'drm.PLAYREADY_CENC': 'com.microsoft.playready',\n 'drm.WIDEVINE_CENC': 'com.widevine.alpha',\n 'fairplay.FAIRPLAY': 'com.apple.fairplay',\n WIDEVINE_CENC: 'com.widevine.alpha',\n PLAYREADY_CENC: 'com.microsoft.playready',\n FAIRPLAY: 'com.apple.fairplay'\n };\n\n /**\n * @member - The drm scheme\n * @type {string}\n */\n scheme: string;\n\n /**\n * @member - The license URL\n * @type {string}\n */\n licenseURL: string;\n\n /**\n * @member - The drm certificate\n * @type {?string}\n */\n certificate: ?string;\n\n /**\n * @constructor\n * @param {Object} drm The json response\n */\n constructor(drm: any) {\n this.scheme = drm.scheme;\n this.licenseURL = drm.licenseURL;\n this.certificate = drm.certificate;\n }\n}\n","//@flow\nexport class KalturaAccessControlMessage {\n /**\n * @member - The access control message\n * @type {string}\n */\n message: string;\n /**\n * @member - The access control message code\n * @@type {string}\n */\n code: string;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: Object) {\n this.message = data.message;\n this.code = data.code;\n }\n}\n","// @flow\nimport MediaSource from './media-source';\nimport {MediaFormat} from './media-format';\nimport ImageSource from './image-source';\n\nexport default class MediaSources {\n /**\n * Progressive download media sources container.\n * @type {Array<MediaSource>}\n * @public\n */\n progressive: Array<MediaSource>;\n /**\n * Dash media sources container.\n * @type {Array<MediaSource>}\n * @public\n */\n dash: Array<MediaSource>;\n /**\n * Hls media sources container.\n * @type {Array<MediaSource>}\n * @public\n */\n hls: Array<MediaSource>;\n image: Array<ImageSource>;\n captions: Array<PKExternalCaptionObject>;\n\n /**\n * @constructor\n */\n constructor() {\n this.progressive = [];\n this.dash = [];\n this.hls = [];\n this.image = [];\n }\n\n /**\n * Maps the source to one of the containers according to his media format.\n * @param {MediaSource} source - The source to add to one of the containers.\n * @param {MediaFormat} mediaFormat - The media format of the source.\n * @returns {void}\n */\n map(source: MediaSource, mediaFormat: ?ProviderMediaFormatType) {\n if (mediaFormat) {\n switch (mediaFormat.name) {\n case MediaFormat.MP4.name:\n this.progressive.push(source);\n break;\n case MediaFormat.DASH.name:\n this.dash.push(source);\n break;\n case MediaFormat.HLS.name:\n this.hls.push(source);\n break;\n default:\n break;\n }\n }\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaSourcesObject} - The json class object.\n */\n toJSON(): ProviderMediaSourcesObject {\n const response: ProviderMediaSourcesObject = {\n progressive: [],\n dash: [],\n hls: [],\n image: []\n };\n this.progressive.forEach(p => response.progressive.push(p.toJSON()));\n this.hls.forEach(h => response.hls.push(h.toJSON()));\n this.dash.forEach(d => response.dash.push(d.toJSON()));\n response.image = this.image;\n return response;\n }\n}\n","//@flow\nimport Drm from './drm';\n\nexport default class MediaSource {\n /**\n * @member - media source id\n * @type {string}\n */\n id: string;\n /**\n * @member - media source url\n * @type {string}\n */\n url: string;\n /**\n * @member - media source mimetype\n * @type {string}\n */\n mimetype: string;\n /**\n * @member - media source drm data\n * @type {Array<Drm>}\n */\n drmData: Array<Drm>;\n /**\n * @member - media source bandwidth\n * @type {number}\n */\n bandwidth: number;\n /**\n * @member - media source width\n * @type {number}\n */\n width: number;\n /**\n * @member - media source height\n * @type {number}\n */\n height: number;\n /**\n * @member - media source label\n * @type {string}\n */\n label: string;\n\n /**\n * Convert class to native js object.\n * @returns {ProviderMediaSourceObject} - The json class object.\n */\n toJSON(): ProviderMediaSourceObject {\n const response: ProviderMediaSourceObject = {\n id: this.id,\n url: this.url,\n mimetype: this.mimetype\n };\n if (this.bandwidth) response.bandwidth = this.bandwidth;\n if (this.width) response.width = this.width;\n if (this.height) response.height = this.height;\n if (this.label) response.label = this.label;\n if (this.drmData && this.drmData.length > 0) {\n response.drmData = [];\n this.drmData.forEach(d => {\n if (Array.isArray(response.drmData)) {\n response.drmData.push(d.toJSON());\n }\n });\n }\n return response;\n }\n}\n","// @flow\nimport MultiRequestBuilder, {MultiRequestResult} from './multi-request-builder';\nimport Error from '../../util/error/error';\n\nexport default class DataLoaderManager {\n /**\n * @member - Loaders response map index\n * @type {Map<string,Array<number>>}\n * @private\n */\n _loadersResponseMap: Map<string, Array<number>> = new Map();\n /**\n * @member - Loaders multi request\n * @type {MultiRequestBuilder}\n * @protected\n */\n _multiRequest: MultiRequestBuilder;\n /**\n * @member - Loaders multi response\n * @type {MultiRequestResult}\n * @private\n */\n _multiResponse: MultiRequestResult;\n /**\n * @member - Loaders to execute\n * @type {Map<string,Function>}\n * @private\n */\n _loaders: Map<string, ILoader> = new Map();\n\n _networkRetryConfig: ProviderNetworkRetryParameters;\n\n constructor(networkRetryConfig: ProviderNetworkRetryParameters) {\n this._networkRetryConfig = networkRetryConfig;\n }\n\n /**\n * Add loader to execution loaders map\n * @function\n * @param {Function} loader Loader to add\n * @param {Object} params Loader params\n * @param {string} ks ks\n * @returns {void}\n */\n add(loader: Function, params: Object, ks?: string): void {\n let execution_loader = new loader(params);\n if (execution_loader.isValid()) {\n this._loaders.set(loader.id, execution_loader);\n // Get the start index from the multiReqeust before adding current execution_loader requests\n let startIndex = this._multiRequest.requests.length;\n // Get the requests\n let requests = execution_loader.requests;\n this._multiRequest.retryConfig = this._networkRetryConfig;\n // Add requests to multiRequest queue\n requests.forEach(request => {\n request.params = request.params || {};\n request.params.ks = request.params.ks || ks;\n this._multiRequest.add(request);\n });\n // Create range array of current execution_loader requests\n let executionLoaderResponseMap = Array.from(new Array(requests.length), (val, index) => index + startIndex);\n // Add to map\n this._loadersResponseMap.set(loader.id, executionLoaderResponseMap);\n }\n }\n\n /**\n * Get data from all loaders using multi request\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @function\n * @returns {Promise} Promise\n */\n fetchData(requestsMustSucceed?: boolean): Promise<any> {\n return new Promise((resolve, reject) => {\n this._multiRequest.execute(requestsMustSucceed).then(\n data => {\n this._multiResponse = data.response;\n let preparedData: Object = this.prepareData(data.response);\n if (preparedData.success) {\n resolve(this._loaders);\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.API_RESPONSE_MISMATCH, {\n headers: data.headers\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n\n /**\n * Prepare fetched data\n * @function\n * @param {MultiRequestResult} response - The multi request result\n * @returns {Object} - The prepared data\n */\n prepareData(response: MultiRequestResult): Object {\n this._loaders.forEach((loader, name) => {\n let loaderDataIndexes = this._loadersResponseMap.get(name);\n try {\n if (loaderDataIndexes && loaderDataIndexes.length > 0) {\n loader.response = response.results.slice(loaderDataIndexes[0], loaderDataIndexes[loaderDataIndexes.length - 1] + 1);\n }\n } catch (err) {\n return {success: false, error: err};\n }\n });\n return {success: true, data: this._loaders};\n }\n}\n","//@flow\nimport RequestBuilder from '../../util/request-builder';\nimport getLogger from '../../util/logger';\nimport ServiceResult from './base-service-result';\nimport Error from '../../util/error/error';\n\nexport default class MultiRequestBuilder extends RequestBuilder {\n static _logger = getLogger('MultiRequestBuilder');\n /**\n * @memberof - MultiRequestBuilder\n * @type {Array<RequestBuilder>}\n */\n requests: Array<RequestBuilder> = [];\n /**\n * Adds request to requests array\n * @function add\n * @param {RequestBuilder} request The request\n * @returns {MultiRequestBuilder} The multiRequest\n */\n add(request: RequestBuilder): MultiRequestBuilder {\n this.requests.push(request);\n const requestParams = {};\n const serviceDef: Object = {service: request.service, action: request.action};\n Object.assign(requestParams, {[this.requests.length]: Object.assign(serviceDef, request.params)});\n Object.assign(requestParams, this.params);\n this.params = requestParams;\n return this;\n }\n\n /**\n * Executes a multi request\n * @function execute\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed or not\n * @returns {Promise} The multirequest execution promise\n */\n execute(requestsMustSucceed?: boolean): Promise<Object> {\n return new Promise((resolve, reject) => {\n try {\n this.params = JSON.stringify(this.params);\n } catch (err) {\n MultiRequestBuilder._logger.error(`${err.message}`);\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.FAILED_PARSING_REQUEST, {\n error: err,\n params: this.params\n })\n );\n }\n this.doHttpRequest().then(\n data => {\n const multiRequestResult = new MultiRequestResult(data, requestsMustSucceed);\n if (multiRequestResult.success) {\n resolve({\n headers: this.responseHeaders,\n response: multiRequestResult\n });\n } else {\n reject(\n new Error(Error.Severity.CRITICAL, Error.Category.NETWORK, Error.Code.MULTIREQUEST_API_ERROR, {\n url: this.url,\n headers: this.responseHeaders,\n results: multiRequestResult.results\n })\n );\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n}\n\nexport class MultiRequestResult {\n static _logger = getLogger('MultiRequestResult');\n /**\n * @memberof MultiRequestResult\n * @type {boolean}\n */\n success: boolean;\n /**\n * @memberof MultiRequestResult\n * @type {Object}\n */\n results: Array<ServiceResult> = [];\n /**\n * @constructor\n * @param {Object} response data\n * @param {boolean} requestsMustSucceed whether all of the requests must succeed\n */\n constructor(response: Object, requestsMustSucceed?: boolean = true) {\n const result = response.result ? response.result : response;\n const responseArr = Array.isArray(result) ? result : [result];\n const results = responseArr.map(result => new ServiceResult(result));\n const errorResults = results.filter(serviceResult => serviceResult.hasError);\n\n errorResults.forEach(serviceResult => {\n MultiRequestResult._logger.error(\n `Service returned an error with error code: ${serviceResult.error.code} and message: ${serviceResult.error.message}.`\n );\n });\n\n this.results = results;\n if ((requestsMustSucceed && errorResults.length) || errorResults.length === this.results.length) {\n this.success = false;\n } else {\n this.results = this.results.filter(serviceResult => !serviceResult.hasError);\n this.success = true;\n }\n }\n}\n","//@flow\nexport default class Drm {\n /**\n * @member - license url\n * @type {string}\n */\n licenseUrl: string;\n /**\n * @member - drm scheme\n * @type {string}\n */\n scheme: string;\n\n /**\n * @member - drm certificate\n * @type {string}\n */\n certificate: string;\n\n /**\n * @constructor\n * @param {string} licenseUrl - the license url\n * @param {string} scheme - the drm scheme\n * @param {?string} certificate - the drm certificate\n */\n constructor(licenseUrl: string, scheme: string, certificate: ?string) {\n this.licenseUrl = licenseUrl;\n this.scheme = scheme;\n if (certificate) {\n this.certificate = certificate;\n }\n }\n\n /**\n * Convert class to native js object.\n * @returns {ProviderDrmDataObject} - The json class object.\n */\n toJSON(): ProviderDrmDataObject {\n const response: ProviderDrmDataObject = {\n licenseUrl: this.licenseUrl,\n scheme: this.scheme\n };\n if (this.certificate) response.certificate = this.certificate;\n return response;\n }\n}\n","//@flow\n\nconst BASE_THUMBNAIL_URL_TEMPLATE = '.+entry_id/[a-zA-Z0-9_]+/';\n\nexport default class ImageSource {\n /**\n * @member - media source id\n * @type {string}\n */\n id: string;\n /**\n * @member - media source url\n * @type {string}\n */\n url: string;\n /**\n * @member - media source mimetype\n * @type {string}\n */\n mimetype: string;\n\n constructor(entry: Object) {\n this.id = entry.id;\n this.url = ImageSource.extractBaseThumbnailUrl(entry.dataUrl);\n this.mimetype = '';\n }\n\n /**\n * Extract the base thumbnail url.\n * @param {string} url - dataUrl.\n * @returns {string} - The base thumbnail url.\n */\n static extractBaseThumbnailUrl(url: string): string {\n // $FlowFixMe\n return url.match(BASE_THUMBNAIL_URL_TEMPLATE)[0].slice(0, -1);\n }\n}\n","// @flow\nimport {getLogLevel, setLogLevel, setLogger, type LogLevelType, LogLevel} from '../../util/logger';\nimport DataLoaderManager from './data-loader-manager';\nimport Error from '../../util/error/error';\n\nexport default class BaseProvider<MI> {\n _partnerId: number;\n _widgetId: ?string;\n _ks: string;\n _uiConfId: ?number;\n _dataLoader: DataLoaderManager;\n _playerVersion: string;\n _logger: any;\n _isAnonymous: boolean;\n _networkRetryConfig: ProviderNetworkRetryParameters = {\n async: true,\n timeout: 0,\n maxAttempts: 4\n };\n\n get partnerId(): number {\n return this._partnerId;\n }\n\n get widgetId(): string {\n return this._widgetId || this.defaultWidgetId;\n }\n\n get defaultWidgetId(): string {\n return '_' + this._partnerId;\n }\n\n get uiConfId(): ?number {\n return this._uiConfId;\n }\n\n get ks(): string {\n return this._ks;\n }\n\n set ks(value: string): void {\n this._ks = value;\n }\n\n get playerVersion(): string {\n return this._playerVersion;\n }\n\n get isAnonymous(): boolean {\n return this._isAnonymous;\n }\n\n constructor(options: ProviderOptionsObject, playerVersion: string) {\n setLogger(options.logger);\n this._partnerId = options.partnerId;\n this._widgetId = options.widgetId;\n this._uiConfId = options.uiConfId;\n this._isAnonymous = !options.ks;\n this._ks = options.ks || '';\n this._playerVersion = playerVersion;\n }\n\n // eslint-disable-next-line no-unused-vars\n getMediaConfig(mediaInfo: MI): Promise<ProviderMediaConfigObject> {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'getMediaConfig method must be implement by the derived class'\n })\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise<ProviderPlaylistObject> {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'The provider does not support loading playlist by id'\n })\n );\n }\n\n // eslint-disable-next-line no-unused-vars\n getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise<ProviderPlaylistObject> {\n return Promise.reject(\n new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.METHOD_NOT_IMPLEMENTED, {\n message: 'The provider does not support loading entry list'\n })\n );\n }\n\n _verifyHasSources(sources: ProviderMediaConfigSourcesObject) {\n if (sources.hls.concat(sources.dash, sources.progressive, sources.image).length === 0) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MISSING_PLAY_SOURCE, {\n action: '',\n messages: `No play source for entry id: ${sources.id}`\n });\n }\n }\n\n get LogLevel(): LogLevelType {\n return LogLevel;\n }\n\n getLogLevel(name?: string): Object {\n return getLogLevel(name);\n }\n\n setLogLevel(level: Object, name?: string): void {\n setLogLevel(level, name);\n }\n}\n","const clone = data => {\n let node;\n if (Array.isArray(data)) {\n node = data.length > 0 ? data.slice(0) : [];\n node.forEach((e, i) => {\n if ((typeof e === 'object' && e !== {}) || (Array.isArray(e) && e.length > 0)) {\n node[i] = clone(e);\n }\n });\n } else if (typeof data === 'object') {\n node = Object.assign({}, data);\n Object.keys(node).forEach(key => {\n if ((typeof node[key] === 'object' && node[key] !== {}) || (Array.isArray(node[key]) && node[key].length > 0)) {\n node[key] = clone(node[key]);\n }\n });\n } else {\n node = data;\n }\n return node;\n};\n\nexport {clone};\n","//@flow\n\nimport MediaEntry from '../entities/media-entry';\n\nexport default class EntryList {\n /**\n * @member - entry list items\n * @type {Array<MediaEntry>}\n */\n items: Array<MediaEntry>;\n\n constructor() {\n this.items = [];\n }\n}\n","//@flow\n\nexport default class Bumper {\n /**\n * @member - bumper url\n * @type {string}\n */\n url: string;\n /**\n * @member - bumper click through url\n * @type {string}\n */\n clickThroughUrl: string;\n\n /**\n * @constructor\n * @param {Object} data - The bumper response\n */\n constructor(data: Object) {\n this.url = data.url;\n this.clickThroughUrl = data.clickThroughUrl;\n }\n}\n","//@flow\nimport {clone} from '../../util/clone';\n\nconst defaultConfig: Object = {\n serviceUrl: 'https://cdnapisec.kaltura.com/api_v3',\n cdnUrl: 'https://cdnapisec.kaltura.com',\n serviceParams: {\n apiVersion: '3.3.0',\n format: 1\n },\n useApiCaptions: true,\n loadThumbnailWithKs: false,\n replaceHostOnlyManifestUrls: false\n};\n\nexport default class OVPConfiguration {\n static set(clientConfig?: ProviderEnvConfigObject) {\n if (clientConfig) {\n Object.assign(defaultConfig, clientConfig);\n }\n }\n\n static get(): Object {\n return clone(defaultConfig);\n }\n}\n\nexport {OVPConfiguration};\n","//@flow\nimport {KalturaDrmPlaybackPluginData} from '../../common/response-types/kaltura-drm-playback-plugin-data';\n\nexport type OVPKalturaPlaybackSource = KalturaPlaybackSource;\n\nexport class KalturaPlaybackSource {\n /**\n * @member - source format according to delivery profile streamer type (applehttp, mpegdash etc.)\n * @type {string}\n */\n format: string;\n /**\n * @member - delivery profile Id\n * @type {string}\n */\n deliveryProfileId: string;\n /**\n * @member - The source URL\n * @type {string}\n */\n url: string;\n /**\n * @member - comma separated string according to deliveryProfile media protocols ('http,https' etc.)\n * @type {string}\n */\n protocols: string;\n /**\n * @member - comma separated string of flavor ids\n * @type {string}\n */\n flavorIds: string;\n /**\n * @member - drm data object containing relevant license url ,scheme name and certificate\n * @type {Array<KalturaDrmPlaybackPluginData>}\n */\n drm: Array<KalturaDrmPlaybackPluginData> = [];\n\n /**\n * @constructor\n * @param {Object} source The response\n */\n constructor(source: Object) {\n this.format = source.format;\n this.deliveryProfileId = source.deliveryProfileId;\n this.url = source.url;\n this.protocols = source.protocols;\n this.flavorIds = source.flavorIds;\n if (source.drm) {\n source.drm.map(drm => this.drm.push(new KalturaDrmPlaybackPluginData(drm)));\n }\n }\n\n /**\n * Checks if source has DRM data\n * @function hasDrmData\n * @returns {boolean} Is source has DRM\n */\n hasDrmData(): boolean {\n return this.drm && this.drm.length > 0;\n }\n\n /**\n * Checks if source has flavor IDs\n * @function hasFlavorIds\n * @returns {boolean} Is source ha flavor IDs\n */\n hasFlavorIds(): boolean {\n return !!this.flavorIds && this.flavorIds.length > 0;\n }\n\n /**\n * Returns source desired protocol if supported\n * @param {string} protocol - the desired protocol for the source (base play url protocol)\n * @returns {string} - protocol if protocol is in the protocols list - if not empty string returned\n */\n getProtocol(protocol: string): string {\n let returnValue: string = '';\n if (this.protocols && this.protocols.length > 0) {\n let protocolsArr: Array<string> = this.protocols.split(',');\n protocolsArr.forEach(p => {\n if (p === protocol) {\n returnValue = p;\n }\n });\n } else if (protocol === 'http') {\n return protocol;\n }\n return returnValue;\n }\n}\n","//@flow\nexport class KalturaRuleAction {\n static Type: {[type: string]: string | number} = {\n DRM_POLICY: 'drm.DRM_POLICY',\n BLOCK: 1,\n PREVIEW: 2,\n LIMIT_FLAVORS: 3,\n ADD_TO_STORAGE: 4,\n LIMIT_DELIVERY_PROFILES: 5,\n SERVE_FROM_REMOTE_SERVER: 6,\n REQUEST_HOST_REGEX: 7,\n LIMIT_THUMBNAIL_CAPTURE: 8\n };\n\n /**\n * @member - The type of the action\n * @type {string|number}\n */\n type: string | number;\n\n /**\n * @constructor\n * @param {Object} data - The response\n */\n constructor(data: Object) {\n this.type = data.type;\n }\n}\n","//@flow\nimport {KalturaRuleAction} from './kaltura-rule-action';\n\nexport class KalturaAccessControlModifyRequestHostRegexAction extends KalturaRuleAction {\n /**\n * @member - Request host regex pattern\n * @type {string}\n */\n pattern: string;\n /**\n * @member - Request host regex replacement\n * @type {string}\n */\n replacement: string;\n /**\n * @member - serverNodeId to generate replacment host from\n * @type {number}\n */\n replacmenServerNodeId: number;\n /**\n * @member - checkAliveTimeout in milliseconds\n * @type {number}\n */\n checkAliveTimeoutMs: number;\n /**\n * @constructor\n * @param {Object} data - The response\n */\n constructor(data: Object) {\n super(data);\n this.pattern = data.pattern;\n this.replacement = data.replacement;\n this.replacmenServerNodeId = data.replacmenServerNodeId;\n this.checkAliveTimeoutMs = data.checkAliveTimeoutMs;\n }\n}\n","//@flow\nexport class KalturaFlavorAsset {\n static Status: {[status: string]: number} = {\n ERROR: -1,\n QUEUED: 0,\n CONVERTING: 1,\n READY: 2,\n DELETED: 3,\n NOT_APPLICABLE: 4,\n TEMP: 5,\n WAIT_FOR_CONVERT: 6,\n IMPORTING: 7,\n VALIDATING: 8,\n EXPORTING: 9\n };\n\n /**\n * @member - The ID of the Flavor Asset\n * @type {string}\n */\n id: string;\n /**\n * @member -The Flavor Params used to create this Flavor Asset\n * @type {string}\n */\n flavorParamsId: string;\n /**\n * @member -The file extension\n * @type {string}\n */\n fileExt: string;\n /**\n * @member - The overall bitrate (in KBits) of the Flavor Asset\n * @type {string}\n */\n bitrate: number;\n /**\n * @member - The width of the Flavor Asset\n * @type {number}\n */\n width: number;\n /**\n * @member - The height of the Flavor Asset\n * @type {number}\n */\n height: number;\n /**\n * @member - The frame rate (in FPS) of the Flavor Asset\n * @type {number}\n */\n frameRate: number;\n /**\n * @member - True if this Flavor Asset is the original source\n * @type {number}\n */\n isOriginal: boolean;\n /**\n * @member - True if this Flavor Asset is playable in KDP\n * @type {boolean}\n */\n isWeb: boolean;\n /**\n * @member - The container format\n * @type {boolean}\n */\n containerFormat: string;\n /**\n *@member - The video codec\n * @type {boolean}\n */\n videoCodecId: string;\n /**\n * @member - The status of the Flavor Asset\n * @type {number}\n */\n status: number;\n /**\n * @member - The language of the flavor asset\n * @type {Status}\n */\n language: string;\n /**\n * @member - The label of the flavor asset\n * @type {string}\n */\n label: string;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: any) {\n this.id = data.id;\n this.flavorParamsId = data.flavorParamsId;\n this.fileExt = data.fileExt;\n this.bitrate = data.bitrate;\n this.width = data.width;\n this.height = data.height;\n this.id = data.id;\n this.frameRate = data.frameRate;\n this.isOriginal = data.isOriginal;\n this.isWeb = data.isWeb;\n this.containerFormat = data.containerFormat;\n this.videoCodecId = data.videoCodecId;\n this.status = data.status;\n this.language = data.language;\n this.label = data.label;\n }\n}\n","//@flow\nimport {KalturaPlaybackSource} from './kaltura-playback-source';\n\nexport class KalturaBumper {\n /**\n * @member - The bumper entry ID\n * @type {string}\n */\n entryId: string;\n /**\n * @member - The bumper click through url\n * @type {string}\n */\n clickThroughUrl: string;\n /**\n * @member - The bumper sources\n * @type {Array<KalturaPlaybackSource>}\n */\n sources: Array<KalturaPlaybackSource>;\n\n constructor(data: any) {\n this.entryId = data.entryId;\n this.clickThroughUrl = data.url;\n this.sources = data.sources ? data.sources.map(source => new KalturaPlaybackSource(source)) : [];\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaAccessControlMessage} from '../../common/response-types/kaltura-access-control-message';\nimport {KalturaPlaybackSource} from './kaltura-playback-source';\nimport {KalturaAccessControlModifyRequestHostRegexAction} from './kaltura-access-control-modify-request-host-regex-action';\nimport {KalturaRuleAction} from './kaltura-rule-action';\nimport {KalturaFlavorAsset} from './kaltura-flavor-asset';\nimport {KalturaBumper} from './kaltura-bumper';\n\nexport class KalturaPlaybackContext extends ServiceResult {\n /**\n * @member - The playback sources\n * @type {Array<KalturaPlaybackSource>}\n */\n sources: Array<KalturaPlaybackSource> = [];\n /**\n * @member - Array of actions as received from the rules that invalidated\n * @type {Array<KalturaRuleAction>}\n */\n actions: Array<KalturaRuleAction> = [];\n /**\n * @member - Array of actions as received from the rules that invalidated\n * @type {Array<KalturaAccessControlMessage>}\n */\n messages: Array<KalturaAccessControlMessage> = [];\n /**\n * @member - The flavor assets\n * @type {Array<KalturaFlavorAsset>}\n */\n flavorAssets: Array<KalturaFlavorAsset> = [];\n /**\n * @member - The bumper data\n * @type {Array<KalturaBumper>}\n */\n bumperData: Array<KalturaBumper> = [];\n\n /**\n * @constructor\n * @param {Object} response The response\n */\n constructor(response: Object) {\n super(response);\n if (!this.hasError) {\n const messages = response.messages;\n if (messages) {\n messages.map(message => this.messages.push(new KalturaAccessControlMessage(message)));\n }\n const actions = response.actions;\n if (actions) {\n actions.map(action => {\n if (action.type === KalturaRuleAction.Type.REQUEST_HOST_REGEX) {\n this.actions.push(new KalturaAccessControlModifyRequestHostRegexAction(action));\n } else {\n this.actions.push(new KalturaRuleAction(action));\n }\n });\n }\n const sources = response.sources;\n if (sources) {\n sources.map(source => this.sources.push(new KalturaPlaybackSource(source)));\n }\n const flavorAssets = response.flavorAssets;\n if (flavorAssets) {\n flavorAssets.map(flavor => this.flavorAssets.push(new KalturaFlavorAsset(flavor)));\n }\n const bumperData = response.bumperData;\n if (bumperData) {\n bumperData.map(bumper => this.bumperData.push(new KalturaBumper(bumper)));\n }\n }\n }\n\n hasBlockAction(): boolean {\n return this.getBlockAction() !== undefined;\n }\n\n getBlockAction(): ?KalturaRuleAction {\n return this.actions.find(action => action.type === KalturaRuleAction.Type.BLOCK);\n }\n\n getErrorMessages(): Array<KalturaAccessControlMessage> {\n return this.messages;\n }\n\n /**\n * Get the KalturaAccessControlModifyRequestHostRegexAction action\n * @function getRequestHostRegexAction\n * @returns {?KalturaAccessControlModifyRequestHostRegexAction} The action\n * */\n getRequestHostRegexAction(): ?KalturaAccessControlModifyRequestHostRegexAction {\n const action = this.actions.find(action => action.type === KalturaRuleAction.Type.REQUEST_HOST_REGEX);\n if (action instanceof KalturaAccessControlModifyRequestHostRegexAction) {\n return action;\n }\n }\n}\n","//@flow\nexport class KalturaMetadata {\n static ObjectType: {[type: string]: string | number} = {\n AD_CUE_POINT: 'adCuePointMetadata.AdCuePoint',\n ANNOTATION: 'annotationMetadata.Annotation',\n CODE_CUE_POINT: 'codeCuePointMetadata.CodeCuePoint',\n THUMB_CUE_POINT: 'thumbCuePointMetadata.thumbCuePoint',\n ENTRY: 1,\n CATEGORY: 2,\n USER: 3,\n PARTNER: 4,\n DYNAMIC_OBJECT: 5\n };\n\n static Status: {[status: string]: number} = {\n VALID: 1,\n INVALID: 2,\n DELETED: 3\n };\n\n id: number;\n metadataProfileId: number;\n metadataProfileVersion: number;\n metadataObjectType: string | number;\n objectId: string;\n version: number;\n created: Date;\n updated: Date;\n status: number;\n xml: string;\n\n /**\n * @constructor\n * @param {Object} data The response\n */\n constructor(data: Object) {\n this.id = data.id;\n this.metadataProfileId = data.metadataProfileId;\n this.metadataProfileVersion = data.metadataProfileVersion;\n this.metadataProfileId = data.metadataProfileId;\n this.metadataObjectType = data.metadataObjectType;\n this.objectId = data.objectId;\n this.version = data.version;\n this.created = new Date(0);\n this.created.setUTCSeconds(data.createdAt);\n this.updated = new Date(0);\n this.updated.setUTCSeconds(data.updatedAt);\n this.status = data.status;\n this.xml = data.xml;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaMetadata} from './kaltura-metadata';\n\nexport class KalturaMetadataListResponse extends ServiceResult {\n totalCount: number;\n metas: Array<KalturaMetadata>;\n\n /**\n * @constructor\n * @param {Object} responseObj The response\n */\n constructor(responseObj: Object) {\n super(responseObj);\n if (!this.hasError) {\n this.totalCount = responseObj.totalCount;\n if (this.totalCount > 0) {\n this.metas = [];\n responseObj.objects.map(meta => this.metas.push(new KalturaMetadata(meta)));\n }\n }\n }\n}\n","//@flow\nexport class KalturaMediaEntry {\n static EntryType: {[entryType: string]: {value: number | string}} = {\n AUTOMATIC: {value: -1},\n EXTERNAL_MEDIA: {value: 'externalMedia.externalMedia'},\n MEDIA_CLIP: {value: 1},\n MIX: {value: 2},\n PLAYLIST: {value: 5},\n DATA: {value: 6},\n LIVE_STREAM: {value: 7},\n LIVE_CHANNEL: {value: 8},\n DOCUMENT: {value: 10}\n };\n\n static MediaType: {[mediaType: string]: {value: number}} = {\n VIDEO: {value: 1},\n IMAGE: {value: 2},\n AUDIO: {value: 5},\n LIVE_STREAM_FLASH: {value: 201},\n LIVE_STREAM_WINDOWS_MEDIA: {value: 202},\n LIVE_STREAM_REAL_MEDIA: {value: 203},\n LIVE_STREAM_QUICK_TIME: {value: 204}\n };\n\n static EntryStatus: {[status: string]: string | number} = {\n ERROR_IMPORTING: -2,\n ERROR_CONVERTING: -1,\n SCAN_FAILURE: 'virusScan.ScanFailure',\n IMPORT: 0,\n INFECTED: 'virusScan.Infected',\n PRECONVERT: 1,\n READY: 2,\n DELETED: 3,\n PENDING: 4,\n MODERATE: 5,\n BLOCKED: 6,\n NO_CONTENT: 7\n };\n\n static EntryModerationStatus: {[status: string]: number} = {\n PENDING_MODERATION: 1,\n APPROVED: 2,\n REJECTED: 3,\n FLAGGED_FOR_REVIEW: 4,\n MODERATE: 5,\n AUTO_APPROVED: 6\n };\n\n /**\n * @member - The entry id\n * @type {string}\n */\n id: string;\n /**\n * @member - The entry referenceId\n * @type {string}\n */\n referenceId: string;\n /**\n * @member - The entry externalSourceType\n * @type {string}\n */\n externalSourceType: string;\n /**\n * @member - Entry name (Min 1 chars)\n * @type {string}\n */\n name: string;\n /**\n * @member - Entry description\n * @type {string}\n */\n description: string;\n /**\n * @member - The URL used for playback. This is not the download URL.\n * @type {string}\n */\n dataUrl: string;\n /**\n * @member - Comma separated flavor params ids that exists for this media entry\n * @type {string}\n */\n flavorParamsIds: string;\n /**\n * @member - The entry duration\n * @type {number}\n */\n duration: number;\n /**\n * @member - The type of the entry, this is auto filled by the derived entry object\n * @type {string | number}\n */\n type: string | number;\n /**\n * @member - The type of the entry, this is auto filled by the derived entry object (Image, Audio etc.)\n * @type {number}\n */\n entryType: number;\n /**\n * @member - Entry poster image\n * @type {string}\n */\n poster: string;\n /**\n * @member - DVR status\n * @type {number}\n */\n dvrStatus: number;\n /**\n * @member - Entry tags\n * @type {string}\n */\n tags: string;\n\n /**\n * @member - Entry status\n * @type {number}\n */\n status: number;\n\n /**\n * @member - Entry creation date as Unix timestamp (In seconds)\n * @type {number}\n */\n createdAt: number;\n\n /**\n * @member - Entry end date as Unix timestamp (In seconds)\n * @type {number}\n */\n endDate: number;\n\n /**\n * @constructor\n * @param {Object} entry The json response\n */\n constructor(entry: Object) {\n this.id = entry.id;\n this.referenceId = entry.referenceId;\n this.externalSourceType = entry.externalSourceType;\n this.name = entry.name;\n this.description = entry.description;\n this.dataUrl = entry.dataUrl;\n this.type = entry.type;\n this.entryType = entry.mediaType;\n this.flavorParamsIds = entry.flavorParamsIds;\n this.duration = entry.duration;\n this.poster = entry.thumbnailUrl;\n this.status = entry.status;\n this.dvrStatus = entry.dvrStatus;\n this.tags = entry.tags;\n this.createdAt = entry.createdAt;\n this.endDate = entry.endDate;\n }\n}\n","//@flow\nimport OVPConfiguration from './config';\n\ntype urlParamsType = {\n partnerId: number,\n entryId: string,\n ks: string,\n uiConfId: ?number,\n format: string,\n protocol: string,\n extension: string,\n flavorIds: ?string\n};\n\nexport default class PlaySourceUrlBuilder {\n /**\n * Returns source url by given url params\n * @function build\n * @param {urlParamsType} urlParams The params\n * @returns {string} The URL\n * @static\n */\n static build(urlParams: urlParamsType): string {\n const config = OVPConfiguration.get();\n const serviceUrlOrigin: string = config.serviceUrl.substr(0, config.serviceUrl.lastIndexOf('/'));\n const {partnerId, entryId, ks, uiConfId, format, protocol, extension, flavorIds} = urlParams;\n\n //verify mandatory params\n //$FlowFixMe\n if (!serviceUrlOrigin || isNaN(Number.parseInt(partnerId)) || !entryId || !format || !protocol) {\n return '';\n }\n\n let playUrl = serviceUrlOrigin;\n if (!serviceUrlOrigin.endsWith('/')) {\n playUrl += '/';\n }\n playUrl += 'p/' + partnerId + '/sp/' + partnerId + '00' + '/playManifest/entryId/' + entryId + '/protocol/' + protocol + '/format/' + format;\n\n if (flavorIds) {\n playUrl += '/flavorIds/' + flavorIds;\n } else if (uiConfId) {\n playUrl += '/uiConfId/' + uiConfId;\n }\n\n if (ks !== '') {\n playUrl += '/ks/' + ks;\n }\n\n if (extension !== '') {\n playUrl += '/a.' + extension;\n }\n\n if (uiConfId && flavorIds !== '') {\n playUrl += '?uiConfId=' + uiConfId;\n }\n\n return playUrl;\n }\n}\n","//@flow\nexport default class XmlParser {\n /**\n * Parses xml string to json object\n * @param {string} xml The xml to parse\n * @returns {{}} The parsed xml as Json object\n * @static\n */\n static xmlToJson(xml: Object) {\n let obj = {};\n if (xml.nodeType === 1) {\n if (xml.attributes.length > 0) {\n obj['@attributes'] = {};\n for (let j = 0; j < xml.attributes.length; j++) {\n let attribute = xml.attributes.item(j);\n obj['@attributes'][attribute.nodeName] = attribute.nodeValue;\n }\n }\n } else if (xml.nodeType === 3) {\n obj = xml.nodeValue;\n }\n if (xml.hasChildNodes()) {\n for (let i = 0; i < xml.childNodes.length; i++) {\n let item = xml.childNodes.item(i);\n let nodeName = item.nodeName;\n if (typeof obj[nodeName] === 'undefined') {\n obj[nodeName] = this.xmlToJson(item);\n } else {\n if (typeof obj[nodeName].push === 'undefined') {\n let old = obj[nodeName];\n obj[nodeName] = [];\n obj[nodeName].push(old);\n }\n obj[nodeName].push(this.xmlToJson(item));\n }\n }\n }\n return obj;\n }\n}\n","//@flow\n\nimport MediaEntry from '../entities/media-entry';\n\nexport default class Playlist {\n /**\n * @member - playlist id\n * @type {string}\n */\n id: string;\n /**\n * @member - playlist name\n * @type {string}\n */\n name: string;\n /**\n * @member - playlist description\n * @type {string}\n */\n description: string;\n\n /**\n * @member - playlist poster\n * @type {string}\n */\n poster: string;\n\n /**\n * @member - playlist items\n * @type {Array<MediaEntry>}\n */\n items: Array<MediaEntry>;\n\n constructor() {\n this.items = [];\n }\n}\n","// @flow\n\nimport {addKsToUrl} from './provider-parser';\n\nconst KalturaCaptionType: CaptionType = {\n SRT: '1',\n DFXP: '2',\n WEBVTT: '3',\n CAP: '4'\n};\n\nconst CaptionsFormatsMap: {[format: string]: string} = {\n '3': 'vtt',\n '1': 'srt'\n};\n\nclass ExternalCaptionsBuilder {\n static createConfig(captions: Array<Object>, ks: string): Array<PKExternalCaptionObject> {\n return captions.map(caption => {\n let url = caption.url;\n let type = CaptionsFormatsMap[caption.format];\n if ([KalturaCaptionType.DFXP, KalturaCaptionType.CAP].includes(caption.format)) {\n url = caption.webVttUrl;\n type = CaptionsFormatsMap[KalturaCaptionType.WEBVTT];\n }\n url = addKsToUrl(url, ks);\n return {\n default: !!caption.isDefault,\n type: type,\n language: caption.languageCode,\n label: caption.label,\n url: url\n };\n });\n }\n}\n\nexport {ExternalCaptionsBuilder};\n","//@flow\nimport {KalturaPlaybackContext} from './response-types/kaltura-playback-context';\nimport {KalturaMetadataListResponse} from './response-types/kaltura-metadata-list-response';\nimport {KalturaMediaEntry} from './response-types/kaltura-media-entry';\nimport {KalturaPlaybackSource} from './response-types/kaltura-playback-source';\nimport {KalturaBumper} from './response-types/kaltura-bumper';\nimport {KalturaDrmPlaybackPluginData} from '../common/response-types/kaltura-drm-playback-plugin-data';\nimport PlaySourceUrlBuilder from './play-source-url-builder';\nimport XmlParser from '../../util/xml-parser';\nimport getLogger from '../../util/logger';\nimport OVPConfiguration from './config';\nimport MediaEntry from '../../entities/media-entry';\nimport Drm from '../../entities/drm';\nimport MediaSource from '../../entities/media-source';\nimport MediaSources from '../../entities/media-sources';\nimport {SupportedStreamFormat, isProgressiveSource} from '../../entities/media-format';\nimport Playlist from '../../entities/playlist';\nimport EntryList from '../../entities/entry-list';\nimport Bumper from '../../entities/bumper';\nimport {KalturaRuleAction} from './response-types/kaltura-rule-action';\nimport {KalturaAccessControlMessage} from '../common/response-types/kaltura-access-control-message';\nimport type {OVPMediaEntryLoaderResponse} from './loaders/media-entry-loader';\nimport {ExternalCaptionsBuilder} from './external-captions-builder';\nimport ImageSource from '../../entities/image-source';\n\nclass OVPProviderParser {\n static _logger = getLogger('OVPProviderParser');\n\n /**\n * Returns parsed media entry by given OVP response objects\n * @function getMediaEntry\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {any} mediaEntryResponse - The media entry response\n * @returns {MediaEntry} - The media entry\n * @static\n * @public\n */\n static getMediaEntry(ks: string, partnerId: number, uiConfId: ?number, mediaEntryResponse: any): MediaEntry {\n const mediaEntry = new MediaEntry();\n const entry = mediaEntryResponse.entry;\n const playbackContext = mediaEntryResponse.playBackContextResult;\n const metadataList = mediaEntryResponse.metadataListResult;\n const kalturaSources = playbackContext.sources;\n\n mediaEntry.sources = OVPProviderParser._getParsedSources(kalturaSources, ks, partnerId, uiConfId, entry, playbackContext);\n OVPProviderParser._fillBaseData(mediaEntry, entry, metadataList);\n if (mediaEntry.type !== MediaEntry.Type.LIVE && OVPConfiguration.get().useApiCaptions && playbackContext.data.playbackCaptions) {\n mediaEntry.sources.captions = ExternalCaptionsBuilder.createConfig(playbackContext.data.playbackCaptions, ks);\n }\n return mediaEntry;\n }\n\n /**\n * Returns the url with KS\n * @function addKsToUrl\n * @param {String} url - The url to add the KS\n * @param {string} ks - The ks\n * @returns {string} - The url with KS\n * @static\n * @public\n */\n static addKsToUrl(url: string, ks: string): string {\n const hasUrlExtension = path => {\n const pathWithoutQuery = path.split('?')[0];\n const pathAfterLastSlash = pathWithoutQuery.replace(/^.*[\\\\/]/, '');\n return pathAfterLastSlash.indexOf('.') !== -1;\n };\n let ksParam;\n if (ks) {\n if (hasUrlExtension(url)) {\n ksParam = url.indexOf('?') === -1 ? '?ks=' : '&ks=';\n } else {\n ksParam = '/ks/';\n }\n return url + ksParam + ks;\n }\n return url;\n }\n\n /**\n * Returns parsed playlist by given OVP response objects\n * @function getPlaylist\n * @param {any} playlistResponse - The playlist response\n * @returns {Playlist} - The playlist\n * @static\n * @public\n */\n static getPlaylist(playlistResponse: any): Playlist {\n const playlist = new Playlist();\n const playlistData = playlistResponse.playlistData;\n const playlistItems = playlistResponse.playlistItems.entries;\n playlist.id = playlistData.id;\n playlist.name = playlistData.name;\n playlist.description = playlistData.description;\n playlist.poster = playlistData.poster;\n playlistItems.forEach((entry: KalturaMediaEntry) => {\n const mediaEntry = new MediaEntry();\n OVPProviderParser._fillBaseData(mediaEntry, entry);\n playlist.items.push(mediaEntry);\n });\n return playlist;\n }\n\n /**\n * Returns parsed entry list by given OVP response objects\n * @function getEntryList\n * @param {any} playlistResponse - response\n * @returns {Playlist} - The entry list\n * @static\n * @public\n */\n static getEntryList(playlistResponse: any): EntryList {\n const entryList = new EntryList();\n const playlistItems = playlistResponse.playlistItems.entries;\n playlistItems.forEach(entry => {\n const mediaEntry = new MediaEntry();\n OVPProviderParser._fillBaseData(mediaEntry, entry);\n entryList.items.push(mediaEntry);\n });\n return entryList;\n }\n\n /**\n * Returns parsed bumper by given OTT response objects.\n * @function getBumper\n * @param {any} assetResponse - The asset response.\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @returns {?Bumper} - The bumper\n * @static\n * @public\n */\n static getBumper(assetResponse: any, ks: string, partnerId: number): ?Bumper {\n const playbackContext = assetResponse.playBackContextResult;\n const bumperData: KalturaBumper = playbackContext.bumperData[0];\n if (bumperData) {\n const bumperSources = bumperData && bumperData.sources;\n const progressiveBumper = bumperSources.find(bumper => isProgressiveSource(bumper.format));\n if (progressiveBumper) {\n const parsedSources = OVPProviderParser._parseProgressiveSources(progressiveBumper, playbackContext, ks, partnerId, 0, bumperData.entryId);\n if (parsedSources[0]) {\n return new Bumper({url: parsedSources[0].url, clickThroughUrl: bumperData.clickThroughUrl});\n }\n }\n }\n }\n\n static _fillBaseData(mediaEntry: MediaEntry, entry: KalturaMediaEntry, metadataList: ?KalturaMetadataListResponse) {\n mediaEntry.poster = entry.poster;\n mediaEntry.id = entry.id;\n mediaEntry.duration = entry.duration;\n mediaEntry.metadata = OVPProviderParser._parseMetadata(metadataList);\n mediaEntry.metadata.description = entry.description || '';\n mediaEntry.metadata.entryId = entry.id || '';\n mediaEntry.metadata.name = entry.name || '';\n if (entry.createdAt) mediaEntry.metadata.createdAt = entry.createdAt;\n if (entry.endDate) mediaEntry.metadata.endDate = entry.endDate;\n mediaEntry.metadata.tags = entry.tags || '';\n mediaEntry.status = entry.status;\n\n mediaEntry.type = OVPProviderParser._getEntryType(entry.entryType, entry.type);\n if (mediaEntry.type === MediaEntry.Type.LIVE) {\n mediaEntry.dvrStatus = entry.dvrStatus;\n }\n\n return mediaEntry;\n }\n\n static _getEntryType(entryTypeEnum: number, typeEnum: number | string): string {\n let type = MediaEntry.Type.UNKNOWN;\n switch (entryTypeEnum) {\n case KalturaMediaEntry.MediaType.IMAGE.value:\n type = MediaEntry.Type.IMAGE;\n break;\n case KalturaMediaEntry.MediaType.AUDIO.value:\n type = MediaEntry.Type.AUDIO;\n break;\n default:\n switch (typeEnum) {\n case KalturaMediaEntry.EntryType.MEDIA_CLIP.value:\n type = MediaEntry.Type.VOD;\n break;\n case KalturaMediaEntry.EntryType.LIVE_STREAM.value:\n case KalturaMediaEntry.EntryType.LIVE_CHANNEL.value:\n type = MediaEntry.Type.LIVE;\n break;\n default:\n type = MediaEntry.Type.UNKNOWN;\n }\n }\n return type;\n }\n\n /**\n * Returns the parsed sources\n * @function _getParsedSources\n * @param {Array<KalturaPlaybackSource>} kalturaSources - The kaltura sources\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {Object} entry - The entry\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @return {MediaSources} - A media sources\n * @static\n * @private\n */\n static _getParsedSources(\n kalturaSources: Array<KalturaPlaybackSource>,\n ks: string,\n partnerId: number,\n uiConfId: ?number,\n entry: Object,\n playbackContext: KalturaPlaybackContext\n ): MediaSources {\n const sources = new MediaSources();\n const addAdaptiveSource = (source: KalturaPlaybackSource) => {\n const parsedSource = OVPProviderParser._parseAdaptiveSource(source, playbackContext, ks, partnerId, uiConfId, entry.id);\n if (parsedSource) {\n const sourceFormat = SupportedStreamFormat.get(source.format);\n sources.map(parsedSource, sourceFormat);\n }\n };\n const parseAdaptiveSources = () => {\n kalturaSources.filter(source => !isProgressiveSource(source.format)).forEach(addAdaptiveSource);\n };\n const parseProgressiveSources = () => {\n const progressiveSource = kalturaSources.find(source => {\n //match progressive source with supported protocol(http/s)\n return isProgressiveSource(source.format) && source.getProtocol(OVPProviderParser._getBaseProtocol()) !== '';\n });\n sources.progressive = OVPProviderParser._parseProgressiveSources(progressiveSource, playbackContext, ks, partnerId, uiConfId, entry.id);\n };\n\n const parseImageSources = () => {\n sources.image.push(new ImageSource(entry));\n };\n\n const parseExternalMedia = () => {\n const mediaSource = new MediaSource();\n mediaSource.mimetype = 'video/youtube';\n mediaSource.url = entry.referenceId;\n mediaSource.id = entry.id + '_youtube';\n sources.progressive.push(mediaSource);\n };\n\n if (entry.type === KalturaMediaEntry.EntryType.EXTERNAL_MEDIA.value) {\n parseExternalMedia();\n } else if (entry.entryType === KalturaMediaEntry.MediaType.IMAGE.value) {\n parseImageSources();\n } else if (kalturaSources && kalturaSources.length > 0) {\n parseAdaptiveSources();\n parseProgressiveSources();\n }\n return sources;\n }\n\n /**\n * Returns a parsed adaptive source\n * @function _parseAdaptiveSource\n * @param {KalturaPlaybackSource} kalturaSource - A kaltura source\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {string} entryId - The entry id\n * @returns {?MediaSource} - The parsed adaptive kalturaSource\n * @static\n * @private\n */\n static _parseAdaptiveSource(\n kalturaSource: ?KalturaPlaybackSource,\n playbackContext: KalturaPlaybackContext,\n ks: string,\n partnerId: number,\n uiConfId: ?number,\n entryId: string\n ): ?MediaSource {\n const mediaSource: MediaSource = new MediaSource();\n if (kalturaSource) {\n let playUrl: string = '';\n const mediaFormat = SupportedStreamFormat.get(kalturaSource.format);\n const protocol = kalturaSource.getProtocol(OVPProviderParser._getBaseProtocol());\n const deliveryProfileId = kalturaSource.deliveryProfileId;\n const format = kalturaSource.format;\n let extension: string = '';\n if (mediaFormat) {\n extension = mediaFormat.pathExt;\n mediaSource.mimetype = mediaFormat.mimeType;\n }\n // in case playbackSource doesn't have flavors we don't need to build the url and we'll use the provided one.\n if (kalturaSource.hasFlavorIds()) {\n if (!extension && playbackContext.flavorAssets && playbackContext.flavorAssets.length > 0) {\n extension = playbackContext.flavorAssets[0].fileExt;\n }\n playUrl = PlaySourceUrlBuilder.build({\n entryId,\n flavorIds: kalturaSource.flavorIds,\n format,\n ks,\n partnerId,\n uiConfId,\n extension,\n protocol\n });\n } else {\n playUrl = OVPProviderParser.addKsToUrl(kalturaSource.url, ks);\n }\n if (!playUrl) {\n const message = `failed to create play url from source, discarding source: (${entryId}_${deliveryProfileId}), ${format}`;\n OVPProviderParser._logger.warn(message);\n return null;\n }\n mediaSource.url = playUrl;\n mediaSource.id = entryId + '_' + deliveryProfileId + ',' + format;\n if (kalturaSource.hasDrmData()) {\n const drmParams: Array<Drm> = [];\n kalturaSource.drm.forEach(drm => {\n drmParams.push(new Drm(drm.licenseURL, KalturaDrmPlaybackPluginData.Scheme[drm.scheme], drm.certificate));\n });\n mediaSource.drmData = drmParams;\n }\n }\n return mediaSource;\n }\n\n /**\n * Returns parsed progressive sources\n * @function _parseProgressiveSources\n * @param {KalturaPlaybackSource} kalturaSource - A kaltura source\n * @param {KalturaPlaybackContext} playbackContext - The playback context\n * @param {string} ks - The ks\n * @param {number} partnerId - The partner ID\n * @param {number} uiConfId - The uiConf ID\n * @param {string} entryId - The entry id\n * @returns {Array<MediaSource>} - The parsed progressive kalturaSources\n * @static\n * @private\n */\n static _parseProgressiveSources(\n kalturaSource: ?KalturaPlaybackSource,\n playbackContext: KalturaPlaybackContext,\n ks: string,\n partnerId: number,\n uiConfId: ?number,\n entryId: string\n ): Array<MediaSource> {\n const videoSources: Array<MediaSource> = [];\n const audioSources: Array<MediaSource> = [];\n if (kalturaSource) {\n const protocol = kalturaSource.getProtocol(OVPProviderParser._getBaseProtocol());\n const format = kalturaSource.format;\n const deliveryProfileId = kalturaSource.deliveryProfileId;\n const sourceId = deliveryProfileId + ',' + format;\n playbackContext.flavorAssets.map(flavor => {\n const mediaSource: MediaSource = new MediaSource();\n mediaSource.id = flavor.id + sourceId;\n mediaSource.mimetype = flavor.fileExt === 'mp3' ? 'audio/mp3' : 'video/mp4';\n mediaSource.height = flavor.height;\n mediaSource.width = flavor.width;\n mediaSource.bandwidth = flavor.bitrate * 1024;\n mediaSource.label = flavor.label || flavor.language;\n const playUrl = PlaySourceUrlBuilder.build({\n entryId,\n flavorIds: flavor.id,\n format,\n ks,\n partnerId: partnerId,\n uiConfId: uiConfId,\n extension: flavor.fileExt,\n protocol\n });\n if (playUrl === '') {\n OVPProviderParser._logger.warn(`failed to create play url from source, discarding source: (${entryId}_${deliveryProfileId}), ${format}.`);\n return null;\n } else {\n mediaSource.url = playUrl;\n if (flavor.height && flavor.width) {\n videoSources.push(mediaSource);\n } else {\n audioSources.push(mediaSource);\n }\n }\n });\n }\n //If we have only audio flavors return them, otherwise return video flavors\n return audioSources.length && !videoSources.length ? audioSources : videoSources;\n }\n\n /**\n * Ovp metadata parser\n * @function _parseMetaData\n * @param {KalturaMetadataListResponse} metadataList The metadata list\n * @returns {Object} Parsed metadata\n * @static\n * @private\n */\n static _parseMetadata(metadataList: ?KalturaMetadataListResponse): Object {\n const metadata = {};\n if (metadataList && metadataList.metas && metadataList.metas.length > 0) {\n metadataList.metas.forEach(meta => {\n if (meta.xml) {\n let metaXml: Object;\n const domParser: DOMParser = new DOMParser();\n meta.xml = meta.xml.replace(/\\r?\\n|\\r/g, '');\n meta.xml = meta.xml.replace(/>\\s*/g, '>');\n meta.xml = meta.xml.replace(/>\\s*/g, '>');\n metaXml = domParser.parseFromString(meta.xml, 'text/xml');\n const metasObj: Object = XmlParser.xmlToJson(metaXml);\n const metaKeys = Object.keys(metasObj.metadata);\n metaKeys.forEach(key => {\n metadata[key] = metasObj.metadata[key]['#text'];\n });\n }\n });\n }\n return metadata;\n }\n\n /**\n * Returns the base protocol\n * @function _getBaseProtocol\n * @returns {string} - The base protocol\n * @static\n * @private\n */\n static _getBaseProtocol(): string {\n const config = OVPConfiguration.get();\n const protocolRegex = /^https?:/;\n const result = protocolRegex.exec(config.cdnUrl);\n const protocol = result ? result[0] : document.location.protocol;\n if (typeof protocol === 'string') {\n return protocol.slice(0, -1); // remove ':' from the end\n }\n return 'https';\n }\n\n static hasBlockAction(response: OVPMediaEntryLoaderResponse): boolean {\n return response.playBackContextResult.hasBlockAction();\n }\n\n static getBlockAction(response: OVPMediaEntryLoaderResponse): ?KalturaRuleAction {\n return response.playBackContextResult.getBlockAction();\n }\n\n static getErrorMessages(response: OVPMediaEntryLoaderResponse): Array<KalturaAccessControlMessage> {\n return response.playBackContextResult.getErrorMessages();\n }\n}\n\nexport const addKsToUrl = OVPProviderParser.addKsToUrl;\nexport default OVPProviderParser;\n","//@flow\nimport MultiRequestBuilder from '../../common/multi-request-builder';\nimport OVPConfiguration from '../config';\n\nconst SERVICE_NAME: string = 'multirequest';\n\nexport default class OVPService {\n /**\n * Gets a new instance of MultiRequestBuilder with ovp params\n * @function getMultiRequest\n * @param {string} playerVersion The player version\n * @param {string} ks The ks\n * @param {string} partnerId The partner ID\n * @returns {MultiRequestBuilder} The multi request builder\n * @static\n */\n static getMultiRequest(playerVersion: string, ks: string, partnerId?: number): MultiRequestBuilder {\n const config = OVPConfiguration.get();\n const ovpParams = config.serviceParams;\n Object.assign(ovpParams, {ks: ks, clientTag: 'html5:v' + playerVersion});\n if (partnerId) {\n Object.assign(ovpParams, {partnerId: partnerId});\n }\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const multiReq = new MultiRequestBuilder(headers);\n multiReq.method = 'POST';\n multiReq.service = SERVICE_NAME;\n multiReq.url = multiReq.getUrl(config.serviceUrl);\n multiReq.params = ovpParams;\n return multiReq;\n }\n}\n","//@flow\nconst FIELDS =\n 'id,referenceId,name,description,thumbnailUrl,dataUrl,duration,msDuration,flavorParamsIds,mediaType,type,tags,dvrStatus,externalSourceType,status,createdAt,endDate';\nconst RESPONSE_PROFILE_TYPE = {\n INCLUDE_FIELDS: 1,\n EXCLUDE_FIELDS: 2\n};\nexport class BaseEntryResponseProfile {\n static Type: {[type: string]: number} = RESPONSE_PROFILE_TYPE;\n /**\n * @member - the response profile type\n * @type {number}\n */\n type: number;\n /**\n * @member - Comma separated fields list to be included or excluded\n * @type {string}\n */\n fields: string;\n\n /**\n * @constructor\n * @param {Object} responseProfile -\n */\n constructor(responseProfile: Object = {}) {\n this.type = responseProfile.type || BaseEntryResponseProfile.Type.INCLUDE_FIELDS;\n this.fields = responseProfile.fields || FIELDS;\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\nimport {BaseEntryResponseProfile} from '../request-params/base-entry-response-profile';\n\nconst SERVICE_NAME: string = 'baseEntry';\n\nexport default class OVPBaseEntryService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for baseentry.getPlaybackContext\n * @function getPlaybackContext\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The ks\n * @param {serviceEntryId} serviceEntryId The entry id from the request result (to support loading by referenceId)\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static getPlaybackContext(serviceUrl: string, ks: string, serviceEntryId: string): RequestBuilder {\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'getPlaybackContext';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'baseEntry-getPlaybackContext';\n const contextDataParams = {objectType: 'KalturaContextDataParams', flavorTags: 'all'};\n request.params = {entryId: serviceEntryId, ks: ks, contextDataParams: contextDataParams};\n return request;\n }\n\n /**\n * Creates an instance of RequestBuilder for baseentry.list\n * @function list\n * @param {string} serviceUrl The base URL\n * @param {string} ks The ks\n * @param {string} entryId The entry ID\n * @param {boolean} redirectFromEntryId whether the live entry should continue and play the VOD one after the live stream ends.\n * @param {string} referenceId a Reference id instead of an entry id\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static list(serviceUrl: string, ks: string, entryId: string, redirectFromEntryId: boolean, referenceId: string): RequestBuilder {\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'list';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'list';\n request.params = OVPBaseEntryService.getEntryListReqParams(entryId, ks, redirectFromEntryId, referenceId);\n return request;\n }\n\n /**\n * Gets baseentry.list service params\n * @function getEntryListReqParams\n * @param {string} entryId The entry ID\n * @param {string} ks The ks\n * @param {boolean} redirectFromEntryId whether the live entry should continue and play the VOD one after the live stream ends.\n * @param {string} referenceId a Reference id instead of an entry id\n * @returns {{ks: string, filter: {redirectFromEntryId: string}, responseProfile: {fields: string, type: number}}} The service params object\n * @static\n */\n static getEntryListReqParams(entryId: string, ks: string, redirectFromEntryId: boolean, referenceId: string): any {\n let filterParams = {};\n if (entryId) {\n filterParams = redirectFromEntryId ? {redirectFromEntryId: entryId} : {idEqual: entryId};\n } else if (referenceId) {\n filterParams = {objectType: 'KalturaBaseEntryFilter', referenceIdEqual: referenceId};\n }\n\n return {ks: ks, filter: filterParams, responseProfile: new BaseEntryResponseProfile()};\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\n\nconst SERVICE_NAME: string = 'metadata_metadata';\n\nexport default class OVPMetadataService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for metadata_metadata.list\n * @function getPlaybackContext\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The ks\n * @param {string} entryId The entry ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static list(serviceUrl: string, ks: string, entryId: string): RequestBuilder {\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'list';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'metadata_metadata-list';\n const filter = {objectType: 'KalturaMetadataFilter', objectIdEqual: entryId, metadataObjectTypeEqual: '1'};\n request.params = {filter: filter, ks: ks};\n return request;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaMediaEntry} from './kaltura-media-entry';\n\nexport class KalturaBaseEntryListResponse extends ServiceResult {\n /**\n * @member - The total count\n * @type {number}\n */\n totalCount: number;\n /**\n * @member - The entries\n * @type {Array<KalturaMediaEntry>}\n */\n entries: Array<KalturaMediaEntry>;\n\n /**\n * @constructor\n * @param {Object} responseObj The json response\n */\n constructor(responseObj: Object) {\n super(responseObj);\n if (!this.hasError) {\n this.totalCount = responseObj.totalCount;\n if (this.totalCount > 0) {\n this.entries = [];\n responseObj.objects.map(entry => this.entries.push(new KalturaMediaEntry(entry)));\n }\n }\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OVPBaseEntryService from '../services/base-entry-service';\nimport OVPMetadataService from '../services/meta-data-service';\nimport OVPConfiguration from '../config';\nimport {KalturaPlaybackContext} from '../response-types/kaltura-playback-context';\nimport {KalturaMetadataListResponse} from '../response-types/kaltura-metadata-list-response';\nimport {KalturaBaseEntryListResponse} from '../response-types/kaltura-base-entry-list-response';\nimport {KalturaMediaEntry} from '../response-types/kaltura-media-entry';\n\ntype OVPMediaEntryLoaderResponse = {\n entry: KalturaMediaEntry,\n playBackContextResult: KalturaPlaybackContext,\n metadataListResult: KalturaMetadataListResponse\n};\nexport type {OVPMediaEntryLoaderResponse};\n\nexport default class OVPMediaEntryLoader implements ILoader {\n _entryId: string;\n _referenceId: string;\n _requests: Array<RequestBuilder>;\n _response: any = {};\n\n static get id(): string {\n return 'media';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n * @boolean {boolean} useExternalCaptions - if we should add captions request to the multirequests.\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._entryId = params.entryId;\n this._referenceId = params.referenceId;\n }\n\n set requests(requests: Array<RequestBuilder>) {\n this._requests = requests;\n }\n\n get requests(): Array<RequestBuilder> {\n return this._requests;\n }\n\n set response(response: any) {\n let mediaEntryResponse: KalturaBaseEntryListResponse = new KalturaBaseEntryListResponse(response[0].data);\n this._response.entry = mediaEntryResponse.entries[0];\n this._response.playBackContextResult = new KalturaPlaybackContext(response[1].data);\n this._response.metadataListResult = new KalturaMetadataListResponse(response[2].data);\n }\n\n get response(): OVPMediaEntryLoaderResponse {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array<RequestBuilder> {\n const config = OVPConfiguration.get();\n const requests: Array<RequestBuilder> = [];\n requests.push(OVPBaseEntryService.list(config.serviceUrl, params.ks, params.entryId, params.redirectFromEntryId, params.referenceId));\n // Use the entry id from the request result to support loading by referenceId\n const serviceEntryId = params.ks === '{1:result:ks}' ? '{2:result:objects:0:id}' : '{1:result:objects:0:id}';\n requests.push(OVPBaseEntryService.getPlaybackContext(config.serviceUrl, params.ks, serviceEntryId));\n requests.push(OVPMetadataService.list(config.serviceUrl, params.ks, serviceEntryId));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!(this._entryId || this._referenceId);\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\n\nconst SERVICE_NAME: string = 'session';\n\nexport default class OVPSessionService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for session.startWidgetSession\n * @function anonymousSession\n * @param {string} serviceUrl The service base URL\n * @param {string} widgetId The widget ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static anonymousSession(serviceUrl: string, widgetId: string): RequestBuilder {\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'startWidgetSession';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = 'session-startWidget';\n request.params = {widgetId};\n return request;\n }\n}\n","//@flow\nimport OVPSessionService from '../services/session-service';\nimport OVPConfiguration from '../config';\nimport RequestBuilder from '../../../util/request-builder';\n\nexport default class OVPSessionLoader implements ILoader {\n _widgetId: string;\n _requests: Array<RequestBuilder>;\n _response: any = {};\n\n static get id(): string {\n return 'session';\n }\n\n set requests(requests: Array<RequestBuilder>) {\n this._requests = requests;\n }\n\n get requests(): Array<RequestBuilder> {\n return this._requests;\n }\n\n set response(response: any) {\n this._response.ks = response[0].data.ks;\n }\n\n get response(): any {\n return this._response.ks;\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._widgetId = params.widgetId;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array<RequestBuilder> {\n const config = OVPConfiguration.get();\n const requests: Array<RequestBuilder> = [];\n requests.push(OVPSessionService.anonymousSession(config.serviceUrl, params.widgetId));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!this._widgetId;\n }\n}\n","// @flow\nimport DataLoaderManager from '../../common/data-loader-manager';\nimport OVPService from '../services/ovp-service';\n\n/**\n * OTTDataLoaderManager is a class that handles the OVP data loading\n * @param {string} playerVersion - player version\n * @param {string} partnerId - partner id\n * @param {string} ks - ks\n * @param {ProviderNetworkRetryParameters} [networkRetryConfig] - network retry configuration\n */\nexport default class OVPDataLoaderManager extends DataLoaderManager {\n constructor(playerVersion: string, partnerId: number, ks: string = '', networkRetryConfig: ProviderNetworkRetryParameters) {\n super(networkRetryConfig);\n this._multiRequest = OVPService.getMultiRequest(playerVersion, ks, partnerId);\n }\n}\n","//@flow\nimport OVPService from './ovp-service';\nimport RequestBuilder from '../../../util/request-builder';\nimport {BaseEntryResponseProfile} from '../request-params/base-entry-response-profile';\n\nconst SERVICE_NAME: string = 'playlist';\n\nexport default class OVPPlaylistService extends OVPService {\n /**\n * Creates an instance of RequestBuilder for playlist.getPlaybackContext\n * @function getPlaybackContext\n * @param {string} serviceUrl The service base URL\n * @param {string} ks The ks\n * @param {string} playlistId The playlist ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static execute(serviceUrl: string, ks: string, playlistId: string): RequestBuilder {\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'execute';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = `${SERVICE_NAME}-execute`;\n request.params = {\n ks: ks,\n id: playlistId,\n responseProfile: new BaseEntryResponseProfile()\n };\n return request;\n }\n\n /**\n * Creates an instance of RequestBuilder for playlist.list\n * @function list\n * @param {string} serviceUrl The base URL\n * @param {string} ks The ks\n * @param {string} playlistId The playlist ID\n * @returns {RequestBuilder} The request builder\n * @static\n */\n static get(serviceUrl: string, ks: string, playlistId: string): RequestBuilder {\n const headers: Map<string, string> = new Map();\n headers.set('Content-Type', 'application/json');\n const request = new RequestBuilder(headers);\n request.service = SERVICE_NAME;\n request.action = 'get';\n request.method = 'POST';\n request.url = request.getUrl(serviceUrl);\n request.tag = `${SERVICE_NAME}-get`;\n request.params = {\n ks: ks,\n id: playlistId,\n responseProfile: {\n fields: 'id,name,description,thumbnailUrl',\n type: 1\n }\n };\n return request;\n }\n}\n","//@flow\n\nexport class KalturaPlaylist {\n /**\n * @member - playlist id\n * @type {string}\n */\n id: string;\n /**\n * @member - playlist name\n * @type {string}\n */\n name: string;\n /**\n * @member - playlist description\n * @type {string}\n */\n description: string;\n /**\n * @member - playlist poster image\n * @type {string}\n */\n poster: string;\n\n /**\n * @constructor\n * @param {Object} playlist - The json response\n */\n constructor(playlist: Object) {\n this.id = playlist.id;\n this.name = playlist.name;\n this.description = playlist.description;\n this.poster = playlist.thumbnailUrl;\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\nimport {KalturaMediaEntry} from './kaltura-media-entry';\n\nexport class KalturaMediaEntries extends ServiceResult {\n /**\n * @member - The entries\n * @type {Array<KalturaMediaEntry>}\n */\n entries: Array<KalturaMediaEntry>;\n\n /**\n * @constructor\n * @param {Object} responseObj The json response\n */\n constructor(responseObj: Object) {\n super(responseObj);\n if (!this.hasError) {\n this.entries = [];\n responseObj.map(entry => this.entries.push(new KalturaMediaEntry(entry)));\n }\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OVPPlaylistService from '../services/playlist-service';\nimport OVPConfiguration from '../config';\nimport {KalturaPlaylist} from '../response-types/kaltura-playlist';\nimport {KalturaMediaEntries} from '../response-types/kaltura-media-entries';\n\nexport default class OVPPlaylistLoader implements ILoader {\n _playlistId: string;\n _requests: Array<RequestBuilder>;\n _response: any = {};\n\n static get id(): string {\n return 'playlist';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._playlistId = params.playlistId;\n }\n\n set requests(requests: Array<RequestBuilder>) {\n this._requests = requests;\n }\n\n get requests(): Array<RequestBuilder> {\n return this._requests;\n }\n\n set response(response: any) {\n this._response.playlistData = new KalturaPlaylist(response[0].data);\n this._response.playlistItems = new KalturaMediaEntries(response[1].data);\n }\n\n get response(): any {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array<RequestBuilder> {\n const config = OVPConfiguration.get();\n const requests: Array<RequestBuilder> = [];\n requests.push(OVPPlaylistService.get(config.serviceUrl, params.ks, params.playlistId));\n requests.push(OVPPlaylistService.execute(config.serviceUrl, params.ks, params.playlistId));\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!this._playlistId;\n }\n}\n","//@flow\nimport RequestBuilder from '../../../util/request-builder';\nimport OVPConfiguration from '../config';\nimport OVPBaseEntryService from '../services/base-entry-service';\nimport {KalturaBaseEntryListResponse} from '../response-types/kaltura-base-entry-list-response';\n\nexport default class OVPEntryListLoader implements ILoader {\n _entries: Array<string>;\n _requests: Array<RequestBuilder>;\n _response: any = {playlistItems: {entries: []}};\n\n static get id(): string {\n return 'entry_list';\n }\n\n /**\n * @constructor\n * @param {Object} params loader params\n */\n constructor(params: Object) {\n this.requests = this.buildRequests(params);\n this._entries = params.entries;\n }\n\n set requests(requests: Array<RequestBuilder>) {\n this._requests = requests;\n }\n\n get requests(): Array<RequestBuilder> {\n return this._requests;\n }\n\n set response(response: any) {\n let mediaEntryResponse: KalturaBaseEntryListResponse;\n response.forEach(item => {\n mediaEntryResponse = new KalturaBaseEntryListResponse(item.data);\n this._response.playlistItems.entries.push(mediaEntryResponse.entries[0]);\n });\n }\n\n get response(): any {\n return this._response;\n }\n\n /**\n * Builds loader requests\n * @function\n * @param {Object} params Requests parameters\n * @returns {RequestBuilder} The request builder\n * @static\n */\n buildRequests(params: Object): Array<RequestBuilder> {\n const config = OVPConfiguration.get();\n const requests: Array<RequestBuilder> = [];\n params.entries.forEach(entry => {\n requests.push(OVPBaseEntryService.list(config.serviceUrl, params.ks, entry.entryId || entry, params.redirectFromEntryId, entry.referenceId));\n });\n return requests;\n }\n\n /**\n * Loader validation function\n * @function\n * @returns {boolean} Is valid\n */\n isValid(): boolean {\n return !!(this._entries && this._entries.length);\n }\n}\n","//@flow\nimport ServiceResult from '../../common/base-service-result';\n\nexport class KalturaUIConfResponse extends ServiceResult {\n static Type: {[type: string]: number} = {\n PLAYER: 1,\n CONTRIBUTION_WIZARD: 2,\n SIMPLE_EDITOR: 3,\n ADVANCED_EDITOR: 4,\n PLAYLIST: 5,\n APP_STUDIO: 6,\n KRECORD: 7,\n PLAYER_V3: 8,\n KMC_ACCOUNT: 9,\n KMC_ANALYTICS: 10,\n KMC_CONTENT: 11,\n KMC_DASHBOARD: 12,\n KMC_LOGIN: 13,\n PLAYER_SL: 14,\n CLIENTSIDE_ENCODER: 15,\n KMC_GENERAL: 16,\n KMC_ROLES_AND_PERMISSIONS: 17,\n CLIPPER: 18,\n KSR: 19,\n KUPLOAD: 20,\n WEBCASTING: 21\n };\n\n static CreationMode: {[mode: string]: number} = {\n WIZARD: 2,\n ADVANCED: 3\n };\n\n description: string;\n objTypeAsString: string;\n width: number;\n height: number;\n htmlParams: string;\n swfUrl: string;\n confFilePath: string;\n confFile: string;\n confFileFeatures: string;\n name: string;\n config: string;\n confVars: string;\n useCdn: boolean;\n tags: string;\n swfUrlVersion: string;\n created: Date;\n updated: Date;\n html5Url: string;\n version: string;\n partnerTags: string;\n objType: number;\n creationMode: number;\n\n /**\n * @constructor\n * @param {Object} data The json response\n */\n constructor(data: Object) {\n super(data);\n if (!this.hasError) {\n this.name = data.name;\n this.description = data.description;\n this.objTypeAsString = data.objTypeAsString;\n this.width = data.width;\n this.height = data.height;\n this.htmlParams = data.htmlParams;\n this.swfUrl = data.swfUrl;\n this.confFilePath = data.confFilePath;\n this.confFile = data.confFile;\n this.confFileFeatures = data.confFileFeatures;\n this.config = data.config;\n this.confVars = data.confVars;\n this.useCdn = data.useCdn;\n this.tags = data.tags;\n this.swfUrlVersion = data.swfUrlVersion;\n this.created = new Date(0);\n this.created.setUTCSeconds(data.createdAt);\n this.updated = new Date(0);\n this.updated.setUTCSeconds(data.updatedAt);\n this.html5Url = data.description;\n this.version = data.description;\n this.partnerTags = data.description;\n this.objType = data.description;\n this.creationMode = data.description;\n }\n }\n}\n","//@flow\nimport getLogger from '../../util/logger';\nimport OVPConfiguration from './config';\nimport {KalturaAccessControlModifyRequestHostRegexAction} from './response-types';\nimport OVPMediaEntryLoader from './loaders/media-entry-loader';\n\nclass RegexActionHandler {\n static _logger = getLogger('RegexActionHandler');\n\n /**\n * Applies the request host regex on the url\n * @function _applyRegexAction\n * @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action\n * @param {string} url - The url to modify\n * @returns {string} - The request host regex applied url\n * @static\n * @private\n */\n static _applyRegexAction(regexAction: KalturaAccessControlModifyRequestHostRegexAction, url: string): string {\n if (regexAction) {\n const regex = new RegExp(regexAction.pattern, 'i');\n if (url.match(regex)) {\n return url.replace(regex, regexAction.replacement + '/');\n }\n }\n return url;\n }\n\n /**\n * Ping the ECDN url to check if alive\n * @function _pingECDNUrl\n * @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action\n * @param {string} cdnUrl - The CDN url\n * @returns {Promise<boolean>} - Whether the media config sources urls should be modified or not\n * @static\n * @private\n */\n static async _isECDNUrlAlive(regexAction: KalturaAccessControlModifyRequestHostRegexAction, cdnUrl: string) {\n const urlPing = cdnUrl + '/api_v3/service/system/action/ping/format/1';\n const req = new XMLHttpRequest();\n req.open('GET', urlPing);\n req.timeout = regexAction.checkAliveTimeoutMs;\n req.onreadystatechange = () => {\n if (req.readyState === 4) {\n if (req.status === 200) {\n return true;\n }\n return false;\n }\n };\n req.ontimeout = () => {\n RegexActionHandler._logger.warn(`Got timeout while pinging the ECDN url. the ping url: ${urlPing}`);\n return false;\n };\n req.send();\n }\n\n /**\n * Handles regex action\n * @function handleRegexAction\n * @param {ProviderMediaConfigObject} mediaConfig - The media config\n * @param {Map<string, Function>} rawResponse - The raw response data from backend\n * @returns {Promise<ProviderMediaConfigObject>} - The media config with old or modified urls\n * @static\n */\n static async handleRegexAction(mediaConfig: ProviderMediaConfigObject, rawResponse: Map<string, Function>): Promise<ProviderMediaConfigObject> {\n let cdnUrl = OVPConfiguration.get().cdnUrl;\n const regexAction = RegexActionHandler._extractRegexActionFromData(rawResponse);\n const regExp = RegexActionHandler._getRegExp(regexAction);\n\n if (\n cdnUrl &&\n regexAction &&\n regExp &&\n cdnUrl.match(regExp) &&\n // we need to make the replacement in all cases except for when the checkAliveTimeoutMs > 0 && the ping has failed\n !(\n regexAction.checkAliveTimeoutMs > 0 &&\n !(await RegexActionHandler._isECDNUrlAlive(regexAction, cdnUrl.replace(regExp, regexAction.replacement)))\n )\n ) {\n RegexActionHandler._replaceHostUrls(mediaConfig, regexAction);\n return mediaConfig;\n }\n\n RegexActionHandler._logger.debug('exiting handleRegexAction - not applying regex action.');\n return mediaConfig;\n }\n\n /**\n * Modify the host urls - injects the configured cdn before the original host, to route requests\n * @function _replaceHostUrls\n * @param {ProviderMediaConfigObject} mediaConfig - The media config\n * @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action\n * @returns {void}\n * @static\n * @private\n */\n static _replaceHostUrls(mediaConfig: ProviderMediaConfigObject, regexAction: KalturaAccessControlModifyRequestHostRegexAction) {\n RegexActionHandler._logger.debug(`Starting to modify urls...`);\n const sources = mediaConfig.sources;\n const {hls, dash, progressive, image} = sources;\n\n [...hls, ...dash, ...progressive, ...image].forEach(src => (src.url = RegexActionHandler._applyRegexAction(regexAction, src.url)));\n\n if (!OVPConfiguration.get().replaceHostOnlyManifestUrls) {\n RegexActionHandler._logger.debug(`replaceHostOnlyManifestUrls flag is off - modifying captions and poster URLs`);\n if (sources.captions) {\n sources.captions.forEach(src => (src.url = RegexActionHandler._applyRegexAction(regexAction, src.url)));\n }\n\n // fix flow - poster can also be an array, but only for ott.\n if (typeof sources.poster === 'string') {\n sources.poster = RegexActionHandler._applyRegexAction(regexAction, sources.poster);\n }\n }\n RegexActionHandler._logger.debug(`Finished modifying urls`);\n }\n\n /**\n * Extracts the regex action from the data response\n * @function _extractRegexActionFromData\n * @param {Map<string, Function>} data - The response data\n * @returns {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action\n * @static\n * @private\n */\n static _extractRegexActionFromData(data: Map<string, Function>): ?KalturaAccessControlModifyRequestHostRegexAction {\n return data.get(OVPMediaEntryLoader.id)?.response?.playBackContextResult.getRequestHostRegexAction();\n }\n\n /**\n * Extracts the regex action from the data response\n * @function _extractRegexActionFromData\n * @param {KalturaAccessControlModifyRequestHostRegexAction} regexAction - The regex action\n * @returns {RegExp} The regex expression\n * @static\n * @private\n */\n static _getRegExp(regexAction: KalturaAccessControlModifyRequestHostRegexAction): ?RegExp {\n if (regexAction && regexAction.pattern && regexAction.replacement) {\n return new RegExp(regexAction.pattern, 'i');\n }\n }\n}\n\nexport default RegexActionHandler;\n","//@flow\nimport getLogger from '../../util/logger';\nimport OVPConfiguration from './config';\nimport OVPProviderParser from './provider-parser';\nimport {KalturaMediaEntry} from './response-types/kaltura-media-entry';\nimport OVPMediaEntryLoader from './loaders/media-entry-loader';\nimport OVPSessionLoader from './loaders/session-loader';\nimport OVPDataLoaderManager from './loaders/data-loader-manager';\nimport OVPPlaylistLoader from './loaders/playlist-loader';\nimport BaseProvider from '../common/base-provider';\nimport MediaEntry from '../../entities/media-entry';\nimport OVPEntryListLoader from './loaders/entry-list-loader';\nimport Error from '../../util/error/error';\nimport RegexActionHandler from './regex-action-handler';\n\nexport default class OVPProvider extends BaseProvider<OVPProviderMediaInfoObject> {\n _filterOptionsConfig: ProviderFilterOptionsObject = {redirectFromEntryId: true};\n /**\n * @constructor\n * @param {ProviderOptionsObject} options - provider options\n * @param {string} playerVersion - player version\n */\n constructor(options: ProviderOptionsObject, playerVersion: string) {\n super(options, playerVersion);\n this._logger = getLogger('OVPProvider');\n OVPConfiguration.set(options.env);\n this._setFilterOptionsConfig(options.filterOptions);\n this._networkRetryConfig = Object.assign(this._networkRetryConfig, options.networkRetryParameters);\n }\n\n get env() {\n return OVPConfiguration.get();\n }\n\n /**\n * Gets the backend media config object.\n * @param {OVPProviderMediaInfoObject} mediaInfo - ovp media info\n * @returns {Promise<ProviderMediaConfigObject>} - The provider media config\n */\n getMediaConfig(mediaInfo: OVPProviderMediaInfoObject): Promise<ProviderMediaConfigObject> {\n if (mediaInfo.ks) {\n this.ks = mediaInfo.ks;\n this._isAnonymous = false;\n }\n if (this.widgetId !== this.defaultWidgetId) {\n this._isAnonymous = false;\n }\n this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const entryId = mediaInfo.entryId;\n const referenceId = mediaInfo.referenceId;\n if (entryId || referenceId) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n const redirectFromEntryId = this._getEntryRedirectFilter(mediaInfo);\n this._dataLoader.add(OVPMediaEntryLoader, {entryId, ks, redirectFromEntryId, referenceId});\n return this._dataLoader.fetchData().then(\n response => {\n try {\n const mediaConfig = this._parseDataFromResponse(response);\n RegexActionHandler.handleRegexAction(mediaConfig, response).then(resolve);\n } catch (err) {\n reject(err);\n }\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject(new Error(Error.Severity.CRITICAL, Error.Category.PROVIDER, Error.Code.MISSING_MANDATORY_PARAMS, {message: 'missing entry id'}));\n }\n });\n }\n\n doRequest(loaders: Array<RequestLoader>, ks?: string): Promise<any> {\n let theKs: string = ks || this.ks;\n const dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, theKs, this._networkRetryConfig);\n\n return new Promise((resolve, reject) => {\n if (!theKs) {\n dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n loaders.forEach((loaderRequest: RequestLoader) => {\n dataLoader.add(loaderRequest.loader, loaderRequest.params, theKs || '{1:result:ks}');\n });\n return dataLoader.fetchData().then(\n response => {\n try {\n resolve(response);\n } catch (err) {\n reject(err);\n }\n },\n err => {\n reject(err);\n }\n );\n });\n }\n\n _getEntryRedirectFilter(mediaInfo: Object): boolean {\n return typeof mediaInfo.redirectFromEntryId === 'boolean'\n ? mediaInfo.redirectFromEntryId\n : typeof this._filterOptionsConfig.redirectFromEntryId === 'boolean'\n ? this._filterOptionsConfig.redirectFromEntryId\n : true;\n }\n\n _setFilterOptionsConfig(options?: ProviderFilterOptionsObject): void {\n if (options && typeof options.redirectFromEntryId == 'boolean') {\n this._filterOptionsConfig.redirectFromEntryId = options.redirectFromEntryId;\n }\n }\n\n _parseDataFromResponse(data: Map<string, Function>): ProviderMediaConfigObject {\n this._logger.debug('Data parsing started');\n const mediaConfig: ProviderMediaConfigObject = {\n session: {\n isAnonymous: this._isAnonymous,\n partnerId: this.partnerId\n },\n sources: this._getDefaultSourcesObject(),\n plugins: {}\n };\n\n if (this.uiConfId) {\n mediaConfig.session.uiConfId = this.uiConfId;\n }\n\n if (data) {\n if (data.has(OVPSessionLoader.id)) {\n const sessionLoader = data.get(OVPSessionLoader.id);\n if (sessionLoader && sessionLoader.response) {\n mediaConfig.session.ks = sessionLoader.response;\n if (this.widgetId !== this.defaultWidgetId) {\n this.ks = mediaConfig.session.ks;\n }\n }\n } else {\n mediaConfig.session.ks = this.ks;\n }\n if (data.has(OVPMediaEntryLoader.id)) {\n const mediaLoader = data.get(OVPMediaEntryLoader.id);\n if (mediaLoader && mediaLoader.response) {\n const response = (mediaLoader: OVPMediaEntryLoader).response;\n if (OVPProviderParser.hasBlockAction(response)) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.BLOCK_ACTION, {\n action: OVPProviderParser.getBlockAction(response),\n messages: OVPProviderParser.getErrorMessages(response)\n });\n }\n const mediaEntry = OVPProviderParser.getMediaEntry(this.isAnonymous ? '' : this.ks, this.partnerId, this.uiConfId, response);\n Object.assign(mediaConfig.sources, this._getSourcesObject(mediaEntry));\n this._verifyMediaStatus(mediaEntry);\n this._verifyHasSources(mediaConfig.sources);\n const bumper = OVPProviderParser.getBumper(response, this.isAnonymous ? '' : this.ks, this.partnerId);\n if (bumper) {\n Object.assign(mediaConfig.plugins, {bumper});\n }\n }\n }\n }\n this._logger.debug('Data parsing finished', mediaConfig);\n return mediaConfig;\n }\n\n /**\n * Checks if media is ready for playback (not being imported or converted)\n * @param {MediaEntry} mediaEntry - the media entry info\n * @returns {void}\n */\n _verifyMediaStatus(mediaEntry: MediaEntry) {\n if ([KalturaMediaEntry.EntryStatus.IMPORT, KalturaMediaEntry.EntryStatus.PRECONVERT].includes(mediaEntry.status)) {\n throw new Error(Error.Severity.CRITICAL, Error.Category.SERVICE, Error.Code.MEDIA_STATUS_NOT_READY, {\n messages: `Status of entry id ${mediaEntry.id} is ${mediaEntry.status} and is still being imported or converted`,\n data: {status}\n });\n }\n }\n /**\n * Gets the backend playlist config.\n * @param {ProviderPlaylistInfoObject} playlistInfo - ovp playlist info\n * @returns {Promise<ProviderPlaylistObject>} - The provider playlist config\n */\n getPlaylistConfig(playlistInfo: ProviderPlaylistInfoObject): Promise<ProviderPlaylistObject> {\n if (playlistInfo.ks) {\n this.ks = playlistInfo.ks;\n this._isAnonymous = false;\n }\n if (this.widgetId !== this.defaultWidgetId) {\n this._isAnonymous = false;\n }\n this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const playlistId = playlistInfo.playlistId;\n if (playlistId) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n this._dataLoader.add(OVPPlaylistLoader, {playlistId, ks});\n this._dataLoader.fetchData().then(\n response => {\n resolve(this._parsePlaylistDataFromResponse(response));\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject({success: false, data: 'Missing mandatory parameter'});\n }\n });\n }\n\n _parsePlaylistDataFromResponse(data: Map<string, Function>): ProviderPlaylistObject {\n this._logger.debug('Data parsing started');\n const playlistConfig: ProviderPlaylistObject = this._getPlaylistObject();\n if (data && data.has(OVPPlaylistLoader.id)) {\n const playlistLoader = data.get(OVPPlaylistLoader.id);\n if (playlistLoader && playlistLoader.response) {\n const playlist = OVPProviderParser.getPlaylist(playlistLoader.response);\n playlistConfig.id = playlist.id;\n playlistConfig.poster = playlist.poster;\n playlistConfig.metadata.name = playlist.name;\n playlistConfig.metadata.description = playlist.description;\n playlist.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));\n }\n }\n this._logger.debug('Data parsing finished', playlistConfig);\n return playlistConfig;\n }\n\n /**\n * Gets playlist config from entry list.\n * @param {ProviderEntryListObject} entryListInfo - ovp entry list info\n * @returns {Promise<ProviderPlaylistObject>} - The provider playlist config\n */\n getEntryListConfig(entryListInfo: ProviderEntryListObject): Promise<ProviderPlaylistObject> {\n if (entryListInfo.ks) {\n this.ks = entryListInfo.ks;\n this._isAnonymous = false;\n }\n if (this.widgetId !== this.defaultWidgetId) {\n this._isAnonymous = false;\n }\n this._dataLoader = new OVPDataLoaderManager(this.playerVersion, this.partnerId, this.ks, this._networkRetryConfig);\n return new Promise((resolve, reject) => {\n const entries = entryListInfo.entries;\n if (entries && entries.length) {\n let ks: string = this.ks;\n if (!ks) {\n ks = '{1:result:ks}';\n this._dataLoader.add(OVPSessionLoader, {widgetId: this.widgetId});\n }\n const redirectFromEntryId = this._getEntryRedirectFilter(entryListInfo);\n this._dataLoader.add(OVPEntryListLoader, {entries, ks, redirectFromEntryId});\n this._dataLoader.fetchData(false).then(\n response => {\n resolve(this._parseEntryListDataFromResponse(response));\n },\n err => {\n reject(err);\n }\n );\n } else {\n reject({success: false, data: 'Missing mandatory parameter'});\n }\n });\n }\n\n _parseEntryListDataFromResponse(data: Map<string, Function>): ProviderPlaylistObject {\n this._logger.debug('Data parsing started');\n const playlistConfig: ProviderPlaylistObject = this._getPlaylistObject();\n if (data && data.has(OVPEntryListLoader.id)) {\n const playlistLoader = data.get(OVPEntryListLoader.id);\n if (playlistLoader && playlistLoader.response) {\n const entryList = OVPProviderParser.getEntryList(playlistLoader.response);\n entryList.items.forEach(i => playlistConfig.items.push({sources: this._getSourcesObject(i)}));\n }\n }\n this._logger.debug('Data parsing finished', playlistConfig);\n return playlistConfig;\n }\n\n _getPlaylistObject(): ProviderPlaylistObject {\n return {\n id: '',\n metadata: {\n name: '',\n description: ''\n },\n poster: '',\n items: []\n };\n }\n\n _getDefaultSourcesObject(): ProviderMediaConfigSourcesObject {\n return {\n hls: [],\n dash: [],\n progressive: [],\n image: [],\n id: '',\n duration: 0,\n type: MediaEntry.Type.UNKNOWN,\n poster: '',\n dvr: false,\n vr: null,\n metadata: {\n name: '',\n description: '',\n tags: ''\n }\n };\n }\n\n _getSourcesObject(mediaEntry: MediaEntry) {\n const sourcesObject: ProviderMediaConfigSourcesObject = this._getDefaultSourcesObject();\n const mediaSources = mediaEntry.sources.toJSON();\n sourcesObject.hls = mediaSources.hls;\n sourcesObject.dash = mediaSources.dash;\n sourcesObject.progressive = mediaSources.progressive;\n sourcesObject.image = mediaSources.image;\n sourcesObject.id = mediaEntry.id;\n sourcesObject.duration = mediaEntry.duration;\n sourcesObject.type = mediaEntry.type;\n sourcesObject.dvr = !!mediaEntry.dvrStatus;\n sourcesObject.poster = mediaEntry.poster;\n if (mediaEntry.sources.captions) {\n sourcesObject.captions = mediaEntry.sources.captions;\n }\n if (mediaEntry.metadata && typeof mediaEntry.metadata.tags === 'string' && mediaEntry.metadata.tags.split(', ').includes('360')) {\n sourcesObject.vr = {};\n }\n Object.assign(sourcesObject.metadata, mediaEntry.metadata);\n return sourcesObject;\n }\n}\n","// @flow\nimport OVPProvider from './provider';\nimport OVPProviderParser from './provider-parser';\nimport RequestBuilder from '../../util/request-builder';\nimport * as ResponseTypes from './response-types';\n\ndeclare var __VERSION__: string;\ndeclare var __NAME__: string;\n\nconst NAME = __NAME__ + '-ovp';\nconst VERSION = __VERSION__;\n\nexport {OVPProvider as Provider, OVPProviderParser as ProviderParser, NAME, VERSION, RequestBuilder, ResponseTypes};\n"],"sourceRoot":""}