{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./sources/js/MandelService.js","webpack:///./sources/js/ValidationUtils.js","webpack:///./sources/js/Main.js","webpack:///./sources/js/MandelWebPlayerAPI.js","webpack:///./sources/js/SessionManager.js","webpack:///./sources/js/LocalStorageObject.js","webpack:///./sources/js/EventBus.js","webpack:///./sources/js/VideoStreamAnalyticsManager.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","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","_ref","_playerVersion","_baseUrl","_systemSettings","baseUrl","tier","playerVersion","_apiKey","_defaultBaseUrl","_wapiVersion","_tier","getDeviceInfo","appVersion","appName","getCloneOfDefaultAjaxSettings","defaultAjaxSettings","freeze","headers","accept","api-key","wapi-version","platform","navigator","device-info","JSON","stringify","parse","createRequestHeadersObject","additionalRequestHeaders","assign","createRequestDataObject","data","useOnlyStrings","toReturn","keys","forEach","undefined","getUrl","theRequest","getSystemSettings","then","systemSettings","endpoints","find","request","endPointURL","getBaseUrl","this","setBaseUrl","useDefaultBaseUrl","Promise","resolve","reject","Request","method","fetchJson","json","endPoints","keepAliveRepeatRateSeconds","configuration","connectionTimeoutSeconds","catch","err","httpResponseString","httpResponseStatus","httpResponseStatusText","fetch","timeout","response","ok","status","statusText","errorCode","userMessage","errorMessage","httpStatus","httpStatusText","queryParams","params","map","k","encodeURIComponent","join","getCloneWithoutUndefinedOrNullProperties","dirty","clean","getEvents","prgSvcID","fromDateTime","toDateTime","url","requestUrl","toISOString","substring","result","events","length","push","sessionStart","_ref7","transport","drm","contentID","playToken","cpeID","partnerCustomerID","endSessionID","sessionEndCode","timeOffset","adInsertionSupport","cpe-id","playtoken","partner-customer-id","sessionPlay","_ref2","sessionID","previousTimeOffset","replace","sessionPause","_ref3","sessionKeepAlive","_ref4","sessionEnd","_ref5","getCustomer","accessToken","localStorage","getItem","parameters","createUrlWithParameters","userAgent","access-token","setItem","channels","providers","getKeepAliveRepeatRateSeconds","logToServer","_ref6","cpeIdAndPartnerCustomerId","body","newUrl","charAt","required","obj","errorString","propt","Error","getRelativeAssetUrl","assetName","document","querySelector","src","getMandelPlayerVersion","window","MandelWebPlayer","settings","version","text","enableLogs","console","log","bitmovinLogLevel","clientSettingForEnableLogs","mandelEndpointUrl","playerContainerElementId","playerApi","warn","ValidationUtils","all","oScript","createElement","type","onerror","oError","target","onload","getElementsByTagName","appendChild","hrefJs","hrefCss","getElementById","head","link","id","rel","href","media","MandelWebPlayerAPI","fairplayCertUrl","MandelAPI","MandelService","_player","_mandelService","_videoStreamAnalyticsManager","_sessionManager","_eventBus","_playerContainerElementId","_fakePlayer","_fairplayCertUrl","_events","playbackError","playbackFinished","playbackStoppedByUser","playbackStoppedBySystem","testAndGetBrowserSupport","player","ignoreIncompatibleBrowser","setForcedBrowserMode","el","setAttribute","bitmovin","getSupportedDRM","supportedDRMs","getSupportedTech","browserSupport","isSupported","includes","supportedTech","streaming","info","date","Date","setHours","getHours","unsupportedBrowserResponse","saveLastLoadRequest","theFunction","argumentsObject","showMessage","htmlFormattedMessage","classList","add","innerHTML","playerDiv","getIncompatibleBrowserMessage","_ref8","htmlFormatted","getTimeOffset","dataTime","isLive","getCurrentTime","formatBitrates","quality","bitrate","Math","round","unit","loadLiveChannel","arguments","start","adInsertion","startResult","receivedPlaybackUrl","playbackUrl","playlistURL","source","setupPlayer","enableTimeShift","laUrl","analyticsVideoID","analyticsUserID","loadContent","bookmark","allowRewind","timeShift","getMaxTimeShift","getInitialBookmark","seek","listenTo","event","listener","subscribe","topic","removeListener","unsubscribe","stop","hasActiveSession","publish","end","endCodes","CUSTOMER_TERMINATED","destroy","validateBrowserSupport","experimental","load","multirightsDrmID","play","getPlayer","SessionManager","mandelService","forceStopCallbackFunction","message","UNKNOWN_REASON","VideoStreamAnalyticsManager","sessionManager","EventBus","userMessageHTML","errorMessageHTML","_ref9","certificateURL","indexOf","error","seekStartPosition","element","seekTarget","gap","initialPlayingHasOccured","ignoreNextStallEnded","conf","playback","autoplay","restoreUserSettings","adaptation","desktop","limitToPlayerSize","mobile","logs","level","tweaks","hwdecoding","network","preprocessHttpRequest","isAdInsertion","toLowerCase","startsWith","now","floor","random","preprocessHttpResponse","clientRequestTimestamp","clientDownloadTime","serverRequestTimestamp","serverResponseTimestamp","clientResponseTimestamp","additionalLogData","xChRequestId","filter","header","xChTimeDeliver","regexDigits","str","exec","timeFromClientToServer","timeFromServerInToServerOut","timeFromServerToClient","timeFromClientRequestToClientResponse","onReady","debug","onPlay","onPlaying","getAudio","currentLang","lang","getAvailableSubtitles","setSubtitle","setSweSubtitlesIfNotSwedishAudio","setTimeout","time","onError","code","onPlaybackFinished","SUCCESS_COMPLETION","onSeek","position","notifySeekStart","onSeeked","onTimeShift","onTimeShifted","getTimeShift","onPaused","issuer","videoPaused","pause","onTimeChanged","updateCurrentTimeOffset","rawTime","onAudioAdaptation","onAudioChanged","onAudioDownloadQualityChange","onAudioDownloadQualityChanged","onAudioPlaybackQualityChanged","onDownloadFinished","success","segmentName","attempt","fullData","downloadTime","downloadType","receivedManifest","segmentReceived","size","bandwidthTrace","onPeriodSwitch","onPeriodSwitched","onSegmentPlayback","mimeType","segmentPlaying","onSegmentRequestFinished","onStallStarted","playbackInterrupted","notifyBufferStart","onStallEnded","playbackResumed","notifyBufferEnd","onVideoAdaptation","onVideoDownloadQualityChange","onVideoDownloadQualityChanged","bitrateDownloadChange","targetQuality","timestamp","onVideoPlaybackQualityChanged","bitratePlaybackChange","onWarning","onMetadata","notifyMetadataReceived","metadata","onVolumeChanged","isMuted","targetVolume","notifyMute","onPlayerResize","isFullscreen","notifyEnterFullscreen","notifyExitFullscreen","onMuted","onUnmuted","notifyUnmute","LA_URL","prepareContentId","contentId","match","prepareMessage","session","messageBase64Encoded","prepareLicense","responseBody","trim","ckc","licenseResponseType","useUint16InitData","customData","labeling","hls","qualities","dash","widevine","arrayBuffer","widevineServerCertificateArrayBuffer","serverCertificate","fetchAndSetWidevineCert","setup","settingItems","getElementsByClassName","style","display","firstChild","textContent","shouldDisplaySettings","hideUnusedSettings","reason","_forceStopCallbackFunction","_currentSession","_yospaceSessionManager","_comscoreAnalytics","_contentLabels","_keepAliveRepeatRateSeconds","_endCodes","_playbackState","_playbackState_pausedByUser","_playbackState_play","_playbackState_seeking","_playbackState_seeking_startPosition","options","calculateBookmarkPosition","getValue","timeline","getTimeline","sessionStartResult","endKeepAlive","clearAndSetValues","startKeepAlive","setValue","YSSessionManager","createForLive","initAdInsertionReporting","createForVoD","publisherId","publisherSecret","mmsClnr","ns_","StreamingAnalytics","isComHemPlayOrBoxerPlayProduction","location","setLabels","mms_clnr","ns_site","playlist","masterPlaylist","registerPlayer","yospaceSessionManagerCallbacks","channelUrl","ns_st_pn","ns_st_tp","ns_st_mp","mms_auto","mms_values","mms_subsite","ns_st_cl","ns_st_ty","ns_st_li","ns_st_pr","createPlaybackSession","e","initAdInsertionSession","playlistUrl","resetSessionData","_ref11","getPlaybackSession","setAsset","notifyPlay","getCurrentContentData","contentLabelsWithPartNumbers","getContentLabelsWithPartNumbers","contentLabels","reportPlayerEvent","YSPlayerEvents","RESUME","SEEK_END","START","previousPosition","_ref12","notifyPause","PAUSE","_ref14","POSITION","calculateTimeOffsetFromBookmark","schemeIdUri","tag","messageData","split","item","METADATA","notifyBufferStop","FULLSCREEN","MUTE","SEEK_START","LocalStorageObject","localStorageKey","seconds","AdBreakStart","AdvertStart","miid","adLabels","advert","currentAdvert","rawAdvert","clipLength","getLinear","getNonLinears","duration","extractExtensionAttributeValue","attributeKey","Extensions","attributes","firstElementChild","ns_st_ad","ns_st_ct","mms_customadid","mms_adid","mms_goalid","mms_campaignid","getAdbreakType","notifyEnd","AdvertEnd","AdBreakEnd","UpdateTimeline","partNumber","totalParts","totalDuration","elements","part","offset","first","last","_ref10","calculateBookmarkFromTimeOffset","keepAliveIntervalRef","setInterval","clearInterval","_ref13","END","notifyError","clearAllValues","onbeforeunload","_LocalStorageObject","_ref15","progressContent","progressAdverts","_ref16","totalLengthsOfAdvertsUntilBookmarkPosition","totalLengthsOfContentSoFar","_localStorageKey","setValues","keyValuesObject","readFromLocalStorage","writeToLocalStorage","parsed","storedObject","_topics","topicOrArrayOfTopics","innerSubscribe","Array","isArray","topicListener","_sessionInfo","_timestamps","_previousBitrate","isJson","stringOrObject","_typeof","logEvent","timeOffsetFromSessionStart","manifestUrl","licenseReceived","downloadTimeMs","downloadSize","bitrateDownload","bitratePlayback","timestampPlaybackResumed","interruptionDuration","playerErrorCode","logMessage","logNetworkResponse","httpResponseLength","additionalData"],"mappings":"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","file":"mandel-web-player.js","sourcesContent":[" \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 = 2);\n","export default function MandelService({baseUrl, tier, playerVersion}) {\n // declare and assign default value to local variables\n var _apiKey = \"ss2g46rGFf\",// mapi: FF8gVWr27G HZvTr4YV8B 5MYbeV7pmz ss2g46rGFf\n _defaultBaseUrl = \"https://api.tv.comhem.se/\", // \"https://api.tv.comhem.se/\" http://83.255.232.105:8080/ https://api-staging.tv.comhem.se/\n _wapiVersion = 3,\n _tier = \"comhem\",\n _playerVersion,\n _baseUrl,\n _systemSettings;\n\n // define api methods\n this.getEvents = getEvents;\n this.sessionStart = sessionStart;\n this.sessionPlay = sessionPlay;\n this.sessionPause = sessionPause;\n this.sessionKeepAlive = sessionKeepAlive;\n this.sessionEnd = sessionEnd;\n this.getCustomer = getCustomer;\n this.getKeepAliveRepeatRateSeconds = getKeepAliveRepeatRateSeconds;\n this.logToServer = logToServer;\n\n //============================ CONSTRUCTOR TASKS ===========================//\n\n setBaseUrl((baseUrl !== undefined) ? baseUrl : _defaultBaseUrl);\n _tier = tier;\n _playerVersion = playerVersion;\n\n //============================ FUNCTIONS ===================================//\n\n\n function getDeviceInfo() {\n return {\n \"appVersion\": _playerVersion,\n \"appName\": \"Mandel Web Player\"\n };\n }\n\n\n function getCloneOfDefaultAjaxSettings() {\n\n var defaultAjaxSettings = Object.freeze({\n// \"timeout\": connectionTimeoutSeconds * 1000,\n mode: 'cors',\n headers: {\n \"accept\": \"application/json\",\n \"api-key\": _apiKey,\n \"wapi-version\": _wapiVersion,\n \"platform\": navigator.platform,\n \"tier\": _tier,\n \"device-info\": JSON.stringify(getDeviceInfo())\n }\n });\n return JSON.parse(JSON.stringify(defaultAjaxSettings));\n }\n\n function createRequestHeadersObject(additionalRequestHeaders) {\n return Object.assign(getCloneOfDefaultAjaxSettings().headers, additionalRequestHeaders);\n }\n\n function createRequestDataObject(data, useOnlyStrings) {\n var toReturn = {};\n Object.keys(data).forEach(function (key) {\n if (data[key] !== undefined) {\n if (useOnlyStrings === true) {\n toReturn[key + \"\"] = data[key] + \"\";\n } else {\n toReturn[key] = data[key];\n }\n }\n });\n return toReturn;\n }\n\n function getUrl(theRequest) {\n return getSystemSettings()\n .then((systemSettings) => {\n return systemSettings.endpoints.find(function (d) {\n return d.request === theRequest;\n }).endPointURL;\n });\n }\n\n function getKeepAliveRepeatRateSeconds() {\n return getSystemSettings()\n .then((systemSettings) => {\n return systemSettings.keepAliveRepeatRateSeconds;\n });\n }\n\n function getConnectionTimeoutSeconds() {\n return getSystemSettings()\n .then((systemSettings) => {\n return systemSettings.connectionTimeoutSeconds;\n });\n }\n\n function getBaseUrl() {\n if(_baseUrl === undefined) {\n useDefaultBaseUrl();\n }\n return _baseUrl;\n }\n\n function useDefaultBaseUrl() {\n this.setBaseUrl(_defaultBaseUrl);\n }\n\n function setBaseUrl(newUrl) {\n _baseUrl = newUrl + (newUrl.charAt(newUrl.length - 1) === \"/\" ? \"\" : \"/\");\n }\n\n function getSystemSettings() {\n return new Promise(function(resolve, reject) {\n if (_systemSettings !== undefined) {\n resolve(_systemSettings);\n return;\n }\n\n var request = new Request(getBaseUrl() + \"wapi/system\",Object.assign(getCloneOfDefaultAjaxSettings(), {\n method: \"GET\"\n }));\n\n return fetchJson(request)\n .then(function(json) {\n _systemSettings = {};\n _systemSettings.endpoints = json.endPoints;\n _systemSettings.keepAliveRepeatRateSeconds = json.configuration.keepAliveRepeatRateSeconds;\n _systemSettings.connectionTimeoutSeconds = json.configuration.connectionTimeoutSeconds;\n resolve(_systemSettings);\n }).catch((err)=> {\n reject(err);\n });\n });\n }\n\n function getEvents(prgSvcID, fromDateTime, toDateTime) {\n return getUrl(\"/wapi/events\")\n .then((url)=>{\n var requestUrl = url + \"?from=\" + fromDateTime.toISOString().substring(0, 16) + \"Z\" + \"&to=\" + toDateTime.toISOString().substring(0, 16) + \"Z\";\n var request = new Request(requestUrl,Object.assign(getCloneOfDefaultAjaxSettings(), {\n method: \"GET\"\n }));\n\n return fetchJson(request)\n .then(function(result) {\n var events = [];\n for(var i = 0; i < result.events.length ; i++) {\n if(result.events[i].prgSvcID == prgSvcID) {\n events.push(result.events[i]);\n }\n }\n result.events = events;\n return result;\n });\n });\n }\n\n function getCustomer(accessToken) {\n return getUrl(\"/wapi/customer/login\")\n .then((url) => {\n // var url = \"https://api.tv.comhem.se/webapi/customer/accessTokenLogin\";\n var cpeID = localStorage.getItem(\"mandelWebPlayer.cpeID\");\n\n var requestUrl = createUrlWithParameters(url, {platform: navigator.platform, userAgent: navigator.userAgent});\n\n var request = new Request(requestUrl,Object.assign(getCloneOfDefaultAjaxSettings(), {\n method: \"GET\",\n headers: createRequestHeadersObject({\n \"access-token\": accessToken,\n \"cpe-id\": cpeID\n })\n }));\n\n return fetchJson(request)\n .then(function(response) {\n localStorage.setItem(\"mandelService.getCustomer.cpeID\",response.cpeID);\n\n var toReturn = {\n cpeID: response.cpeID,\n partnerCustomerID: response.partnerCustomerID,\n playToken: response.playToken,\n channels: response.channels,\n providers: response.providers\n };\n return toReturn;\n });\n });\n\n }\n\n function sessionPlay({sessionID, cpeID, partnerCustomerID, timeOffset, previousTimeOffset}) {\n return getUrl(\"/wapi/sessions/{sessionID}/play\")\n .then((url)=>{\n var requestUrl = url.replace(\"{sessionID}\", sessionID);\n\n var params = createRequestDataObject({\n timeOffset: timeOffset,\n previousTimeOffset: previousTimeOffset\n });\n\n var request = new Request(requestUrl + \"?\" + queryParams(params),Object.assign(getCloneOfDefaultAjaxSettings(), {\n method: \"GET\",\n headers: createRequestHeadersObject({\n \"cpe-id\": cpeID,\n \"partner-customer-id\": partnerCustomerID\n })\n }));\n\n return fetchJson(request);\n });\n }\n\n function sessionPause({sessionID, cpeID, partnerCustomerID, timeOffset}) {\n return getUrl(\"/wapi/sessions/{sessionID}/pause\")\n .then((url)=>{\n var requestUrl = url.replace(\"{sessionID}\", sessionID);\n var params = createRequestDataObject({\n timeOffset: timeOffset\n });\n\n var request = new Request(requestUrl + \"?\" + queryParams(params),Object.assign(getCloneOfDefaultAjaxSettings(), {\n method: \"GET\",\n headers: createRequestHeadersObject({\n \"cpe-id\": cpeID,\n \"partner-customer-id\": partnerCustomerID\n })\n }));\n\n return fetchJson(request);\n });\n }\n\n function sessionKeepAlive({sessionID, cpeID, partnerCustomerID, timeOffset}) {\n return getUrl(\"/wapi/sessions/{sessionID}/keepAlive\")\n .then((url)=>{\n var requestUrl = url.replace(\"{sessionID}\", sessionID);\n var params = createRequestDataObject({\n timeOffset: timeOffset\n });\n\n var request = new Request(requestUrl + \"?\" + queryParams(params),Object.assign(getCloneOfDefaultAjaxSettings(), {\n method: \"GET\",\n headers: createRequestHeadersObject({\n \"cpe-id\": cpeID,\n \"partner-customer-id\": partnerCustomerID\n })\n }));\n\n return fetchJson(request);\n });\n }\n\n function sessionEnd({sessionID, cpeID, partnerCustomerID, timeOffset, sessionEndCode}) {\n return getUrl(\"/wapi/sessions/{sessionID}/end\")\n .then((url)=>{\n var requestUrl = url.replace(\"{sessionID}\", sessionID);\n var params = createRequestDataObject({\n timeOffset: timeOffset,\n sessionEndCode: sessionEndCode\n });\n\n var request = new Request(requestUrl + \"?\" + queryParams(params),Object.assign(getCloneOfDefaultAjaxSettings(), {\n method: \"GET\",\n headers: createRequestHeadersObject({\n \"cpe-id\": cpeID,\n \"partner-customer-id\": partnerCustomerID\n })\n }));\n\n return fetchJson(request);\n });\n }\n\n function logToServer({cpeID, partnerCustomerID, data}) {\n\n var cpeIdAndPartnerCustomerId = {\n \"cpe-id\": cpeID,\n \"partner-customer-id\": partnerCustomerID\n };\n\n return getUrl(\"/wapi/system/log\")\n .then((url)=>{\n var request = new Request(url,Object.assign(getCloneOfDefaultAjaxSettings(),{\n method: 'post',\n body: JSON.stringify(Object.assign(data,cpeIdAndPartnerCustomerId,getDeviceInfo())),\n headers: createRequestHeadersObject(cpeIdAndPartnerCustomerId)\n }));\n\n return fetchJson(request);\n });\n }\n\n function sessionStart({prgSvcID, transport, drm, contentID, playToken, cpeID, partnerCustomerID, endSessionID, sessionEndCode, timeOffset, adInsertionSupport}) {\n return getUrl(\"/wapi/sessions/start\")\n .then((url)=>{\n\n var params = {\n prgSvcID: prgSvcID,\n contentID: contentID,\n transport: transport,\n drm: drm,\n endSessionID: endSessionID,\n sessionEndCode: sessionEndCode,\n timeOffset: timeOffset,\n adInsertionSupport: adInsertionSupport === true\n };\n\n var requestUrl = url + \"?\" + queryParams(getCloneWithoutUndefinedOrNullProperties(params));\n var request = new Request(requestUrl,Object.assign(getCloneOfDefaultAjaxSettings(), {\n method: \"GET\",\n headers: createRequestHeadersObject({\n \"cpe-id\": cpeID,\n \"playtoken\": playToken,\n \"partner-customer-id\": partnerCustomerID\n })\n }));\n return fetchJson(request);\n });\n }\n\n function fetchJson(request) {\n var httpResponseString;\n var httpResponseStatus;\n var httpResponseStatusText;\n return fetch(request, {timeout: 10000})\n .then(function(response) {\n if(response.ok === false) {\n httpResponseString = \"HTTP status: \" + response.status + \" \" + response.statusText;\n httpResponseStatus = response.status;\n httpResponseStatusText = response.statusText;\n }\n return response.json();\n })\n .then((json) => {\n if(json.errorCode !== undefined) {\n return Promise.reject({\n \"userMessage\": (json.userMessage ? json.userMessage: json.errorMessage),\n \"errorMessage\": json.errorMessage,\n \"errorCode\": json.errorCode,\n \"httpStatus\": json.status,\n \"httpStatusText\": httpResponseStatusText\n });\n } else if(httpResponseString !== undefined) {\n return Promise.reject({\n \"userMessage\": (json.userMessage ? json.userMessage: json.errorMessage),\n \"errorMessage\": httpResponseString,\n \"errorCode\": \"-1\",\n \"httpStatus\": httpResponseStatus,\n \"httpStatusText\": httpResponseStatusText\n });\n }\n return json;\n })\n .catch(function(err) {\n err.httpStatus = httpResponseStatus;\n err.httpStatusText = httpResponseStatusText;\n return Promise.reject(err);\n });\n }\n\n function queryParams(params) {\n return Object.keys(params)\n .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k]))\n .join('&');\n }\n\n function getCloneWithoutUndefinedOrNullProperties(dirty) {\n var clean = {};\n Object.keys(dirty).forEach(function(key){\n if (dirty[key] !== undefined && dirty[key]!== null ){\n clean[key] = dirty[key];\n }\n });\n return clean;\n }\n\n function createUrlWithParameters(url, parameters) {\n var params = getCloneWithoutUndefinedOrNullProperties(parameters);\n return url + \"?\" + Object.keys(params)\n .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k]))\n .join('&');\n }\n\n}","export default {\n required: function(obj) {\n var errorString = \"\";\n for(var propt in obj){\n if(obj[propt] === null || obj[propt] === undefined || (typeof obj[propt] === \"string\" && obj[propt] === \"\")) {\n errorString = errorString + \" \" + propt + \" is required.\";\n }\n }\n if(errorString !== \"\") {\n throw new Error(errorString);\n }\n return;\n }\n};","import MandelWebPlayerAPI from './MandelWebPlayerAPI.js';\nimport MandelService from './MandelService.js';\nimport ValidationUtils from './ValidationUtils.js';\nimport '../css/main.css';\n\nwindow.MandelWebPlayer = {\n settings: {\n enableLogs: false,\n version: undefined,\n bitmovinLogLevel: \"warn\"\n }\n};\n\ngetMandelPlayerVersion();\n\nwindow.MandelWebPlayer.create = function({mandelEndpointUrl, playerContainerElementId, tier, enableLogs}) {\n if(window.MandelWebPlayer.playerApi !== undefined) {\n console.warn(\"Mandel Web Player already initialized\");\n return Promise.resolve(window.MandelWebPlayer.playerApi);\n }\n ValidationUtils.required({mandelEndpointUrl, playerContainerElementId, tier});\n this.settings.enableLogs = getEnableLogsSetting(enableLogs);\n return new Promise(function(resolve, reject){\n Promise.all([\n loadBitmovinPlayerLib(),\n loadYospaceLib(),\n loadComscoreLib(),\n addCss(),\n getMandelPlayerVersion()]\n )\n .then(() => {\n var playerApi = new MandelWebPlayerAPI({\n mandelEndpointUrl: mandelEndpointUrl,\n playerContainerElementId: playerContainerElementId,\n tier: tier,\n playerVersion: window.MandelWebPlayer.settings.version,\n fairplayCertUrl: getRelativeAssetUrl(\"cert.cer\") // to be returned from session start instead\n });\n window.MandelWebPlayer.playerApi = playerApi;\n resolve(playerApi);\n });\n });\n};\n\nfunction getEnableLogsSetting(clientSettingForEnableLogs) {\n if(window.MandelWebPlayer && window.MandelWebPlayer.settings && window.MandelWebPlayer.settings.enableLogs !== undefined){\n return window.MandelWebPlayer.settings.enableLogs;\n } else {\n return (clientSettingForEnableLogs !== undefined ? clientSettingForEnableLogs : false);\n }\n}\n\nwindow.MandelAPI = {\n create: function ({mandelEndpointUrl}) {\n return new Promise(function (resolve, reject) {\n var mandelService = new MandelService({baseUrl: mandelEndpointUrl});\n resolve(mandelService);\n });\n }\n};\n\nfunction loadBitmovinPlayerLib() {\n return new Promise(function(resolve, reject){\n var oScript = document.createElement(\"script\");\n oScript.type = \"text\\/javascript\";\n oScript.onerror = function(oError) {\n reject(\"The script \" + oError.target.src + \" is not accessible.\");\n };\n oScript.onload = function() {\n resolve();\n };\n document.getElementsByTagName('head')[0].appendChild(oScript);\n oScript.src = \"//cdn.bitmovin.com/player/web/7.8.16/bitmovinplayer.js\";\n });\n}\nfunction loadYospaceLib() {\n return new Promise(function(resolve, reject){\n var hrefJs = getRelativeAssetUrl(\"yo-ad-management.min.js\");\n var oScript = document.createElement(\"script\");\n oScript.type = \"text\\/javascript\";\n oScript.onerror = function(oError) {\n reject(\"The script \" + oError.target.src + \" is not accessible.\");\n };\n oScript.onload = function() {\n resolve();\n };\n document.getElementsByTagName('head')[0].appendChild(oScript);\n oScript.src = hrefJs;\n });\n}\n\nfunction loadComscoreLib() {\n return new Promise(function(resolve, reject){\n var hrefJs = getRelativeAssetUrl(\"comScore-JS-6.2.3.180328.min.js\");\n var oScript = document.createElement(\"script\");\n oScript.type = \"text\\/javascript\";\n oScript.onerror = function(oError) {\n reject(\"The script \" + oError.target.src + \" is not accessible.\");\n };\n oScript.onload = function() {\n resolve();\n };\n document.getElementsByTagName('head')[0].appendChild(oScript);\n oScript.src = hrefJs;\n });\n}\n\n\nfunction addCss() {\n return new Promise(function(resolve, reject){\n var hrefCss = getRelativeAssetUrl(\"mandel-web-player.css\");\n\n var cssId = 'myCss'; // you could encode the css path itself to generate id..\n if (!document.getElementById(cssId))\n {\n var head = document.getElementsByTagName('head')[0];\n var link = document.createElement('link');\n link.id = cssId;\n link.rel = 'stylesheet';\n link.type = 'text/css';\n link.href = hrefCss;\n link.media = 'all';\n head.appendChild(link);\n }\n resolve();\n });\n}\n\nfunction getRelativeAssetUrl(assetName) {\n return document.querySelector('script[src*=\"mandel-web-player.js\"]').src.replace(\"mandel-web-player.js\", assetName);\n}\nwindow.MandelWebPlayer.getRelativeAssetUrl = getRelativeAssetUrl;\n\nfunction getMandelPlayerVersion() {\n\n return new Promise(function(resolve, reject) {\n if(window.MandelWebPlayer.settings.version !== undefined) {\n resolve(window.MandelWebPlayer.settings.version);\n }\n return fetch(getRelativeAssetUrl(\"version.txt\"))\n .then(function (response) {\n if (response.ok === true) {\n return response.text();\n }\n })\n .then((version) => {\n version = version.replace(/\\r?\\n|\\r/g, \" \"); // remove line breaks from version text\n window.MandelWebPlayer.settings.version = version;\n if (window.MandelWebPlayer.settings.enableLogs === true) {\n console.log(\"Mandel Player Version: \" + version);\n }\n resolve(version);\n });\n });\n}\n","import MandelService from './MandelService.js';\nimport SessionManager from './SessionManager.js';\nimport ValidationUtils from './ValidationUtils.js';\nimport EventBus from './EventBus.js';\nimport VideoStreamAnalyticsManager from './VideoStreamAnalyticsManager.js';\n\nexport default function MandelWebPlayerAPI({playerContainerElementId, mandelEndpointUrl, tier, playerVersion, fairplayCertUrl}) {\n var _player, _mandelService, _videoStreamAnalyticsManager, _sessionManager, _eventBus, _playerContainerElementId, _lastLoadRequest, _fakePlayer, _fairplayCertUrl;\n\n var _events = Object.freeze({\n playbackError: \"MandelWebPlayerAPI.events.playbackError\",\n playbackFinished: \"MandelWebPlayerAPI.events.playbackFinished\",\n playbackStoppedByUser: \"MandelWebPlayerAPI.events.playbackStoppedByUser\",\n playbackStoppedBySystem: \"MandelWebPlayerAPI.events.playbackStoppedBySystem\"\n });\n\n // define api methods\n this.loadLiveChannel = loadLiveChannel;\n this.loadContent = loadContent;\n this.listenTo = listenTo;\n this.removeListener = removeListener;\n this.stop = stop;\n this.validateBrowserSupport = validateBrowserSupport;\n this.events = _events;\n this.experimental = {};\n this.experimental.load = load;\n this.experimental.getPlayer = getPlayer;\n\n //============================ CONSTRUCTOR TASKS ===========================//\n\n _playerContainerElementId = playerContainerElementId;\n _player = bitmovin.player(document.getElementById(_playerContainerElementId));\n _mandelService = new MandelService({baseUrl: mandelEndpointUrl, tier: tier, playerVersion: playerVersion});\n _sessionManager = new SessionManager({mandelService: _mandelService, forceStopCallbackFunction: forceStopWithMessage});\n _videoStreamAnalyticsManager = new VideoStreamAnalyticsManager({mandelService: _mandelService, sessionManager: _sessionManager});\n _eventBus = new EventBus();\n _fairplayCertUrl = fairplayCertUrl; // to be returned from session start instead\n\n //============================ FUNCTIONS ===================================//\n\n function validateBrowserSupport() {\n return testAndGetBrowserSupport({ignoreIncompatibleBrowser: false}).then((browserSupport)=>{\n if(browserSupport.isSupported === true) {\n return Promise.resolve(true);\n } else {\n return Promise.resolve(false);\n }\n });\n }\n\n function testAndGetBrowserSupport({ignoreIncompatibleBrowser}) {\n if(ignoreIncompatibleBrowser === true) {\n setForcedBrowserMode();\n }\n if(_fakePlayer === undefined){\n var elementId = \"fakeplayer\";\n var el = document.createElement(\"div\");\n el.setAttribute(\"id\", elementId);\n el.setAttribute(\"style\",\"display:none\");\n document.body.appendChild(el);\n _fakePlayer = bitmovin.player(elementId);\n }\n return getBrowserSupport(_fakePlayer).then((browserSupport) => {\n if (browserSupport.isSupported === false) {\n if(shouldIgnoreUnsupportedBrowser()) {\n browserSupport.isSupported=true;\n return Promise.resolve(browserSupport);\n } else {\n return Promise.reject(unsupportedBrowserResponse);\n }\n } else {\n return Promise.resolve(browserSupport);\n }\n });\n }\n\n function loadLiveChannel({prgSvcID, playToken, cpeID, partnerCustomerID, ignoreIncompatibleBrowser}) {\n ValidationUtils.required({prgSvcID, playToken, cpeID, partnerCustomerID});\n saveLastLoadRequest(loadLiveChannel, arguments[0]);\n _videoStreamAnalyticsManager.sessionStart({prgSvcID: prgSvcID, cpeID: cpeID, partnerCustomerID: partnerCustomerID});\n\n return testAndGetBrowserSupport({ignoreIncompatibleBrowser: ignoreIncompatibleBrowser}).then((browserSupport)=>{\n return _sessionManager.start({prgSvcID: prgSvcID, playToken: playToken, cpeID: cpeID, partnerCustomerID: partnerCustomerID, transport: browserSupport.transport, drm: browserSupport.drm, tier: tier, adInsertion: true })\n .then((startResult) => {\n _videoStreamAnalyticsManager.receivedPlaybackUrl({playbackUrl: startResult.playlistURL, sessionID: startResult.sessionID});\n var source = {};\n source[browserSupport.transport] = startResult.playlistURL;\n return setupPlayer({transport: browserSupport.transport, drm: browserSupport.drm, enableTimeShift: false, laUrl: startResult.laUrl, source : source, ignoreIncompatibleBrowser: ignoreIncompatibleBrowser, analyticsVideoID: prgSvcID, analyticsUserID: cpeID, sessionID: startResult.sessionID});\n });\n });\n }\n\n function setSweSubtitlesIfNotSwedishAudio() {\n if(_player.getAudio() !== undefined) {\n var currentLang = _player.getAudio().lang;\n if(currentLang !== \"swe\" && currentLang !== \"sv\") {\n for (var i = 0; i < _player.getAvailableSubtitles().length; i++) {\n if(_player.getAvailableSubtitles()[i].lang === \"swe\" || _player.getAvailableSubtitles()[i].lang === \"sv\") {\n _player.setSubtitle(_player.getAvailableSubtitles()[i].id);\n }\n }\n }\n }\n }\n\n function loadContent({contentID, playToken, cpeID, partnerCustomerID, ignoreIncompatibleBrowser}) {\n ValidationUtils.required({contentID, playToken, cpeID, partnerCustomerID});\n saveLastLoadRequest(loadContent, arguments[0]);\n var bookmark;\n\n return testAndGetBrowserSupport({ignoreIncompatibleBrowser: ignoreIncompatibleBrowser}).then((browserSupport)=>{\n _videoStreamAnalyticsManager.sessionStart({contentID: contentID, cpeID: cpeID, partnerCustomerID: partnerCustomerID});\n return _sessionManager.start({contentID: contentID, playToken: playToken, cpeID: cpeID, partnerCustomerID: partnerCustomerID, transport: browserSupport.transport, drm: browserSupport.drm, tier: tier})\n .then(function(startResult) {\n _videoStreamAnalyticsManager.receivedPlaybackUrl({playbackUrl: startResult.playlistURL, sessionID: startResult.sessionID});\n bookmark = startResult.bookmark;\n var source = {};\n source[browserSupport.transport] = startResult.playlistURL;\n return setupPlayer({transport: browserSupport.transport, drm: browserSupport.drm, enableTimeShift: startResult.allowRewind, laUrl: startResult.laUrl, source : source, ignoreIncompatibleBrowser: ignoreIncompatibleBrowser, analyticsVideoID: contentID, analyticsUserID: cpeID, sessionID: startResult.sessionID});\n })\n .then(function() {\n if(_player.isLive()) {\n _player.timeShift(_player.getMaxTimeShift());\n } else if (_sessionManager.getInitialBookmark() !== undefined) {\n _player.seek(_sessionManager.getInitialBookmark());\n }\n\n });\n });\n }\n\n function listenTo({event, listener}) {\n ValidationUtils.required({event, listener});\n _eventBus.subscribe({topic: event, listener: listener});\n }\n\n function removeListener({event, listener}) {\n ValidationUtils.required({event, listener});\n _eventBus.unsubscribe({topic: event, listener: listener});\n }\n\n function stop() {\n if(_sessionManager.hasActiveSession() === true) {\n _eventBus.publish(_events.playbackStoppedByUser, {});\n _sessionManager.end({timeOffset: getTimeOffset(_player), sessionEndCode: _sessionManager.endCodes.CUSTOMER_TERMINATED});\n _player.destroy();\n }\n }\n\n function load({laUrl, source, enableTimeShift, multirightsDrmID}) {\n return testAndGetBrowserSupport().then((browserSupport)=> {\n return setupPlayer({\n transport: browserSupport.transport,\n drm: browserSupport.drm,\n enableTimeShift: enableTimeShift,\n laUrl: laUrl,\n source: source,\n multirightsDrmID: multirightsDrmID\n })\n .then(function () {\n _player.play();\n });\n });\n }\n\n function getPlayer() {\n return _player;\n }\n\n function saveLastLoadRequest(theFunction, argumentsObject) {\n _lastLoadRequest = {\n theFunction: theFunction,\n argumentsObject: argumentsObject\n };\n }\n\n function setForcedBrowserMode() {\n localStorage.setItem(\"mandelWebPlayer.ignoreUnsupportedBrowser\",new Date());\n }\n\n function shouldIgnoreUnsupportedBrowser() {\n var date = new Date();\n date.setHours(date.getHours() - 28);\n return new Date(Date.parse(localStorage.getItem(\"mandelWebPlayer.ignoreUnsupportedBrowser\"))) > date;\n }\n\n function retryLastLoadRequest() {\n if(_lastLoadRequest !== undefined) {\n _lastLoadRequest.theFunction(_lastLoadRequest.argumentsObject);\n }\n }\n\n function forceStop() {\n if(_sessionManager.hasActiveSession() === true) {\n _eventBus.publish(_events.playbackStoppedBySystem, {});\n _sessionManager.end({timeOffset: getTimeOffset(_player), sessionEndCode: _sessionManager.endCodes.UNKNOWN_REASON});\n _player.destroy();\n }\n }\n\n function forceStopWithMessage(message) {\n forceStop();\n showMessage(message);\n }\n\n function getBrowserSupport(player) {\n return player.getSupportedDRM().then((supportedDRMs) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.log(supportedDRMs); }\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.log(player.getSupportedTech()); }\n\n var browserSupport = {\n isSupported: false\n };\n\n if(supportedDRMs.includes(\"com.widevine.alpha\") === true) {\n player.getSupportedTech().forEach((supportedTech) => {\n if((supportedTech.player === \"html5\" || supportedTech.player === \"native\") && supportedTech.streaming === \"dash\") {\n browserSupport.isSupported = true;\n browserSupport.transport = \"dash\";\n browserSupport.drm = \"widevine\";\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.log(browserSupport); }\n }\n });\n } else if (supportedDRMs.includes(\"com.apple.fps.1_0\") === true) {\n player.getSupportedTech().forEach((supportedTech) => {\n if((supportedTech.player === \"html5\" || supportedTech.player === \"native\") && supportedTech.streaming === \"hls\") {\n browserSupport.isSupported = false; // change to enable\n browserSupport.transport = \"hls\";\n browserSupport.drm = \"fairplay\";\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.log(browserSupport); }\n }\n });\n } else if (supportedDRMs.includes(\"com.microsoft.playready\") === true) {\n player.getSupportedTech().forEach((supportedTech) => {\n if((supportedTech.player === \"html5\" || supportedTech.player === \"native\") && supportedTech.streaming === \"dash\") {\n browserSupport.isSupported = false; // change to enable\n browserSupport.transport = \"dash\";\n browserSupport.drm = \"playready\";\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.log(browserSupport); }\n }\n });\n } else {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.info(\"could not find any supported combination of streaming format and drm for this browser\"); }\n }\n return Promise.resolve(browserSupport);\n });\n }\n\n function showMessage(htmlFormattedMessage) {\n var el = document.createElement(\"div\");\n el.classList.add(\"mandelWebPlayer-message\");\n el.innerHTML = htmlFormattedMessage;\n var playerDiv = document.getElementById(_playerContainerElementId);\n if (!playerDiv) {\n console.warn('no player container found');\n return;\n }\n playerDiv.innerHTML = \"\";\n playerDiv.appendChild(el);\n }\n\n function appendElementToMessage(el) {\n if(document.getElementsByClassName(\"mandelWebPlayer-message\")[0]) {\n document.getElementsByClassName(\"mandelWebPlayer-message\")[0].appendChild(el);\n }\n }\n\n function showBrowserSupportNotice() {\n showMessage(getIncompatibleBrowserMessage({htmlFormatted: true}));\n\n var btn = document.createElement(\"button\");\n btn.innerHTML = \"Försök spela ändå\";\n btn.addEventListener('click',()=>{\n setForcedBrowserMode();\n retryLastLoadRequest();\n });\n\n appendElementToMessage(btn);\n }\n\n function getIncompatibleBrowserMessage({htmlFormatted}) {\n if (htmlFormatted === true) {\n return 'Tyvärr stöds inte din webbläsare. Vi rekommenderar att du använder senaste versionen av Chrome eller Firefox på Mac eller Windows. '; // eller Edge\n } else {\n return 'Tyvärr stöds inte din webbläsare. Vi rekommenderar att du använder senaste versionen av Chrome eller Firefox på Mac eller Windows. ';\n }\n }\n\n function getTimeOffset(player, dataTime) {\n if (player.isLive()) {\n return 0;\n // var startoverProgress = player.getTimeShift() - player.getMaxTimeShift();\n // return Math.floor(startoverProgress);\n } else {\n if(dataTime === undefined) {\n dataTime = _player.getCurrentTime();\n }\n return dataTime;\n }\n }\n\n function isLiveContent() {\n return _player.getConfig().playback.timeShift === false;\n }\n\n function formatBitrates(quality) {\n var bitrate = Math.round(quality.bitrate/1000);\n var unit = \"kbit/s\";\n if(bitrate>=1000) {\n bitrate = bitrate/1000;\n unit = \"Mbit/s\";\n }\n return bitrate + \" \" + unit;\n }\n\n function hideUnusedSettings() {\n var settingItems = document.getElementsByClassName(\"bmpui-ui-settings-panel-item\");\n var shouldDisplaySettings = true;\n for(var i = 0; i < settingItems.length ; i++) {\n if (settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0] && settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0].innerHTML === \"Speed\") {\n settingItems[i].style.display = \"none\";\n } else if (settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0] && settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0].innerHTML.includes(\"Subtitles\")) {\n settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0].firstChild.textContent = settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0].firstChild.textContent.replace(\"Subtitles\",\"Undertexter\");\n // TODO Fixa så att subtitle settings funkar i UI:t\n } else if (settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0] && settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0].innerHTML === \"Audio Quality\") {\n settingItems[i].style.display = \"none\";\n } else if(settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0] && settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0].innerHTML === \"Audio Track\") {\n settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0].innerHTML = \"Ljudspår\";\n } else if(settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0] && settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0].innerHTML === \"Video Quality\") {\n settingItems[i].getElementsByClassName(\"bmpui-ui-label\")[0].innerHTML = \"Videokvalité\";\n\n }\n }\n if(shouldDisplaySettings === false) {\n if(document.getElementsByClassName(\"bmpui-ui-settingstogglebutton\")[0]) {\n document.getElementsByClassName(\"bmpui-ui-settingstogglebutton\")[0].style.display = \"none\";\n }\n }\n }\n\n var unsupportedBrowserResponse = {\n \"userMessage\": getIncompatibleBrowserMessage({htmlFormatted: false}),\n \"errorMessage\": getIncompatibleBrowserMessage({htmlFormatted: false}),\n \"userMessageHTML\": getIncompatibleBrowserMessage({htmlFormatted: true}),\n \"errorMessageHTML\": getIncompatibleBrowserMessage({htmlFormatted: true}),\n \"errorCode\": \"BROWSER_NOT_SUPPORTED\"\n };\n\n function setupPlayer({transport, drm, enableTimeShift, laUrl, source, analyticsVideoID, analyticsUserID, certificateURL, sessionID, multirightsDrmID}) {\n if(laUrl !== undefined && laUrl.indexOf(\"://\") === -1) {\n laUrl = \"https://\" + laUrl;\n }\n if (_player && _player.stop) {\n _player.stop();\n }\n if (_player && _player.destroy) {\n try {\n _player.destroy();\n } catch (error) {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.warn(\"Caught error when destroying player: \" + error); }\n }\n }\n var element = document.getElementById(_playerContainerElementId);\n if (element) element.innerHTML = \"\";\n // var analytics = bitmovin.analytics({\n // key: \"f029b9e2-267d-4eb1-a69a-3081a62bcac7\",\n // playerKey: \"905b9176-bcf5-4e02-ab11-628136201fd0\",\n // player: bitmovin.analytics.Players.BITMOVIN,\n // userId: analyticsUserID,\n // videoId: analyticsVideoID,\n // debug: false\n // });\n _player = bitmovin.player(_playerContainerElementId);\n //analytics.register(_player);\n var seekStartPosition;\n var initialPlayingHasOccured = false;\n var ignoreNextStallEnded = false;\n var seekTarget;\n var gap;\n var conf = {\n key: \"905b9176-bcf5-4e02-ab11-628136201fd0\",\n playback: {\n autoplay: true,\n timeShift: enableTimeShift,\n restoreUserSettings: true\n },\n adaptation : {\n desktop: {\n limitToPlayerSize: true\n },\n mobile: {\n limitToPlayerSize: true\n }\n },\n logs: {\n bitmovin: window.MandelWebPlayer.settings.enableLogs,\n level: window.MandelWebPlayer.settings.bitmovinLogLevel\n },\n tweaks: {\n hwdecoding: true\n },\n network : {\n preprocessHttpRequest : function(type, request) {\n if((!_sessionManager.isAdInsertion() && type.toLowerCase().startsWith(\"manifest\")) || type.toLowerCase().startsWith(\"media\")) {\n request.headers.push({\n name: 'x-ch-session-id',\n value: sessionID\n });\n request.headers.push({\n name: 'x-ch-request-id',\n value: Date.now() + \"_\" + (Math.floor(Math.random() * 999999) + 100000)\n });\n }\n if(_sessionManager.isAdInsertion() && type.toLowerCase().startsWith(\"media\")) {\n request.headers.push({\n name: 'x-ad-insertion',\n value: true\n });\n }\n return Promise.resolve(request);\n },\n preprocessHttpResponse : function(type, response) {\n var clientRequestTimestamp;\n var clientResponseTimestamp = Date.now();\n var clientDownloadTime;\n var serverRequestTimestamp;\n var serverResponseTimestamp;\n var additionalLogData = {};\n try {\n\n var xChRequestId = response.request.headers.filter(header => header.name === 'x-ch-request-id')[0];\n if(xChRequestId !== undefined) {\n clientRequestTimestamp = xChRequestId.value.substring(0,13); // request id contains a timestamp\n clientDownloadTime = clientResponseTimestamp-clientRequestTimestamp;\n }\n\n // var xChTid = response.headers.filter(header => header.name === \"x-ch-tid\")[0];\n // if(xChTid !== undefined) {\n // const str = xChTid.value;\n // }\n\n var xChTimeDeliver = response.headers.filter(header => (header.name === \"x-ch-time-deliver\" || header.name === \"x-time-deliver\"))[0];\n if(xChTimeDeliver !== undefined) {\n const regexStart = /start=\\d+/;\n const regexDeliver = /deliver=\\d+/;\n const regexDigits = /\\d+/;\n const str = xChTimeDeliver.value;\n serverRequestTimestamp = regexDigits.exec(regexStart.exec(str)[0])[0];\n serverResponseTimestamp = regexDigits.exec(regexDeliver.exec(str)[0])[0];\n }\n\n\n additionalLogData.timeFromClientToServer = serverRequestTimestamp - clientRequestTimestamp;\n additionalLogData.timeFromServerInToServerOut = serverResponseTimestamp - serverRequestTimestamp;\n additionalLogData.timeFromServerToClient = clientResponseTimestamp - serverResponseTimestamp;\n additionalLogData.timeFromClientRequestToClientResponse = clientDownloadTime;\n\n\n } catch(err) {\n console.warn(err);\n //ignore\n }\n\n // if(response.status !== 200 || clientDownloadTime > 0) {\n // _videoStreamAnalyticsManager.logNetworkResponse({response: response, additionalData: additionalLogData});\n // }\n return Promise.resolve(response);\n }\n },\n events: {\n onReady: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"onReady \" + JSON.stringify(data)); }\n },\n onPlay: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"onPlay \" + JSON.stringify(data)); }\n },\n onPlaying: (data) => {\n if(initialPlayingHasOccured === false) {\n setSweSubtitlesIfNotSwedishAudio();\n }\n\n setTimeout(()=>{\n initialPlayingHasOccured = true;\n }, 1000); // wait one second to set so that we can ignore initial buffering callbacks\n if (window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"onPlaying \" + JSON.stringify(data)); }\n if (seekStartPosition !== undefined) {\n _sessionManager.play({\n timeOffset: getTimeOffset(_player, seekTarget),\n previousTimeOffset: seekStartPosition\n });\n seekStartPosition = undefined;\n } else {\n _sessionManager.play({timeOffset: getTimeOffset(_player, data.time)});\n }\n },\n onError: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"onError \" + JSON.stringify(data)); }\n _sessionManager.end({sessionEndCode: _sessionManager.endCodes.UNKNOWN_REASON});\n _eventBus.publish(_events.playbackError, data);\n _videoStreamAnalyticsManager.error({code: data.code, message: data.message});\n },\n onPlaybackFinished: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"onPlaybackFinished \" + JSON.stringify(data)); }\n _eventBus.publish(_events.playbackFinished, {});\n _sessionManager.end({sessionEndCode: _sessionManager.endCodes.SUCCESS_COMPLETION});\n },\n onSeek: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"onSeek \" + JSON.stringify(data)); }\n if(seekStartPosition === undefined) {\n seekStartPosition = data.position;\n _sessionManager.notifySeekStart({seekStartPosition: seekStartPosition});\n }\n seekTarget = data.seekTarget;\n },\n onSeeked: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"onSeeked \" + JSON.stringify(data)); }\n },\n onTimeShift: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"onTimeShift \" + JSON.stringify(data)); }\n // console.log({\n // \"player.getTimeShift()\": _player.getTimeShift(),\n // \"player.getMaxTimeShift()\": _player.getMaxTimeShift(),\n // \"player.getTimeShift()-player.getMaxTimeShift()\": _player.getTimeShift()-_player.getMaxTimeShift(),\n // \"timeShiftData.position\": data.position,\n // \"timeShiftData.target\": data.target,\n // \"data.target-data.position\": data.target-data.position,\n // \"shift from\": _player.getTimeShift()-_player.getMaxTimeShift(),\n // \"shift to\": _player.getTimeShift()-_player.getMaxTimeShift() + data.target-data.position\n // });\n // var from = _player.getTimeShift()-_player.getMaxTimeShift();\n // var to = _player.getTimeShift()-_player.getMaxTimeShift() + data.position-data.target;\n // console.info(\"shift___ from: \" + from);\n // console.info(\"shift___ to: \" + to);\n\n if(seekStartPosition === undefined) {\n seekStartPosition = getTimeOffset(_player, data.position);\n }\n seekTarget = getTimeOffset(_player, data.target);\n\n gap = data.target - data.position;\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.log(\"gap: \" + gap); }\n\n },\n onTimeShifted: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"onTimeShifted \" + JSON.stringify(data)); }\n // calculate current time shift with player.getMaxTimeShift() as 0\n var timeShift = _player.getTimeShift() - _player.getMaxTimeShift();\n if(window.MandelWebPlayer.settings.enableLogs === true) {\n console.log('current position: ', timeShift);\n console.log('previous position: ', timeShift - gap);\n }\n\n // _sessionManager.play({\n // timeOffset: Math.floor(timeShift),\n // previousTimeOffset: Math.floor(timeShift - gap)\n // });\n\n },\n onPaused: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"onPaused \" + JSON.stringify(data)); }\n if (data.issuer !== \"ui-seek\") {\n _videoStreamAnalyticsManager.videoPaused();\n _sessionManager.pause({timeOffset: getTimeOffset(_player, data.time)});\n }\n initialPlayingHasOccured = false;\n },\n onTimeChanged: (data) => {\n var timeOffset = getTimeOffset(_player, data.time);\n _sessionManager.updateCurrentTimeOffset({timeOffset: timeOffset, rawTime: data.time});\n },\n onAudioAdaptation: (data) => {\n },\n onAudioChanged: (data) => {\n },\n onAudioDownloadQualityChange: (data) => {\n },\n onAudioDownloadQualityChanged: (data) => {\n },\n onAudioPlaybackQualityChanged: (data) => {\n },\n onDownloadFinished: (data) => {\n var url = data.url;\n url = url.replace( /^[a-zA-Z]{3,5}\\:\\/{2}[a-zA-Z0-9_.:-]+\\//, '' );\n url = url.substring(0,url.indexOf(\"?\"));\n\n if(data.success !== true) {\n _videoStreamAnalyticsManager.warn({segmentName: url, httpStatus: data.httpStatus, attempt: data.attempt, url: data.url, fullData: data});\n }\n // else if(data.attempt > 1) {\n // console.warn(data);\n // }\n\n if(data.downloadTime > 900000) {\n _videoStreamAnalyticsManager.warn(\"Download time: \" + data.downloadTime + \" (bitmovin bug?)\");\n } else if(data.downloadType.startsWith(\"manifest\")) {\n _videoStreamAnalyticsManager.receivedManifest();\n } else if (data.downloadType === (\"media/video\")) {\n // size downloadTime attempt\n _videoStreamAnalyticsManager.segmentReceived({segmentName: url, downloadTime: data.downloadTime, size: data.size});\n _videoStreamAnalyticsManager.bandwidthTrace({segmentName: url, downloadTime: data.downloadTime, size: data.size});\n }\n },\n\n onPeriodSwitch: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) {console.debug(\"onPeriodSwitch \" + JSON.stringify(data));}\n },\n onPeriodSwitched: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) {console.debug(\"onPeriodSwitched \" + JSON.stringify(data));}\n },\n onSegmentPlayback: (data) => {\n if(data.mimeType.includes(\"video\")) {\n _videoStreamAnalyticsManager.segmentPlaying();\n }\n },\n onSegmentRequestFinished: (data) => {\n if(data.mimeType.includes(\"video\")) {\n _videoStreamAnalyticsManager.segmentReceived({segmentName: data.segmentName});\n }\n },\n onStallStarted: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) {console.debug(\"onStallStarted \" + JSON.stringify(data));}\n if(seekStartPosition === undefined) {\n if(initialPlayingHasOccured === true) {\n _videoStreamAnalyticsManager.playbackInterrupted(JSON.stringify(data));\n _sessionManager.notifyBufferStart();\n ignoreNextStallEnded = false;\n } else {\n ignoreNextStallEnded = true;\n }\n }\n },\n onStallEnded: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) {console.debug(\"onStallEnded \" + JSON.stringify(data));}\n if(seekStartPosition === undefined && ignoreNextStallEnded === false) {\n _videoStreamAnalyticsManager.playbackResumed(JSON.stringify(data));\n _sessionManager.notifyBufferEnd();\n }\n },\n onVideoAdaptation: (data) => {\n },\n onVideoDownloadQualityChange: (data) => {\n },\n onVideoDownloadQualityChanged: (data) => {\n _videoStreamAnalyticsManager.bitrateDownloadChange({bitrate: data.targetQuality.bitrate, timestamp: data.timestamp});\n },\n onVideoPlaybackQualityChanged: (data) => {\n _videoStreamAnalyticsManager.bitratePlaybackChange({bitrate: data.targetQuality.bitrate, timestamp: data.timestamp});\n },\n onWarning: (data) => {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"onWarning \" + JSON.stringify(data)); }\n _videoStreamAnalyticsManager.warn({code: data.code, message: data.message});\n },\n onMetadata: (data) => {\n _sessionManager.notifyMetadataReceived(data.metadata);\n },\n onVolumeChanged: (data) => {\n if(_player.isMuted() === false ) {\n if(data.targetVolume === 0) {\n _sessionManager.notifyMute();\n }\n }\n },\n onPlayerResize: (data) => {\n if(_player.isFullscreen() === true) {\n _sessionManager.notifyEnterFullscreen();\n } else {\n _sessionManager.notifyExitFullscreen();\n }\n },\n onMuted: (data) => {\n _sessionManager.notifyMute();\n },\n onUnmuted: (data) => {\n _sessionManager.notifyUnmute();\n }\n\n }\n };\n\n conf.drm = {};\n\n if(drm === \"fairplay\") {\n conf.drm[drm] = {\n LA_URL: laUrl,\n certificateURL: _fairplayCertUrl,\n prepareContentId: function (contentId) {\n return contentId.match(/skd\\:\\/\\/(.*)$/)[1];\n },\n prepareMessage: function (event, session) {\n return 'spc=' + encodeURIComponent(event.messageBase64Encoded);\n },\n prepareLicense: function (responseBody) {\n return JSON.parse(responseBody.trim()).ckc;\n },\n licenseResponseType: 'text',\n useUint16InitData: true\n };\n } else if(drm === \"playready\") {\n conf.drm[\"playready\"].LA_URL = laUrl; // jshint ignore:line\n conf.drm[\"playready\"].customData = multirightsDrmID; // jshint ignore:line\n } else {\n conf.drm[drm] = {\n LA_URL: laUrl\n };\n }\n\n source.labeling = {\n hls: {\n qualities: formatBitrates\n },\n dash: {\n qualities: formatBitrates\n }\n };\n conf.source = source;\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(JSON.stringify(source, null, 2)); }\n\n return fetchAndSetWidevineCert(conf).then((conf)=>{\n return _player.setup(conf)\n .then(function (value) {\n // Success\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"Bitmovin player instance created\"); }\n //document.getElementById(\"bitmovinplayer-video-player\").ontimeupdate = function() {renderfTime()};\n\n hideUnusedSettings();\n\n return this;\n }, function (reason) {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.error(\"Failed creating Bitmovin player instance: \" + reason); }\n return this;\n });\n });\n }\n\n function fetchAndSetWidevineCert(conf) {\n return new Promise((resolve)=>{\n if(conf.drm.widevine) {\n return loadWidevineServerCertificate().then((widevineServerCertificateArrayBuffer)=>{\n conf.drm.widevine.serverCertificate = widevineServerCertificateArrayBuffer;\n resolve(conf);\n });\n } else {\n resolve(conf);\n }\n });\n\n }\n\n function loadWidevineServerCertificate() {\n return fetch(window.MandelWebPlayer.getRelativeAssetUrl(\"cert_license_widevine_com.bin\"))\n .then(function (response) {\n return response.arrayBuffer();\n });\n }\n\n}","import LocalStorageObject from './LocalStorageObject.js';\n\nexport default function SessionManager({mandelService, forceStopCallbackFunction}) {\n // declare and assign default value to local variables\n var _mandelService, _forceStopCallbackFunction, _currentSession, _yospaceSessionManager, _comscoreAnalytics, _contentLabels;\n var _keepAliveRepeatRateSeconds = 120 * 1000; // 120 millisec default\n\n var _endCodes = Object.freeze({\n UNKNOWN_REASON: 0,\n SUCCESS_COMPLETION: 1,\n CUSTOMER_TERMINATED: 2\n });\n\n let _playbackState = \"playbackState\";\n let _playbackState_pausedByUser = \"pausedByUser\";\n let _playbackState_play = \"pausedByUser_play\";\n let _playbackState_seeking = \"_playbackState_seeking\";\n let _playbackState_seeking_startPosition = \"_playbackState_seeking_startPosition\";\n\n // define api methods\n this.start = start;\n this.play = play;\n this.pause = pause;\n this.end = end;\n this.updateCurrentTimeOffset = updateCurrentTimeOffset;\n this.hasActiveSession = hasActiveSession;\n this.getInitialBookmark = getInitialBookmark;\n this.endCodes = _endCodes;\n this.isAdInsertion = isAdInsertion;\n this.notifyMetadataReceived = notifyMetadataReceived;\n this.notifyBufferStart = notifyBufferStart;\n this.notifyBufferEnd = notifyBufferEnd;\n this.notifyEnterFullscreen = notifyEnterFullscreen;\n this.notifyExitFullscreen = notifyExitFullscreen;\n this.notifyMute = notifyMute;\n this.notifyUnmute = notifyUnmute;\n this.notifySeekStart = notifySeekStart;\n\n //============================ CONSTRUCTOR TASKS ===========================//\n\n _mandelService = mandelService;\n _forceStopCallbackFunction = forceStopCallbackFunction;\n\n _currentSession = new LocalStorageObject({localStorageKey: \"mandelWebPlayer.currentSession\"});\n\n _mandelService.getKeepAliveRepeatRateSeconds()\n .then((seconds) => {\n _keepAliveRepeatRateSeconds = seconds * 1000;\n });\n\n //============================ FUNCTIONS ===================================//\n\n function start({prgSvcID, contentID, playToken, cpeID, partnerCustomerID, transport, drm, tier, adInsertion}) {\n // assume it's live if prgSvcID is set\n var isLive = false;\n if(prgSvcID) {\n isLive = true;\n }\n var options = {\n prgSvcID: prgSvcID,\n contentID: contentID,\n playToken: playToken,\n cpeID: cpeID,\n partnerCustomerID: partnerCustomerID,\n transport: transport,\n drm: drm,\n adInsertionSupport: adInsertion === true\n };\n if (hasActiveSession()) {\n var position = calculateBookmarkPosition({timeOffset: _currentSession.getValue(\"currentTimeOffset\"), timeline: getTimeline()});\n options.endSessionID = _currentSession.getValue(\"sessionID\");\n options.timeOffset = position !== undefined ? Math.floor(position) : 0;\n options.sessionEndCode = this.endCodes.CUSTOMER_TERMINATED;\n }\n return _mandelService.sessionStart(options)\n .then(function (sessionStartResult) {\n endKeepAlive(); // always make sure to end last keep alive\n\n if (window.MandelWebPlayer.settings.enableLogs === true) {\n console.debug(\"Session id: \" + sessionStartResult.sessionID);\n }\n\n _currentSession.clearAndSetValues({\n sessionID: sessionStartResult.sessionID,\n cpeID: cpeID,\n partnerCustomerID: partnerCustomerID,\n isLive: isLive\n });\n\n startKeepAlive();\n\n return new Promise(function (resolve) {\n _currentSession.setValue(\"initialBookmark\",sessionStartResult.bookmark);\n if (sessionStartResult.adInsertion === true) {\n _currentSession.setValue(\"isAdInsertion\", true);\n return initAdInsertionSession({url: sessionStartResult.playlistURL + \"&yo.ac=true\", tier: tier}).then((playlistUrl) => {\n sessionStartResult.playlistURL = playlistUrl;\n resolve(sessionStartResult);\n });\n } else {\n resolve(sessionStartResult);\n }\n });\n })\n .catch(function (err) {\n resetSessionData();\n if (err && err.errorCode === \"601\") {\n _forceStopCallbackFunction(err.userMessage);\n }\n return Promise.reject(err);\n });\n }\n\n function getInitialBookmark() {\n if(isAdInsertion()) {\n return calculateTimeOffsetFromBookmark({\n bookmark: _currentSession.getValue(\"initialBookmark\"),\n timeline: getTimeline()\n });\n } else {\n return _currentSession.getValue(\"initialBookmark\");\n }\n }\n\n var yospaceSessionManagerCallbacks = {\n AdBreakStart: function (obj) {\n // Function gets called whenever an advert break starts\n //console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" yospace AdBreakStart. obj:\");\n // console.log(obj);\n },\n AdvertStart: function (miid) {\n // Function gets called at the start of each advert within a break\n // (except for filler content - eg ident etc)\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" yospace AdvertStart (part data). Advert:\");\n\n var advert = _yospaceSessionManager.session.currentAdvert;\n // console.log(advert);\n\n var rawAdvert = advert.advert;\n //console.log(\"Advert sequence is \" + rawAdvert.sequence);\n\n var linear = rawAdvert.getLinear();\n var nonlinears = rawAdvert.getNonLinears();\n\n if (linear != null) {\n // console.log(\"Advert has a linear creative\");\n // console.log(\"Clickthrough URL is: \" + linear.getClickThrough());\n // console.log(\"Ad duration: (seconds) : \" + linear.getDuration());\n }\n\n var adLabels;\n const clipLength = advert.duration ? Math.floor(advert.duration*1000) : 0;\n if(_currentSession.getValue(\"isLive\") === true) { // live\n adLabels = Object.assign({}, _contentLabels, {\n // overwrite values from _contentLabels\n ns_st_cl: clipLength,\n ns_st_ty: \"advertisment\",\n ns_st_li: null, // zero out for ads\n ns_st_pr: advert.advert.id,\n\n // labels only used for ads\n ns_st_ad: 1,\n ns_st_ct: \"linear video ad\",\n mms_customadid: extractExtensionAttributeValue({advert: advert, attributeKey: \"customaid\"}),\n mms_adid: advert.advert.id,\n mms_goalid: extractExtensionAttributeValue({advert: advert, attributeKey: \"gid\"}),\n mms_campaignid: extractExtensionAttributeValue({advert: advert, attributeKey: \"cid\"})\n });\n } else { // assume it's vod if not live\n adLabels = Object.assign({}, _contentLabels, adLabels = {\n ns_st_cl: clipLength,\n ns_st_ty: \"advertisment\",\n ns_st_li: null, // zero out for ads\n ns_st_pr: advert.advert.id + \"_\" + (Math.floor(Math.random() * 999999) + 100000),\n\n //\n ns_st_pn: 1,\n ns_st_tp: 1,\n\n // labels only used for ads\n ns_st_ad: getAdbreakType({timeOffset:window.MandelWebPlayer.playerApi.experimental.getPlayer().getCurrentTime()}),\n ns_st_ct: \"non-linear video ad\",\n mms_customadid: extractExtensionAttributeValue({advert: advert, attributeKey: \"customaid\"}),\n mms_adid: advert.advert.id,\n mms_goalid: extractExtensionAttributeValue({advert: advert, attributeKey: \"gid\"}),\n mms_campaignid: extractExtensionAttributeValue({advert: advert, attributeKey: \"cid\"})\n });\n }\n\n\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: AdvertStart, call: _comscoreAnalytics.notifyEnd()\");\n _comscoreAnalytics.notifyEnd();\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: AdvertStart, call: _comscoreAnalytics.getPlaybackSession().setAsset(adLabels), adLabels:\" + JSON.stringify(adLabels));\n _comscoreAnalytics.getPlaybackSession().setAsset(adLabels);\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: AdvertStart, call: _comscoreAnalytics.notifyPlay()\");\n _comscoreAnalytics.notifyPlay();\n\n function extractExtensionAttributeValue({advert, attributeKey}) {\n try {\n return advert.advert.Extensions[0].firstChild.attributes[attributeKey].value;\n } catch(err) {\n try {\n return advert.advert.Extensions[0].firstElementChild.attributes[attributeKey].value;\n } catch(err) {\n return \"unknown\";\n }\n }\n }\n },\n AdvertEnd: function (obj) {\n // Function gets called at the end of each advert within a break\n // (except for filler content - eg ident etc)\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" yospace AdvertEnd. obj:\");\n // console.log(obj);\n },\n AdBreakEnd: function (obj) {\n // Function gets called at the end of an advert break signalling a return to main content\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" yospace AdBreakEnd. obj:\");\n // console.log(obj);\n\n\n // AdBreakEnd can be called after the playback has ended, so check if session still active\n if (hasActiveSession()) {\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: AdBreakEnd, call: _comscoreAnalytics.notifyEnd()\");\n _comscoreAnalytics.notifyEnd();\n\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" event: AdBreakEnd message: \" + JSON.stringify(getCurrentContentData({timeOffset: window.MandelWebPlayer.playerApi.experimental.getPlayer().getCurrentTime()})));\n\n var contentLabelsWithPartNumbers = getContentLabelsWithPartNumbers({\n contentLabels: _contentLabels,\n timeOffset: window.MandelWebPlayer.playerApi.experimental.getPlayer().getCurrentTime()\n });\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: AdBreakEnd, call: _comscoreAnalytics.getPlaybackSession().setAsset(contentLabelsWithPartNumbers)\"); //, _contentLabels:\" + JSON.stringify(contentLabelsWithPartNumbers));\n _comscoreAnalytics.getPlaybackSession().setAsset(Object.assign({}, contentLabelsWithPartNumbers));\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: AdBreakEnd, call: _comscoreAnalytics.notifyPlay()\");\n _comscoreAnalytics.notifyPlay();\n }\n },\n UpdateTimeline: function (timeline) {\n _currentSession.setValue(\"timeline\", timeline);\n // renderTimeline();\n // Function gets called whenever there is updated information concerning the playback timeline\n // (for VoD and NonLinear content only)\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" yospace UpdateTimeline. Timeline:\");\n // console.log(timeline);\n }\n };\n\n // TODO: Only for testing extract\n function renderTimeline() {\n if(document.getElementById(\"timeline\")) {\n let timeline = getTimeline();\n var timelineContainer = document.getElementById(\"timeline\");\n timelineContainer.innerHTML = \"\";\n timelineContainer.style.paddingLeft = \"9.5%\";\n timelineContainer.style.paddingRight = \"9.5%\";\n var totalDuration = 0;\n for (var i = 0; i < timeline.elements.length; i++) {\n totalDuration = totalDuration + timeline.elements[i].duration;\n }\n for (var j = 0; j < timeline.elements.length; j++) {\n var part = document.createElement(\"div\");\n console.log(timeline.elements[j]);\n part.style.backgroundColor = timeline.elements[j].type === \"advert\" ? \"orange\" : \"blue\";\n part.style.width = (timeline.elements[j].duration * 100 / totalDuration) + \"%\";\n part.style.display = \"inline-block\";\n part.innerHTML = \" \";\n timelineContainer.appendChild(part);\n }\n }\n }\n\n function initAdInsertionSession({url, tier}) {\n return new Promise(function (resolve, reject) {\n //YSSessionManager.DEFAULTS.DEBUGGING = true;\n if(_currentSession.getValue(\"isLive\") === true) {\n _yospaceSessionManager = YSSessionManager.createForLive(url, null,(result, status) => {\n initAdInsertionReporting(result, status, resolve, reject);\n });\n } else {\n\n // url = \"https://csm-e.tls1.yospace.com/csm/access/153492627/ZGFzaC82Y2JlZWJhMy0yMjU4LTQ5NDgtYjRkZC1hZjRmYzUyZjA2YzYvbWFuaWZlc3Q=?contentId=se.tv4.content.200025900&userId=1234&yo.up=https://vcdn-l.tv.comhem.se/ad/dash/54090/&channelId=29\";\n\n _yospaceSessionManager = YSSessionManager.createForVoD(url, null,(result, status) => {\n initAdInsertionReporting(result, status, resolve, reject);\n });\n }\n\n });\n\n function initAdInsertionReporting(result, status, resolve, reject) {\n if (result !== \"ready\") {\n if (status && status.hasOwnProperty(status)) {\n reject(\"Response code: \" + status.status);\n } else {\n reject(\"Unknown error\");\n }\n }\n try {\n var publisherId, publisherSecret, mmsClnr;\n if (tier === \"comhem\") {\n publisherId = \"28129443\";\n publisherSecret = \"3a952f751cea985882f30e015b1b37a9\";\n mmsClnr = \"1002060\";\n } else if (tier === \"boxer\") {\n publisherId = \"28129444\";\n publisherSecret = \"a5c125a8cc2b9c9b22732a7d540f23e2\";\n mmsClnr = \"1002059\";\n }\n\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: start session, call: _comscoreAnalytics = new ns_.StreamingAnalytics( { publisherId: publisherId, publisherSecret: publisherSecret } ), values:\" + JSON.stringify({\n // publisherId: publisherId,\n // publisherSecret: publisherSecret\n // }));\n _comscoreAnalytics = new ns_.StreamingAnalytics({\n publisherId: publisherId,\n publisherSecret: publisherSecret\n });\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: start session, call: _comscoreAnalytics.setLabels({mms_clnr: mmsClnr,ns_site: nsSite})\"); //, values:\" + JSON.stringify({ mms_clnr: mmsClnr, ns_site: (isComHemPlayOrBoxerPlayProduction === true ? \"total\" : \"test\") // total = production, test=test}));\n var isComHemPlayOrBoxerPlayProduction = window.location.href.includes(\"//www.comhemplay.se\") || window.location.href.includes(\"//play.boxer.se\");\n _comscoreAnalytics.setLabels({\n mms_clnr: mmsClnr,\n ns_site: (isComHemPlayOrBoxerPlayProduction === true ? \"total\" : \"test\") // total = production, test=test\n });\n\n // Obtain playlist URL\n var playlist = _yospaceSessionManager.masterPlaylist();\n _yospaceSessionManager.registerPlayer(yospaceSessionManagerCallbacks);\n // console.log(\"adInsertions session manager callback object registered\");\n\n var channelUrl = extractChannelId(playlist);\n\n if(_currentSession.getValue(\"isLive\") === true) { // live\n _contentLabels = {\n // labels which are the same for content and ads\n ns_st_pn: 1,\n ns_st_tp: 1,\n ns_st_mp: \"Mandel Web player \" + window.MandelWebPlayer.settings.version, // playerName???\n mms_auto: \"yes\", // (autoStarted) \"yes\" else \"no\"\n mms_values: \"origcode=\" + channelUrl,\n mms_subsite: tier + \".web\",\n\n // labels specific to content, which will be overridden\n ns_st_cl: 0,\n ns_st_ty: \"live\",\n ns_st_li: 1, // li = live, 1 för live, null för ads\n ns_st_pr: \"origcode=\" + channelUrl\n };\n } else { // assume it's vod if not live\n _contentLabels = {\n // labels which are the same for content and ads\n ns_st_mp: \"Mandel Web player \" + window.MandelWebPlayer.settings.version, // playerName???\n mms_auto: \"yes\", // (autoStarted) \"yes\" else \"no\"\n mms_values: \"origcode=\" + channelUrl,\n mms_subsite: tier + \".web\",\n\n // labels specific to content, which will be overridden\n ns_st_ty: \"content\",\n ns_st_pr: \"origcode=\" + channelUrl\n };\n }\n\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: start session, call: _comscoreAnalytics.createPlaybackSession()\");\n _comscoreAnalytics.createPlaybackSession();\n\n resolve(playlist);\n } catch (e) {\n reject(e);\n }\n }\n }\n\n function getContentLabelsWithPartNumbers({contentLabels, timeOffset}) {\n var data = getCurrentContentData({timeOffset: timeOffset});\n\n var o = Object.assign({},contentLabels,{\n ns_st_cl: data.duration ? Math.floor(data.duration*1000) : 0,\n // td: data.totalDuration,\n ns_st_pn: data.partNumber,\n ns_st_tp: data.totalParts\n });\n return o;\n }\n\n function notifyMetadataReceived(metadata) {\n if (isAdInsertion()) {\n if (metadata && metadata.schemeIdUri === \"urn:yospace:a:id3:2016\") {\n var tag = {};\n metadata.messageData.split(\",\").forEach(function (item) {\n tag[item.split(\"=\")[0]] = item.split(\"=\")[1];\n });\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.METADATA, tag);\n }\n }\n\n }\n\n function notifyMute() {\n if (isAdInsertion()) {\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.MUTE, true);\n }\n }\n\n function notifyUnmute() {\n if (isAdInsertion()) {\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.MUTE, false);\n }\n }\n\n function notifyEnterFullscreen() {\n if (isAdInsertion()) {\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.FULLSCREEN, true);\n }\n }\n\n function notifyExitFullscreen() {\n if (isAdInsertion()) {\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.FULLSCREEN, false);\n }\n }\n\n function extractChannelId(url) {\n return url.match('[?&]' + \"channelId\" + '=([^&]+)')[1];\n }\n\n function isAdInsertion() {\n return hasActiveSession() ? _currentSession.getValue(\"isAdInsertion\") : false;\n }\n\n function notifySeekStart({seekStartPosition}) {\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" sessionManager event: notifySeekStart\");\n if (isAdInsertion() && _currentSession.getValue(_playbackState) !== _playbackState_seeking) {\n\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: SEEK_START, call: _comscoreAnalytics.notifySeekStart()\"); // + seekStartPosition\n _comscoreAnalytics.notifySeekStart();\n\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" yospace event: SEEK_START, call: _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.SEEK_START) \" + seekStartPosition);\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.SEEK_START, seekStartPosition);\n }\n _currentSession.setValue(_playbackState, _playbackState_seeking);\n _currentSession.setValue(_playbackState_seeking_startPosition, seekStartPosition);\n }\n\n function notifyBufferStart() {\n if (isAdInsertion()) {\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: buffer start, call: _comscoreAnalytics.notifyBufferStart()\");\n _comscoreAnalytics.notifyBufferStart();\n }\n }\n\n function notifyBufferEnd() {\n if (isAdInsertion()) {\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: buffer stop, call: _comscoreAnalytics.notifyBufferStop()\");\n _comscoreAnalytics.notifyBufferStop();\n }\n }\n\n function getCurrentContentData({timeOffset}) {\n var data = {};\n var totalParts = 0;\n var totalDuration = 0;\n getTimeline().elements.forEach((part)=>{\n if(part.type === \"vod\") {\n totalParts++;\n totalDuration = totalDuration + part.duration;\n }\n if(timeOffset >= part.offset && (part.offset+part.duration) >= timeOffset) {\n data.type = part.type;\n if(data.type === \"vod\") {\n data.partNumber = totalParts;\n data.duration = part.duration;\n }\n }\n });\n if(data.type === \"vod\") {\n data.totalParts = totalParts;\n data.totalDuration = totalDuration;\n }\n return data;\n }\n\n function getAdbreakType({timeOffset}) {\n var timeline = getTimeline().elements;\n var first = timeline[0];\n var last = timeline[timeline.length-1];\n\n if(first.type === \"advert\" && timeOffset >= first.offset && timeOffset <= (first.offset+first.duration)) {\n return \"pre-roll\";\n } else if (last.type === \"advert\" && timeOffset >= last.offset && timeOffset <= (last.offset+last.duration)) {\n return \"post-roll\";\n } else {\n return \"mid-roll\"; // else assume mid-roll. might be a little error prone if you call this method with a timeoffset which isn't within an adbreak. but who is that stupid?\n }\n }\n\n function isAdBreak({timeOffset}) {\n var contentData = getCurrentContentData({timeOffset});\n return contentData.type === \"advert\";\n }\n\n function calculateBookmarkPosition({timeOffset, timeline}) {\n if(isAdInsertion()) {\n return calculateBookmarkFromTimeOffset({timeOffset: timeOffset, timeline: timeline});\n } else {\n return timeOffset;\n }\n }\n\n function getTimeline() {\n const timeline = _yospaceSessionManager && _yospaceSessionManager.session && _yospaceSessionManager.session.timeline;\n return timeline || _currentSession.getValue(\"timeline\");\n }\n\n function play({timeOffset, previousTimeOffset}) {\n _currentSession.setValue(\"currentTimeOffset\", timeOffset);\n if (hasActiveSession()) {\n if (isAdInsertion()) {\n //console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" event: play message: \" + JSON.stringify(getCurrentContentData({timeOffset: window.MandelWebPlayer.playerApi.experimental.getPlayer().getCurrentTime()})));\n if(_currentSession.getValue(\"isLive\")) {\n _comscoreAnalytics.getPlaybackSession().setAsset(Object.assign({}, _contentLabels));\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: play, call: _comscoreAnalytics.notifyPlay()\");\n _comscoreAnalytics.notifyPlay();\n } else { // assume vod if not live, and only execute block if vod content at play timeOffset\n // renderTimeline();\n var time = window.MandelWebPlayer.playerApi.experimental.getPlayer().getCurrentTime();\n // console.log(\"play time:: \" + time);\n\n if (_currentSession.getValue(_playbackState) === _playbackState_pausedByUser) {\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: play, call: _comscoreAnalytics.notifyPlay()\");\n _comscoreAnalytics.notifyPlay();\n// } else if(_currentSession.getValue(_playbackState) === _playbackState_seeking) {\n } else if (!isAdBreak({timeOffset: timeOffset})) {\n var contentLabelsWithPartNumbers = getContentLabelsWithPartNumbers({contentLabels:_contentLabels, timeOffset: time});\n _comscoreAnalytics.getPlaybackSession().setAsset(Object.assign({}, contentLabelsWithPartNumbers));\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: play, call: _comscoreAnalytics.notifyPlay()\");\n _comscoreAnalytics.notifyPlay();\n }\n }\n\n if (_currentSession.getValue(_playbackState) === _playbackState_pausedByUser) {\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" yospace event: play, call: _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.RESUME)\");\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.RESUME);\n } else if(_currentSession.getValue(_playbackState) === _playbackState_seeking) {\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" yospace event: SEEK_END \" + timeOffset);\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.SEEK_END, timeOffset);\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" yospace event: play, call: _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.RESUME)\");\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.RESUME);\n } else {\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" yospace event: play, call: _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.START)\");\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.START);\n }\n\n }\n const timeline = getTimeline();\n var position = calculateBookmarkPosition({timeOffset: _currentSession.getValue(\"currentTimeOffset\"), timeline: timeline});\n var previousPosition = calculateBookmarkPosition({timeOffset: previousTimeOffset, timeline: timeline});\n\n _mandelService.sessionPlay({\n sessionID: _currentSession.getValue(\"sessionID\"),\n cpeID: _currentSession.getValue(\"cpeID\"),\n partnerCustomerID: _currentSession.getValue(\"partnerCustomerID\"),\n timeOffset: position !== undefined ? Math.floor(position) : 0,\n previousTimeOffset: previousPosition !== undefined ? Math.floor(previousPosition) : 0\n })\n .catch((err) => {\n if (window.MandelWebPlayer.settings.enableLogs === true) {\n console.warn(err);\n }\n _forceStopCallbackFunction(err.userMessage);\n });\n\n _currentSession.setValue(_playbackState, _playbackState_play);\n }\n\n }\n\n function startKeepAlive() {\n setKeepAliveIntervalRef(setInterval(() => {\n if (hasActiveSession()) {\n var position = calculateBookmarkPosition({timeOffset: _currentSession.getValue(\"currentTimeOffset\"), timeline: getTimeline()});\n _mandelService.sessionKeepAlive({\n sessionID: _currentSession.getValue(\"sessionID\"),\n cpeID: _currentSession.getValue(\"cpeID\"),\n partnerCustomerID: _currentSession.getValue(\"partnerCustomerID\"),\n timeOffset: position !== undefined ? Math.floor(position) : 0\n })\n .catch((err) => {\n if (window.MandelWebPlayer.settings.enableLogs === true) {\n console.warn(err);\n }\n if (err.message === \"Failed to fetch\" || err.httpStatus === 0 || err.httpStatus >= 500) {\n // ignore timeouts or internal server errors (we don't want to kill active streams if mandel is down)\n console.warn(\"Ignoring status: \" + err.httpStatus + \" \" + err.httpStatusText);\n } else {\n _forceStopCallbackFunction(err.userMessage);\n }\n });\n }\n }, _keepAliveRepeatRateSeconds));\n }\n\n function endKeepAlive() {\n clearInterval(getKeepAliveIntervalRef());\n }\n\n function pause({timeOffset}) {\n _currentSession.setValue(\"currentTimeOffset\", timeOffset);\n if (hasActiveSession()) {\n _currentSession.setValue(_playbackState, _playbackState_pausedByUser);\n if (isAdInsertion()) {\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: pause, call: _comscoreAnalytics.notifyPause()\");\n _comscoreAnalytics.notifyPause();\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" yospace event: pause, call: _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.PAUSE)\");\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.PAUSE);\n\n }\n var position = calculateBookmarkPosition({timeOffset: _currentSession.getValue(\"currentTimeOffset\"), timeline: getTimeline()});\n _mandelService.sessionPause({\n sessionID: _currentSession.getValue(\"sessionID\"),\n cpeID: _currentSession.getValue(\"cpeID\"),\n partnerCustomerID: _currentSession.getValue(\"partnerCustomerID\"),\n timeOffset: position !== undefined ? Math.floor(position) : 0\n })\n .catch((err) => {\n if (window.MandelWebPlayer.settings.enableLogs === true) {\n console.warn(err);\n }\n _forceStopCallbackFunction(err.userMessage);\n });\n }\n }\n\n function end({timeOffset, sessionEndCode}) {\n if (timeOffset !== undefined) {\n _currentSession.setValue(\"currentTimeOffset\", timeOffset);\n }\n if (hasActiveSession()) {\n\n if(isAdInsertion()) {\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.END);\n if (sessionEndCode === _endCodes.UNKNOWN_REASON) {\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: playback error, call: _comscoreAnalytics.notifyError()\");\n _comscoreAnalytics.notifyError();\n } else {\n // console.log(new Date().toISOString().split('T')[1].substring(0, 8) + \" comscore event: end session, call: _comscoreAnalytics.notifyEnd()\");\n _comscoreAnalytics.notifyEnd();\n }\n }\n\n var position = calculateBookmarkPosition({timeOffset: _currentSession.getValue(\"currentTimeOffset\"), timeline: getTimeline()});\n _mandelService.sessionEnd({\n sessionID: _currentSession.getValue(\"sessionID\"),\n cpeID: _currentSession.getValue(\"cpeID\"),\n partnerCustomerID: _currentSession.getValue(\"partnerCustomerID\"),\n timeOffset: position !== undefined ? Math.floor(position) : 0,\n sessionEndCode: sessionEndCode\n })\n .catch((err) => {\n if (window.MandelWebPlayer.settings.enableLogs === true) {\n console.warn(err);\n }\n });\n }\n endKeepAlive();\n resetSessionData();\n }\n\n function resetSessionData() {\n _currentSession.clearAllValues();\n }\n\n function hasActiveSession() {\n return _currentSession.getValue(\"sessionID\") !== undefined &&\n _currentSession.getValue(\"sessionID\") !== null &&\n _currentSession.getValue(\"sessionID\") !== \"\";\n }\n\n function updateCurrentTimeOffset({timeOffset, rawTime}) {\n if (isAdInsertion()) {\n _yospaceSessionManager.reportPlayerEvent(YSPlayerEvents.POSITION, rawTime);\n }\n _currentSession.setValue(\"currentTimeOffset\", timeOffset);\n }\n\n function getKeepAliveIntervalRef() {\n return localStorage.getItem(\"mandelWebPlayer.keepAliveIntervalRef\");\n }\n\n function setKeepAliveIntervalRef(keepAliveIntervalRef) {\n localStorage.setItem(\"mandelWebPlayer.keepAliveIntervalRef\", keepAliveIntervalRef);\n }\n\n window.onbeforeunload = closingCode;\n function closingCode() {\n if (hasActiveSession() === true) {\n end({sessionEndCode: _endCodes.CUSTOMER_TERMINATED});\n }\n }\n}\n\nexport function calculateBookmarkFromTimeOffset({timeOffset, timeline}) {\n if(timeOffset === undefined) {\n return 0;\n }\n var progressContent = 0;\n var progressAdverts = 0;\n for(var i = 0; timeline.elements.length > i; i++) {\n var part = timeline.elements[i];\n if(part.offset <= timeOffset && part.offset+part.duration > timeOffset) {\n if(part.type !== \"advert\") {\n return timeOffset-progressAdverts;\n } else if(part.type === \"advert\") {\n return progressContent;\n }\n } else if(part.type !== \"advert\") {\n progressContent = progressContent + part.duration;\n } else if(part.type === \"advert\") {\n progressAdverts = progressAdverts + part.duration;\n }\n }\n}\n\nexport function calculateTimeOffsetFromBookmark({bookmark, timeline}) {\n if(bookmark === undefined) {\n return undefined;\n }\n var totalLengthsOfAdvertsUntilBookmarkPosition = 0;\n var totalLengthsOfContentSoFar = 0;\n for(var i = 0; timeline.elements.length > i; i++) {\n var part = timeline.elements[i];\n if(part.type === \"advert\") {\n totalLengthsOfAdvertsUntilBookmarkPosition = totalLengthsOfAdvertsUntilBookmarkPosition + part.duration;\n } else if(totalLengthsOfContentSoFar + part.duration < bookmark) {\n totalLengthsOfContentSoFar = totalLengthsOfContentSoFar + part.duration;\n } else {\n return totalLengthsOfAdvertsUntilBookmarkPosition + bookmark;\n }\n }\n}\n\n","export default function LocalStorageObject({localStorageKey}) {\n // declare and assign default value to local variables\n var _localStorageKey;\n\n // define api methods\n this.getValue = getValue;\n this.setValue = setValue;\n this.setValues = setValues;\n this.clearAllValues = clearAllValues;\n this.clearAndSetValues = clearAndSetValues;\n\n //============================ CONSTRUCTOR TASKS ===========================//\n\n _localStorageKey = localStorageKey;\n\n //============================ FUNCTIONS ===================================//\n\n function getValue(key) {\n return readFromLocalStorage()[key];\n }\n\n function setValue(key, value) {\n var object = readFromLocalStorage();\n object[key] = value;\n writeToLocalStorage(object);\n }\n\n function setValues(keyValuesObject) {\n var object = readFromLocalStorage();\n\n Object.keys(keyValuesObject).forEach(function (key) {\n object[key] = keyValuesObject[key];\n });\n\n writeToLocalStorage(object);\n }\n\n function clearAndSetValues(keyValuesObject) {\n clearAllValues();\n setValues(keyValuesObject);\n }\n\n function clearAllValues() {\n writeToLocalStorage({});\n }\n\n function readFromLocalStorage() {\n var storedObject = localStorage.getItem(_localStorageKey);\n if(storedObject === null) {\n clearAllValues();\n storedObject = localStorage.getItem(_localStorageKey);\n }\n var parsed;\n try {\n parsed = JSON.parse(storedObject);\n } catch(e) {\n parsed = {};\n }\n return parsed;\n }\n\n function writeToLocalStorage(object) {\n localStorage.setItem(_localStorageKey, JSON.stringify(object));\n }\n\n}\n","export default function EventBus() {\n var _topics = {};\n\n // define public methods\n this.subscribe = subscribe;\n this.publish = publish;\n this.unsubscribe = unsubscribe;\n\n //=================================================================================\n\n function subscribe(topicOrArrayOfTopics, listener) {\n if(topicOrArrayOfTopics !== null && Array.isArray(topicOrArrayOfTopics)) {\n topicOrArrayOfTopics.forEach(function (topic) {\n innerSubscribe(topic, listener);\n });\n } else {\n innerSubscribe(topicOrArrayOfTopics, listener);\n }\n\n function innerSubscribe(topic) {\n // create the topic if not yet created\n if(!_topics[topic.topic]) _topics[topic.topic] = [];\n\n // add the listener\n _topics[topic.topic].push(topic.listener);\n }\n }\n\n function publish(topic, data) {\n if(window.MandelWebPlayer.settings.enableLogs === true) { console.debug(\"Event published: \" + topic); }\n // return if the topic doesn't exist, or there are no listeners\n if(!_topics[topic] || _topics[topic].length < 1) return;\n\n // send the event to all listeners\n _topics[topic].forEach(function(listener) {\n listener(data, topic || {}, topic);\n });\n }\n\n function unsubscribe({ topic, listener }) {\n if (!_topics[topic] || _topics[topic].length < 1) return;\n _topics[topic] = _topics[topic].filter((topicListener) => topicListener !== listener);\n }\n\n return this;\n}","export default function VideoStreamAnalyticsManager({mandelService, sessionManager}) {\n // declare and assign default value to local variables\n var _mandelService;\n var _sessionInfo = {};\n var _timestamps = {};\n var _previousBitrate = 0;\n\n // define public methods\n this.sessionStart = sessionStart; //PlaybackSessionStarted\n this.receivedPlaybackUrl = receivedPlaybackUrl; //PlaybackDataReceived (playback_url)\n this.receivedManifest = receivedManifest; //PlaybackDataReceived (playback_manifest)\n this.licenseReceived = licenseReceived; //PlaybackDataReceived (playback_license)\n this.segmentReceived = segmentReceived; //PlaybackDataReceived (playback_first_segment)\n this.segmentPlaying = segmentPlaying; //PlaybackStarted\n this.bandwidthTrace = bandwidthTrace; //BandwidthTrace\n this.bitrateDownloadChange = bitrateDownloadChange; //BitrateChange\n this.bitratePlaybackChange = bitratePlaybackChange; //BitrateChange\n this.playbackInterrupted = playbackInterrupted; //PlaybackInterrupted\n this.playbackResumed = playbackResumed; //PlaybackResumed\n this.error = error; //Error\n this.warn = warn; //Warn\n this.videoPaused = videoPaused;\n this.logNetworkResponse = logNetworkResponse;\n\n //============================ CONSTRUCTOR TASKS ===========================//\n\n _mandelService = mandelService;\n\n\n //============================ FUNCTIONS ===================================//\n\n function sessionStart({prgSvcID, contentID, cpeID, partnerCustomerID}) {\n _sessionInfo = {};\n _sessionInfo.prgSvcID = prgSvcID;\n _sessionInfo.contentID = contentID;\n _sessionInfo.cpeID = cpeID;\n _sessionInfo.partnerCustomerID = partnerCustomerID;\n _timestamps = {};\n _timestamps.sessionStart = Date.now();\n _mandelService.logToServer({\n cpeID: cpeID,\n partnerCustomerID: partnerCustomerID,\n data: {\n logEvent: \"SESSION_START\",\n timestamp: _timestamps.sessionStart,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n }\n });\n }\n function receivedPlaybackUrl({playbackUrl, sessionID}) {\n _sessionInfo.playbackUrl = playbackUrl;\n _sessionInfo.sessionID = sessionID;\n _timestamps.receivedPlaybackUrl = Date.now();\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"MANIFEST_URL_RECEIVED\",\n sessionID: _sessionInfo.sessionID,\n timestamp: _timestamps.receivedPlaybackUrl,\n // stepDuration: _timestamps.receivedPlaybackUrl-_timestamps.sessionStart,\n timeOffsetFromSessionStart: _timestamps.receivedPlaybackUrl-_timestamps.sessionStart,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID,\n manifestUrl: playbackUrl\n }\n });\n }\n function receivedManifest() {\n if (_timestamps.receivedManifest === undefined) {\n _timestamps.receivedManifest = Date.now();\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"MANIFEST_RECEIVED\",\n sessionID: _sessionInfo.sessionID,\n timestamp: _timestamps.receivedManifest,\n //stepDuration: _timestamps.receivedManifest-_timestamps.receivedPlaybackUrl,\n timeOffsetFromSessionStart: _timestamps.receivedManifest-_timestamps.sessionStart,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n }\n });\n }\n }\n function licenseReceived() {\n if (_timestamps.licenseReceived === undefined) {\n _timestamps.licenseReceived = Date.now();\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"PLAYBACK_LICENCE_RECEIVED\",\n sessionID: _sessionInfo.sessionID,\n timestamp: _timestamps.licenseReceived,\n timeOffsetFromSessionStart: _timestamps.licenseReceived - _timestamps.sessionStart,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n }\n });\n }\n }\n function segmentReceived({segmentName}) {\n if(_timestamps.segmentReceived === undefined) {\n _timestamps.segmentReceived = Date.now();\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"FIRST_SEGMENT_RECEIVED\",\n sessionID: _sessionInfo.sessionID,\n timestamp: _timestamps.segmentReceived,\n //stepDuration: _timestamps.segmentReceived-_timestamps.receivedManifest,\n timeOffsetFromSessionStart: _timestamps.segmentReceived-_timestamps.sessionStart,\n segmentName: segmentName,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n }\n });\n }\n }\n function playHasOccuredDuringSession() {\n return _timestamps.segmentPlaying !== undefined;\n }\n function segmentPlaying() {\n if(_timestamps.segmentPlaying === undefined) {\n _timestamps.segmentPlaying = Date.now();\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"PLAYBACK_STARTED\",\n sessionID: _sessionInfo.sessionID,\n timeOffsetFromSessionStart: _timestamps.segmentPlaying-_timestamps.sessionStart,\n //stepDuration: _timestamps.segmentPlaying-_timestamps.segmentReceived,\n timestamp: _timestamps.segmentPlaying,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n }\n });\n }\n }\n function bandwidthTrace({segmentName, downloadTime, size}) {\n if(size < 1000) {\n return; // skip downloads less than 1k\n }\n var downloadTimeMs = Math.round(downloadTime * 1000);\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"BANDWIDTH_TRACE\",\n sessionID: _sessionInfo.sessionID,\n segmentName: segmentName,\n downloadTime: downloadTimeMs,\n downloadSize: size,\n timestamp: Date.now(),\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n //bandwidthTraceKbps: Math.floor(size/1000/downloadTime)\n }\n });\n }\n function bitratePlaybackChange({bitrate, timestamp}) {\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"PROFILE_CHANGE_PLAYBACK\",\n sessionID: _sessionInfo.sessionID,\n bitratePlayback: bitrate,\n timestamp: timestamp,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n }\n });\n }\n function bitrateDownloadChange({bitrate, timestamp}) {\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"PROFILE_CHANGE_DOWNLOAD\",\n sessionID: _sessionInfo.sessionID,\n bitrateDownload: bitrate,\n timestamp: timestamp,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n }\n });\n\n if(_previousBitrate > bitrate) {\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"PROFILE_DROP\",\n sessionID: _sessionInfo.sessionID,\n bitrate: bitrate,\n timestamp: timestamp,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n }\n });\n }\n _previousBitrate = bitrate;\n }\n function playbackInterrupted(data) {\n if(playHasOccuredDuringSession() === true){\n _timestamps.playbackInterrupted = Date.now();\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"PLAYBACK_INTERRUPTED\",\n sessionID: _sessionInfo.sessionID,\n timestamp: _timestamps.playbackInterrupted,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n }\n });\n }\n }\n function videoPaused() {\n _timestamps.playbackInterrupted = undefined; // reset\n }\n function playbackResumed(data) {\n if(_timestamps.playbackInterrupted !== undefined) {\n var timestampPlaybackResumed = Date.now();\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"PLAYBACK_RESUMED\",\n sessionID: _sessionInfo.sessionID,\n interruptionDuration: timestampPlaybackResumed-_timestamps.playbackInterrupted,\n timestamp: timestampPlaybackResumed,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n }\n });\n }\n }\n function error(data) {\n var httpStatus, playerErrorCode;\n if(typeof data === \"object\") {\n httpStatus = data.httpStatus;\n playerErrorCode = \"\" + data.code;\n if(httpStatus === undefined && data.message !== undefined) {\n try {\n httpStatus = data.message.substring(data.message.indexOf(\"got HTTP status code\") + 21, data.message.indexOf(\"got HTTP status code\") + 24);\n } catch (err) {\n console.debug(err);\n // ignore\n }\n }\n }\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"PLAYER_ERROR\",\n sessionID: _sessionInfo.sessionID,\n logMessage: JSON.stringify((isJson(data) ? data : {message: data})),\n timestamp: Date.now(),\n httpStatus: httpStatus,\n playerErrorCode: playerErrorCode,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n }\n });\n }\n function warn(data) {\n var httpStatus, playerErrorCode;\n if(typeof data === \"object\") {\n httpStatus = data.httpStatus;\n playerErrorCode = data.code;\n }\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: {\n logEvent: \"PLAYER_WARNING\",\n sessionID: _sessionInfo.sessionID,\n logMessage: JSON.stringify((isJson(data) ? data : {message: data})),\n timestamp: Date.now(),\n httpStatus: httpStatus,\n playerErrorCode: playerErrorCode,\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID\n }\n });\n }\n\n function logNetworkResponse({response, additionalData}) {\n var httpStatus, url, httpResponseLength, httpResponseHeaderTime, httpResponseHeaderDeliver, clientDownloadTime;\n\n if(typeof response === \"object\") {\n httpStatus = response.status;\n url = response.url;\n httpResponseLength = response.length;\n }\n\n _mandelService.logToServer({\n cpeID: _sessionInfo.cpeID,\n partnerCustomerID: _sessionInfo.partnerCustomerID,\n data: Object.assign({\n logEvent: \"PLAYER_HTTP_RESPONSE\",\n sessionID: _sessionInfo.sessionID,\n logMessage: JSON.stringify((isJson(response) ? response : {message: response})),\n timestamp: Date.now(),\n prgSvcID: _sessionInfo.prgSvcID,\n contentID: _sessionInfo.contentID,\n httpStatus: httpStatus,\n url: url,\n httpResponseLength: httpResponseLength\n }, additionalData)\n });\n }\n\n function isJson(stringOrObject){\n try {\n if (stringOrObject && typeof stringOrObject === \"object\") {\n return true;\n }\n\n var o = JSON.parse(stringOrObject);\n if (o && typeof o === \"object\") {\n return true;\n }\n }\n catch (e) { }\n\n return false;\n }\n}\n"],"sourceRoot":""}