{"version":3,"file":"player.next.min.js","mappings":"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AAK,IAAK,GAAI,GAAI,EAAG,EAAG,EAAG,EAClE,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,EAAG,GAChE,IAAK,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAChE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC/D,GAAI,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,IAAK,GAAI,GAAI,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACjE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAC/D,IAAK,IAAK,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACjE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAChE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAClE,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,EAAG,EAAG,GAAI,IAAK,IAAK,IAC9D,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACjE,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAChE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAA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C,WAAY,YAGxBrE,KAAM,CACF74B,KAAM,gCACN9E,KAAM,kIAIdhQ,QAAS,CACLkB,UAAW,CACPF,OAAQ,GACRurC,GAAI,CAAC,iBAAkB,mBAG3B5vB,UAAW,CACP3b,OAAQ,CACJ,aACA,gBACA,mBACA,gBACA,gBACA,UACA,eACA,YACA,SACA,WACA,aACA,kBACA,kBACA,SACA,SACA,kBACA,aACA,UAGA,cAEA,cAEA,oBACA,mBACA,cACA,SACA,UAEA,mBACA,SACA,aACA,cACA,kBACA,mBACA,aACA,cACA,iBACA,iBACA,qBACA,cACA,YACA,gBACA,eACA,cACA,UACA,uBACA,eACA,UACA,mBAIA,cACA,eACA,aACA,mBACA,kBACA,gBACA,SACA,aACA,iBACA,oBAEA,aACA,qBACA,YAEA,UACA,YACA,mBACA,UACA,iBACA,aACA,gBACA,eACA,mBACA,YACA,iBAEA,cACA,mBAEA,SACA,UAEA,UACA,mBAEA,iBACA,kBACA,UAEA,WACA,qBACA,UAGA,iBAIRP,QAAS,CACLO,OAAQ,CACJ,aACA,oBACA,uBACA,aACA,cACA,6BAKZL,QAAS,CACLkO,GAAI,CAAC,KAAM,QAGfrW,aD0HG,SAAyBsX,GAC5B,OAAOtX,EAAasX,EACxB,EEhXA/V,IAAa,a,yIEFN,MAAMk4C,EAAS,KACTC,EAAiB,MAEjBlxB,EAAa,MACbmxB,EAAwB,MACxBC,EAAmB,MACnBrxB,EAAY,MACZsxB,EAAkB,MAElB3xB,EAAgB,KAChB4xB,EAAgB,MAChB5wC,EAAoB,MAE3B6wC,EAAiB,CACnB,CAACN,GAAS,gBACV,CAACC,GAAiB,eAClB,CAAClxB,GAAa,uBACd,CAACmxB,GACG,qDACJ,CAACC,GAAmB,mDACpB,CAACrxB,GAAY,mBACb,CAACsxB,GAAkB,8BACnB,CAAC3xB,GAAgB,gBACjB,CAAC4xB,GAAgB,gBACjB,CAAC5wC,GAAoB,qBAQzB,EAAgB8wC,GACZD,EAAeC,IAAcD,EAAe7xB,E,oKC9BhD,IAAIO,UAAW,EACXwxB,QAAU,CAAC,EAEA,SAAS,2BAACC,MAChBzxB,WACDA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","sources":["webpack:///./utils/underscore.js","webpack:///./utils/backbone.events.js","webpack:///./utils/device.js","webpack:///./utils/merge.js","webpack:///./utils/utils.js","webpack:///./utils/logger.js","webpack:///./utils/warn-once.ts","webpack:///./player/model/locale.js","webpack:///./player/services/api.ts","webpack:///./player/services/api/asset/mock.js","webpack:///./player/services/api/asset.ts","webpack:///./utils/model.js","webpack:///./utils/clone-deep.ts","webpack:///./player/model/category.js","webpack:///./player/model/asset.js","webpack:///./utils/image.js","webpack:///./utils/string.js","webpack:///./player/model/domain.js","webpack:///./player/model/token.js","webpack:///./player/model/stream.js","webpack:///./player/playback/ads/relevant-yield.js","webpack:///./player/playback/ads/appnexus-tag-builder.js","webpack:///./player/playback/ads/appnexus-jw-config.js","webpack:///./player/playback/ads/appnexus.js","webpack:///./player/playback/config/sharing.js","webpack:///./player/playback/config/chromecast.js","webpack:///./player/plugins/anti-adblock/dom.js","webpack:///./player/playback/skin/jw-controls.js","webpack:///./player/playback/skin/tts-skin.js","webpack:///./player/playback/skin/audioSkinResolver.js","webpack:///./player/playback/youbora.js","webpack:///./player/playback/config.js","webpack:///./player/playback/config/playlist.js","webpack:///./player/playback/config/captions.js","webpack:///./player/playback/config/playback.js","webpack:///./player/playback/config/jw-youbora.js","webpack:///./utils/prebid.js","webpack:///./player/playback/config/keys.js","webpack:///./player/services/api/related.ts","webpack:///./player/model/next-asset.ts","webpack:///./player/model/recommended.js","webpack:///./player/model/recommended/list.ts","webpack:///./player/plugins/pulse-stats/tracker.js","webpack:///./utils/video-preview.js","webpack:///./player/events/error.js","webpack:///./player/playback/ads/appnexus-ast.js","webpack:///./utils/eventable.js","webpack:///./player/plugins/model.js","webpack:///./player/plugins/pause.js","webpack:///./player/plugins/age-limit.js","webpack:///./player/plugins/sponsor-label.js","webpack:///./player/plugins/podcast-experiment.js","webpack:///./player/plugins/countdown.js","webpack:///./player/plugins/recommended.js","webpack:///./player/plugins/pulse-stats/ad-events.js","webpack:///./player/plugins/pulse-stats/session.js","webpack:///./player/plugins/pulse-stats/playback-events.js","webpack:///./player/plugins/pulse-stats/helpers.js","webpack:///./player/plugins/pulse-stats/ui-events.js","webpack:///./player/model/category-tree.js","webpack:///./player/plugins/pulse-stats.js","webpack:///./player/plugins/podcast-native-link.js","webpack:///./player/plugins/anti-adblock/homad/eventbus.js","webpack:///./player/plugins/anti-adblock/homad/config.js","webpack:///./player/plugins/anti-adblock/homad/proxy.js","webpack:///./player/plugins/anti-adblock/homad.js","webpack:///./player/plugins/anti-adblock/homad/global.js","webpack:///./player/plugins/anti-adblock/homad/utils.js","webpack:///./player/plugins/anti-adblock/index.js","webpack:///./player/plugins/anti-adblock/tracking.js","webpack:///./player/events/playlist.js","webpack:///./player/events/complete.js","webpack:///./player/events/helpers.js","webpack:///./player/events/asset.js","webpack:///./utils/style-loader.js","webpack:///./player/playback/config/autoplay.js","webpack:///./player/playback/skin/icons-loader.js","webpack:///./player/playback/skin/settings-menu.js","webpack:///./player/playback/skin/sharing-box.js","webpack:///./player/playback/skin/container-class.js","webpack:///./player/playback/skin/levels-icon.js","webpack:///./player/playback/skin/nextUp.js","webpack:///./player/playback/skin.js","webpack:///./player/playback/skin/floating-skin.js","webpack:///./player/playback/skin/config-button.js","webpack:///./utils/clipboard.js","webpack:///./player/playback/provider.js","webpack:///./player/playback/ads/prevent-seeking.js","webpack:///./player/plugins.js","webpack:///./utils/mixin.js","webpack:///./player/events/config.js","webpack:///./player/player.js","webpack:///./index.js","webpack:///./player/config/translations.ts","webpack:///./player/config.ts","webpack:///./player/config/production.js","webpack:///./player/config/jw-keys.js","webpack:///./player/playback/config/status-codes.js","webpack:///./player/plugins/anti-adblock/homad/lib.js","webpack:///./utils/script-loader.js","webpack:///./utils/server-time.js","webpack:///./icons/audio-half.svg","webpack:///./icons/audio-muted.svg","webpack:///./icons/audio.svg","webpack:///./icons/audio/audio-half.svg","webpack:///./icons/audio/audio-off.svg","webpack:///./icons/audio/audio-on.svg","webpack:///./icons/audio/forward-30.svg","webpack:///./icons/audio/pause.svg","webpack:///./icons/audio/play.svg","webpack:///./icons/audio/playback-rate.svg","webpack:///./icons/audio/replay.svg","webpack:///./icons/audio/rewind-10.svg","webpack:///./icons/buffering.svg","webpack:///./icons/captions.svg","webpack:///./icons/chevron-right.svg","webpack:///./icons/close.svg","webpack:///./icons/error.svg","webpack:///./icons/fullscreen-off.svg","webpack:///./icons/fullscreen-on.svg","webpack:///./icons/info.svg","webpack:///./icons/pause.svg","webpack:///./icons/play.svg","webpack:///./icons/replay.svg","webpack:///./icons/settings.svg","webpack:///./icons/share.svg","webpack:///./player/plugins/anti-adblock/icons/fullscreen.svg","webpack:///./player/plugins/anti-adblock/icons/link.svg","webpack:///./player/plugins/anti-adblock/icons/pause.svg","webpack:///./player/plugins/anti-adblock/icons/play.svg","webpack:///./player/plugins/anti-adblock/icons/speaker-muted.svg","webpack:///./player/plugins/anti-adblock/icons/speaker.svg","webpack:///./player/plugins/countdown.html","webpack:///./player/plugins/pause.html","webpack:///./player/plugins/recommended/grid.html","webpack:///./player/plugins/recommended/next-asset.html","webpack:///./player/plugins/recommended/recommended.html","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./svp-player.js"],"sourcesContent":["var idCounter = 0;\n\n// we do not include underscore as it is our hard dependency\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst { _ } = jwplayer;\n/**\n * @param {string|number} key\n * @return {(obj: Object|Array|null) => *}\n */\nconst property = function (key) {\n return function (obj) {\n return obj == null ? undefined : obj[key];\n };\n};\nconst MAX_ARRAY_INDEX = 2 ** 53 - 1;\nconst getLength = property('length');\nconst isArrayLike = function (collection) {\n var length = getLength(collection);\n return (\n typeof length === 'number' && length >= 0 && length <= MAX_ARRAY_INDEX\n );\n};\n\nconst isArguments = (obj) => {\n return Object.prototype.toString.call(obj) === '[object Arguments]';\n};\n\n/**\n * @param {*} obj\n * @returns {boolean}\n */\nexport function isEmpty(obj) {\n if (obj == null) return true;\n if (\n isArrayLike(obj) &&\n (Array.isArray(obj) || typeof obj === 'string' || isArguments(obj))\n )\n return obj.length === 0;\n return Object.keys(obj).length === 0;\n}\n\n/**\n * @param {string} prefix\n * @returns {string}\n */\nexport function uniqueId(prefix) {\n var id = `${++idCounter}`;\n return prefix ? prefix + id : id;\n}\n\nexport const size = function (obj) {\n if (obj == null) {\n return 0;\n }\n return obj.length === +obj.length ? obj.length : Object.keys(obj).length;\n};\n\nexport default _;\n","/* eslint-disable no-param-reassign, no-mixed-operators, no-multi-assign */\nimport _, { uniqueId, isEmpty, size } from './underscore';\n\n// Backbone.Events\n// ---------------\n\n// A module that can be mixed in to *any object* in order to provide it with\n// a custom event channel. You may bind a callback to an event with `on` or\n// remove with `off`; `trigger`-ing an event fires all callbacks in\n// succession.\n//\n// var object = {};\n// Object.assign(object, Backbone.Events);\n// object.on('expand', function(){ alert('expanded'); });\n// object.trigger('expand');\n//\nconst Events = {};\n\n// Regular expression used to split event strings.\nconst eventSplitter = /\\s+/;\n\n// Iterates over the standard `event, callback` (as well as the fancy multiple\n// space-separated events `\"change blur\", callback` and jQuery-style event\n// maps `{event: callback}`).\nconst eventsApi = function (iteratee, events, name, callback, opts) {\n var i = 0,\n names;\n if (name && typeof name === 'object') {\n // Handle event maps.\n if (\n callback !== undefined &&\n 'context' in opts &&\n opts.context === undefined\n )\n opts.context = callback;\n for (names = Object.keys(name || {}); i < names.length; i++) {\n events = eventsApi(\n iteratee,\n events,\n names[i],\n name[names[i]],\n opts,\n );\n }\n } else if (name && eventSplitter.test(name)) {\n // Handle space separated event names by delegating them individually.\n for (names = name.split(eventSplitter); i < names.length; i++) {\n events = iteratee(events, names[i], callback, opts);\n }\n } else {\n // Finally, standard events.\n events = iteratee(events, name, callback, opts);\n }\n return events;\n};\n\n// The reducing API that adds a callback to the `events` object.\nconst onApi = function (events, name, callback, options) {\n if (callback) {\n const handlers = events[name] || (events[name] = []);\n const { context, ctx, listening } = options;\n if (listening) listening.count++;\n\n handlers.push({\n callback: callback,\n context: context,\n ctx: context || ctx,\n listening: listening,\n });\n }\n return events;\n};\n\n// Guard the `listening` argument from the public API.\nconst internalOn = function (obj, name, callback, context, listening) {\n obj._events = eventsApi(onApi, obj._events || {}, name, callback, {\n context: context,\n ctx: obj,\n listening: listening,\n });\n\n if (listening) {\n const listeners = obj._listeners || (obj._listeners = {});\n listeners[listening.id] = listening;\n }\n\n return obj;\n};\n\n// Bind an event to a `callback` function. Passing `\"all\"` will bind\n// the callback to all events fired.\nEvents.on = function (name, callback, context) {\n return internalOn(this, name, callback, context);\n};\n\n// Inversion-of-control versions of `on`. Tell *this* object to listen to\n// an event in another object... keeping track of what it's listening to\n// for easier unbinding later.\nEvents.listenTo = function (obj, name, callback) {\n if (!obj) return this;\n const id = obj._listenId || (obj._listenId = uniqueId('l'));\n const listeningTo = this._listeningTo || (this._listeningTo = {});\n let listening = listeningTo[id];\n\n // This object is not listening to any other events on `obj` yet.\n // Setup the necessary references to track the listening callbacks.\n if (!listening) {\n const thisId = this._listenId || (this._listenId = uniqueId('l'));\n listening = listeningTo[id] = {\n obj: obj,\n objId: id,\n id: thisId,\n listeningTo: listeningTo,\n count: 0,\n };\n }\n\n // Bind callbacks on obj, and keep track of them on listening.\n internalOn(obj, name, callback, this, listening);\n return this;\n};\n\n// The reducing API that removes a callback from the `events` object.\nconst offApi = function (events, name, callback, options) {\n if (!events) return;\n\n let i = 0;\n let listening;\n const { context, listeners } = options;\n\n // Delete all events listeners and \"drop\" events.\n if (!name && !callback && !context) {\n const ids = Object.keys(listeners || {});\n for (; i < ids.length; i++) {\n listening = listeners[ids[i]];\n delete listeners[listening.id];\n delete listening.listeningTo[listening.objId];\n }\n return;\n }\n const names = name ? [name] : Object.keys(events || {});\n for (; i < names.length; i++) {\n name = names[i];\n const handlers = events[name];\n\n // Bail out if there are no events stored.\n if (!handlers) break;\n\n // Replace events if there are any remaining. Otherwise, clean up.\n const remaining = [];\n for (let j = 0; j < handlers.length; j++) {\n const handler = handlers[j];\n if (\n (callback &&\n callback !== handler.callback &&\n callback !== handler.callback._callback) ||\n (context && context !== handler.context)\n ) {\n remaining.push(handler);\n } else {\n listening = handler.listening;\n if (listening && --listening.count === 0) {\n delete listeners[listening.id];\n delete listening.listeningTo[listening.objId];\n }\n }\n }\n\n // Update tail event if the list has any events. Otherwise, clean up.\n if (remaining.length) {\n events[name] = remaining;\n } else {\n delete events[name];\n }\n }\n if (size(events)) {\n // eslint-disable-next-line consistent-return\n return events;\n }\n};\n\n// Remove one or many callbacks. If `context` is null, removes all\n// callbacks with that function. If `callback` is null, removes all\n// callbacks for the event. If `name` is null, removes all bound\n// callbacks for all events.\nEvents.off = function (name, callback, context) {\n if (!this._events) return this;\n this._events = eventsApi(offApi, this._events, name, callback, {\n context: context,\n listeners: this._listeners,\n });\n return this;\n};\n\n// Tell this object to stop listening to either specific events ... or\n// to every object it's currently listening to.\nEvents.stopListening = function (obj, name, callback) {\n var listeningTo = this._listeningTo;\n if (!listeningTo) return this;\n\n const ids = obj ? [obj._listenId] : Object.keys(listeningTo || {});\n\n for (let i = 0; i < ids.length; i++) {\n const listening = listeningTo[ids[i]];\n\n // If listening doesn't exist, this object is not currently\n // listening to obj. Break out early.\n if (!listening) break;\n\n listening.obj.off(name, callback, this);\n }\n if (isEmpty(listeningTo)) this._listeningTo = undefined;\n\n return this;\n};\n\n// Reduces the event callbacks into a map of `{event: onceWrapper}`.\n// `offer` unbinds the `onceWrapper` after it has been called.\nconst onceMap = function (map, name, callback, offer) {\n if (callback) {\n const once = (map[name] = _.once(function () {\n offer(name, once);\n callback.apply(this, arguments);\n }));\n once._callback = callback;\n }\n return map;\n};\n\n// Bind an event to only be triggered a single time. After the first time\n// the callback is invoked, its listener will be removed. If multiple events\n// are passed in using the space-separated syntax, the handler will fire\n// once for each event, not once for a combination of all events.\nEvents.once = function (name, callback, context) {\n // Map the event into a `{event: once}` object.\n var events = eventsApi(onceMap, {}, name, callback, _.bind(this.off, this));\n return this.on(events, undefined, context);\n};\n\n// Inversion-of-control versions of `once`.\nEvents.listenToOnce = function (obj, name, callback) {\n // Map the event into a `{event: once}` object.\n var events = eventsApi(\n onceMap,\n {},\n name,\n callback,\n _.bind(this.stopListening, this, obj),\n );\n return this.listenTo(obj, events);\n};\n\n// A difficult-to-believe, but optimized internal dispatch function for\n// triggering events. Tries to keep the usual cases speedy (most internal\n// Backbone events have 3 arguments).\nconst triggerEvents = function (events, args) {\n let ev;\n let i = -1;\n const l = events.length;\n const [a1, a2, a3] = args;\n switch (args.length) {\n case 0:\n while (++i < l) (ev = events[i]).callback.call(ev.ctx);\n return;\n case 1:\n while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1);\n return;\n case 2:\n while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2);\n return;\n case 3:\n while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3);\n return;\n default:\n while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);\n }\n};\n\n// Handles triggering the appropriate event callbacks.\nconst triggerApi = function (objEvents, name, cb, args) {\n if (objEvents) {\n const events = objEvents[name];\n let allEvents = objEvents.all;\n if (events && allEvents) allEvents = allEvents.slice();\n if (events) triggerEvents(events, args);\n if (allEvents) triggerEvents(allEvents, [name].concat(args));\n }\n return objEvents;\n};\n\n// Trigger one or many events, firing all bound callbacks. Callbacks are\n// passed the same arguments as `trigger` is, apart from the event name\n// (unless you're listening on `\"all\"`, which will cause your callback to\n// receive the true name of the event as the first argument).\nEvents.trigger = function (name) {\n if (!this._events) return this;\n\n const length = Math.max(0, arguments.length - 1);\n const args = Array(length);\n for (let i = 0; i < length; i++) args[i] = arguments[i + 1];\n\n eventsApi(triggerApi, this._events, name, undefined, args);\n return this;\n};\n\n// Aliases for backwards compatibility.\nEvents.bind = Events.on;\nEvents.unbind = Events.off;\n\nexport default Events;\n","const { userAgent } = navigator;\n\n/**\n * @param {RegExp} regex\n * @returns {boolean}\n */\nfunction userAgentMatch(regex) {\n return userAgent.match(regex) !== null;\n}\n\n/**\n * @param {RegExp} regex\n * @returns {boolean}\n */\nfunction lazyUserAgentMatch(regex) {\n return function () {\n return userAgentMatch(regex);\n };\n}\n\nconst isIETrident = lazyUserAgentMatch(/trident\\/.+rv:\\s*11/i);\nconst isIPad = () =>\n lazyUserAgentMatch(/iPad/i)() ||\n (userAgentMatch(/Macintosh/i, userAgent) &&\n navigator.maxTouchPoints !== undefined &&\n navigator.maxTouchPoints > 1);\nconst isIPhone = lazyUserAgentMatch(/iPhone/i);\n// Check for spiders/bots\n/**\n * @returns {boolean}\n */\nfunction isBot() {\n return userAgentMatch(/bot|google|baidu|bing|msn|teoma|slurp|yandex|yeti/i);\n}\n// Check for Facebook App Version to see if it's Facebook\n\n/**\n * @returns {boolean}\n */\nfunction isEdge() {\n return userAgentMatch(/\\sEdge\\/\\d+/i);\n}\n\n/**\n * @returns {boolean}\n */\nfunction isMSIE() {\n return userAgentMatch(/msie/i);\n}\n\n/**\n * @returns {boolean|*}\n */\nfunction isIE() {\n return isEdge() || isIETrident() || isMSIE();\n}\n\n/**\n * @returns {boolean}\n */\nfunction isSafari() {\n return (\n userAgentMatch(/safari/i) &&\n !userAgentMatch(/(?:Chrome|CriOS|chromium|android)/i)\n );\n}\n\n/**\n * @returns {boolean}\n */\nfunction isFirefox() {\n return userAgentMatch(/\\sFirefox\\/\\d+/i);\n}\n\n/**\n * Matches iOS devices\n *\n * @param version\n * @returns {boolean}\n */\nfunction isIOS(version) {\n var isAppleIOS = userAgentMatch(/iP(hone|ad|od)/i),\n result = null;\n\n // check if version matches\n if (isAppleIOS && version) {\n result = /OS ([._\\d]+)/.exec(userAgent);\n\n // get version and parse it\n if (result && parseInt(result[1], 10) === version) {\n return true;\n }\n // didn't match version\n return false;\n }\n\n return isAppleIOS;\n}\n\n/**\n * @returns {boolean}\n */\nfunction isAndroid() {\n return userAgentMatch(/Android/i);\n}\n\n/**\n * @returns {boolean}\n */\nfunction isTablet() {\n let result = isIPad() || false;\n\n // android tables are when\n if (isAndroid() && userAgent.indexOf('Mobile') === -1) {\n result = true;\n }\n\n return result;\n}\n\n/**\n * @returns {boolean}\n */\nfunction isMobile() {\n return (\n userAgent.match(\n // eslint-disable-next-line max-len\n /(iPhone|iPod|Android(?=.*Mobile).*|HTC|Fennec|IEMobile|BlackBerry|SymbianOS(?=.*AppleWebKit).*|Opera Mobi|Symbian|SonyEricsson|Nokia|SAMSUNG|LG)/i,\n ) !== null\n );\n}\n\n/**\n * @returns {boolean}\n */\nfunction isDesktop() {\n return !isMobile() && !isTablet();\n}\n\n/**\n * @returns {boolean}\n */\nfunction isSamsungInternet() {\n return userAgent.indexOf('SamsungBrowser') !== -1;\n}\n\n/**\n * @returns {boolean}\n */\nfunction isHermesApp() {\n return userAgentMatch(/hermes/i);\n}\n\n/**\n * @returns {number|boolean}\n */\nfunction getChromeVersion() {\n var raw = userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\n\n return raw ? parseInt(raw[2], 10) : false;\n}\n\n/**\n * @returns {number}\n */\nfunction getPixelRatio() {\n var devicePixelRatio = window.devicePixelRatio || 1;\n\n if (devicePixelRatio > 1) {\n devicePixelRatio = 2;\n }\n\n return devicePixelRatio;\n}\n\n/**\n * Tracking is divided by device type\n *\n * @returns {'tablet'|'phone'|'desktop'}\n */\nfunction getDeviceType() {\n if (isTablet()) {\n return 'tablet';\n }\n\n if (isMobile()) {\n return 'phone';\n }\n\n return 'desktop';\n}\n\n/**\n * @returns {'always'|'muted'|'never'}\n */\nfunction canAutoplay() {\n let result = 'always';\n\n // default is muted for never ios systems\n if (this.isIOS()) {\n result = 'muted';\n }\n\n // iOS 8 and 9 can not autoplay any kind of stream\n // also Android Devices are lacking this\n if (this.isIOS(9) || this.isIOS(8) || this.isAndroid()) {\n result = 'never';\n }\n\n // chrome android can autoplay muted\n if (\n this.isAndroid() &&\n !this.isSamsungInternet() &&\n this.getChromeVersion() >= 53\n ) {\n result = 'muted';\n }\n\n return result;\n}\n\nexport default {\n isIOS,\n isIPhone,\n isIPad,\n isSafari,\n isAndroid,\n isEdge,\n isIE,\n isFirefox,\n isDesktop,\n isSamsungInternet,\n isTablet,\n isMobile,\n isHermesApp,\n isBot,\n getChromeVersion,\n getPixelRatio,\n getDeviceType,\n canAutoplay,\n};\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nfunction isMergeableObject(val) {\n var nonNullObject = val && typeof val === 'object';\n\n return (\n nonNullObject &&\n Object.prototype.toString.call(val) !== '[object RegExp]' &&\n Object.prototype.toString.call(val) !== '[object Date]'\n );\n}\n\nfunction emptyTarget(val) {\n return Array.isArray(val) ? [] : {};\n}\n\nfunction cloneIfNecessary(value, optionsArgument) {\n var clone = optionsArgument && optionsArgument.clone === true;\n return clone && isMergeableObject(value)\n ? deepmerge(emptyTarget(value), value, optionsArgument)\n : value;\n}\n\nfunction defaultArrayMerge(target, source, optionsArgument) {\n var destination = target.slice();\n source.forEach(function (e, i) {\n if (typeof destination[i] === 'undefined') {\n destination[i] = cloneIfNecessary(e, optionsArgument);\n } else if (isMergeableObject(e)) {\n destination[i] = deepmerge(target[i], e, optionsArgument);\n } else if (target.indexOf(e) === -1) {\n destination.push(cloneIfNecessary(e, optionsArgument));\n }\n });\n return destination;\n}\n\nfunction mergeObject(target, source, optionsArgument) {\n var destination = {};\n if (isMergeableObject(target)) {\n Object.keys(target).forEach(function (key) {\n destination[key] = cloneIfNecessary(target[key], optionsArgument);\n });\n }\n Object.keys(source).forEach(function (key) {\n if (!isMergeableObject(source[key]) || !target[key]) {\n destination[key] = cloneIfNecessary(source[key], optionsArgument);\n } else {\n destination[key] = deepmerge(\n target[key],\n source[key],\n optionsArgument,\n );\n }\n });\n return destination;\n}\n\nfunction deepmerge(target, source, optionsArgument) {\n var array = Array.isArray(source);\n var options = optionsArgument || { arrayMerge: defaultArrayMerge };\n var arrayMerge = options.arrayMerge || defaultArrayMerge;\n\n if (array) {\n return Array.isArray(target)\n ? arrayMerge(target, source, optionsArgument)\n : cloneIfNecessary(source, optionsArgument);\n }\n return mergeObject(target, source, optionsArgument);\n}\n\ndeepmerge.all = function deepmergeAll(array, optionsArgument) {\n if (!Array.isArray(array) || array.length < 2) {\n throw new Error(\n 'first argument should be an array with at least two elements',\n );\n }\n\n // we are sure there are at least 2 values, so it is safe to have no initial value\n return array.reduce(function (prev, next) {\n return deepmerge(prev, next, optionsArgument);\n });\n};\n\nwindow.deepmerge = deepmerge;\n\nexport default deepmerge;\n","/* eslint-disable no-param-reassign, no-multi-assign */\n\nimport Events from './backbone.events';\nimport device from './device';\nimport merge from './merge';\n\nconst jwUtils = jwplayer.utils;\nconst jwUnderscore = jwplayer._;\n// jwplayer is hard dependecy here\nconst utils = {\n Events: Events,\n extend: Object.assign,\n // merge with deep copy, similar to jQuery extend\n merge: merge,\n each: jwUnderscore.each,\n isNumber: (data) => typeof data === 'number' || data instanceof Number,\n isString: (data) => typeof data === 'string' || data instanceof String,\n isObject: (data) => {\n const type = typeof data;\n return data != null && (type === 'object' || type === 'function');\n },\n createNode: jwUtils.createElement,\n /**\n *\n * @param {HTMLElement} element\n * @param {string | string[]} classList\n * @returns {void}\n */\n addClass: (element, classList) => {\n if (Array.isArray(classList)) {\n element.classList.add(...classList);\n } else {\n element.classList.add(classList);\n }\n },\n /**\n *\n * @param {HTMLElement} element\n * @param {string | string[]} classList\n * @returns {void}\n */\n removeClass: (element, classList) => {\n if (Array.isArray(classList)) {\n element.classList.remove(...classList);\n } else {\n element.classList.remove(classList);\n }\n },\n\n /**\n * Template system borrowed from http://ejohn.org/blog/javascript-micro-templating/\n */\n template: (function () {\n var cache = {};\n\n return function tmpl(str, data) {\n // Figure out if we're getting a template, or if we need to\n // load the template - and be sure to cache the result.\n var fn = !/\\W/.test(str)\n ? (cache[str] =\n cache[str] ||\n tmpl(document.getElementById(str).innerHTML))\n : // Generate a reusable function that will serve as a template\n // generator (and which will be cached).\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n new Function(\n 'obj',\n `${\n 'var p=[],print=function(){p.push.apply(p,arguments);};' +\n // Introduce the data as local variables using with(){}\n \"with(obj){p.push('\"\n }${\n // Convert the template into pure JavaScript\n str\n .replace(/[\\r\\t\\n]/g, ' ')\n .split('<%')\n .join('\\t')\n .replace(/((^|%>)[^\\t]*)'/g, '$1\\r')\n .replace(/\\t=(.*?)%>/g, \"',$1,'\")\n .split('\\t')\n .join(\"');\")\n .split('%>')\n .join(\"p.push('\")\n .split('\\r')\n .join(\"\\\\'\")\n }');}return p.join('');`,\n );\n\n // Provide some basic currying to the user\n return data ? fn(data) : fn({});\n };\n })(),\n /* jshint ignore:end */\n\n device: device,\n\n time: {\n shareTimeToSeconds: function (time) {\n var hours, minutes, seconds, length;\n\n time = jwUnderscore.compact(time.split(/[msh]/));\n length = time.length; // last is empty\n\n seconds = parseInt(time[length - 1], 10);\n minutes = time[length - 2];\n hours = time[length - 3];\n\n return (\n seconds +\n (minutes ? parseInt(minutes, 10) * 60 : 0) +\n (hours ? parseInt(hours, 10) * 3600 : 0)\n );\n },\n },\n\n number: {\n zeroPad: function (number) {\n number = parseInt(number, 10);\n return number < 10 ? `0${number}` : number.toString();\n },\n },\n\n string: {\n // timestamp [s]\n getTimeFormatted: function (timestamp) {\n var hours = Math.floor(timestamp / 3600),\n minutes = Math.floor((timestamp % 3600) / 60),\n seconds = timestamp % 60;\n\n return `${\n (hours > 0 ? `${hours}:` : '') + utils.number.zeroPad(minutes)\n }:${utils.number.zeroPad(seconds)}`;\n },\n },\n\n /**\n * Check snap points support\n * @returns {boolean}\n */\n getScrollSnapPrefix: function () {\n var scrollSnapSupport = false;\n\n if ('webkitScrollSnapType' in document.documentElement.style) {\n scrollSnapSupport = '-webkit-';\n } else if ('msScrollSnapType' in document.documentElement.style) {\n scrollSnapSupport = '-ms-';\n } else if ('scrollSnapType' in document.documentElement.style) {\n scrollSnapSupport = '';\n }\n\n return scrollSnapSupport;\n },\n\n jsonToUrl: function (obj) {\n return Object.keys(obj)\n .map(function (key) {\n return `${encodeURIComponent(key)}=${encodeURIComponent(\n obj[key],\n )}`;\n })\n .join('&');\n },\n};\n\nexport default utils;\n","const counters = {};\n\nconst log = function (...args) {\n const counter = counters[args[0]] || 0;\n counters[args[0]] = counter + 1;\n\n args[0] = `${args[0]}: ${counter} %c\"${args[1]}\"`;\n args[1] = 'color: #ca2117;';\n\n // eslint-disable-next-line no-console\n console.log(...args);\n};\n\n/**\n * @param {string} block\n * @returns {boolean}\n */\nconst isEnabled = function (block) {\n const itemKey = `logSvpPlayer${block}`;\n\n // check global first\n if (window[itemKey] === true) {\n return true;\n }\n\n // fix Safari errors when cookies are disabled\n try {\n if (!window.localStorage) {\n return false;\n }\n\n return window.localStorage.getItem(itemKey) === 'true';\n } catch (error) {\n return false;\n }\n};\n\n/**\n * @param {string} [block='SVP']\n * @return {{log: (...[*]) => void, error: ((...[*]) => void)}}\n */\nexport default function (block = 'SVP') {\n // eslint-disable-next-line no-console\n const error = (...args) => console.error('SVP Player:', ...args);\n\n if (isEnabled(block)) {\n return {\n log(...args) {\n if (typeof args[0] === 'function') {\n args[0](log.bind(this, block));\n } else {\n args.unshift(block);\n log.apply(this, args);\n }\n },\n error,\n };\n }\n\n return {\n log() {},\n error,\n };\n}\n","const warned: Record = {};\n\nexport const warnOnce = (id: string, message: string) => {\n if (warned[id]) {\n return;\n }\n warned[id] = true;\n // eslint-disable-next-line no-console\n console.warn(message);\n};\n","/**\n * @type {Record}\n */\nlet translations = {};\n\n/**\n * @param {Record} data\n */\nconst setTranslations = (data) => {\n translations = data;\n};\n\n/**\n * @returns {Record}\n */\nconst getTranslations = () => translations;\n\n/**\n * @param {string} key\n * @param {string} [substitute]\n * @returns {string}\n */\n// eslint-disable-next-line arrow-body-style\nconst translate = (key, substitute) => {\n // typeof to check keys like \"0\"\n return (\n translations[key] ||\n (typeof substitute === 'undefined' ? key : substitute)\n );\n};\n\n/**\n * @param {Date} date\n * @returns {string|undefined}\n */\nconst getMonthName = (date) => {\n const months = translations.months || [];\n return months[date.getMonth()] || date.getMonth();\n};\n\nexport default {\n translate,\n setTranslations,\n getMonthName,\n getTranslations,\n};\n","import config from 'player/config';\nimport type { Asset } from '@schibsted-svp/svp-api-types';\n\nasync function makeFetch(\n url: string,\n): Promise {\n const response = await fetch(url);\n\n if (!response.ok) {\n return Promise.reject(response);\n }\n\n const data: Data = await response.json();\n return data;\n}\n\nexport const APPNEXUS_PROVIDER_ID = 'appnexus';\n\nexport const assetAdditionalData = [\n 'settings',\n 'chapters',\n 'cuePoints',\n 'externalId',\n 'barrels',\n 'externalCategoryId',\n 'nextAsset',\n 'sourceFiles',\n 'subtitles',\n 'metadata',\n 'access',\n 'tags',\n 'stories',\n 'playlist',\n].join('|');\n\nexport const api = ({\n vendor,\n endpoint,\n}: {\n vendor: string;\n endpoint: string;\n}): Promise => makeFetch(config.api.getUrl(vendor, endpoint));\n\nexport const relatedApi = ({\n path,\n query,\n}: {\n path: string;\n query: string;\n}): Promise => {\n const relatedApiUrl = config.api.relatedApiUrl.replace(/\\/$/, '');\n\n return makeFetch(`${relatedApiUrl}/${path}?${query}`);\n};\n","const VIDEO = new Blob(\n [\n new Uint8Array([\n 0, 0, 0, 28, 102, 116, 121, 112, 105, 115, 111, 109, 0, 0, 2, 0,\n 105, 115, 111, 109, 105, 115, 111, 50, 109, 112, 52, 49, 0, 0, 0, 8,\n 102, 114, 101, 101, 0, 0, 2, 239, 109, 100, 97, 116, 33, 16, 5, 32,\n 164, 27, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 55, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 112, 33, 16, 5, 32, 164, 27, 255, 192, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 55, 167, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 2, 194, 109, 111,\n 111, 118, 0, 0, 0, 108, 109, 118, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 3, 232, 0, 0, 0, 47, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 3, 0, 0, 1, 236, 116, 114, 97, 107, 0, 0, 0, 92, 116, 107, 104,\n 100, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,\n 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36,\n 101, 100, 116, 115, 0, 0, 0, 28, 101, 108, 115, 116, 0, 0, 0, 0, 0,\n 0, 0, 1, 0, 0, 0, 47, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 100, 109,\n 100, 105, 97, 0, 0, 0, 32, 109, 100, 104, 100, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 172, 68, 0, 0, 8, 0, 85, 196, 0, 0, 0, 0, 0,\n 45, 104, 100, 108, 114, 0, 0, 0, 0, 0, 0, 0, 0, 115, 111, 117, 110,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 111, 117, 110, 100, 72, 97,\n 110, 100, 108, 101, 114, 0, 0, 0, 1, 15, 109, 105, 110, 102, 0, 0,\n 0, 16, 115, 109, 104, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 100,\n 105, 110, 102, 0, 0, 0, 28, 100, 114, 101, 102, 0, 0, 0, 0, 0, 0, 0,\n 1, 0, 0, 0, 12, 117, 114, 108, 32, 0, 0, 0, 1, 0, 0, 0, 211, 115,\n 116, 98, 108, 0, 0, 0, 103, 115, 116, 115, 100, 0, 0, 0, 0, 0, 0, 0,\n 1, 0, 0, 0, 87, 109, 112, 52, 97, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 2, 0, 16, 0, 0, 0, 0, 172, 68, 0, 0, 0, 0, 0, 51,\n 101, 115, 100, 115, 0, 0, 0, 0, 3, 128, 128, 128, 34, 0, 2, 0, 4,\n 128, 128, 128, 20, 64, 21, 0, 0, 0, 0, 1, 244, 0, 0, 1, 243, 249, 5,\n 128, 128, 128, 2, 18, 16, 6, 128, 128, 128, 1, 2, 0, 0, 0, 24, 115,\n 116, 116, 115, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 4, 0, 0, 0,\n 0, 28, 115, 116, 115, 99, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0,\n 0, 2, 0, 0, 0, 1, 0, 0, 0, 28, 115, 116, 115, 122, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 2, 0, 0, 1, 115, 0, 0, 1, 116, 0, 0, 0, 20, 115, 116,\n 99, 111, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 44, 0, 0, 0, 98, 117, 100,\n 116, 97, 0, 0, 0, 90, 109, 101, 116, 97, 0, 0, 0, 0, 0, 0, 0, 33,\n 104, 100, 108, 114, 0, 0, 0, 0, 0, 0, 0, 0, 109, 100, 105, 114, 97,\n 112, 112, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 105, 108,\n 115, 116, 0, 0, 0, 37, 169, 116, 111, 111, 0, 0, 0, 29, 100, 97,\n 116, 97, 0, 0, 0, 1, 0, 0, 0, 0, 76, 97, 118, 102, 53, 54, 46, 52,\n 48, 46, 49, 48, 49,\n ]),\n ],\n { type: 'video/mp4' },\n);\n\n/**\n * @returns {SvpAsset}\n */\nconst getMockAsset = () => ({\n id: 1,\n status: 'active',\n streamType: 'mock',\n streamUrls: {\n hls: window.URL.createObjectURL(VIDEO),\n },\n\n images: {\n main: null,\n },\n\n streamConfiguration: {\n properties: [],\n },\n category: {},\n});\n\nexport { getMockAsset };\n","import type { Asset } from '@schibsted-svp/svp-api-types';\nimport { assetAdditionalData, api } from '../api';\n\nexport { getMockAsset } from './asset/mock';\n\nconst getAssetEndpoint = (id: number): string =>\n `/assets/${id}?additional=${assetAdditionalData}`;\n\nexport const getById = async ({\n vendor,\n assetId,\n}: {\n vendor: string;\n assetId: number;\n}): Promise =>\n api({\n vendor,\n endpoint: getAssetEndpoint(assetId),\n });\n","import Events from './backbone.events';\n\nconst SimpleModel = {\n /**\n * @param {string} attr\n */\n get(attr) {\n this.attributes = this.attributes || {};\n return this.attributes[attr];\n },\n /**\n * @param {string} attr\n * @param {*} val\n */\n set(attr, val) {\n this.attributes = this.attributes || {};\n\n if (this.attributes[attr] === val) {\n return;\n }\n const oldVal = this.attributes[attr];\n this.attributes[attr] = val;\n this.trigger(`change:${attr}`, this, val, oldVal);\n },\n clone() {\n return { ...this.attributes };\n },\n ...Events,\n};\n\nexport default SimpleModel;\n","export const cloneDeep = (value: T): T => {\n if ('structuredClone' in window) {\n return structuredClone(value);\n }\n\n return JSON.parse(JSON.stringify(value));\n};\n","/* eslint-disable no-param-reassign */\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\n\n/**\n * @param {SvpCategory} data\n */\nconst Category = function (options) {\n this.attributes = {\n id: 0,\n };\n\n this.initialize(options);\n};\n\nCategory.prototype = {\n /**\n * @param {SvpCategory} data\n */\n initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n /**\n * @param {SvpCategory} data\n * @returns {ParsedCategory}\n */\n parse(data) {\n if (data.additional) {\n utils.each(data.additional, (value, key) => {\n if (typeof data[key] === 'undefined') {\n data[key] = value;\n }\n });\n\n data.images = utils.extend({}, data.images || {}, {\n background: data.background,\n main: data.image,\n logo: data.logo,\n playerLogo: data.playerLogoImage,\n });\n\n delete data.additional;\n delete data.background;\n delete data.image;\n delete data.logo;\n delete data.playerLogoImage;\n }\n\n return data;\n },\n\n /**\n * @returns {number}\n */\n getId() {\n return this.get('id');\n },\n\n /**\n * @returns {string}\n */\n getTitle() {\n return this.get('title');\n },\n};\n\nutils.extend(Category.prototype, Model);\n\nexport default Category;\n","/* eslint-disable no-param-reassign */\nimport { getById } from 'player/services/api/asset';\nimport utils from 'utils/utils';\nimport Model from 'utils/model';\nimport { cloneDeep } from 'utils/clone-deep';\nimport Category from './category';\n\n/**\n * @typedef AssetChapter\n * @property {string|null} description\n * @property {boolean} featured\n * @property {number} timeline\n * @property {string} title\n */\n\nfunction unifyTimestamp(time) {\n if (!time) {\n return null;\n }\n\n if (time.toString().length === 10) {\n return time * 1000;\n }\n\n return time;\n}\n\nconst Asset = function (options) {\n this.attributes = {\n id: 0,\n };\n\n this.initialize(options);\n};\n\nAsset.prototype = {\n /**\n * @param {SvpAsset} data\n */\n initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n /**\n * @returns {import('@schibsted-svp/svp-api-types').Asset|undefined}\n */\n getRawAsset() {\n return this.rawAsset;\n },\n\n /**\n * @param {SvpAsset} data\n * @returns {ParsedAsset}\n */\n parse(data) {\n this.rawAsset = cloneDeep(data || {});\n const result = cloneDeep(data || {});\n\n // rewrite additional fields\n if (result.additional) {\n utils.each(result.additional, (value, key) => {\n // featured chapters are fetched on the lists\n // merge them\n if (key === 'featuredChapters') {\n key = 'chapters';\n }\n\n if (key === 'subtitles') {\n key = 'captions';\n }\n\n if (typeof result[key] === 'undefined') {\n result[key] = value;\n }\n });\n\n if (result.additional.settings) {\n if (result.additional.settings.ageLimit !== undefined) {\n result.ageLimit = result.additional.settings.ageLimit;\n }\n }\n }\n\n // multiply timestamps by 1000 to use ms instead of s\n if (result.flightTimes) {\n result.flightTimes = {\n start: result.flightTimes.start\n ? unifyTimestamp(result.flightTimes.start)\n : null,\n end: result.flightTimes.end\n ? unifyTimestamp(result.flightTimes.end)\n : null,\n };\n }\n\n if (result.category && !(result.category instanceof Category)) {\n result.category = new Category(result.category);\n }\n\n if (result.chapters) {\n utils.each(result.chapters, (chapter, index) => {\n chapter.time = utils.string.getTimeFormatted(chapter.timeline);\n chapter.index = index + 1;\n });\n }\n\n // next asset is optional, fill with basic object to avoid undefined errors\n if (!result.nextAsset) {\n result.nextAsset = {};\n }\n\n result.tags = result.tags || [];\n\n if (result._embedded && result._embedded.tags) {\n result.tags = result._embedded.tags;\n }\n\n result.playlist = [];\n\n if (result._embedded && result._embedded.playlist) {\n result.playlist = result._embedded.playlist;\n }\n\n return result;\n },\n\n /**\n * @returns {Promise}\n */\n async fetch() {\n const asset = await getById({\n vendor: this.getVendor(),\n assetId: this.getId(),\n });\n Object.assign(this.attributes, this.parse(asset));\n },\n\n /**\n * @returns {string}\n */\n getVendor() {\n return this.get('vendor');\n },\n\n /**\n * @returns {number}\n */\n getId() {\n return this.get('id');\n },\n\n /**\n * @returns {'live'|'wasLive'|'vod']}\n */\n getStreamType() {\n return this.get('streamType');\n },\n\n /**\n * @returns {number|undefined}\n */\n getNextAssetId() {\n return this.get('nextAsset').id;\n },\n\n destroy() {\n // in case of any cleanup\n },\n\n /**\n * @returns {number}\n */\n getAgeLimit() {\n return utils.isNumber(this.get('ageLimit')) ? this.get('ageLimit') : -1;\n },\n\n /**\n * @returns {boolean}\n */\n isSponsored() {\n const metadata = this.get('metadata');\n\n let isSponsored = false;\n\n /**\n * SVP API metadata values are always strings. There can be different structures serialized to string though.\n */\n if (metadata && metadata.sponsored) {\n try {\n isSponsored =\n JSON.parse(metadata.sponsored.toLowerCase()) === true;\n } catch (e) {\n // All the cases that fail to be json decoded are treated as false\n }\n }\n\n return isSponsored;\n },\n\n /**\n * Get chapter by its index (numbered from 1)\n *\n * @param chapterIndex\n * @returns {*} or undefined if not found\n */\n getChapter(chapterIndex) {\n return this.getChapters()[chapterIndex - 1];\n },\n\n /**\n * Get chapters for single stream\n *\n * @returns {AssetChapter[]}\n */\n getChapters() {\n return this.get('chapters') || [];\n },\n\n /**\n * @returns {string}\n */\n getThumbnail() {\n return this.get('images').main;\n },\n\n /**\n * @returns {string}\n */\n getTitle() {\n return this.get('title');\n },\n\n /**\n * @returns {Category}\n */\n getCategory() {\n return this.get('category');\n },\n\n /**\n * @returns {boolean}\n */\n isAudio() {\n return this.get('assetType') === 'audio';\n },\n};\n\nutils.extend(Asset.prototype, Model);\n\nexport default Asset;\n","/**\n * @type {number}\n */\n/**\n * @type {*}\n */\nvar config;\n\n/**\n * @param {number} pixelRatio\n * @returns {number}\n */\nfunction getImageQuality(pixelRatio) {\n return pixelRatio >= 2 ? 50 : 80;\n}\n\n/**\n * @param {number} size\n * @param {number} pixelRatio\n * @returns [number, number]\n */\nfunction normalizeTransformSize(size, pixelRatio) {\n // return default value\n return [size, getImageQuality(pixelRatio)];\n}\n\n/**\n * @param {number[]} transformSizes\n * @param {number} maxDimension\n * @returns {number|undefined}\n */\nfunction getClosestSize(transformSizes, maxDimension) {\n return transformSizes.reduce(function (prev, curr) {\n return Math.abs(curr - maxDimension) < Math.abs(prev - maxDimension)\n ? curr\n : prev;\n });\n}\n\n/**\n * @returns {number}\n */\nfunction getPixelRatio() {\n // we do not support px lower than 1 and bigger than 2\n return Math.max(1, Math.min(2, config.getPixelRatio()));\n}\n\n/**\n * Returns transformation for given image key and width\n * Adjusts the best\n */\nconst getImageTransform = (function () {\n /**\n * @type {Record}\n */\n var cache = {};\n\n /**\n * @param {string} key\n * @param {number} width\n * @param {number} height\n * @returns {string}\n */\n function imageTransform(key, width, height) {\n const pixelRatio = getPixelRatio();\n const cacheKey = key + width + height + pixelRatio;\n\n // first check if there is cached object\n if (cache[cacheKey]) {\n return cache[cacheKey];\n }\n\n const id = key.split('.');\n let transformSizes = config.sizes;\n\n let i = 0;\n while (i < id.length) {\n transformSizes = transformSizes[id[i]];\n\n if (!transformSizes) {\n throw new Error(`Image transformation missing for key ${key}`);\n }\n\n i++;\n }\n\n const transformType = height > width ? 'autoWidth' : 'autoHeight';\n transformSizes = transformSizes[transformType];\n\n // transformation is adjusted to not 'auto' side\n let maxDimension = transformType === 'autoHeight' ? width : height;\n maxDimension *= pixelRatio;\n\n const dimensions = normalizeTransformSize(\n getClosestSize(transformSizes, maxDimension),\n pixelRatio,\n );\n\n // auto width transform starts with 'x'\n // http://svp.vg.no/svp/api/v1/docs/\n let transform = transformType === 'autoWidth' ? 'x' : '';\n transform = `${transform}${dimensions[0]}q${dimensions[1]}`;\n\n cache[cacheKey] = transform;\n\n return transform;\n }\n\n return imageTransform;\n})();\n\nconst image = {\n /**\n * @param {*} options\n */\n initialize: function (options) {\n config = options;\n },\n /**\n * @param {string} imageId\n * @param {string} key\n * @param {number} width\n * @param {number} height\n * @returns {string|null}\n */\n getImageSrc: function (imageId, key, width, height) {\n if (imageId) {\n const extension =\n imageId.indexOf('.jpg') === -1 && imageId.indexOf('.png') === -1\n ? '.jpg'\n : '';\n return `${imageId + extension}?t[]=${getImageTransform(\n key,\n width,\n height,\n )}`;\n }\n return null;\n },\n};\n\nexport default image;\n","/* eslint-disable no-restricted-syntax, guard-for-in */\n\n/**\n * @param {Object} obj\n * @return {string}\n */\nconst objectToString = (obj) => {\n // create an array that will later be joined into a string.\n const string = [];\n\n // is object\n // Both arrays and objects seem to return \"object\"\n // when typeof(obj) is applied to them. So instead\n // I am checking to see if they have the property\n // join, which normal objects don't have but\n // arrays do.\n if (obj === undefined) {\n return String(obj);\n }\n if (typeof obj === 'object' && obj !== null && obj.join === undefined) {\n for (const prop in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n string.push(`${prop}: ${objectToString(obj[prop])}`);\n }\n }\n\n return `{${string.join(',')}}`;\n\n // is array\n }\n if (typeof obj === 'object' && obj !== null && !(obj.join === undefined)) {\n for (const prop in obj) {\n string.push(objectToString(obj[prop]));\n }\n return `[${string.join(',')}]`;\n\n // is function\n }\n if (typeof obj === 'function') {\n string.push(obj.toString());\n\n // all other values can be done with JSON.stringify\n } else {\n string.push(JSON.stringify(obj));\n }\n\n return string.join(',');\n};\n\n/**\n * @param {string} string\n * @return {string}\n */\nconst capitalizeFirstLetter = (string) => {\n try {\n return string.charAt(0).toUpperCase() + string.slice(1);\n } catch (e) {\n // return what was sent\n return string;\n }\n};\n\nexport { objectToString, capitalizeFirstLetter };\n","import config from 'player/config';\nimport utils from 'utils/utils';\n\n/**\n * @param {string} origin\n * @param {string[]} domains\n * @returns {boolean}\n */\nfunction isDomainInArray(origin, domains) {\n let domain;\n let pos;\n let domainBeginning;\n\n // check if domain has access for given provider\n // otherwise deny it\n // allow all dev builds set settings\n if (config.version === 'dev') {\n return true;\n }\n\n // list is not provided\n if (!Array.isArray(domains)) {\n return false;\n }\n\n const len = domains.length;\n\n for (let i = 0; i < len; i += 1) {\n domain = domains[i];\n\n // subdomain parsing, subdomain has to end with domain\n if (domain[0] === '*') {\n // remove asterisk\n domain = domain.slice(1);\n pos = origin.indexOf(domain);\n\n domainBeginning = origin[origin.length - domain.length - 1];\n\n // check if origin has exactly the same ending of domain\n if (\n pos > -1 &&\n origin.length - pos === domain.length &&\n (domainBeginning === undefined || domainBeginning === '.')\n ) {\n return true;\n }\n\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (domain.indexOf(origin) > -1) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Inherit data from parent array to child\n * Prevents undefined to persist if one of given array is empty\n *\n * @param {string[]} parent\n * @param {string[]} child\n * @returns {string[]}\n */\nfunction inherit(parent, child) {\n return (parent || []).concat(child || []);\n}\n\nconst Domain = {\n /**\n * @type {string|null}\n */\n domain: null,\n\n // default settings configuration\n settings: {\n // boolean Preview of not published videos\n preview: false,\n // completely turn off all ads\n na: false,\n },\n\n /**\n * @type {Record>}\n */\n vendors: {},\n\n /**\n * @param {string} domain\n */\n initialize(domain) {\n this.domain = domain;\n },\n\n /**\n * Fetch permissions for extended settings\n *\n * @param {string} vendor\n * @returns {Promise<*>}\n */\n fetch(vendor) {\n if (!this.vendors[vendor]) {\n this.vendors[vendor] = Promise.resolve(config.domains);\n }\n\n return this.vendors[vendor];\n },\n\n /**\n * Check whatever custom settings may be used on current domain or not\n *\n * @param vendor - api key vendor\n * @returns {Promise>}\n */\n getPermissions(vendor) {\n return this.fetch(vendor).then((data) => {\n const result = {};\n\n utils.each(data, (item, key) => {\n result[key] = isDomainInArray(\n this.domain,\n inherit(item.global, item[vendor]),\n );\n });\n\n return result;\n });\n },\n\n /**\n * Check if current domain is blacklisted\n *\n * @param {string} vendor - api vendor key\n * @returns {boolean}\n */\n isBlacklisted(vendor) {\n const { blacklist } = config.domains;\n\n // check if domain has access for given provider\n // otherwise deny it\n // allow all dev builds set settings\n if (config.version === 'dev') {\n return false;\n }\n\n return isDomainInArray(\n this.domain,\n inherit(blacklist.global, blacklist[vendor]),\n );\n },\n};\n\nexport default Domain;\n","import config from 'player/config';\n\nimport { TOKEN_FETCH_ERROR } from '../playback/config/status-codes';\n\n/**\n * @param {{expiry: number, value: string, vendor: string}} params\n * @returns {Promise}\n */\nconst fetchToken = async function (params) {\n this.isFetching = true;\n\n const response = await fetch(this.url(params));\n\n this.isFetching = false;\n\n if (!response.ok) {\n return Promise.reject(TOKEN_FETCH_ERROR);\n }\n\n this.value = await response.text();\n this.expire = Date.now() + 1000;\n return this.value;\n};\n\nclass Token {\n /**\n * @param {number} assetId\n * @param {string} [assetAccess]\n * @param {number} [maxBitrate]\n */\n constructor(assetId, assetAccess, maxBitrate) {\n /**\n * Id of SVP related asset\n *\n * @type {number}\n */\n this.assetId = assetId;\n\n /**\n * An access level key string\n * See https://svp.vg.no/svp/api/v1/vgtv/assets/access-definitions?appName=docs for available levels\n *\n * @type {string}\n */\n this.assetAccess = assetAccess;\n\n /**\n * Akamai token value retrieved from SVP api\n * @type {string|null}\n */\n this.value = null;\n /**\n * Expiration time, timestamp\n * @type {number|null}\n */\n this.expire = null;\n\n /**\n * Maximum allowed bitrate for stream\n * @type {number|null}\n */\n this.maxBitrate = maxBitrate || null;\n\n /**\n * @type {Promise|null}\n */\n this.request = null;\n this.isFetching = false;\n }\n\n /**\n * @param {((assetId: number, assetAccess: string) => Promise<{expiry: number, value: string} | {} | null>)} [configuration]\n * @param {boolean} hasAccess\n * @param {string} vendor\n * @returns {Promise|null}\n */\n async fetch(configuration, hasAccess, vendor) {\n if (!this.isValid()) {\n if (this.request && this.isFetching) {\n return this.request;\n }\n\n if (typeof configuration === 'function') {\n const { value, expiry } = await configuration(\n this.assetId,\n this.assetAccess,\n );\n if (value && expiry) {\n this.request = fetchToken.call(this, {\n expiry,\n value,\n vendor,\n });\n return this.request;\n }\n }\n if (!hasAccess) {\n this.request = fetchToken.call(this, { vendor });\n return this.request;\n }\n this.request = Promise.resolve(null);\n }\n\n return this.request;\n }\n\n /**\n * @param {{expiry: number, value: string, vendor: string}} params\n *\n * @returns {string}\n */\n url(params) {\n const query = [`vendor=${params.vendor}`];\n\n if (params && params.expiry && params.value) {\n query.push(`assetId=${this.assetId}`);\n query.push(`expires=${params.expiry}`);\n query.push(`hmac=${params.value}`);\n } else {\n query.push('acl=/*');\n }\n\n if (this.maxBitrate) {\n query.push(`maxBitrate=${this.maxBitrate}`);\n }\n\n return `${config.api.tokenUrl}?${query.join('&')}`;\n }\n\n /**\n * @returns {string|null}\n */\n getValue() {\n return this.value;\n }\n\n /**\n * @returns {boolean}\n */\n isValid() {\n // on load expire is null therefore it will always return false\n return Date.now() < this.expire;\n }\n}\n\nexport default Token;\n","import utils from 'utils/utils';\nimport Model from 'utils/model';\nimport device from 'utils/device';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\n\n/**\n * @param {SvpAsset} options\n * @constructor\n */\nconst Stream = function (options) {\n this.attributes = {\n id: 0,\n };\n\n this.initialize(options);\n};\n\nStream.prototype = {\n /**\n * @param {SvpAsset} data\n */\n initialize(data) {\n utils.extend(this.attributes, this.parse(data));\n },\n\n /**\n * Parse data from asset\n * Be aware, data went through Asset.parse method\n *\n * @param {SvpAsset} data\n * @returns {ParsedStream}\n */\n parse(data) {\n const result = {\n id: data.id,\n vendor: data.vendor,\n title: data.title,\n\n streams: {\n hls: data.streamUrls.hls,\n mp4: data.streamUrls.mp4 ? [data.streamUrls.mp4] : [],\n },\n status: data.status,\n type: data.streamType,\n mediaType: data.assetType,\n streamConfiguration: data.streamConfiguration,\n\n images: {\n main: data.images.main,\n snapshots: data.images.snapshots || null,\n },\n\n captions: data.captions || [],\n\n flightTimes: {\n start: null,\n end: null,\n },\n\n playback: {\n begin: null,\n end: null,\n },\n\n externalId: data.externalId || null,\n category: data.category,\n };\n\n if (data.duration) {\n result.duration = data.duration / 1000;\n }\n\n if (data.additional && data.additional.metadata) {\n result.disableNextVideo = data.additional.metadata.disableNextVideo;\n result.chunkDuration = Number(\n data.additional.metadata.chunkDuration,\n );\n result.isPodcast = data.additional.metadata.isPodcast === 'true';\n result.hasSubtitlesInHls =\n data.additional.metadata.hasSubtitlesInHls;\n result.tts = Boolean(data.additional.metadata.tts_articleId);\n\n result.videoPreviews = Object.entries(\n data.additional.metadata,\n ).reduce((videoPreviews, [metadataKey, metadataValue]) => {\n if (!metadataKey.includes('preview')) {\n return videoPreviews;\n }\n return {\n ...videoPreviews,\n [metadataKey]: metadataValue,\n };\n }, {});\n }\n\n // override start and end if set in api\n if (data.flightTimes) {\n result.flightTimes = {\n start: data.flightTimes.start ? data.flightTimes.start : null,\n end: data.flightTimes.end ? data.flightTimes.end : null,\n };\n }\n\n if (data.playback) {\n result.playback = {\n begin: data.playback.begin,\n end: data.playback.end,\n };\n }\n\n // additional stream settings\n if (data.settings) {\n result.showAds = data.settings.showAds;\n }\n\n // cue points, empty array if nothing set\n result.cuePoints = data.cuePoints;\n\n // playlist, empty array if nothing set\n result.playlist = data.playlist || [];\n\n // add midroll in 10s TODO remove after tests\n // result.cuePoints = [31];\n return result;\n },\n\n /**\n * @returns {number}\n */\n getId() {\n return this.get('id');\n },\n\n /**\n * @returns {string}\n */\n getVendor() {\n return this.get('vendor');\n },\n\n /**\n * @returns {Category}\n */\n getCategory() {\n return this.get('category');\n },\n\n /**\n * @param {string} property\n * @return {boolean}\n */\n hasProperty(property) {\n return (\n this.get('streamConfiguration').properties.indexOf(property) > -1\n );\n },\n\n /**\n * @returns {boolean}\n */\n hasSubtitlesInHls() {\n return this.get('hasSubtitlesInHls') === 'true';\n },\n\n /**\n * Get duration stored in API\n *\n * @returns {number}\n */\n getDuration() {\n return this.get('duration');\n },\n\n /**\n * @returns {number[]}\n */\n getCuePoints() {\n return this.get('cuePoints');\n },\n\n /**\n * Check if stream has Akamai Secure Token\n * @returns {boolean}\n */\n isSecure() {\n return this.hasProperty('tokenSecured');\n },\n\n /**\n * Check if stream is behind paywall\n * @returns {boolean}\n */\n hasAccess() {\n return !!this.get('access');\n },\n\n /**\n * Check wheter give stream contains mock data to allow embedding player without asset id\n * @returns {boolean}\n */\n isMock() {\n return this.get('type') === 'mock';\n },\n\n /**\n * Check if stream is available only in certain areas\n * @returns {boolean}\n */\n isGeoblocked() {\n return this.hasProperty('geoblocked');\n },\n\n /**\n * @returns {boolean}\n */\n isLive() {\n return this.get('type') === 'live';\n },\n\n /**\n * @returns {boolean}\n */\n wasLive() {\n return this.get('type') === 'wasLive';\n },\n\n /**\n * @returns {boolean}\n */\n isActive() {\n return this.get('status') === 'active' && !this.isPast();\n },\n\n /**\n * @returns {boolean}\n */\n isFuture() {\n return this.get('flightTimes') && this.get('flightTimes').start\n ? this.get('flightTimes').start > ServerTime.getTime()\n : false;\n },\n\n /**\n * @returns {boolean}\n */\n isPast() {\n return this.get('flightTimes') && this.get('flightTimes').end\n ? this.get('flightTimes').end < ServerTime.getTime()\n : false;\n },\n\n /**\n * @returns {boolean}\n */\n hasPlaylist() {\n return this.get('playlist').length > 0;\n },\n\n /**\n * @returns {boolean}\n */\n isDisabledNextVideo() {\n return !!this.get('disableNextVideo');\n },\n /**\n * Streams might not be available while asset is created\n *\n * @returns {boolean}\n */\n hasPlayableSource() {\n if (this.getTimeToStart() > 0 || !this.isActive()) {\n return false;\n }\n\n return true;\n },\n\n getUrl(streamType) {\n const isOnHttp = window.location.protocol\n .toLowerCase()\n .startsWith('http:');\n const type = streamType.toLowerCase();\n\n let streamUrl = this.get('streams')[type];\n\n if (utils.device.isIE() && isOnHttp) {\n streamUrl = streamUrl.replace('https', 'http');\n }\n\n return streamUrl;\n },\n\n /**\n * @returns {string}\n */\n getPoster() {\n return this.get('images').main;\n },\n\n getAllPreviewsUrls() {\n return this.get('videoPreviews') || {};\n },\n\n /**\n * Returns preview video URL\n * @param {string} metadataKey\n * @returns {string|undefined}\n */\n getVideoPreviewUrl(metadataKey) {\n const videoPreviews = this.get('videoPreviews');\n return videoPreviews ? videoPreviews[metadataKey] : undefined;\n },\n\n /**\n * Get chunk duration of live video\n *\n * @returns {number}\n */\n getChunkDuration() {\n return this.get('chunkDuration');\n },\n\n /**\n * Get snapshots url\n * @returns {string|null} - url string or null if snapshots not found\n */\n getSnapshots() {\n return `${\n config.api.thumbnailsUrl + this.getVendor()\n }/assets/${this.getId()}`;\n },\n\n /**\n * Not every asset has snapshot (lives, wasLives)\n *\n * @returns {boolean}\n */\n hasSnapshots() {\n return this.get('images').snapshots !== null;\n },\n\n /**\n * Get captions associated with stream\n *\n * @returns {boolean}\n */\n getCaptions() {\n return this.get('captions') || [];\n },\n\n /**\n * Check if mp4 streams are available\n *\n * @returns {boolean}\n */\n hasMp4Streams() {\n return this.get('streams').mp4.length > 0;\n },\n\n /**\n * Check if asset is published\n * Method relay on server time to avoid timezone differences\n *\n * @returns {number} seconds to live\n */\n getTimeToStart() {\n return (this.get('flightTimes').start - ServerTime.getTime()) / 1000;\n },\n\n /**\n * Asset can be virually sliced into small chunks\n * These are only indicators and do not slice stream\n *\n * @param position\n *\n * @returns {number|null}\n */\n getPlaybackTime(position) {\n const playback = this.get('playback');\n\n if (position === 'begin') {\n if (this.get('playAhead') > 0) {\n return this.get('playAhead');\n }\n\n return playback.begin > 0 ? playback.begin : null;\n }\n\n if (position === 'end' && playback.end > 0) {\n return playback.end;\n }\n\n return null;\n },\n\n /**\n * External id\n * Used for JW Player statistics\n *\n * @returns {string|undefined}\n */\n getExternalId() {\n return this.get('externalId');\n },\n\n /**\n * Check wethever stream has ads disabled\n *\n * @returns {boolean}\n */\n hasAdsDisabled() {\n return this.get('showAds') === false;\n },\n\n /**\n * @returns {boolean}\n */\n isAudio() {\n return this.get('mediaType') === 'audio';\n },\n\n /**\n * @returns {boolean}\n */\n hasTextSpeech() {\n return this.get('tts');\n },\n\n /**\n * Check if stream is podcast\n * @returns {boolean}\n */\n isPodcast() {\n return this.get('isPodcast') === true;\n },\n\n /**\n * Get VMAP API URL for ads schedule\n * @param {Record} [params]\n * @returns {string}\n */\n getVmapApiUrl(params = {}) {\n let supplyType = 'web_desktop';\n\n if (device.isMobile()) {\n supplyType = 'web_phone';\n } else if (device.isTablet()) {\n supplyType = 'web_tablet';\n }\n\n const queryParams = new URLSearchParams({\n gdpr: '__gdpr__',\n gdpr_consent: '__gdpr_consent__',\n ...params,\n supplyType,\n }).toString();\n\n return `${\n config.api.vmapUrl\n }/${this.getVendor()}/${this.getId()}?${queryParams}`;\n },\n};\n\nutils.extend(Stream.prototype, Model);\n\nexport default Stream;\n","import { scriptLoader } from 'utils/script-loader';\nimport utils from 'utils/utils';\n\nfunction getRandomId() {\n return Math.floor(Math.random() * 100) + 1;\n}\n\nfunction getJwAdsConfig(jwAdScheduleSlots, stream, settings) {\n const adSlots = jwAdScheduleSlots || {};\n\n const { hasNext } = settings || {};\n const startTime = stream.getPlaybackTime('begin') || 0;\n\n const adsConfig = {};\n\n if (adSlots.preroll) {\n adsConfig[`preroll${getRandomId()}-prebid`] = {\n offset: 'pre',\n extra: 1,\n tag: adSlots.preroll.tag,\n };\n }\n\n utils.each(stream.getCuePoints(), function (cuePoint) {\n if (cuePoint?.timeline > startTime) {\n if (adSlots.midroll) {\n adsConfig[`midroll${getRandomId()}-prebid`] = {\n offset: cuePoint.timeline,\n tag: adSlots.midroll.tag,\n };\n }\n }\n });\n\n if (\n hasNext === false ||\n (hasNext !== true && stream.get('hasNext') === false)\n ) {\n if (adSlots.postroll) {\n adsConfig[`postroll${getRandomId()}-prebid`] = {\n offset: 'post',\n tag: adSlots.postroll.tag,\n };\n }\n }\n\n return adsConfig;\n}\n\nfunction getScheduleSlots(adSlots, adtTagUrls) {\n return Object.keys(adSlots).reduce((prev, current, index) => {\n prev[current] = {\n offset: current,\n tag: adtTagUrls[index],\n };\n return prev;\n }, {});\n}\n\nconst CACHE_URL = 'https://pbs.relevant-digital.com/analytics_cache/cache';\n\nasync function loadAdTagUrls(config) {\n return new Promise((resolve, reject) => {\n if (!window.relevantDigital)\n reject(new Error('Cannot find relevantDigital on global object'));\n\n window.relevantDigital.cmd.push(() => {\n const prebidConfig = {\n consentManagement: config.consentManagement ?? {\n cmpApi: 'none',\n },\n cache: {\n url: CACHE_URL,\n },\n };\n\n if (config.userId) {\n prebidConfig.ortb2 = {\n user: {\n id: config.userId,\n },\n };\n }\n\n if (config.eids) {\n const eids = config.eids.map(({ source, id }) => ({\n source,\n uids: [{ id, atype: 1, ext: { stype: 'ppuid' } }],\n }));\n\n prebidConfig.userSync = {\n userIds: [{ name: 'pubProvidedId', params: { eids } }],\n };\n }\n\n window.relevantDigital.addPrebidConfig(prebidConfig);\n\n const slots = window.relevantDigital\n .defineVideoSlots(\n Object.values(config.adSlots).map((adSlot) => ({\n path: adSlot.path,\n custParams: {\n ...adSlot.params,\n ...config.params,\n },\n })),\n )\n .map((s) => s.getSlotElementId());\n\n window.relevantDigital.loadPrebid({\n configId: config.configId,\n collapseEmptyDivs: true,\n collapseBeforeAdFetch: false,\n allowedDivIds: null, // set to an array to only load certain
s, example - [\"divId1\", \"divId2\"]\n noSlotReload: true,\n allowedPlacementType: 'instream',\n onSlotAndUnit: function ({ slot, unit }) {\n const xandrKeywords = Object.fromEntries(\n Object.entries(slot.custParams || {})\n .filter(([, value]) => Boolean(value))\n .map(([key, value]) => [\n key,\n value.toString().split(','),\n ]),\n );\n const { pbAdUnit } = unit; // AdUnit in Prebid\n const xandrBids = pbAdUnit.bids.filter(\n (b) => b.bidder.indexOf('appnexus') === 0,\n );\n xandrBids.forEach(({ params }) => {\n params.keywords = Object.assign(\n params.keywords || {},\n xandrKeywords,\n );\n });\n },\n });\n\n window.relevantDigital.loadVideoUrls(slots, (urls) => {\n resolve(urls);\n });\n });\n });\n}\n\nasync function loadRelevantScript(url) {\n if (window.relevantDigital) return true;\n try {\n await scriptLoader(url);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getRelevantYieldConfig(config, stream, settings) {\n const result = await loadRelevantScript(config.scriptUrl);\n if (!result) return null;\n\n const adTagUrls = await loadAdTagUrls(config);\n const scheduleSlots = getScheduleSlots(config.adSlots, adTagUrls);\n return getJwAdsConfig(scheduleSlots, stream, settings);\n}\n\nexport const onAdEventImpression = (ev) => {\n if (!window.relevantDigital) return;\n window.relevantDigital.cmd.push(() => {\n // Loop through all ad ids starting from the innermost ad.\n // registerImpressionByAdId() will return true if it registered an impression\n const adIds = [ev.getAd().getAdId(), ...ev.getAd().getWrapperAdIds()];\n // eslint-disable-next-line no-restricted-syntax\n for (const id of adIds) {\n if (window.relevantDigital.Auction.registerImpressionByAdId(id)) {\n return;\n }\n }\n });\n};\n","import config from 'player/config';\nimport utils from 'utils/utils';\n\n/**\n * @param {string} url\n * @param {Object} params\n * @returns {string}\n */\nfunction buildUrlString(url, params) {\n const cb = Math.round(Math.random() * 100000000000);\n const queryParams = utils.jsonToUrl(utils.extend({ cb }, params));\n return `${url}?${queryParams}`;\n}\n\n/**\n * This is only for overriding/preview ads live on the page\n * @see https://github.schibsted.io/svp/web-player/issues/833\n * @param {string|number} overriddenId\n * @returns {string}\n */\nexport function getOverriddenCrTag(overriddenId) {\n const overriddenParams = { id: overriddenId, format: 'vast' };\n return buildUrlString(config.ads.appnexus.cr, overriddenParams);\n}\n\n/**\n * @param {Record} params\n * @returns {string}\n */\nexport function getPtvTag(params) {\n return buildUrlString(config.ads.appnexus.ptv, params);\n}\n\n/**\n * @param {Record} params\n * @returns {string}\n */\nexport function getVmapTag(params) {\n return buildUrlString(config.ads.appnexus.vmap, params);\n}\n\n/**\n * @param {Object} tagOptions\n * @param {Object} globalOptions\n * @returns {Object}\n */\nexport function getAstConfig(tagOptions, globalOptions) {\n return utils.extend({}, utils.merge(globalOptions, tagOptions));\n}\n\n/**\n * @param {Stream & Eventable} stream\n * @returns {Object}\n */\nexport function getDefaultParams(stream) {\n const publisherName = stream.getVendor();\n const countryCode = config.vendors.se.includes(publisherName) ? 'se' : 'no';\n const supplyType = `web_${utils.device.getDeviceType()}`;\n return {\n countryCode,\n supplyType,\n publisherName,\n slotIds: { preroll: 1, midroll: 2, postroll: 3 },\n };\n}\n","import utils from 'utils/utils';\nimport * as appnexusTag from './appnexus-tag-builder';\n\nconst OVERRIDE_SEPARATOR = ':';\nconst OVERRIDE_SLOT_PARAM = 'ast_override_slot';\nconst OVERRIDE_SLOT_TAG_ID = 'ast_override_tag_id';\n\n/**\n * @returns {Record|undefined}\n */\nexport function getOverriddenParams() {\n const urlParams = new URLSearchParams(window.location.search);\n\n if (urlParams.has(OVERRIDE_SLOT_PARAM)) {\n const [slotName, creativeId] = urlParams\n .get(OVERRIDE_SLOT_PARAM)\n .split(OVERRIDE_SEPARATOR);\n return { [slotName]: creativeId };\n }\n\n if (urlParams.has(OVERRIDE_SLOT_TAG_ID)) {\n const [tagId, creativeId] = urlParams\n .get(OVERRIDE_SLOT_TAG_ID)\n .split(OVERRIDE_SEPARATOR);\n return { [tagId]: creativeId };\n }\n\n return undefined;\n}\n\nexport default class JwAdsConfig {\n /**\n * @param {Stream & Eventable} stream\n */\n constructor(stream) {\n this.stream = stream;\n this.config = {};\n this.params = [];\n this.overriddenParams = getOverriddenParams();\n }\n\n /**\n * @param {Object} params\n */\n setParams(params) {\n this.params = params;\n }\n\n /**\n * @param {Object} adSlotConfig\n * @param {string} adLabel\n * @return {string}\n */\n getTag(adSlotConfig, adLabel) {\n const adConfig = utils.merge(this.params, adSlotConfig);\n const overriddenId =\n this.overriddenParams &&\n (this.overriddenParams[adLabel] ||\n (adConfig.id && this.overriddenParams[adConfig.id]));\n if (overriddenId) {\n return appnexusTag.getOverriddenCrTag(overriddenId);\n }\n\n if (this.stream.isAudio()) {\n return appnexusTag.getPtvTag(adConfig);\n }\n\n return appnexusTag.getVmapTag(adConfig);\n }\n\n /**\n * @param {Object} adSlotConfig\n * @param {string} offset\n * @param {string} adLabel\n */\n add(adSlotConfig, offset, adLabel) {\n // do not add tag when id is empty\n if (adSlotConfig) {\n this.config[adLabel + Math.floor(Math.random() * 100) + 1] = {\n offset: offset,\n tag: this.getTag(adSlotConfig, adLabel),\n };\n }\n }\n\n getConfig() {\n return this.config;\n }\n}\n","import { isEmpty } from 'utils/underscore';\nimport utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport { getRelevantYieldConfig } from './relevant-yield';\nimport * as appnexusTagBuilder from './appnexus-tag-builder';\nimport JwAdsConfig from './appnexus-jw-config';\n\n/**\n * @param {{adSlots, params: ({member: string}|Object)}} adConfig\n * @param {Stream&Eventable} stream\n * @param {*} settings\n * @returns {*}\n */\n// move to appnexus jw\nfunction getAdsConfig(adConfig, stream, settings) {\n const adSlots = adConfig.adSlots || {};\n const params = adConfig.params || [];\n const adsConfig = new JwAdsConfig(stream);\n const { hasNext } = settings || {};\n const startTime = stream.getPlaybackTime('begin') || 0;\n\n adsConfig.setParams(params);\n adsConfig.add(adSlots.preroll, 'pre', 'preroll');\n\n utils.each(stream.getCuePoints(), function (cuePoint) {\n if (cuePoint?.timeline > startTime) {\n adsConfig.add(adSlots.midroll, cuePoint.timeline, 'midroll');\n }\n });\n\n // postroll is disabled when playnext is available\n if (\n hasNext === false ||\n (hasNext !== true && stream.get('hasNext') === false)\n ) {\n adsConfig.add(adSlots.postroll, 'post', 'postroll');\n }\n\n return adsConfig.getConfig();\n}\n\n/**\n * @param {Params} params\n * @param {string} memberId\n * @returns {Params & { member: string }}\n * @template Params\n */\nfunction getParams(params, memberId) {\n if (memberId) {\n return { member: memberId, ...params };\n }\n\n return params;\n}\n\n/**\n * @param {*} adPlacements\n * @param {*} globalParams\n */\nfunction parseAdPlacements(adPlacements, globalParams) {\n const placements = {};\n\n utils.each(adPlacements, function (values, placementId) {\n placements[placementId] = appnexusTagBuilder.getAstConfig(\n values,\n globalParams,\n );\n });\n\n return placements;\n}\n\n/**\n * @param {*} clientConfig\n * @param {Stream} stream\n * @param {*} settings\n * @returns {*}\n */\nfunction getJwAdSchedule(clientConfig, stream, settings) {\n const { adSlots } = clientConfig;\n if (adSlots) {\n return getAdsConfig(\n {\n adSlots: adSlots.schedule,\n params: getParams(adSlots.params, clientConfig.member),\n },\n stream,\n settings,\n );\n }\n\n return {};\n}\n\n/**\n * @param {*} clientConfig\n * @returns {*}\n */\nfunction getAdPlacements(clientConfig) {\n const { adPlacements } = clientConfig;\n\n if (clientConfig.member && adPlacements) {\n return parseAdPlacements(\n adPlacements.schedule,\n getParams(adPlacements.params, clientConfig.member),\n );\n }\n\n return {};\n}\n\n/**\n * @param {Stream} stream\n * @param {*} settings\n * @returns {Promise<*>}\n */\nconst getClientConfig = async (stream, settings) => {\n // ads are disabled\n // check stream config also\n const { na, adn } = settings;\n\n if (na === true || !adn || stream.hasAdsDisabled()) {\n return null;\n }\n\n let svpAdConfig = {};\n\n if (typeof adn === 'function') {\n svpAdConfig = await adn(\n stream,\n appnexusTagBuilder.getDefaultParams(stream),\n adn.svpPlayer,\n );\n }\n\n logger('SVP').log('adsConfig', svpAdConfig);\n\n return svpAdConfig;\n};\n\n/**\n * Handle midroll scheduling in player\n *\n * @param {string} tag\n * @param {number|'NOW'} startTime\n * @returns {{onEnter: (cb: () => void) => void, setTime: (time: number) => void, onReady: (cb: () => void) => void}}\n */\nfunction createMidroll({ tag, startTime }) {\n let hasEntered = false;\n let onEnterCallback = () => {};\n\n /**\n * @param {() => void} callback\n */\n const onEnter = (callback) => {\n onEnterCallback = callback;\n };\n\n /**\n * @param {() => void} callback\n */\n const onReady = (callback) => {\n if (tag) {\n callback();\n }\n };\n\n /**\n * @param {number} time\n */\n const setTime = (time) => {\n if (\n hasEntered === false &&\n (time >= startTime || startTime === 'NOW')\n ) {\n onEnterCallback(tag);\n hasEntered = true;\n }\n };\n\n return {\n setTime,\n onEnter,\n onReady,\n };\n}\n\n/**\n * @typedef AppnexusConfig\n * @property {*} adSchedule\n * @property {*} adPlacements\n * @property {*} adOptions\n */\n\n/**\n * @param {Stream} stream\n * @param {*} settings\n * @returns {Promise}\n */\nasync function getConfig(stream, settings) {\n const clientConfig = await getClientConfig(stream, settings);\n\n if (clientConfig === null) {\n return {};\n }\n\n if (!isEmpty(clientConfig.relevantYield)) {\n return {\n adSchedule: await getRelevantYieldConfig(\n clientConfig.relevantYield,\n stream,\n settings,\n ),\n adPlacements: getAdPlacements(clientConfig),\n adOptions: clientConfig.options || {},\n };\n }\n\n return {\n adSchedule: getJwAdSchedule(clientConfig, stream, settings),\n adPlacements: getAdPlacements(clientConfig),\n adOptions: clientConfig.options || {},\n };\n}\n\n/**\n * @param {number} maxDuration\n * @param {Stream} stream\n * @param {Object} settings\n * @returns {Promise}\n */\nfunction getLiveMidrollTag(maxDuration, stream, settings) {\n return getClientConfig(stream, settings).then(function (clientConfig) {\n if (!clientConfig) {\n return undefined;\n }\n\n const { adSlots } = clientConfig;\n const midroll = adSlots && adSlots.schedule && adSlots.schedule.midroll;\n if (!midroll) {\n return undefined;\n }\n\n const params = getParams((adSlots || {}).params, clientConfig.member);\n params.vmaxduration = maxDuration;\n\n return appnexusTagBuilder.getVmapTag(utils.merge(params, midroll));\n });\n}\n\nexport default {\n getConfig,\n getLiveMidrollTag,\n createMidroll,\n};\n","import configuration from 'player/config';\nimport locale from 'player/model/locale';\n/**\n * Create sharing config based on passed options\n *\n * @param {*} options\n * @param {Stream} stream\n * @param {*} globals\n * @return {config.sharing|null}\n */\nconst getConfig = ({\n options,\n stream,\n globals = {\n sharing: configuration.sharing,\n title: locale.translate('Sharing'),\n },\n}) => {\n if (options === false) {\n return null;\n }\n\n const defaults = globals.sharing || {};\n const vendor = stream.getVendor();\n\n const sharing = { ...defaults.global };\n\n // use provider specific sharing info\n if (defaults[vendor]) {\n Object.assign(sharing, defaults[vendor]);\n }\n\n // extend sharing options when object is provided as param for it\n if (typeof options === 'object') {\n Object.assign(sharing, options);\n } else if (typeof options === 'function') {\n Object.assign(sharing, options(stream.attributes));\n }\n\n // add uri encoding to prevent sharing problems\n if (sharing.code) {\n sharing.code = encodeURIComponent(sharing.code);\n }\n\n if (!sharing.heading) {\n sharing.heading = globals.title;\n }\n\n return sharing;\n};\n\n/**\n * JW configuration adapter\n *\n * @param args\n * @return {function(config: Config): Config}\n * @template Config\n */\nconst addSharing = (...args) =>\n function (config) {\n const sharing = getConfig(...args);\n\n if (sharing === null) {\n delete config.sharing;\n } else {\n config.sharing = sharing;\n }\n\n return config;\n };\n\nexport { getConfig, addSharing };\n","export const fallbackChromecastApp = 'A753C1FE';\nexport const chromecastApps = {\n CB3CFFEE: ['ab'],\n '96E78488': ['svd'],\n C6559D78: ['ridenws'],\n E43A13ED: ['brandstudio'],\n '8AE3CE4D': ['riks'],\n '9E7A477E': ['100sport'],\n '35E82475': ['sa'],\n B6C9EA8E: ['bt'],\n E64998E3: ['ap'],\n '615D672F': ['schibsted'],\n A7738716: ['tvnu'],\n A5965089: ['vgtv', 'vgtvexternal', 'vgtvs'],\n '06A55D09': [\n 'fvn',\n 'adressa',\n 'altaposten',\n 'folkebladet',\n 'harstad',\n 'itromso',\n 'rbnett',\n 'tronderavisa',\n 'adressabrandstudio',\n 'smp',\n 'steinkjer',\n 'avisast',\n 'bladet',\n 'banett',\n 'innherred',\n 'fosnafolket',\n 'opp',\n 'tronderbladet',\n 'stjordalsnytt',\n 'mn24',\n 'hitrafroya',\n 'framtidinord',\n 'vaganavisa',\n 'vol',\n 'nyttiuka',\n 'vikebladet',\n 'fjt',\n 'vestlandsnytt',\n 'fjuken',\n 'vigga',\n 'dolen',\n 'fjordabladet',\n 'morenytt',\n 'fjordingen',\n 'driva',\n 'andalsnes',\n 'nyss',\n 'agderposten',\n 'lindesnes',\n 'farsund',\n 'varden',\n 'lp',\n 'venneslatidende',\n 'gat',\n 'bomlonytt',\n 'sunnhordland',\n ],\n};\n","/**\n * @param {HTMLElement} parent\n * @param {string | HTMLElement | Object} child\n * @returns {HTMLElement}\n */\nexport function appendChild(parent, child) {\n if (Array.isArray(child)) {\n child.forEach((c) => appendChild(parent, c));\n } else if (typeof child === 'string') {\n parent.appendChild(document.createTextNode(child));\n } else if (child instanceof HTMLElement) {\n parent.appendChild(child);\n } else {\n throw new Error('Invalid child type');\n }\n\n return parent;\n}\n\n/**\n * @param {string} tagName\n * @param {Object} attributes\n * @param {string | HTMLElement | Object | (string | HTMLElement | Object)[]} children\n * @returns {HTMLElement}\n */\nexport function createElement(tagName, attributes = {}, children = []) {\n const element = document.createElement(tagName);\n Object.keys(attributes).forEach((attribute) => {\n element.setAttribute(attribute, attributes[attribute]);\n });\n appendChild(element, children);\n\n return element;\n}\n","/**\n * @param {HTMLElement} container\n * @return {Promise}\n */\nconst waitForControls = (container) =>\n new Promise((resolve) => {\n const checkIfControlsLoaded = () => {\n const hasControlsLoaded = container.querySelector('.jw-controlbar');\n\n if (hasControlsLoaded) {\n resolve();\n } else {\n window.requestAnimationFrame(checkIfControlsLoaded);\n }\n };\n\n window.requestAnimationFrame(checkIfControlsLoaded);\n });\n\n/**\n * If jwplayer chooses to use bundle without embedded controls, it can load them asynchronously later,\n * in that case, we must ensure their presence when e.g. resolving audio skin.\n *\n * @param {HTMLElement} container\n * @return {Promise}\n */\nexport const ensureIfControlsLoaded = async (container) => {\n const controlsLoaded = Boolean(container.querySelector('.jw-controlbar'));\n\n if (controlsLoaded) {\n return;\n }\n\n await waitForControls(container);\n};\n","import configuration from 'player/config';\nimport { createElement } from 'player/plugins/anti-adblock/dom';\nimport locale from 'player/model/locale';\nimport logger from 'utils/logger';\nimport { ensureIfControlsLoaded } from './jw-controls';\n\nexport const TTS_SKIN_CLASS_NAME = 'jw-skin-svp-tts';\n\nconst JW_AUDIO_MODE_MAX_HEIGHT = '44';\n\nconst DEFAULT_TTS_PLAYBACK_RATES = [0.8, 1, 1.25, 1.5, 2, 2.5, 3];\n\n/**\n * Extends JW Player config with a particular height and no controls\n * @param {Object} jwConfig\n * @param {Stream} stream\n * @param {Config} config - playback config\n */\nexport function applyTtsOption(jwConfig, stream, config) {\n if (!config.shouldApplyTextToSpeechSkin(stream)) {\n return jwConfig;\n }\n\n // extend config with no controls and height for text to speech\n const {\n height = JW_AUDIO_MODE_MAX_HEIGHT,\n playbackRates = DEFAULT_TTS_PLAYBACK_RATES,\n playbackRateControls = true,\n } = config.getRaw();\n\n config.set('height', height);\n\n return {\n ...jwConfig,\n height,\n playbackRates,\n playbackRateControls,\n };\n}\n\n/**\n * @param {...string} names - class names without text-to-speech skin prefixes\n */\nfunction classNames(...names) {\n return names.map((name) => `svp-tts-${name}`).join(' ');\n}\n\n/**\n *\n * @param {HTMLDivElement} container\n * @param {Object} translate\n */\nfunction createControls(container, translate) {\n const durationText = createElement('span', {\n class: classNames('duration'),\n });\n const durationReplayText = createElement('span', {\n class: classNames('duration'),\n });\n\n const idleText = createElement(\n 'div',\n { class: classNames('text', 'idle-text') },\n [createElement('strong', {}, [translate.play]), ' • ', durationText],\n );\n\n const replayText = createElement(\n 'div',\n { class: classNames('text', 'replay-text') },\n [\n createElement('strong', {}, [translate.replay]),\n ' • ',\n durationReplayText,\n ],\n );\n\n [idleText, replayText].forEach((el) => {\n container.querySelector('.jw-button-container').appendChild(el);\n });\n\n return {\n durationText,\n durationReplayText,\n };\n}\n\n/**\n *\n * @param {HTMLDivElement} container\n * @param {Object} translate\n */\nfunction createAdElements(container, translate) {\n const altText = createElement(\n 'div',\n { class: 'jw-text jw-reset-text svp-tts-text-alt' },\n [translate.cuetext],\n );\n\n container\n .querySelector('.jw-button-container')\n .insertBefore(\n altText,\n container.querySelector('.jw-button-container .jw-text-elapsed'),\n );\n}\n\n/**\n * @param {number} n\n * @param {string} singular\n * @param {string} plural\n */\nfunction pluralize(n, singular, plural) {\n return n === 1 ? singular : plural;\n}\n\n/**\n * @param {number} duration\n * @param {Object} translate\n */\nfunction timeToText(duration, translate) {\n const minutes = Math.floor(duration / 60);\n if (minutes) {\n return `${minutes} ${pluralize(\n minutes,\n translate.minute,\n translate.minutes,\n )}`;\n }\n\n const seconds = Math.floor(duration - minutes * 60);\n return `${seconds} ${pluralize(\n seconds,\n translate.second,\n translate.seconds,\n )}`;\n}\n\nlet fontLoadingPromise;\n\nasync function loadFonts() {\n if (fontLoadingPromise) {\n return fontLoadingPromise;\n }\n\n const fonts = Object.entries(configuration.cdn.fonts.Graphik).map(\n async ([weight, url]) => {\n const font = new FontFace('Graphik', `url(${url})`, { weight });\n document.fonts.add(font);\n return font.load();\n },\n );\n\n fontLoadingPromise = Promise.all(fonts);\n return fontLoadingPromise;\n}\n\n/**\n * @param {PlayerModel} svpPlayer\n */\nfunction replacePlayerPoster(svpPlayer) {\n const video = svpPlayer.getContainer().querySelector('video.jw-video');\n if (!video) {\n return;\n }\n video.setAttribute('poster', configuration.cdn.poster);\n}\n\n/**\n * @param {UIEvent} event\n */\nfunction closeSettingsMenu(event) {\n if (!event.target.classList.contains('jw-settings-content-item')) {\n return;\n }\n\n const controls = event.currentTarget.querySelector('.jw-controls');\n if (!controls?.classList.contains('jw-settings-open')) {\n return;\n }\n\n const settingsMenu = event.currentTarget.querySelector(\n '.jw-icon-settings.jw-settings-submenu-button',\n );\n if (!settingsMenu) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n settingsMenu.click();\n}\n\n/**\n * Resolves whether the player needs a text-to-speech skin or not and replaces UI elements\n * @param {PlayerModel} svpPlayer\n */\nexport function ttsSkinResolver(svpPlayer) {\n const useTextSpeechSkin = svpPlayer.config.shouldApplyTextToSpeechSkin();\n logger('TTS').log(useTextSpeechSkin ? 'on' : 'off');\n\n if (!useTextSpeechSkin) {\n return;\n }\n\n loadFonts();\n\n const translate = locale.translate('tts');\n let elements;\n\n const updateDetailTexts = (time, duration) => {\n if (!elements.durationText.textContent.length) {\n elements.durationText.textContent = timeToText(duration, translate);\n }\n\n if (!elements.durationReplayText.textContent.length) {\n elements.durationReplayText.textContent = timeToText(\n duration,\n translate,\n );\n }\n };\n\n svpPlayer.on('time', (time, duration) => {\n updateDetailTexts(time, duration);\n });\n\n svpPlayer.on('ready', () => {\n svpPlayer.getContainer()?.addEventListener('click', closeSettingsMenu);\n });\n\n svpPlayer.on('playlistItem', async () => {\n const container = svpPlayer.getContainer();\n\n if (container) {\n await ensureIfControlsLoaded(container);\n }\n\n const buttonContainer = container?.querySelector(\n '.jw-button-container',\n );\n\n if (!container || !buttonContainer) {\n return;\n }\n\n container.classList.add(TTS_SKIN_CLASS_NAME);\n\n replacePlayerPoster(svpPlayer);\n if (!elements) {\n elements = createControls(container, translate);\n createAdElements(container, locale.translate('ads'));\n }\n\n const time = svpPlayer.getCurrentTime();\n const duration = svpPlayer.getStream().getDuration();\n updateDetailTexts(time, duration);\n });\n}\n","import logger from 'utils/logger';\nimport utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport { forward30Icon, playbackRateIcon } from 'icons/audio';\nimport { ensureIfControlsLoaded } from './jw-controls';\n\nconst DEFAULT_USE_AUDIO_SKIN = true;\n\nconst CN_FORWARD_BUTTON = 'jw-icon-forward';\nconst CN_DURATION_INFO = 'svp-duration';\nconst CN_PLAYBACK_RATE = 'svp-playback-rate';\nconst COVER = 'svp-cover';\nconst COVER_CONTAINER = 'svp-cover-container';\n\nconst PLAYBACK_RATES = [1.0, 1.2, 1.5, 1.7, 2.0];\n\n/** {string} An icon with proper class names */\nconst forwardIcon = forward30Icon.replace(\n ' {\n const position = jwPlayer.getPosition();\n const duration = jwPlayer.getDuration();\n svpPlayer.seek(Math.min(duration, position + 30));\n };\n\n const changePlaybackRate = () => {\n const rate = jwPlayer.getPlaybackRate();\n const nextRateIndex = PLAYBACK_RATES.findIndex(\n (currentRate) => currentRate === rate,\n );\n jwPlayer.setPlaybackRate(\n PLAYBACK_RATES[\n nextRateIndex >= PLAYBACK_RATES.length - 1\n ? 0\n : nextRateIndex + 1\n ],\n );\n };\n\n svpPlayer.on('playbackRateChanged', ({ playbackRate }) => {\n if (!svpPlayer.player.getControls()) {\n return;\n }\n\n const container = svpPlayer.getContainer();\n const playbackRateButton = container.querySelector(\n `.jw-controlbar .${CN_PLAYBACK_RATE}`,\n );\n const playbackRateButtonText = playbackRateButton.querySelector('text');\n\n playbackRateButtonText.textContent = playbackRate.toFixed(1);\n playbackRateButton.setAttribute(\n 'aria-label',\n `${translate.playbackSpeed} ${playbackRateButtonText.textContent}`,\n );\n });\n\n svpPlayer.on('playlistItem', async () => {\n if (!svpPlayer.player.getControls()) {\n return;\n }\n\n const container = svpPlayer.getContainer();\n const stream = svpPlayer.getStream();\n const isAudio = stream.isAudio();\n const duration = stream.getDuration();\n const forwardTooltip = translate.forward;\n\n const addOrRemoveClass = isAudio ? utils.addClass : utils.removeClass;\n addOrRemoveClass(container, 'svp-flag-media-audio');\n\n await ensureIfControlsLoaded(container);\n\n const displayControl = container.querySelector(\n '.jw-display-icon-display .jw-icon-display',\n );\n const cover = container.querySelector(`.jw-preview .${COVER}`);\n let forwardButton = container.querySelector(\n `.jw-controlbar .${CN_FORWARD_BUTTON}`,\n );\n let durationInfo = container.querySelector(\n `.jw-title .${CN_DURATION_INFO}`,\n );\n let playbackRateButton = container.querySelector(\n `.jw-controlbar .${CN_PLAYBACK_RATE}`,\n );\n\n if (!cover && isAudio) {\n container\n .querySelector('.jw-wrapper')\n .insertBefore(\n utils.createNode(\n `
/`,\n ),\n container.querySelector('.jw-preview'),\n );\n\n container.querySelector(`.${COVER_CONTAINER}`).style[\n 'background-image'\n ] = `url(\"${config.getPoster(stream)}\")`;\n }\n\n if (!forwardButton) {\n jwPlayer.addButton(\n forwardIcon,\n forwardTooltip,\n seekForward,\n 'forward',\n CN_FORWARD_BUTTON,\n );\n forwardButton = container.querySelector(\n `.jw-controlbar .${CN_FORWARD_BUTTON}`,\n );\n }\n\n if (!durationInfo) {\n const title = container.querySelector('.jw-title');\n durationInfo = utils.createNode(\n `
`,\n );\n title.appendChild(durationInfo);\n }\n\n if (!playbackRateButton) {\n jwPlayer.addButton(\n playbackRateIcon,\n '',\n changePlaybackRate,\n 'playback-rate',\n CN_PLAYBACK_RATE,\n );\n const playbackRateButtonText = container.querySelector(\n `.jw-controlbar .${CN_PLAYBACK_RATE} text`,\n );\n playbackRateButtonText.textContent = jwPlayer\n .getPlaybackRate()\n .toFixed(1);\n\n playbackRateButton = container.querySelector(\n `.jw-controlbar .${CN_PLAYBACK_RATE}`,\n );\n playbackRateButton.setAttribute(\n 'aria-label',\n `${translate.playbackSpeed} ${playbackRateButtonText.textContent}`,\n );\n }\n\n const displayStyle = isAudio ? null : 'none';\n displayControl.setAttribute(\n 'aria-label',\n isAudio ? translate.listen : translate.playback,\n );\n forwardButton.style.display = displayStyle;\n durationInfo.style.display = displayStyle;\n playbackRateButton.style.display = displayStyle;\n durationInfo.innerText = isAudio ? timeToText(duration, translate) : '';\n });\n}\n","import config from 'player/config';\nimport { scriptLoader } from 'utils/script-loader';\n\nlet request = null;\n\nexport const youboraSdk = {\n state: 'UNLOADED',\n options: {},\n forceLoad: false,\n\n load(options = {}, forceLoad = false) {\n this.options = options;\n this.forceLoad = forceLoad;\n if (request === null) {\n this.state = 'LOADING';\n\n request = scriptLoader(config.cdn.youbora);\n request.then((youbora = window.youbora) => {\n this.state = 'READY';\n window.youbora = youbora;\n });\n }\n\n return request;\n },\n\n /**\n * @param {jwplayer.JWPlayer} player\n * @param {*} options\n */\n initialize(player, options = {}) {\n // skip when library is not loaded\n if (this.state !== 'READY' || this.state === 'LOADED') {\n return;\n }\n\n const { youbora } = window;\n\n // skip if youbora sdk does not exist\n if (!youbora) {\n return;\n }\n\n try {\n const plugin = new youbora.Plugin({\n ...options,\n ...this.options,\n });\n\n plugin.setAdapter(new youbora.adapters.JWPlayer(player));\n\n this.state = 'LOADED';\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Could not load youbora plugin', e);\n }\n },\n};\n","import utils from 'utils/utils';\nimport Model from 'utils/model';\nimport image from 'utils/image';\nimport { objectToString } from 'utils/string';\nimport ServerTime from 'utils/server-time';\n\nimport config from 'player/config';\nimport Domain from 'player/model/domain';\nimport Token from 'player/model/token';\nimport Asset from 'player/model/asset';\nimport Stream from 'player/model/stream';\n\nimport locale from 'player/model/locale';\n\nimport appnexus from './ads/appnexus';\nimport addPlaylistFactory from './config/playlist';\nimport { addSharing } from './config/sharing';\nimport setPlaybackOptions from './config/playback';\nimport addYoubora from './config/jw-youbora';\nimport setKey from './config/keys';\nimport setCaptions from './config/captions';\nimport { chromecastApps, fallbackChromecastApp } from './config/chromecast';\nimport { applyTtsOption } from './skin/tts-skin';\nimport { shouldUseAudioSkin } from './skin/audioSkinResolver';\n\nimport * as STATUS_CODES from './config/status-codes';\nimport { youboraSdk } from './youbora';\n\n/**\n * @param {string} htmlError\n * @returns {string|undefined}\n * */\nfunction getAkamaiReferenceId(htmlError) {\n return htmlError\n ?.split('Reference #')\n ?.at(-1)\n ?.split('\\n')\n ?.at(0)\n ?.replace(/./g, '.');\n}\n/**\n * Config instance for player\n * Contains SVP Player options\n * Parses config\n *\n * @constructor\n */\nconst Config = function () {\n this.attributes = {\n // DOM node\n node: null,\n // API vendor\n vendor: null,\n // player environment\n env: 'production',\n // stream object (extracted from asset)\n stream: null,\n // if not provided width will be read from node element\n width: '100%',\n // if not provided height will be read from node element\n height: '100%',\n // start playing from chapter time\n chapter: null,\n // start stream automatically on capable devices (does not work on iPhone and iPad, Android)\n autoplay: false,\n // player poster (image), mixed string (http src)|true|false\n poster: true,\n // display title on poster or change to provided string (default false)\n title: null,\n // play ahead time, format XXhYYmZZs, for example: 02h09m10s\n time: null,\n // repeat mode\n repeat: false,\n // minimum dvr window\n minDvrWindow: null,\n // url to css file with skin\n skin: config.skins.default,\n // right click defualt text and link\n about: {\n text: 'Stream',\n link: '',\n },\n /**\n * Token function for secured streams\n * @type {Token|null}\n */\n token: null,\n // disable default countdown plugin\n disableCountdownPlugin: false,\n };\n\n /**\n * JW Player Config\n */\n this.jwDefaults = {\n base: config.cdn.player,\n key: config.player.keys.default,\n preload: 'auto',\n horizontalVolumeSlider: true,\n };\n\n this.token = null;\n};\n\nConfig.prototype = {\n /**\n * Calculates bitrate value based on given limit\n *\n * maxBitrate is increased by 15% due to VBR encoding\n * @returns {number}\n */\n getMaxBitrate() {\n return this.get('maxBitrate') * 1.15;\n },\n\n /**\n * @param {Stream} stream\n */\n setStream(stream) {\n this.stream = stream;\n\n this.token = new Token(\n stream.getId(),\n stream.get('access'),\n this.getMaxBitrate(),\n );\n },\n\n /**\n * Get config passed to SVP Player constructor\n * @returns {*|{}}\n */\n getRaw() {\n return { ...this.rawOptions } || {};\n },\n\n /**\n * @returns {boolean}\n */\n isPreviewMode() {\n const settings = this.getSettings();\n return settings.preview || false;\n },\n\n /**\n * Dump Javascript config to a string\n * @returns {string}\n */\n dump() {\n return objectToString(this.getRaw());\n },\n\n /**\n * TODO add tests\n *\n * @param {Stream} stream\n * @param {HTMLElement} playerContainer\n * @returns {string|null}\n */\n getPoster(stream, playerContainer) {\n // disable poster in TTS mode\n if (this.shouldApplyTextToSpeechSkin(stream)) {\n return null;\n }\n\n const container =\n playerContainer || document.getElementById(this.get('node'));\n\n const width = this.get('width');\n const height = this.get('height');\n\n if (utils.isString(this.get('poster'))) {\n return this.get('poster');\n }\n\n if (container && stream) {\n return image.getImageSrc(\n stream.getPoster(),\n 'poster',\n // use width and height if it's set as a number\n utils.isNumber(width) ? width : container.clientWidth,\n utils.isNumber(height) ? height : container.clientHeight,\n );\n }\n\n return null;\n },\n\n /**\n * @param {Stream} [stream]\n * @returns {boolean}\n */\n shouldApplyTextToSpeechSkin(stream) {\n const ttsSkinOption = this.get('ttsSkin');\n if (typeof ttsSkinOption === 'boolean') {\n return ttsSkinOption;\n }\n\n const currentStream = stream || this.stream;\n return Boolean(currentStream) && currentStream.hasTextSpeech();\n },\n\n /**\n * @returns {string|undefined}\n */\n getVideoPreviewMetadataKey() {\n const { videoPreview } = this.getRaw();\n const isCustomMetadataKey = typeof videoPreview === 'string';\n\n const allPreviewsKeys = Object.keys(this.stream.getAllPreviewsUrls());\n\n if (!(videoPreview === true || isCustomMetadataKey)) {\n return undefined;\n }\n\n if (isCustomMetadataKey) {\n return videoPreview;\n }\n\n if (\n this.stream.isLive() &&\n allPreviewsKeys.includes(config.liveVideoPreview)\n ) {\n return config.liveVideoPreview;\n }\n\n return (\n config.videoPreview[this.get('vendor')] ||\n config.videoPreview.default\n );\n },\n\n /**\n * @param {Stream} stream\n * @param {HTMLElement} [playerContainer]\n * @returns {HTMLElement|undefined}\n */\n getVideoPreviewUrl(stream, playerContainer) {\n const container =\n playerContainer || document.getElementById(this.get('node'));\n if (!container || !stream || stream.isAudio()) {\n return undefined;\n }\n\n const metadataKey = this.getVideoPreviewMetadataKey(stream);\n\n return metadataKey ? stream.getVideoPreviewUrl(metadataKey) : undefined;\n },\n\n /**\n * @param {Stream} stream\n * @returns {string}\n */\n getTitle(stream) {\n const title = this.get('title');\n const isAudioWithoutCustomTitle =\n stream.isAudio() && !utils.isString(title);\n\n if (title === true || isAudioWithoutCustomTitle) {\n return stream.get('title');\n }\n\n return title;\n },\n\n /**\n * @param {Stream} stream\n * @returns {string|undefined}\n */\n getDescription(stream) {\n if (stream.isAudio()) {\n return stream.getCategory().getTitle();\n }\n\n return undefined;\n },\n\n /**\n * @param {Stream} stream\n * @returns {number|undefined}\n */\n getLiveSyncDuration(stream) {\n const chunkDuration = stream.getChunkDuration();\n if (chunkDuration) {\n // https://github.com/video-dev/hls.js/blob/master/docs/API.md#livesyncduration\n return chunkDuration * 2 + 1;\n }\n return undefined;\n },\n\n /**\n * Retrieve token required for secure streams\n * Token expiry has to match API\n *\n * @returns {Promise}\n */\n getToken() {\n if (this.stream.isSecure()) {\n return this.token.fetch(\n this.get('token'),\n this.stream.hasAccess(),\n this.stream.getVendor(),\n );\n }\n\n return Promise.resolve(null);\n },\n\n /**\n * Token is required only for secure streams so for all other types it's valid\n *\n * @returns {boolean}\n */\n hasValidToken() {\n return !this.stream.isSecure() || this.token.isValid();\n },\n\n getStreamUrl(type) {\n // stream not set yet\n if (!this.stream) {\n // eslint-disable-next-line no-console\n console.error('SVP SDK: getStreamUrl() called before stream set');\n return null;\n }\n\n return this.getToken().then((token) => {\n const streamUrl = this.stream.getUrl(type);\n const maxBitrate = this.getMaxBitrate();\n const params = [];\n\n if (type === 'hls' && token) {\n params.push(`hdnea=${encodeURIComponent(token)}`);\n }\n\n if (maxBitrate) {\n params.push(`b=0-${maxBitrate}`);\n }\n\n return (\n streamUrl + (params.length > 0 ? `?${params.join('&')}` : '')\n );\n });\n },\n\n /**\n * Check if user is eligible to play stream in his geolocation\n *\n * @returns {Promise}\n */\n isStreamPlayable() {\n const { stream } = this;\n const settings = this.getSettings();\n\n return new Promise((resolve, reject) => {\n if (settings.preview === true) {\n resolve(STATUS_CODES.ACTIVE_PREVIEW);\n } else if (!ServerTime.fetched) {\n reject({ code: STATUS_CODES.NETWORK_ERROR });\n } else if (stream.isActive()) {\n if (stream.isGeoblocked() && !stream.isFuture()) {\n this.getStreamUrl('hls')\n .then(async (streamUrl) => {\n const response = await fetch(streamUrl);\n\n if (response.ok) return resolve();\n\n const htmlError = await response.text?.();\n const referenceId = getAkamaiReferenceId(htmlError);\n\n if (response.status === 403) {\n return reject({\n code: STATUS_CODES.NOT_ACTIVE_GEOBLOCKED,\n referenceId,\n });\n }\n if (response.status === 401) {\n return reject({\n code: STATUS_CODES.NOT_ACTIVE_TOKEN,\n referenceId,\n });\n }\n if (response.status === 404) {\n return reject({\n code: STATUS_CODES.NOT_FOUND,\n referenceId,\n });\n }\n return reject({\n code: STATUS_CODES.NETWORK_ERROR,\n referenceId,\n });\n })\n .catch(() => {\n reject({ code: STATUS_CODES.NETWORK_ERROR });\n });\n } else {\n resolve(STATUS_CODES.ACTIVE);\n }\n } else if (stream.isPast()) {\n reject({ code: STATUS_CODES.NOT_ACTIVE_PAST });\n } else {\n reject({ code: STATUS_CODES.NOT_ACTIVE });\n }\n });\n },\n\n /**\n * @param {Stream} stream\n * @returns {Stream[]}\n */\n getPlaylistItems(stream) {\n if (!stream) {\n return [];\n }\n const vendor = this.get('vendor');\n const playlistStreams = stream\n .get('playlist')\n .map((data) => {\n const asset = new Asset(data);\n asset.set('vendor', vendor);\n return asset;\n })\n .map((asset) => new Stream(asset.attributes));\n return [stream].concat(playlistStreams);\n },\n\n getChromecastAppId() {\n const vendorEntry = Object.entries(chromecastApps).find((entry) =>\n entry[1].includes(this.stream.getVendor()),\n );\n return (vendorEntry && vendorEntry[0]) || fallbackChromecastApp;\n },\n\n getJwConfig(stream) {\n const settings = this.getSettings();\n\n return (\n Promise.resolve({\n width: this.get('width'),\n height: this.get('height'),\n abouttext: this.get('about').text,\n aboutlink: this.get('about').link,\n floating: this.get('floating'),\n sharing: utils.extend({}, config.sharing.global),\n localization: locale.translate('player', true),\n plugins: {},\n cast: {\n customAppId: this.getChromecastAppId(),\n },\n playlist: [],\n ...(this.getLiveSyncDuration(stream)\n ? { liveSyncDuration: this.getLiveSyncDuration(stream) }\n : {}),\n })\n .then((jwConfig) => {\n const playlistItems = this.getPlaylistItems(stream);\n const addPlaylistItemsPromise = playlistItems.reduce(\n (promise, currentStream) => {\n const streamUrlPromise = promise.then(() => {\n // change to the current stream object to prepare a valid stream url\n this.setStream(currentStream);\n return this.getStreamUrl('hls');\n });\n\n return streamUrlPromise.then((streamUrl) => {\n const playlistSettings =\n this.getPlaylistSettings();\n const playlistOptions = {\n poster: this.getPoster(currentStream),\n preview:\n this.getVideoPreviewUrl(currentStream),\n title: this.getTitle(currentStream),\n description:\n this.getDescription(currentStream),\n locale: locale,\n minDvrWindow: this.get('minDvrWindow'),\n };\n\n const applyPlaylistAdding = addPlaylistFactory(\n streamUrl,\n currentStream,\n playlistOptions,\n playlistSettings,\n {\n forceImaClientLoading: this.get(\n 'forceImaClientLoading',\n ),\n shouldUseAudioSkin:\n shouldUseAudioSkin(this),\n },\n );\n\n return applyPlaylistAdding(jwConfig);\n });\n },\n Promise.resolve(),\n );\n\n return addPlaylistItemsPromise.then(() => {\n // revert to the origin stream object\n this.setStream(stream);\n return jwConfig;\n });\n })\n .then(\n addSharing({\n options: this.get('sharing'),\n stream,\n }),\n )\n .then((jwConfig) => applyTtsOption(jwConfig, stream, this))\n .then(setCaptions(this.get('captions')))\n // setPlaybackOptions has to be invoked in the closure to inject the current values of mute, skin, etc.\n // otherwise it will get values when getJwConfig was called\n .then((jwConfig) =>\n setPlaybackOptions(stream, {\n mute: this.get('mute'),\n skin: this.get('skin'),\n autoplay: this.get('autoplay'),\n autopause: this.get('autopause'),\n repeat: this.get('repeat'),\n })(jwConfig),\n )\n .then(addYoubora(stream, youboraSdk.state === 'READY'))\n .then(setKey(this.get('vendor')))\n .then((jwConfig) =>\n utils.merge(\n utils.extend({}, this.jwDefaults, jwConfig),\n settings.jw || {},\n ),\n )\n );\n },\n\n /**\n * Check if recommended is available\n */\n hasRecommended() {\n // recommended truned on and repeat truned off\n return (\n this.get('recommended') !== false && this.get('repeat') === false\n );\n },\n\n getRecommended() {\n return this.get('recommended');\n },\n\n getAgeLimit() {\n return this.get('ageLimit');\n },\n\n hasNext() {\n if (!this.hasRecommended()) {\n return false;\n }\n\n if (\n this.getRecommended() &&\n (this.getRecommended().next === false ||\n typeof this.getRecommended().next === 'undefined')\n ) {\n return false;\n }\n\n return true;\n },\n\n getPlaylistSettings() {\n return utils.extend(\n {\n adn: this.get('adn'),\n hasNext: this.hasNext(),\n },\n this.getSettings(),\n );\n },\n\n getLiveMidrollTag(time) {\n return appnexus.getLiveMidrollTag(\n time,\n this.stream,\n this.getPlaylistSettings(),\n );\n },\n\n parse(options) {\n const asset = options.asset || options.id;\n const about = config.about[options.vendor];\n const skin = utils.extend(\n {},\n config.skins[options.vendor] || config.skins.default,\n );\n\n // set default skin for player if nothing is provided\n if (typeof options.skin === 'object') {\n if (options.skin.name) {\n skin.name += ` ${options.skin.name}`;\n }\n\n if (options.skin.url) {\n skin.url = options.skin.url;\n }\n } else {\n // remove if not valid\n delete options.skin;\n }\n\n options.skin = skin;\n\n // override about link/text\n if (!options.about && about) {\n options.about = about;\n }\n\n options.floating = {\n dismissible: options.floating?.dismissible ?? true,\n mode: options.floating?.mode ?? 'never',\n };\n\n // delete asset\n if (asset) {\n delete options.asset;\n }\n\n // check if user passed chapter or time\n if (utils.isString(options.chapter) && options.chapter.match(/^\\d+$/)) {\n options.chapter = parseInt(options.chapter, 10);\n }\n\n // legacy support\n if (options.time) {\n options.time = utils.time.shareTimeToSeconds(options.time);\n }\n\n if (options.settings) {\n delete options.settings;\n }\n\n return options;\n },\n};\n\nObject.defineProperty(Config.prototype, 'initialize', {\n value(options) {\n const { vendor } = options;\n const rawOptions = utils.extend({}, options);\n\n this.rawOptions = rawOptions;\n\n Domain.getPermissions(vendor).then((permissions) => {\n const settings = {};\n\n if (permissions.whitelist === true && options.settings) {\n utils.extend(settings, options.settings);\n } else if (\n permissions.whitelist === false &&\n options.settings &&\n options.settings.jw\n ) {\n settings.jw = {};\n utils.extend(settings.jw, options.settings.jw);\n }\n\n if (permissions.preview === false) {\n delete settings.preview;\n }\n\n // turn off ads for certain provider\n if (config.ads[vendor] === false) {\n settings.na = true;\n }\n\n Object.defineProperty(this, 'settings', {\n value: Object.freeze(settings),\n writable: false,\n });\n\n utils.extend(this.attributes, this.parse(options));\n this.trigger('ready', rawOptions, settings);\n });\n },\n writable: false,\n});\n\n// Immutable method for restricted settings like preview or na\nObject.defineProperty(Config.prototype, 'getSettings', {\n value() {\n return this.settings;\n },\n writable: false,\n});\n\nutils.extend(Config.prototype, Model);\n\nexport default Config;\n","import utils from 'utils/utils';\nimport appnexus from 'player/playback/ads/appnexus';\n\n/**\n * @param {string} streamUrl\n * @param {Stream} stream\n * @param {*} options\n * @param {*} settings\n * @returns {(config: Config) => Config}\n * @template Config\n */\nfunction getPlaylist(\n streamUrl,\n stream,\n options,\n settings,\n { forceImaClientLoading, shouldUseAudioSkin } = {\n forceImaClientLoading: false,\n shouldUseAudioSkin: false,\n },\n) {\n const { locale, poster, title, description, minDvrWindow } = options;\n\n /**\n * @param {PlaylistItem} playlistItem\n * @returns {PlaylistItem}\n */\n function addPlaylistMetadata(playlistItem) {\n const mediaId = stream.getExternalId();\n const startTime = stream.getPlaybackTime('begin');\n\n // set media id only if it exists\n if (mediaId) {\n playlistItem.mediaid = mediaId;\n }\n\n // add title\n if (title) {\n playlistItem.title = title;\n }\n\n if (description) {\n playlistItem.description = description;\n }\n\n // seek stream if play ahead time is set\n if (startTime) {\n playlistItem.starttime = startTime;\n }\n\n if (minDvrWindow) {\n playlistItem.minDvrWindow = minDvrWindow;\n }\n return playlistItem;\n }\n\n /**\n * @param {PlaylistItem} playlistItem\n * @returns {PlaylistItem}\n */\n function addSnapshots(playlistItem) {\n if (stream.hasSnapshots()) {\n // add snapshots for each stream\n playlistItem.tracks.push({\n file: stream.getSnapshots(),\n kind: 'thumbnails',\n });\n }\n\n return playlistItem;\n }\n\n /**\n * @param {PlaylistItem} playlistItem\n * @returns {PlaylistItem}\n */\n function addCaptions(playlistItem) {\n if (stream.getCaptions().length > 0 && !stream.hasSubtitlesInHls()) {\n utils.each(stream.getCaptions(), function (caption) {\n playlistItem.tracks.push({\n file: caption.url,\n label: locale.translate(caption.language),\n kind: 'captions',\n default: caption.default === true,\n });\n });\n }\n\n return playlistItem;\n }\n\n /**\n * @param {*} adConfig\n * @param {PlaylistItem} playlistItem\n * @returns {PlaylistItem & { adPlacements?: *, adschedule?: * }}\n */\n function addAppnexusAds(adConfig, playlistItem) {\n const { adSchedule, adPlacements } = adConfig || {};\n\n // check if there are ads\n if (adSchedule && Object.keys(adSchedule).length > 0) {\n utils.extend(playlistItem, {\n adschedule: adSchedule,\n });\n }\n\n // check if there are ads\n if (adPlacements) {\n playlistItem.adPlacements = adPlacements;\n }\n\n return playlistItem;\n }\n\n return function (config) {\n const type = stream.isAudio() && stream.hasMp4Streams() ? 'mp4' : 'hls';\n\n return Promise.resolve({\n id: stream.getId(),\n image: stream.isAudio() && shouldUseAudioSkin ? undefined : poster,\n sources: [\n {\n file: type === 'mp4' ? stream.getUrl(type) : streamUrl,\n // force stream type for mock stream which contains mp4 blob\n type: stream.isMock() ? 'video/mp4' : type,\n default: true,\n preload: type === 'mp4' ? 'none' : 'auto',\n },\n ],\n mediaType: stream.get('mediaType'),\n tracks: [],\n })\n .then(addPlaylistMetadata)\n .then(addCaptions)\n .then(addSnapshots)\n .then(async function (playlistItem) {\n if (\n (stream.isPodcast() || settings.vmap) &&\n !stream.hasAdsDisabled() &&\n !settings.na\n ) {\n config.advertising = utils.extend(\n {\n client: 'vast',\n },\n locale.translate('ads', true),\n );\n\n const vmapParams =\n settings.vmap instanceof Function\n ? await settings.vmap()\n : {};\n\n return utils.extend(playlistItem, {\n adschedule: stream.getVmapApiUrl(vmapParams),\n });\n }\n\n return appnexus\n .getConfig(stream, settings)\n .then(function (adConfig) {\n const adOptions = adConfig.adOptions || {};\n\n const shouldEnableIma =\n adConfig.adSchedule &&\n Object.keys(adConfig.adSchedule || {}).some(\n (schedule) => schedule.endsWith('prebid'),\n );\n\n config.advertising = utils.extend(\n {\n client:\n shouldEnableIma || forceImaClientLoading\n ? 'googima'\n : 'vast',\n maxRedirects: 7,\n locale:\n locale.getTranslations().id === 'se'\n ? 'sv'\n : locale.getTranslations().id,\n },\n locale.translate('ads', true),\n );\n\n if (typeof adOptions.autoplayMuted !== 'undefined') {\n config.advertising.autoplayadsmuted =\n adOptions.autoplayMuted;\n }\n\n if (adOptions.vpaidcontrols === true) {\n config.advertising.vpaidcontrols = true;\n }\n\n if (adOptions.preloadAds === true) {\n config.advertising.preloadAds = true;\n }\n\n // do not add any ads to playlist when it is in preload mode\n if (\n stream.isMock() &&\n stream.getVendor() !== 'appnexus'\n ) {\n return playlistItem;\n }\n\n return addAppnexusAds(adConfig, playlistItem);\n });\n })\n .then(function (playlistItem) {\n if (!config.playlist) {\n config.playlist = [];\n }\n config.playlist.push(playlistItem);\n\n playlistItem.svp = {\n stream: stream,\n settings: settings,\n };\n\n return config;\n });\n };\n}\n\nexport default getPlaylist;\n","export default function (options = {}) {\n // additional config options required for playback\n return function (jwConfig) {\n if (options.native === true) {\n jwConfig.renderCaptionsNatively = true;\n delete options.native;\n }\n\n if (Object.keys(options).length > 0) {\n jwConfig.captions = options;\n }\n\n return jwConfig;\n };\n}\n","/**\n * Check if preroll is scheduled in configuration\n *\n * @param {*} config\n * @returns {boolean}\n */\nconst hasPreroll = (config) => {\n const playlistItem = config && config.playlist[0];\n\n // check if preroll exists in array\n if (playlistItem.adschedule) {\n return Object.values(playlistItem.adschedule).some(\n (slot) => slot.offset === 'pre',\n );\n }\n\n return false;\n};\n\n/**\n * @param {Stream} stream\n * @param {*} options\n */\nexport default function (stream, options) {\n // additional config options required for playback\n return function (config) {\n let canAutostart = options.autoplay;\n\n // stream is not available yet, display countdown\n if (!stream.hasPlayableSource()) {\n // disable autoplay if stream is not available\n config.preload = 'none';\n config.autostart = false;\n }\n\n // force sound mute when configuration is set\n if (options.mute === true) {\n config.mute = true;\n }\n\n // load skin if available\n if (options.skin) {\n config.skin = options.skin;\n }\n\n // fix jw bug\n // by default you can't play muted ads\n if (\n hasPreroll(config) &&\n config.advertising.autoplayadsmuted !== true\n ) {\n try {\n if (\n config.mute === true ||\n localStorage.getItem('jwplayer.mute') === 'true'\n ) {\n // unmute player when autostart is not available\n config.mute = false;\n }\n } catch (error) {\n // for private browsing\n }\n }\n\n // disable autostart for future streams\n if (stream.isFuture()) {\n canAutostart = false;\n }\n\n if (typeof canAutostart !== 'undefined') {\n config.autostart = canAutostart;\n }\n\n // set autopause to viewable\n if (options.autopause === 'viewable') {\n config.autoPause = {\n viewability: true,\n pauseAds: true,\n };\n }\n\n // set repeat mode\n if (options.repeat === true) {\n config.repeat = options.repeat;\n }\n\n return config;\n };\n}\n","import { checkIsPrebidEnabled } from 'utils/prebid';\n\n/**\n * @param {Stream} stream\n * @param {boolean} isEnabled\n * @returns {(config: Config) => Config}\n * @template Config\n */\nexport default function (stream, isEnabled) {\n // additional config options required for playback\n return function (config) {\n // allow only when account config is available\n if (isEnabled) {\n if (config.playlist && config.playlist[0]) {\n const streamConfiguration =\n stream.get('streamConfiguration') &&\n stream.get('streamConfiguration').properties;\n\n const category = stream.getCategory();\n\n const isPrebidEnabled = checkIsPrebidEnabled(config.playlist);\n\n config.playlist[0].youbora = {\n 'content.resource': stream.getUrl('hls'),\n 'content.isLive': stream.isLive(),\n 'content.title': stream.get('title'),\n 'content.duration': stream.getDuration(),\n 'content.cdn': 'AKAMAI',\n 'content.metadata': {\n content_id: stream.getId(),\n owner: stream.getVendor(),\n },\n\n 'extraparam.1': stream.getId(),\n 'extraparam.2': stream.getVendor(),\n 'extraparam.3': streamConfiguration.join(','),\n 'extraparam.4': category && category.getId(),\n 'extraparam.5': isPrebidEnabled,\n };\n }\n }\n\n return config;\n };\n}\n","export const checkIsPrebidEnabled = (playlist) =>\n playlist[0] &&\n Object.keys(playlist[0].adschedule || {}).some((key) =>\n key.endsWith('prebid'),\n );\n","import config from 'player/config';\n\n/**\n * @param {string} vendor\n * @returns {(config: JWConfig) => JWConfig}\n * @template JWConfig\n */\nexport default function (vendor) {\n // additional config options required for playback\n return function (jwConfig) {\n const { keys } = config.player;\n\n jwConfig.key = keys[vendor] || keys.default;\n\n return jwConfig;\n };\n}\n","import type { Asset } from '@schibsted-svp/svp-api-types';\nimport { assetAdditionalData, relatedApi } from '../api';\n\nexport async function getRelatedAssets({\n vendor,\n assetId,\n limit,\n}: {\n vendor: string;\n assetId: number;\n limit?: number;\n}): Promise {\n const query = [\n `additional=${assetAdditionalData}`,\n `ignoreAspectRatio=true`,\n ];\n if (limit) {\n query.push(`limit=${limit}`);\n }\n\n return relatedApi({ path: `${vendor}/${assetId}`, query: query.join('&') });\n}\n","import type { Asset } from '@schibsted-svp/svp-api-types';\nimport { getRelatedAssets } from 'player/services/api/related';\nimport { getById } from 'player/services/api/asset';\nimport Stream from './stream';\nimport AssetModel from './asset';\n\ntype Source = 'byId' | 'related';\n\nconst createResponse = ({\n nextAsset,\n source,\n}: {\n nextAsset?: Asset;\n source: Source;\n}): {\n nextAsset: AssetModel | null;\n source: Source;\n} => ({\n nextAsset: nextAsset ? new AssetModel(nextAsset) : null,\n source,\n});\n\nconst handlers = {\n /**\n * Check if given asset has next stream\n * Used for setting/disabling postrolls\n */\n hasPlayNext(asset: AssetModel): boolean {\n if (asset.getStreamType() === 'live') {\n return false;\n }\n\n if (asset.getNextAssetId()) {\n return true;\n }\n\n return false;\n },\n\n async fetchNextById({\n vendor,\n assetId,\n }: {\n vendor: string;\n assetId: number;\n }): Promise<{\n nextAsset: AssetModel | null;\n source: Source;\n }> {\n const nextAsset = await getById({\n vendor,\n assetId,\n });\n\n return createResponse({\n source: 'byId',\n nextAsset,\n });\n },\n\n async fetchNextFromRelatedEngine({\n vendor,\n assetId,\n }: {\n vendor: string;\n assetId: number;\n }): Promise<{\n nextAsset: AssetModel | null;\n source: Source;\n }> {\n const assets = await getRelatedAssets({\n vendor,\n assetId,\n limit: 1,\n });\n\n return createResponse({\n nextAsset:\n Array.isArray(assets) && assets.length > 0\n ? assets[0]\n : undefined,\n source: 'related',\n });\n },\n\n /**\n * Fetch next for given asset\n * Cascade lookup from direct linkage (nextAsset.id) to retrieving from category\n */\n async getNext(asset: AssetModel): Promise<{\n nextAsset: AssetModel | null;\n source: Source;\n }> {\n const vendor = asset.getVendor();\n const assetId = asset.getId();\n\n return this.fetchNextFromRelatedEngine({\n vendor,\n assetId,\n });\n },\n\n /**\n * Fetch next for given asset\n * Cascade lookup from direct linkage (nextAsset.id) to retrieving from category\n * Rejected when nextAsset is not found\n */\n async fetchNext(asset: AssetModel): Promise<{\n nextAsset: AssetModel | null;\n source: Source;\n }> {\n const { nextAsset, source } = await this.getNext(asset);\n\n if (!nextAsset) {\n return Promise.reject({\n reason: 'nextAssetNotFound',\n source,\n });\n }\n\n const stream = new Stream(nextAsset.attributes);\n\n if (!stream.isActive()) {\n return Promise.reject({\n reason: 'nextAssetNotActive',\n source,\n });\n }\n\n return {\n nextAsset,\n source,\n };\n },\n};\n\nexport default handlers;\n","import nextAsset from './next-asset';\nimport { fetchFromRelated } from './recommended/list';\n\nclass Recommended {\n /**\n * @param {Asset} asset\n */\n constructor({ asset }) {\n /**\n * @type {Asset}\n */\n this.asset = asset;\n }\n\n /**\n * Fetch next asset\n *\n * @returns {Promise}\n */\n getNextAsset(options = {}) {\n const { asset } = this;\n\n // next asset can be provided in player configuration\n if (options.asset) {\n return nextAsset.fetchNextById({\n // set vendor is specified or use main asset as default\n vendor: options.asset.vendor || asset.getVendor(),\n // asset can be object or number with asset id\n assetId: options.asset.id || options.asset,\n });\n }\n\n return nextAsset.fetchNext(asset);\n }\n\n /**\n * Fetch recommended asset list\n *\n * @returns {*}\n */\n async getItems() {\n const vendor = this.asset.getVendor();\n const assetId = this.asset.getId();\n\n return fetchFromRelated({\n vendor,\n assetId,\n });\n }\n}\n\nexport default Recommended;\n","import type { Asset } from '@schibsted-svp/svp-api-types';\nimport { getRelatedAssets } from 'player/services/api/related';\nimport AssetModel from '../asset';\n\nconst mapResponse = (vendor: string, assets: Asset[]): AssetModel[] =>\n assets.map(\n (asset) =>\n new AssetModel({\n vendor,\n ...asset,\n }),\n );\n\nexport async function fetchFromRelated({\n vendor,\n assetId,\n}: {\n vendor: string;\n assetId: number;\n}): Promise {\n const assets = await getRelatedAssets({ vendor, assetId });\n return mapResponse(vendor, assets);\n}\n","import { scriptLoader } from 'utils/script-loader';\n\nconst TRACKER_ID = 'svp-tracker';\n\nconst PulseTrackerLoader = {\n request: null,\n\n trackers: {},\n\n /**\n * Load pulse library only once per page\n *\n * @returns {null}\n */\n load() {\n if (!this.request) {\n if (!window.pulse) {\n // a global pulse object has to be present to avoid autoloader errors\n window.pulse =\n window.pulse ||\n function () {\n window.pulse.q = window.pulse.q || [];\n window.pulse.q.push(arguments);\n };\n\n this.request = scriptLoader(\n '//sdk.pulse.schibsted.com/versioned/3.1/pulse.min.js',\n );\n } else {\n // pulse is already available\n this.request = Promise.resolve();\n }\n }\n\n return this.request;\n },\n\n init(provider, sdkConfig) {\n return this.load()\n .then(() => this.getTracker(provider))\n .then((storedTracker) => {\n const PROVIDER_TRACKER_ID = `${TRACKER_ID}-${provider}`;\n\n // initialize pulse only once per page per provider\n if (!storedTracker) {\n // we need to name the tracker to avoid tracking conflicts when embedding the player\n window.pulse(\n 'init',\n provider,\n {\n altEventHandler: window.pulseEventHandler,\n useBeaconWhenAvailable: true,\n ...sdkConfig,\n },\n undefined,\n PROVIDER_TRACKER_ID,\n );\n\n const promise = new Promise((resolve) => {\n window.pulse(PROVIDER_TRACKER_ID, (tracker) =>\n resolve(tracker),\n );\n });\n\n PulseTrackerLoader.trackers[provider] = promise;\n\n return promise;\n }\n\n return storedTracker;\n });\n },\n\n getTracker(provider) {\n return PulseTrackerLoader.trackers[provider] || Promise.resolve(null);\n },\n};\n\nexport default PulseTrackerLoader;\n","const PLAYER_CONTAINER_CLASS_NAME = 'svp-flag-video-preview';\nconst PREVIEW_CONTAINER_CLASS_NAME = 'jw-preview';\nconst PREVIEW_ELEMENT_CLASS_NAME = 'svp-video-preview';\n\n/**\n * @param {HTMLElement} container\n * @return {{previewContainer: HTMLDivElement, previewElement?: HTMLVideoElement}}\n */\nfunction queryVideoPreviewElements(container) {\n const previewContainer = container.querySelector(\n `.${PREVIEW_CONTAINER_CLASS_NAME}`,\n );\n const previewElement =\n previewContainer.querySelector(`.${PREVIEW_ELEMENT_CLASS_NAME}`) ||\n undefined;\n return { previewContainer, previewElement };\n}\n\n/**\n * @this Player\n */\nfunction removeVideoPreviewElement() {\n // in case when asset is not published and player is removed\n if (!this.model || !this.model.player) {\n return;\n }\n const container = this.getContainer();\n container.classList.remove(PLAYER_CONTAINER_CLASS_NAME);\n\n const { previewContainer, previewElement } =\n queryVideoPreviewElements(container);\n if (!previewElement) {\n return;\n }\n\n previewContainer.removeChild(previewElement);\n}\n\n/**\n * @param {HTMLDivElement} previewContainer\n * @return {HTMLVideoElement}\n */\nfunction createPreviewElement(previewContainer) {\n const previewElement = document.createElement('video');\n previewElement.loop = true;\n previewElement.autoplay = true;\n previewElement.muted = true;\n previewElement.classList.add(PREVIEW_ELEMENT_CLASS_NAME);\n ['autoplay', 'disableremoteplayback', 'muted', 'playsinline'].forEach(\n (attr) => {\n previewElement.setAttribute(attr, '');\n },\n );\n previewContainer.appendChild(previewElement);\n return previewElement;\n}\n\n/**\n * @this Player\n */\nasync function addVideoPreviewElement() {\n const stream = this.model.getStream();\n const previewUrl = this.config.getVideoPreviewUrl(stream);\n const autoplay = this.config.get('autoplay');\n if (!previewUrl || autoplay) {\n return removeVideoPreviewElement.call(this);\n }\n\n const container = this.getContainer();\n container.classList.add(PLAYER_CONTAINER_CLASS_NAME);\n\n const {\n previewContainer,\n previewElement = createPreviewElement(previewContainer),\n } = queryVideoPreviewElements(container);\n\n previewElement.src = previewUrl;\n previewElement.load();\n return previewElement.play();\n}\n\nexport default {\n addVideoPreviewElement,\n removeVideoPreviewElement,\n};\n","import logger from 'utils/logger';\nimport utils from 'utils/utils';\nimport config from 'player/config';\nimport errorIcon from 'icons/error.svg';\nimport videoPreviewHelper from 'utils/video-preview';\nimport locale from '../model/locale';\nimport statusCode, {\n NOT_FOUND,\n GENERAL_ERROR,\n NOT_ACTIVE,\n} from '../playback/config/status-codes';\nimport { TTS_SKIN_CLASS_NAME } from '../playback/skin/tts-skin';\n\n/**\n * Clear error message\n */\nexport function clearError(node) {\n const previousErrorNode = node.getElementsByClassName(\n 'svp-player-error-wrapper',\n );\n\n // clear old node\n if (previousErrorNode.length > 0) {\n utils.removeClass(node, [\n 'svp-player-error',\n 'svp-player-error-hasImage',\n ]);\n\n if (previousErrorNode[0].parentNode) {\n previousErrorNode[0].parentNode.removeChild(previousErrorNode[0]);\n }\n }\n}\n\n/**\n * Display error message in given node\n */\nfunction displayError(node, message, code = null, referenceId = null) {\n let template = `
${errorIcon}${message}`;\n\n if (code) {\n template += `
${locale.translate(\n 'Error code',\n )}: ${code}${referenceId ? `, #${referenceId}` : ''}
`;\n }\n\n template += '
';\n\n const posterSrc =\n this.model &&\n this.model.getStream() &&\n this.model.getPoster(this.model.getStream(), node);\n\n clearError(node);\n utils.addClass(node, 'svp-player-error');\n\n // add image\n if (posterSrc) {\n utils.addClass(node, 'svp-player-error-hasImage');\n template += `
`;\n }\n\n const errorNode = utils.createNode(\n `
${template}
`,\n );\n\n node.appendChild(errorNode);\n\n this.once(\n 'complete',\n function () {\n utils.removeClass(node, [\n 'svp-player-error',\n 'svp-player-error-hasImage',\n ]);\n\n if (errorNode.parentNode) {\n errorNode.parentNode.removeChild(errorNode);\n }\n },\n this,\n );\n}\n\n/**\n * Display error message\n */\nexport function onError(details) {\n logger('SVP').error(details);\n const node = document.getElementById(this.config.get('node'));\n const { code, message, referenceId } = details || {};\n\n if (this.model.config.shouldApplyTextToSpeechSkin()) {\n node.classList.add(TTS_SKIN_CLASS_NAME);\n }\n\n let translatedMessage = locale.translate(message);\n\n // translation not found\n if (translatedMessage === message) {\n translatedMessage = locale.translate(statusCode(GENERAL_ERROR));\n }\n\n // details - message in english\n // message - localized, displayed message\n const errorDetails = {\n code,\n details: message,\n message: translatedMessage,\n referenceId,\n };\n\n if (details.type) {\n errorDetails.type = details.type;\n }\n\n displayError.call(this, node, translatedMessage, code, referenceId);\n\n if (this.model.player) {\n this.model.player.stop();\n }\n\n this.trigger('error', errorDetails);\n}\n\n/**\n * Asset fetch failed. Usually happens when network issue occurred\n */\nexport function onAssetError(error) {\n let code = GENERAL_ERROR;\n\n videoPreviewHelper.removeVideoPreviewElement.call(this);\n\n if (error) {\n if (error.status === 404) {\n code = NOT_FOUND;\n } else if (error.status === 401) {\n code = NOT_ACTIVE;\n }\n }\n\n const details = {\n message: statusCode(code),\n code,\n };\n\n this.trigger('assetError', details);\n\n // load stylesheet as player is not attached\n onError.call(this, {\n type: 'assetFetchError',\n ...details,\n });\n\n logger('SVP').error('error', error);\n\n // display errors in development mode\n if (config.env === 'development') {\n throw error;\n }\n}\n","/* global apntag */\nimport config from 'player/config';\nimport utils from 'utils/utils';\nimport { scriptLoader } from 'utils/script-loader';\nimport logger from 'utils/logger';\n\nexport default utils.extend(\n {\n /**\n * @type {boolean|null}\n */\n isLoaded: null,\n\n /**\n * @returns {Promise}\n */\n load() {\n if (window.apntag) {\n this.isLoaded = true;\n return Promise.resolve();\n }\n if (this.isLoaded === false) {\n // after loading fail we do not retry\n return Promise.reject({\n firstLoad: false,\n });\n }\n\n // load this only once\n return scriptLoader(config.ads.appnexus.ast)\n .then(() => {\n // check if object really exist\n this.isLoaded = typeof window.apntag === 'object';\n })\n .catch((error) => {\n // appnexus can be blocked by adblock\n this.isLoaded = false;\n\n return Promise.reject({\n firstLoad: true,\n error,\n });\n });\n },\n\n /**\n * @param {string} tagId\n * @param {*} tagOptions\n * @returns {Promise}\n */\n defineTag(tagId, tagOptions) {\n return this.load()\n .then(() => {\n const tagConfig = {\n targetId: tagId,\n ...tagOptions,\n };\n\n apntag.debug = config.ads.appnexus.debug;\n // apntag tag overriden by reference\n apntag.defineTag(utils.extend({}, tagConfig));\n\n apntag.loadTags([tagId]);\n apntag.onEvent(\n 'adLoaded',\n tagId,\n this.trigger.bind(this, 'adLoaded', tagId),\n );\n })\n .catch((error) => {\n if (error.firstLoad) {\n logger('SVP').log('Could not load AST tag');\n }\n });\n },\n\n /**\n * @param {string} tagId\n */\n showTag(tagId) {\n if (this.isLoaded) {\n apntag.showTag(tagId);\n }\n },\n\n /**\n * @param {string} tagId\n */\n refreshTag(tagId) {\n if (this.isLoaded) {\n apntag.refresh([tagId]);\n }\n },\n\n /**\n * @param {string} tagId\n * @param {(string|number)[]} dimmensions\n */\n resizeTag(tagId, dimmensions) {\n const size = [\n parseInt(dimmensions[0], 10),\n parseInt(dimmensions[1], 10),\n ];\n\n if (this.isLoaded) {\n apntag.resizeAd(tagId, size);\n }\n },\n\n /**\n * @param {string} targetId\n */\n off(targetId) {\n if (this.isLoaded) {\n apntag.offEvent('adLoaded', targetId);\n }\n },\n },\n utils.Events,\n);\n","import BackboneEvents from './backbone.events';\n\n/**\n * Simple syntactic sugar for easier extending objects with events\n */\nclass Eventable {}\nObject.assign(Eventable.prototype, BackboneEvents);\n\nexport default Eventable;\n","/* eslint-disable max-classes-per-file */\nimport Eventable from 'utils/eventable';\nimport { copyProperties } from 'utils/mixin';\n\nclass PluginModel extends Eventable {\n constructor(options) {\n super();\n\n this.player = null;\n this.el = null;\n\n if (typeof this.initialize === 'function') {\n this.initialize(options);\n }\n }\n\n // eslint-disable-next-line\n getName() {\n throw new Error('getName() method has to be implemented');\n }\n\n // eslint-disable-next-line\n initialize() {}\n // eslint-disable-next-line\n setup() {}\n // eslint-disable-next-line\n destroy() {}\n\n /**\n * @param {Player} player\n */\n setPlayer(player) {\n this.player = player;\n this.setup(player);\n }\n}\n\n/**\n * @param {Object} plugin\n * @return {PluginModel}\n */\nconst createClass = (plugin) => {\n class CustomPluginModel extends PluginModel {}\n copyProperties(CustomPluginModel.prototype, plugin);\n return CustomPluginModel;\n};\n\nexport { createClass };\n\nexport default PluginModel;\n","import utils from 'utils/utils';\nimport closeIcon from 'icons/close.svg';\nimport appnexus from 'player/playback/ads/appnexus-ast';\nimport pauseTemplate from './pause.html';\nimport PluginModel from './model';\n\nclass PausePlugin extends PluginModel {\n constructor(options) {\n super(options);\n\n this.maxDisplays = -1;\n this.displayCounter = 0;\n }\n}\n/**\n * Check if ad is loaded\n *\n * @param sourceMethod\n * @returns {Function}\n */\nfunction withAdTag(sourceMethod) {\n // eslint-disable-next-line consistent-return\n return function () {\n if (this.adPlacement) {\n return sourceMethod.apply(\n this,\n Array.prototype.slice.call(arguments),\n );\n }\n };\n}\n\nfunction withCounter(sourceMethod) {\n // eslint-disable-next-line consistent-return\n return function () {\n if (this.maxDisplays === -1 || this.displayCounter < this.maxDisplays) {\n return sourceMethod.apply(\n this,\n Array.prototype.slice.call(arguments),\n );\n }\n };\n}\n\nutils.extend(PausePlugin.prototype, {\n counter: 0,\n getName() {\n return 'PausePlugin';\n },\n\n resizeAd: withAdTag(function (width, height) {\n let size = width && height ? [width, height] : null;\n\n if (!size) {\n size = this.player\n .getContainer()\n .querySelector('.jw-wrapper')\n .getBoundingClientRect();\n size = [size.width, size.height];\n }\n\n appnexus.resizeTag(this.containerId, size);\n }),\n\n load: withAdTag(function (appnexusAdId) {\n this.listenTo(\n appnexus,\n 'adLoaded',\n function (adId, adData) {\n // different adId\n if (appnexusAdId !== adId) {\n return;\n }\n\n this.resizeAd();\n utils.addClass(this.el, 'svp-pause-view--visible');\n\n this.trigger('adVisible', {\n adId,\n creativeId: adData.creativeId,\n });\n\n this.isAdTagLoaded = true;\n },\n this,\n );\n\n appnexus.defineTag(appnexusAdId, this.adPlacement).then(() => {\n appnexus.showTag(appnexusAdId);\n });\n }),\n\n show: withCounter(\n withAdTag(function (data) {\n if (this.player.getState() === 'playing') return;\n const { pauseReason } = data;\n\n // undefined is returned on ie11 win7\n // settingsInteraction is triggered on mobile phones while using quality or share button\n if (\n pauseReason !== undefined &&\n pauseReason !== 'external' &&\n pauseReason !== 'settingsInteraction' &&\n this.player.model.player.getViewable() === 1\n ) {\n this.displayCounter += 1;\n\n if (this.isAdTagLoaded === true) {\n appnexus.refreshTag(this.containerId);\n } else {\n this.load(this.containerId);\n }\n }\n }),\n ),\n\n hide: withAdTag(function () {\n utils.removeClass(this.el, 'svp-pause-view--visible');\n }),\n\n /**\n * Fixing pause event triggered while interacting with scrub bar\n * @param data\n */\n onPause: withCounter(function (data) {\n let timerId = null;\n\n function onSeek() {\n if (timerId) {\n clearTimeout(timerId);\n timerId = null;\n }\n }\n\n timerId = setTimeout(() => {\n // cleanup seek listener when seek wasn't performed\n // eg regular pause button click\n this.stopListening(this.player.model, 'seek', onSeek);\n // display pause ad\n this.show(data);\n }, 50);\n\n // prevent to display pause ad when user seeked stream\n this.listenToOnce(this.player.model, 'seek', onSeek);\n }),\n\n onResumeClick() {\n this.player.play();\n utils.removeClass(this.el, 'svp-pause-view--visible');\n },\n\n setup() {\n PausePlugin.prototype.counter += 1;\n this.containerId = `svpPauseContainer${PausePlugin.prototype.counter}`;\n\n this.listenTo(\n this.player.model,\n 'playlistItem',\n function (item) {\n const { adPlacements } = item;\n\n if (adPlacements && adPlacements.pause) {\n this.maxDisplays =\n typeof adPlacements.pause.maxDisplays === 'undefined'\n ? -1\n : parseInt(adPlacements.pause.maxDisplays, 10);\n\n this.displayCounter = 0;\n this.render(adPlacements.pause);\n }\n },\n this,\n );\n\n this.listenTo(this.player.model, 'pause', this.onPause, this);\n this.listenTo(this.player, 'play', this.hide, this);\n },\n\n render(adTagOptions) {\n const appnexusAdContainerId = this.containerId;\n\n this.adPlacement = adTagOptions;\n this.el = utils.createNode(\n utils.template(pauseTemplate, {\n appnexusAdContainerId: appnexusAdContainerId,\n closeIcon: closeIcon,\n }),\n );\n\n const playButton = this.el.querySelector('.jw-icon-playback');\n const closeButton = this.el.querySelector('.svp-pause-close');\n\n if (playButton) {\n playButton.addEventListener(\n 'click',\n this.onResumeClick.bind(this),\n true,\n );\n }\n\n if (closeButton) {\n closeButton.addEventListener(\n 'click',\n (event) => {\n event.stopPropagation();\n this.hide();\n },\n true,\n );\n }\n this.player\n .getContainer()\n .querySelector('.jw-wrapper')\n .appendChild(this.el);\n\n this.listenTo(\n this.player.model.player,\n 'resize',\n function (width, height) {\n if (this.player.getState() === 'paused') {\n this.resizeAd(width, height);\n }\n },\n this,\n );\n\n this.trigger('render');\n },\n\n destroy() {\n appnexus.off(this.containerId);\n\n this.stopListening(this.player);\n this.stopListening(this.player.model);\n this.stopListening(appnexus);\n\n this.adPlacement = null;\n this.isAdTagLoaded = false;\n\n if (this.el) {\n this.player\n .getContainer()\n .querySelector('.jw-wrapper')\n .removeChild(this.el);\n this.el = null;\n }\n },\n});\n\nexport default PausePlugin;\n","import utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\n/**\n * Displays Age Limit labels in player\n *\n * @param options\n * @constructor\n */\nclass AgeLimitPlugin extends PluginModel {\n constructor(options) {\n super(options);\n this.ageLimit = options.ageLimit;\n this.hideAfter =\n options.settings && options.settings.hideAfter != null\n ? options.settings.hideAfter\n : 3000;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'AgeLimitPlugin';\n }\n\n setup() {\n this.listenToOnce(this.player, 'assetPlay', this.render, this);\n\n this.once('render', this.show, this);\n }\n\n render() {\n // return number when there is no translation available\n const ageLimit = locale.translate(\n `ageLimit-${this.ageLimit}`,\n this.ageLimit,\n );\n\n this.el = utils.createNode(`\n
\n \n \n \n \n\n ${ageLimit}\n
\n `);\n this.player.getContainer().appendChild(this.el);\n\n this.trigger('render');\n }\n\n destroy() {\n this.stopListening(this.player);\n\n if (this.el) {\n this.player.getContainer().removeChild(this.el);\n this.el = null;\n }\n }\n\n show() {\n if (this.ageLimit !== null) {\n utils.addClass(this.player.getContainer(), 'svp-display-age-limit');\n\n if (this.hideAfter) {\n this.listenToOnce(\n this.player,\n 'time',\n setTimeout.bind(null, this.hide.bind(this), this.hideAfter),\n );\n }\n }\n }\n\n hide() {\n utils.removeClass(this.player.getContainer(), 'svp-display-age-limit');\n }\n}\n\nexport default AgeLimitPlugin;\n","import utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\n/**\n * Displays sponsor label in top left corner of player\n *\n * @param options\n * @constructor\n */\nclass SponsorLabelPlugin extends PluginModel {\n constructor(options) {\n super(options);\n this.sponsor = options.sponsor;\n this.pluginName = 'SponsorLabelPlugin';\n }\n\n getName() {\n return this.pluginName;\n }\n\n setup() {\n this.listenToOnce(this.player, 'viewable', this.render, this);\n }\n\n render() {\n const adFrom = locale.translate('Ad from');\n\n if (this.sponsor) {\n this.el = utils.createNode(\n `
${adFrom} ${this.sponsor}
`,\n );\n this.player.getContainer().appendChild(this.el);\n }\n }\n\n destroy() {\n this.stopListening(this.player);\n\n if (this.el) {\n this.player.getContainer().removeChild(this.el);\n this.el = null;\n }\n }\n}\n\nexport default SponsorLabelPlugin;\n","import logger from 'utils/logger';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\nconst SVP_LOGIN_OVERLAY = 'svp-login-overlay';\n\n/**\n * @param {String} actual\n * @param {String} expected\n */\nfunction assertUppercased(actual, expected) {\n return actual && actual.toUpperCase() === expected;\n}\n\nexport function chooseVariant({ variants = {}, rangeNumber }) {\n const winner = Object.values(variants)\n .reduce((prev, { id, Percentage }, index) => {\n const percentage = Number(Percentage);\n if (index) {\n return prev.concat({\n id,\n min: prev[index - 1].max,\n max: prev[index - 1].max + percentage,\n });\n }\n return [{ id, min: 0, max: percentage }];\n }, [])\n .find(({ min, max }) => rangeNumber > min && rangeNumber < max);\n return winner && variants[winner.id];\n}\n\nexport function prepareVariantsForExperiment(metadata = {}) {\n const variantIds = metadata.variants && metadata.variants.split(',');\n const experimentMetadataKeys = Object.keys(metadata).filter((key) =>\n key.match(/^\\d+variant/g),\n );\n\n return experimentMetadataKeys.reduce((prev, current) => {\n const [, id, , key] = /^(\\d+)(variant)(\\D+)/g.exec(current);\n if (variantIds.includes(id)) {\n prev[id] = Object.assign(prev[id] || {}, {\n id,\n [key]: metadata[current],\n });\n }\n return prev;\n }, {});\n}\n\nfunction isLoginVariantType(variant = {}) {\n return assertUppercased(variant.Type, 'LOGIN');\n}\n\nfunction isSubscriptionVariantType(variant = {}) {\n return assertUppercased(variant.Type, 'SUBSCRIPTION');\n}\n\nconst getUiElementId = (provider, articleUrl, assetId) =>\n `sdrn:${provider}:article:${articleUrl}:element:${assetId}`;\n\nclass PodcastExperimentPlugin extends PluginModel {\n constructor({ id, variant }, { loginUrl, subscriptionUrl, articleUrl }) {\n super({ id, variant });\n this.id = id;\n this.variant = variant;\n this.loginUrl = loginUrl;\n this.subscriptionUrl = subscriptionUrl;\n this.articleUrl = articleUrl;\n this.pluginName = 'PodcastExperimentPlugin';\n }\n\n getName() {\n return this.pluginName;\n }\n\n setup() {\n logger('ExperimentPlugin').log('setup', this);\n this.listenToOnce(this.player, 'viewable', this.render, this);\n }\n\n /**\n * @returns {string}\n */\n getButtonText() {\n const { variant = {} } = this;\n const translate = locale.translate('player');\n\n if (isLoginVariantType(variant)) {\n return translate.loginToListen;\n }\n if (isSubscriptionVariantType(variant)) {\n return translate.subscribeToListen;\n }\n return translate.listen;\n }\n\n render() {\n const { variant, loginUrl, subscriptionUrl, articleUrl, player } = this;\n const { id, provider } = player.asset.attributes;\n const jwPlayer = player.model.player;\n const container = jwPlayer.getContainer();\n const buttonText = this.getButtonText();\n const uiElementId = getUiElementId(\n provider,\n encodeURIComponent(articleUrl),\n id,\n );\n const pulseStatsPlugin = player.plugins.PulseStats;\n\n function trackEngagement() {\n if (pulseStatsPlugin) {\n pulseStatsPlugin.track('Engagement podcast experiment', {\n provider: { productType: 'Web' },\n type: 'Engagement',\n object: {\n '@id': uiElementId,\n type: 'UIElement',\n name: buttonText,\n },\n });\n }\n }\n\n if (pulseStatsPlugin) {\n pulseStatsPlugin.playbackEvents.once('Load', () => {\n pulseStatsPlugin.track('View podcast experiment', {\n provider: { productType: 'Web' },\n type: 'View',\n object: {\n '@id': uiElementId,\n type: 'UIElement',\n name: buttonText,\n },\n });\n });\n }\n\n if (!variant) {\n player.once('initialPlay', () => {\n trackEngagement();\n });\n return;\n }\n\n const redirectUrl = isLoginVariantType(variant)\n ? loginUrl\n : subscriptionUrl;\n\n const linkAnchor = document.createElement('a');\n const linkSpan = document.createElement('span');\n linkSpan.classList.add('svp-login-button');\n linkSpan.appendChild(document.createTextNode(buttonText));\n linkAnchor.appendChild(linkSpan);\n linkAnchor.classList.add(SVP_LOGIN_OVERLAY);\n linkAnchor.setAttribute('href', redirectUrl);\n\n container.appendChild(linkAnchor);\n }\n\n destroy() {\n this.stopListening(this.player);\n const jwPlayer = this.player.model.player;\n const container = jwPlayer.getContainer();\n\n const experimentOverlay = container.querySelector(\n `.${SVP_LOGIN_OVERLAY}`,\n );\n if (experimentOverlay) {\n experimentOverlay.parentNode.removeChild(experimentOverlay);\n }\n\n logger('ExperimentPlugin').log('destroy', this);\n }\n}\n\nexport default PodcastExperimentPlugin;\n","import utils from 'utils/utils';\nimport ServerTime from 'utils/server-time';\nimport config from 'player/config';\nimport locale from 'player/model/locale';\n\nimport countdownTemplate from './countdown.html';\nimport PluginModel from './model';\n\nconst PLAYLIST_REGENERATION_THRESHOLD = 5; // in seconds\n\n/**\n * Format number by adding leading zeros eg 7 -> 07\n *\n * @param numValue\n * @param numLen\n * @returns {string}\n */\nconst leadingZeros = (numValue, numLen) => {\n const length = numLen || 2;\n let num = String(numValue);\n\n while (num.length < length) {\n num = `0${num}`;\n }\n\n return num;\n};\n\n/**\n * Renders countdown clock for streams which are not published yet\n *\n * @param options\n * @constructor\n */\nclass CountdownPlugin extends PluginModel {\n constructor(options) {\n super(options);\n\n /**\n * Start date for stream (flightTime.start)\n * Javascript Date object\n */\n this.streamStart = options.streamStart;\n\n this.liveDOM = null;\n this.countdownDOM = null;\n\n this.isPlaylistRegenerated = false;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'countdown';\n }\n\n setup() {\n this.listenTo(this.player, 'playlistItem', this.render, this);\n }\n\n /**\n * Cleanup old node\n */\n destroy() {\n this.stopListening(this.player);\n\n if (this.el) {\n this.player.getContainer().removeChild(this.el);\n this.el = null;\n }\n }\n\n /**\n * Render countdown\n */\n render() {\n try {\n this.player.getContainer();\n } catch (error) {\n return;\n }\n\n this.el = utils.createNode(utils.template(countdownTemplate));\n this.player.getContainer().appendChild(this.el);\n\n utils.addClass(this.player.getContainer(), 'svp-countdown-loaded');\n\n // cached live label dom element\n // eslint-disable-next-line prefer-destructuring\n this.liveDOM = this.el.getElementsByClassName('svp-live-label')[0];\n // eslint-disable-next-line prefer-destructuring\n this.countdownDOM = this.el.getElementsByClassName(\n 'svp-countdown-live-timer',\n )[0];\n\n // countdown is ready\n this.trigger('ready');\n // start event runs on first change of countdown\n this.once('change', () => this.trigger('start'));\n\n // interval has to be initialized on\n this.intervalId = setInterval(() => this.refresh(), 1000);\n this.refresh();\n }\n\n /**\n * Refresh state and repaint\n */\n async refresh() {\n if (!this.diff) {\n this.diff = this.getDiff();\n }\n\n if (this.diff <= 0) {\n this.stop();\n }\n\n const string = [];\n\n if (this.isCountdownActive()) {\n const minutes = Math.floor(this.diff / 60) % 60;\n const seconds = this.diff % 60;\n\n string.push(`${leadingZeros(minutes)}:`);\n string.push(\n `${leadingZeros(seconds)}s`,\n );\n\n if (this.currentState !== 'timer') {\n this.currentState = 'timer';\n this.liveDOM.innerHTML = locale.translate(\n 'Video will start in',\n );\n\n utils.addClass(\n this.player.getContainer(),\n 'svp-countdown-active',\n );\n }\n } else if (this.currentState !== 'date') {\n this.currentState = 'date';\n\n string.push(\n `${this.streamStart.getDate()}. ${locale\n .getMonthName(this.streamStart)\n .toLowerCase()} `,\n );\n string.push(`${leadingZeros(this.streamStart.getHours())}:`);\n string.push(leadingZeros(this.streamStart.getMinutes()));\n\n this.liveDOM.innerHTML = locale.translate('Video will start at');\n }\n\n if (string.length > 0) {\n this.countdownDOM.innerHTML = string.join('');\n this.trigger('change', this.streamStart);\n }\n\n // sync server time every 60s\n if (this.diff % 60 === 0) {\n await ServerTime.fetch(config.time);\n const newDiff = this.getDiff();\n if (Math.abs(newDiff - newDiff) > 1) {\n this.diff = newDiff;\n }\n }\n\n if (this.shouldRegeneratePlaylist()) {\n setTimeout(this.regeneratePlaylist.bind(this), 0);\n }\n\n this.diff -= 1;\n }\n\n shouldRegeneratePlaylist() {\n return (\n this.player.model.getStream().isSecure() &&\n this.diff <= PLAYLIST_REGENERATION_THRESHOLD &&\n !this.isPlaylistRegenerated\n );\n }\n\n /**\n * Regenerate playlist to update tokens for secured streams\n * @return {Promise}\n */\n async regeneratePlaylist() {\n this.isPlaylistRegenerated = true;\n const { model } = this.player;\n const { playlist } = await model.getConfig();\n model.player.load(playlist);\n }\n\n /**\n * End of countdown\n */\n stop() {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n\n this.intervalId = null;\n this.el.parentNode.removeChild(this.el);\n this.el = null;\n\n utils.removeClass(this.player.getContainer(), [\n 'svp-countdown-active',\n 'svp-countdown-loaded',\n ]);\n\n this.trigger('end');\n }\n\n /**\n * Get difference between stream start and current server time\n * @returns {number}\n */\n getDiff() {\n return Math.ceil(\n (this.streamStart.getTime() - ServerTime.getTime()) / 1000,\n );\n }\n\n /**\n * Check whatever countdown or date should be displayed\n * Countdown is active when less than 1 hour reminded to start\n * @returns {boolean}\n */\n isCountdownActive() {\n // less than 1 hour\n return this.diff < 60 * 60 - 1;\n }\n}\n\nexport default CountdownPlugin;\n","import utils from 'utils/utils';\nimport image from 'utils/image';\nimport Recommended from 'player/model/recommended';\nimport closeIcon from 'icons/close.svg';\nimport nextIcon from 'icons/chevron-right.svg';\nimport recommendedTemplate from './recommended/recommended.html';\nimport nextAssetTemplate from './recommended/next-asset.html';\nimport gridTemplate from './recommended/grid.html';\nimport PluginModel from './model';\n\n/**\n * Play next asset from the list\n *\n * @param {number} assetId - SVP Asset id\n * @param {string} source - source of playnext (auto - when autoplay next, single, grid)\n */\nfunction playNext(assetId, source) {\n const clear = () => {\n utils.removeClass(this.el, [\n 'is-grid-visible',\n 'is-next-visible',\n 'is-counting',\n 'is-next-closing',\n ]);\n };\n\n this.stopListening(this.player, 'complete');\n\n // autoplay of asset can be turned off from config\n if (this.settings.autoplay !== false) {\n this.player.playNext(assetId);\n }\n\n // nextAsset case, triggered by autoplay or user\n if (source === 'single' || source === 'auto') {\n this.trigger(\n 'nextAssetPlay',\n this.nextAsset,\n source === 'auto' ? 'auto' : 'click',\n {\n source: this.nextAssetSource,\n },\n );\n\n utils.addClass(this.el, 'is-next-closing');\n setTimeout(clear, 700);\n } else {\n // grid click\n this.trigger('playRecommended', assetId);\n clear();\n }\n}\n\n/**\n * Turn off autoplay of recommended next asset\n */\nfunction disableNext() {\n this.trigger('nextAssetClose', this.nextAsset);\n this.nextAsset = null;\n utils.removeClass(this.el, [\n 'is-next-visible',\n 'is-counting',\n 'is-next-visible',\n ]);\n}\n\n/**\n * Retrieve full url for play next and grid assets thumbnails\n *\n * @param {string} key\n * @returns {string|null}\n */\nfunction getThumbnailUrl(key) {\n return image.getImageSrc(key, 'poster', 200);\n}\n\n/**\n * Add snap scroll for mobile grid\n */\nfunction initSnapScroll() {\n const scrollSnapPrefix = utils.getScrollSnapPrefix();\n const gridItem = this.getByClass('svp-player-recommended-item')[0];\n\n // check if snap points are supported\n if (scrollSnapPrefix !== false) {\n this.el.style[`${scrollSnapPrefix}scroll-snap-type`] = 'mandatory';\n this.el.style[`${scrollSnapPrefix}scroll-snap-points-x`] =\n `repeat(${gridItem.clientWidth}px)`;\n }\n}\n\n/**\n * Click handler for recommended grid\n *\n * @param {HTMLElement} node\n */\nfunction onGridItemClicked(node) {\n utils.addClass(node, 'svp-to-active');\n\n this.listenToOnce(\n this.player,\n 'assetPlay',\n function () {\n utils.removeClass(\n this.player.getContainer(),\n 'is-recommended-grid-visible',\n );\n },\n this,\n );\n\n setTimeout(() => {\n playNext.call(this, parseInt(node.dataset.id, 10), 'grid');\n utils.removeClass(this.el, 'is-grid-visible');\n }, 500);\n}\n\n/**\n * Fetch recommended assets when player is ready\n */\nfunction onPlaybackStart() {\n const recommended = new Recommended({\n asset: this.player.getAsset({\n shouldLogDeprecatedWarning: false,\n }),\n });\n\n // restore default state for each new asset\n this.gridItemsReady = false;\n\n // turn off option for grid\n if (this.settings.grid !== false) {\n recommended\n .getItems()\n .then((items) => {\n if (Array.isArray(items) && items.length > 0) {\n this.gridItemsReady = true;\n this.trigger('gridItemsReady', items);\n } else {\n utils.removeClass(\n this.player.getContainer(),\n 'is-recommended-grid-visible',\n );\n }\n })\n .catch(() => {\n try {\n utils.removeClass(\n this.player.getContainer(),\n 'is-recommended-grid-visible',\n );\n } catch (e) {\n // player container not available\n }\n });\n }\n\n // next asset is available by default but can be turned off\n if (this.settings.next !== false) {\n if (this.nextAsset) {\n this.trigger('nextAssetReady', this.nextAsset, {\n source: this.nextAssetSource,\n });\n return;\n }\n\n recommended\n .getNextAsset(this.settings.next)\n .then(({ nextAsset, source }) => {\n this.nextAsset = nextAsset;\n this.nextAssetSource = source;\n\n this.trigger('nextAssetReady', this.nextAsset, {\n source,\n });\n })\n .catch(() => {\n if (this.el) {\n utils.removeClass(this.el, [\n 'is-next-visible',\n 'is-counting',\n 'is-next-closing',\n ]);\n }\n });\n }\n}\n\n/**\n * Initialize lazy fetching\n */\nfunction onInitialize() {\n // fetch recommended 5s before countdown time\n let fetchDuration = this.player.getDuration() - this.countdownTime - 5;\n\n // for streams shorter than 15s load next in 2s\n if (fetchDuration < 0) {\n fetchDuration = 2;\n }\n const stream = this.player.model.getStream();\n const isLive = stream.isLive();\n const isDisabledNextVideo = stream.isDisabledNextVideo();\n const hasPlaylist = stream.hasPlaylist();\n const isAssetFromPlaylist = this.player.model.isAssetFromPlaylist(\n stream.getId(),\n );\n\n // do not enable recommended for live streams and asset with metadata.disableNextVideo set to true\n if (\n !isLive &&\n !isDisabledNextVideo &&\n !hasPlaylist &&\n !isAssetFromPlaylist\n ) {\n this.listenTo(\n this.player,\n 'time',\n function (time) {\n if (fetchDuration > 0 && time > fetchDuration) {\n fetchDuration = -1;\n onPlaybackStart.call(this);\n }\n },\n this,\n );\n }\n}\n\n/**\n * Handler for stream end (countdown end) event\n * Stream complete can't be used due to circular events triggering\n * @param {string} reason\n */\nfunction onPlaybackComplete(reason) {\n const stream = this.player.model.getStream();\n const isAssetFromPlaylist = this.player.model.isAssetFromPlaylist(\n stream.getId(),\n );\n\n // do not take any action if complete is triggered by playNext\n if (\n stream.hasPlaylist() ||\n isAssetFromPlaylist ||\n reason === 'manualNext' ||\n reason === 'stop'\n ) {\n return;\n }\n\n if (this.nextAsset) {\n this.trigger('nextAssetComplete', this.nextAsset);\n playNext.call(this, this.nextAsset.getId(), 'auto');\n } else if (this.gridItemsReady) {\n // display grid only when items are available\n utils.addClass(this.el, 'is-grid-visible');\n utils.addClass(\n this.player.getContainer(),\n 'is-recommended-grid-visible',\n );\n\n initSnapScroll.call(this);\n this.trigger('gridVisible');\n }\n}\n\n/**\n * Handler for checking time in which playNext should be available\n * @param {number} time\n * @param {number} duration\n */\nfunction onTimeNextVisible(time, duration) {\n if (duration - time < this.countdownTime) {\n this.trigger('playNextVisible', Math.floor(duration - time));\n }\n}\n\n/**\n * Display play next in given time\n *\n * @param {number} timeout - duration of countdown\n */\nfunction onPlayNextVisible(timeout) {\n // Don't present play next for audio assets as it isn't prepared\n const asset = this.player.getAsset({\n shouldLogDeprecatedWarning: false,\n });\n if (asset.isAudio()) {\n return;\n }\n\n utils.addClass(this.el, ['is-next-visible', 'is-counting']);\n\n this.stopListening(this.player, 'time', onTimeNextVisible);\n // update transition duration as it may be smaller than default due to seek\n this.getByClass(\n 'svp-player-recommended-countdown',\n )[0].style.transitionDuration = `${timeout}s`;\n}\n\n/**\n * Handler triggered when nextAsset is available for current stream\n */\nfunction onNextAssetReady() {\n const img = new Image();\n // prefetch image\n img.src = getThumbnailUrl(this.nextAsset.getThumbnail());\n\n this.listenTo(this.player, 'time', onTimeNextVisible, this);\n\n this.getByClass('svp-player-recommended-next')[0].innerHTML =\n utils.template(nextAssetTemplate, {\n next: this.nextAsset,\n countdown: this.countdownTime, // default countdown\n getThumbnail: getThumbnailUrl,\n closeIcon: closeIcon,\n nextIcon: nextIcon,\n });\n\n this.getByClass('svp-player-recommended-image')[0].addEventListener(\n 'click',\n playNext.bind(this, this.nextAsset.getId(), 'single'),\n );\n\n this.getByClass('svp-player-recommended-close')[0].addEventListener(\n 'click',\n disableNext.bind(this),\n );\n}\n\n/**\n * Triggered when grid items are available\n * @param {Asset[]} recommended\n */\nfunction onGridItemsReady(recommended) {\n this.getByClass('svp-player-recommended-grid')[0].innerHTML =\n utils.template(gridTemplate, {\n recommended: recommended,\n getThumbnail: getThumbnailUrl,\n utils: utils,\n });\n\n utils.each(this.getByClass('svp-player-recommended-item'), (item) => {\n item.addEventListener('click', onGridItemClicked.bind(this, item));\n });\n}\n\n/**\n * Triggered when recommended grid is displayed\n */\nfunction onGridVisible() {\n // replay asset triggers play\n // clicking on grid not intersects with this\n this.listenToOnce(\n this.player,\n 'play',\n this.trigger.bind(this, 'assetReplay'),\n );\n}\n\n/**\n * Event fired when user decided to restart video\n */\nfunction onAssetReplay() {\n // attach events to allow again display of grid\n this.setup();\n // cleanup state\n utils.removeClass(\n this.player.getContainer(),\n 'is-recommended-grid-visible',\n );\n utils.removeClass(this.el, [\n 'is-grid-visible',\n 'is-next-visible',\n 'is-counting',\n 'is-next-closing',\n ]);\n}\n\n/**\n * Renders countdown clock for streams which are not published yet\n *\n * @param options\n * @constructor\n */\nclass RecommendedPlugin extends PluginModel {\n constructor(options) {\n super(options);\n\n // time in seconds from end of stream\n this.countdownTime =\n (options.settings &&\n options.settings.next &&\n options.settings.next.countdown) ||\n 10;\n this.nextAsset = null;\n this.settings = utils.extend(\n {\n grid: true,\n next: {},\n },\n options.settings,\n );\n\n // check if grid items are available\n this.gridItemsReady = false;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'RecommendedPlugin';\n }\n\n setup() {\n // assetPlay\n this.stopListening(this.player);\n this.listenToOnce(this.player, 'assetPlay', this.render, this);\n this.listenToOnce(this.player, 'assetPlay', onInitialize, this);\n this.listenToOnce(this.player, 'complete', onPlaybackComplete, this);\n\n this.once('playNextVisible', onPlayNextVisible, this);\n this.once('nextAssetReady', onNextAssetReady, this);\n this.once('gridItemsReady', onGridItemsReady, this);\n this.once('gridVisible', onGridVisible, this);\n this.once('assetReplay', onAssetReplay, this);\n }\n\n /**\n * Get current element child node by class name\n *\n * @param className\n * @returns {NodeList|*}\n */\n getByClass(className) {\n return this.el.getElementsByClassName(className);\n }\n\n /**\n * Render default view holder for play next and recommended\n *\n */\n render() {\n const container = this.player.getContainer();\n const previousEl = container.getElementsByClassName(\n 'svp-player-recommended-box',\n );\n\n // clean if previously grid was displayed\n utils.removeClass(\n this.player.getContainer(),\n 'is-recommended-grid-visible',\n );\n\n // cleanup old element\n // recommended is \"async\" so it can't be destroyed like normal plugin\n if (previousEl.length > 0) {\n container.removeChild(previousEl[0]);\n }\n\n this.el = utils.createNode(utils.template(recommendedTemplate));\n\n container.appendChild(this.el);\n }\n}\n\nexport default RecommendedPlugin;\n","import Eventable from 'utils/eventable';\n\n/**\n * @typedef AdEventsAdData\n * @property {string} id\n * @property {false|number[]} adSequenceDuration\n * @property {number} duration integer\n * @property {number} position integer\n * @property {number} sequence ad sequence position\n * @property {number} count\n * @property {boolean} start\n * @property {string} type\n */\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop\n */\nclass AdEvents extends Eventable {\n constructor(player) {\n super();\n this.player = player;\n /**\n * @type {AdEventsAdData}\n */\n this.adData = { adSequenceDuration: false };\n this.beforeUnload = [\n 'onpagehide' in window.self ? 'pagehide' : 'beforeunload',\n this.onAdSlotComplete.bind(this),\n true,\n ];\n\n this.listenTo(this.player, 'playlistItem', this.onPlaylistItem, this);\n this.listenTo(this.player, 'adSlotStart', this.onAdSlotStart, this);\n this.listenTo(this.player, 'adStarted', this.onAdStarted, this);\n this.listenTo(this.player, 'adError', this.onAdError, this);\n this.listenTo(this.player, 'adProgress', this.onAdProgress, this);\n this.listenTo(\n this.player,\n 'adSlotComplete',\n this.onAdSlotComplete,\n this,\n );\n this.listenTo(this.player, 'adFinished', this.onAdFinished, this);\n\n this.listenTo(this.player, 'adPause', this.onAdPause, this);\n this.listenTo(this.player, 'adPlay', this.onAdPlay, this);\n\n this.listenTo(\n this.player,\n 'PausePlugin:adVisible',\n this.onPauseAdVisible,\n this,\n );\n\n this.listenTo(this.player, 'playlistItem', () => {\n this.adData.adSequenceDuration = false;\n });\n\n window.addEventListener(...this.beforeUnload);\n }\n\n onPlaylistItem() {\n this.listenToOnce(this.player, 'complete', this.onAdSlotComplete, this);\n }\n\n onAdSlotStart(slotData) {\n Object.assign(this.adData, {\n type: slotData.position,\n });\n }\n\n onAdProgress(time) {\n if (!this.adData.id) {\n return;\n }\n\n const position = Math.floor(time);\n\n Object.assign(this.adData, {\n position,\n });\n }\n\n onAdError(adErrorData) {\n this.sendAttemptEvent(adErrorData);\n }\n\n onAdSlotComplete() {\n this.sendStopEvent();\n window.removeEventListener(...this.beforeUnload);\n }\n\n onAdFinished() {\n this.sendStopEvent();\n }\n\n onAdStarted({ meta: adData }) {\n Object.assign(this.adData, {\n start: true,\n });\n\n // adData is missing from homad events\n if (!adData) {\n return;\n }\n\n Object.assign(this.adData, {\n id: adData.adId,\n sequence: adData.sequence,\n count: adData.podcount,\n position: 0,\n });\n\n if (!this.adData.adSequenceDuration) {\n this.adData.adSequenceDuration = Array(adData.podcount);\n }\n\n const adType = adData?.adschedule?.offset;\n // Preroll ads only\n if (adType === 'pre' && adData.duration) {\n this.adData.adSequenceDuration[adData.sequence - 1] =\n adData.duration;\n }\n }\n\n onAdPlay() {\n this.trigger('Play', this.adData);\n // start indicates first play of ad\n this.adData.start = false;\n }\n\n onAdPause() {\n this.trigger('Pause', this.adData);\n }\n\n onPauseAdVisible(data) {\n this.trigger('View', {\n id: data.creativeId,\n type: 'Pausead',\n });\n }\n\n sendStopEvent() {\n if (this.adData.id) {\n this.trigger('Stop', {\n ...this.adData,\n duration: this.adData.position,\n });\n // keep adSequenceDuration for playback tracking purposes\n this.adData = {\n adSequenceDuration: this.adData.adSequenceDuration,\n };\n }\n }\n\n sendAttemptEvent(adErrorData) {\n this.trigger('Attempt', {\n ...this.adData,\n id: '000000',\n position: 0,\n type: adErrorData?.adposition\n ? `${adErrorData.adposition}roll`\n : undefined,\n sequence: 1,\n count: 0,\n adSequenceDuration: [0],\n });\n }\n\n destroy() {\n window.removeEventListener(...this.beforeUnload);\n this.stopListening();\n }\n}\n\nexport default AdEvents;\n","export default {};\n","import Eventable from 'utils/eventable';\nimport utils from 'utils/utils';\nimport session from './session';\nimport { isCustomIntervalFalsy } from './helpers';\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop, Watch\n */\nclass PlaybackEvents extends Eventable {\n constructor(player, options) {\n super();\n this.player = player;\n this.watchData = {\n time: 0,\n duration: -1,\n };\n\n this.previousTime = -1;\n\n this.session = this.createSession();\n this.beforeStreamStart = true;\n this.beforeUnload = [\n 'onpagehide' in window.self ? 'pagehide' : 'beforeunload',\n this.onBeforeUnload.bind(this),\n true,\n ];\n this.playMethod = null;\n\n this.vodInterval = options?.vodInterval;\n this.liveInterval = options?.liveInterval;\n\n this.listenTo(this.player, 'playlistItem', this.onPlaylistItem, this);\n this.listenTo(this.player, 'assetPlay', this.onAssetPlay, this);\n this.listenTo(this.player, 'pause', this.onPause, this);\n this.listenTo(this.player, 'play', this.onPlay, this);\n this.listenTo(this.player, 'playNext', this.onPlayNext, this);\n\n if (this.stream.isLive()) {\n this.listenTo(this.player, 'time', this.onLiveTime, this);\n } else {\n this.listenTo(this.player, 'time', this.onTime, this);\n }\n\n this.listenTo(\n this.player,\n 'RecommendedPlugin:nextAssetPlay',\n (asset, mode, opts) => {\n let playbackSource =\n mode === 'auto' ? 'autoplayNext' : 'manualNext';\n if (opts.source && opts.source !== 'byId') {\n playbackSource += `-${opts.source}`;\n }\n return this.onRecommendedPlay(playbackSource);\n },\n );\n\n this.listenTo(this.player, 'nextAutoAdvance', () =>\n this.onRecommendedPlay('autoplayNext-playlist'),\n );\n\n this.listenTo(this.player, 'nextClick', () =>\n this.onRecommendedPlay('manualNext-playlist'),\n );\n\n this.listenTo(this.player, 'relatedReady', () => {\n if (!this.jwRelatedPlugin) {\n return;\n }\n this.jwRelatedPlugin.on('feedClick', () => {\n this.beforeStreamStart = false;\n this.onComplete();\n this.onRecommendedPlay('manualNext-playlist');\n });\n });\n\n this.listenTo(this.player, 'playlistComplete', () => {\n this.listenToOnce(this.player, 'displayClick', () =>\n this.onRecommendedPlay('manualNext-playlist'),\n );\n });\n\n this.listenTo(this.player, 'RecommendedPlugin:playRecommended', () => {\n this.onRecommendedPlay('manualNext-grid');\n });\n\n this.listenToOnce(this.player, 'play', ({ playReason }) => {\n this.playMethod = playReason;\n });\n\n window.addEventListener(...this.beforeUnload);\n }\n\n get eventData() {\n const data = {\n playMethod: this.playMethod,\n };\n const { previousAssetId } = this.session;\n\n if (previousAssetId) {\n data.previousAssetId = previousAssetId;\n data.playbackSource = this.session.playbackSource;\n }\n\n data.duration = this.watchData.duration;\n\n try {\n data.position = Math.floor(this.player.getCurrentTime());\n } catch (e) {\n // could not parse time\n // do not set any value in this case\n }\n\n return data;\n }\n\n get stream() {\n try {\n return this.player.config.stream || {};\n } catch (e) {\n return {};\n }\n }\n\n get jw() {\n try {\n return this.player.model.player || {};\n } catch (e) {\n return {};\n }\n }\n\n get jwRelatedPlugin() {\n try {\n return this.jw.getPlugin('related') || null;\n } catch (e) {\n return null;\n }\n }\n\n getPosition() {\n try {\n return Math.floor(this.player.getCurrentTime());\n } catch (e) {\n return 0;\n }\n }\n\n createSession() {\n // node is unique player identifier\n const node = this.player.config.get('node');\n const id = node.id || node;\n\n /**\n * Initialize session object to keep reference\n */\n if (!session[id]) {\n session[id] = {};\n }\n\n return session[id];\n }\n\n trackTimeEvent({ time, defaultInterval = 1, customInterval }) {\n const eventInterval = utils.isNumber(customInterval)\n ? customInterval\n : defaultInterval;\n\n // track event data with one second interval\n if (time % 1 === 0 && this.previousTime !== time) {\n this.watchData.duration += 1;\n this.previousTime = time;\n }\n\n if (time % eventInterval === 0 && this.watchData.time !== time) {\n this.watchData.time = time;\n\n // skip when custom interval is turned off\n if (isCustomIntervalFalsy(customInterval)) {\n return;\n }\n\n this.trigger(\n 'Watch',\n Object.assign(this.eventData, {\n position: time,\n }),\n );\n }\n }\n\n onBeforeUnload() {\n if (this.beforeStreamStart === false) {\n this.onComplete();\n }\n }\n\n onPlaylistItem() {\n this.listenToOnce(\n this.player,\n 'complete nextClick',\n this.onComplete,\n this,\n );\n const track = this.trigger.bind(\n this,\n 'Load',\n Object.assign(this.eventData, {\n position: this.stream.getPlaybackTime('begin') || 0,\n duration: 0,\n }),\n );\n\n /**\n * Only first playback has to wait for viewable event\n * Playnext/grid will work without it\n */\n if (this.session.wasViewed === true) {\n track();\n } else {\n // wait for player to be viewable\n this.listenTo(this.player.model.player, 'viewable', (data) => {\n if (data.viewable) {\n track();\n this.stopListening(this.player.model.player, 'viewable');\n this.session.wasViewed = true;\n }\n });\n }\n\n this.previousAssetId = null;\n }\n\n onAssetPlay() {\n this.beforeStreamStart = false;\n\n return this.trigger(\n 'Play',\n Object.assign(this.eventData, {\n start: true,\n duration: 0,\n }),\n );\n }\n\n onPause() {\n this.trigger('Pause', this.eventData);\n }\n\n onPlay() {\n // play can't be triggered before assetPlay\n if (!this.beforeStreamStart) {\n this.trigger('Play', this.eventData);\n }\n }\n\n /**\n * Intervals for VOD are defined as follow\n *\n * every 5s - during the first 10 seconds of content playback (no matter of where playback has started)\n * every 10s - for the range (10-60s) of content playback, after seeking intervals should be triggered in same time\n * every 30s - for the rest\n * seek 42, then first trigger should be in 50\n */\n onTime(eventTime) {\n const time = Math.floor(eventTime);\n let eventInterval;\n\n if (eventTime <= 10) {\n eventInterval = 5;\n } else if (eventTime <= 120) {\n eventInterval = 10;\n } else {\n eventInterval = 30;\n }\n this.trackTimeEvent({\n time,\n defaultInterval: eventInterval,\n customInterval: this.vodInterval,\n });\n }\n\n /**\n * Track live events by checking time from flight time to current date\n * DVR seek is also included in calculations\n */\n onLiveTime() {\n // after playback stars time to start will be negative\n // add DVR shift from playback\n const eventTime = Math.floor(\n this.stream.getTimeToStart() * -1 + this.jw.getPosition(),\n );\n // constant tracking interval\n this.trackTimeEvent({\n time: eventTime,\n defaultInterval: 30,\n customInterval: this.liveInterval,\n });\n }\n\n onComplete(reason) {\n if (reason === 'manualNext') {\n this.onRecommendedPlay('manualNext');\n }\n\n /**\n * Track stop event only when playback has started\n */\n if (this.beforeStreamStart === false) {\n this.trigger('Stop', this.eventData);\n // store asset id in memory to attach it to play next video\n this.session.previousAssetId = this.stream.getId();\n }\n this.beforeStreamStart = true;\n }\n\n /**\n * @param {Number} id\n * @param {Object} [options]\n * @param {Object} [options.pulse]\n * @param {String} [options.source] - A source that will be added as a playback source for pulse metrics\n */\n onPlayNext(id, options) {\n if (options && options.pulse) {\n Object.assign(this.session, options.pulse);\n }\n }\n\n onRecommendedPlay(playbackSource) {\n this.session.playbackSource = playbackSource;\n }\n\n destroy() {\n window.removeEventListener(...this.beforeUnload);\n this.stopListening();\n }\n}\n\nexport default PlaybackEvents;\n","/**\n * Returns true when custom interval is set to false, null or 0\n * @param customInterval\n * @return {boolean}\n */\nexport function isCustomIntervalFalsy(customInterval) {\n return customInterval !== undefined && !customInterval;\n}\n","import Eventable from 'utils/eventable';\n\n/**\n * Parse SVP Player events and tailor data to pulse requirements\n *\n * Available events: Play, Pause, Stop, Watch\n */\nclass UiEvents extends Eventable {\n constructor(player) {\n super();\n this.player = player;\n this.listenTo(this.player, 'ready', this.onReady, this);\n\n this.listenTo(\n this.player,\n 'RecommendedPlugin:playNextVisible',\n this.onRecommendedVisible,\n this,\n );\n\n this.listenTo(\n this.player,\n 'nextShown',\n this.onRecommendedVisible,\n this,\n );\n }\n\n onRecommendedVisible(event) {\n if (event.ui === 'nextup') {\n this.trigger('UiElement', {\n id: this.player\n .getAsset({\n shouldLogDeprecatedWarning: false,\n })\n .getId(),\n name: 'nextAssetCountdown',\n });\n }\n }\n\n destroy() {\n this.stopListening();\n }\n}\n\nexport default UiEvents;\n","import config from 'player/config';\n\nclass CategoryTree {\n /**\n * @param {string} vendor\n */\n constructor(vendor) {\n this.vendor = vendor;\n }\n\n /**\n * @returns {Promise>}\n */\n fetch() {\n if (!this.request) {\n this.request = fetch(config.api.getUrl(this.vendor, '/categories'))\n .then((response) => response.json())\n .then((response) => {\n // eslint-disable-next-line\n if (response && response._embedded.categories) {\n // eslint-disable-next-line\n return response._embedded.categories;\n }\n\n return [];\n })\n .then((categories) => {\n this.categories = new Map(\n categories.map((category) => [category.id, category]),\n );\n });\n }\n return this.request;\n }\n\n /**\n * @param {number} categoryId\n * @returns {SvpCategory[]}\n */\n getPath(categoryId) {\n const path = [];\n let category = this.categories?.get(categoryId);\n\n if (category) {\n path.push(category);\n\n while (category.parentId !== 0) {\n category = this.categories?.get(category.parentId);\n path.unshift(category);\n }\n }\n\n return path;\n }\n}\n\n/**\n * @type {Record}\n */\nconst instances = {};\n\n/**\n * @param {string} vendor\n * @returns {CategoryTree}\n */\nexport default (vendor) => {\n if (!instances[vendor]) {\n instances[vendor] = new CategoryTree(vendor);\n }\n\n return instances[vendor];\n};\n","import { capitalizeFirstLetter } from 'utils/string';\nimport logger from 'utils/logger';\nimport utils from 'utils/utils';\nimport { isEmpty } from 'utils/underscore';\nimport configuration from 'player/config';\nimport PluginModel from './model';\nimport PulseTracker from './pulse-stats/tracker';\nimport AdEvents from './pulse-stats/ad-events';\nimport PlaybackEvents from './pulse-stats/playback-events';\nimport UiEvents from './pulse-stats/ui-events';\nimport CategoryTree from '../model/category-tree';\n\n/**\n * Retrieve tags from asset\n * @param asset\n */\nconst getTags = (asset) =>\n (asset.get('tags') || [])\n .filter((tag) => utils.isObject(tag) || !isEmpty(tag.tag))\n .map(({ tag }) => tag);\n\nexport const getMediaAssetId = (provider, mediaId) =>\n `sdrn:${provider}:mediaasset:${mediaId}`;\n\n/**\n * @param {string[]} accessControl\n * @param {string} provider\n * @param {{variant: {type: 'Subscription' | 'Login'}}} experiment\n * @returns {'Free' | 'Login' | 'Paid'}\n */\nexport const getAssetLevel = (accessControl, provider, experiment) => {\n if (accessControl.length > 0) {\n if (\n accessControl.includes('login') ||\n // special case for vgtv configuration - premium is login :)\n (provider === 'vgtv' && accessControl.includes('premium'))\n ) {\n return 'Login';\n }\n return 'Paid';\n }\n if (experiment?.variant?.Type) {\n if (experiment.variant.Type === 'Subscription') {\n return 'Paid';\n }\n if (experiment.variant.Type === 'Login') {\n return 'Login';\n }\n }\n return 'Free';\n};\n\n/**\n * @param {string[]} accessControl\n * @param {{variant: {type: 'Subscription' | 'Login'}}} experiment\n * @returns {string}\n */\nexport const getAssetLevelName = (accessControl, experiment) => {\n if (accessControl.length > 0) {\n return accessControl.join(',');\n }\n if (experiment?.variant?.Type) {\n return experiment.variant.Type;\n }\n return 'Free';\n};\n\nconst getImageUrl = (asset) => {\n const image = asset.getThumbnail();\n\n if (image) {\n return `${image}?t[]=480q80`;\n }\n\n return undefined;\n};\n\n/**\n * Integration with Pulse Tracker\n * https://github.schibsted.io/spt-dataanalytics/pulse-autotracker\n *\n * @param options\n * @constructor\n */\nclass PulseStatsPlugin extends PluginModel {\n constructor(options, experiment, isExperimentEnabled, isMockAsset) {\n super(options);\n this.provider = options.provider;\n this.sdkConfig = options.sdkConfig;\n this.decorator = options.decorator || ((data) => data);\n this.intervals = {\n ...(options?.engagementIntervals?.live && {\n live: options.engagementIntervals.live,\n }),\n ...(options?.engagementIntervals?.vod && {\n vod: options?.engagementIntervals?.vod,\n }),\n };\n this.embed = options.embed === true;\n this.previousAssetId = options.previousAssetId;\n this.tracker = null;\n this.experiment = experiment;\n this.isExperimentEnabled = isExperimentEnabled;\n this.isMockAsset = isMockAsset;\n this.setupErrorEventEmitted = false;\n this.tts = options.tts || { enabled: false };\n }\n\n // eslint-disable-next-line\n getName() {\n return 'PulseStats';\n }\n\n get jw() {\n try {\n return this.player.model.player || {};\n } catch (e) {\n return {};\n }\n }\n\n get asset() {\n const asset = this.playerAsset;\n const additional = asset.get('additional') || {};\n const accessControl = Object.keys(additional.access || {});\n const tags = getTags(asset);\n\n const data = {\n assetType: capitalizeFirstLetter(asset.get('assetType')),\n title: asset.get('title'),\n // duration should be in seconds\n duration: Math.round(asset.get('duration') / 1000),\n imageUrl: getImageUrl(asset),\n };\n\n if (accessControl.length > 0) {\n // @deprecated\n data.accessControl = accessControl.join(',');\n }\n\n data.accessLevel = getAssetLevel(\n accessControl,\n asset.get('provider'),\n this.experiment,\n );\n data.accessLevelName = getAssetLevelName(\n accessControl,\n this.experiment,\n );\n\n if (tags.length > 0) {\n data.tags = tags;\n }\n\n // check if stream has category\n if (asset.getCategory()) {\n data.category = asset.getCategory().getId();\n }\n\n // delete duration from live assets\n if (asset.getStreamType() === 'live') {\n delete data.duration;\n }\n\n if (additional.originAssetId) {\n data.originAssetId = additional.originAssetId;\n }\n\n if (this.tts.enabled) {\n data.assetType = 'AudioTTS';\n }\n\n return data;\n }\n\n get apiUrl() {\n const { url } = configuration.api;\n const asset = this.playerAsset;\n const protocol = !url.startsWith('http') ? 'https:' : '';\n return `${protocol}${url}${asset.getVendor()}/assets/${asset.getId()}?appName=linkpulse`;\n }\n\n get isAutoplay() {\n const autoplay = this.player.config.get('autoplay');\n return autoplay === true || autoplay === 'viewable';\n }\n\n getCategoryPath(categoryId) {\n if (typeof categoryId !== 'number') {\n return null;\n }\n\n // check if id exist and create category path\n if (!this.categoryPath) {\n this.categoryPath = this.categoryTree\n .getPath(categoryId)\n .map((category) => category.title.toLowerCase())\n .join(' > ');\n }\n\n return this.categoryPath;\n }\n\n /**\n * Track Pulse event\n * Defer tracking when Pulse library is not loaded yet\n */\n async track(eventName, eventData) {\n const tracker = await this.getTracker();\n const data = {};\n Object.assign(\n data,\n eventData,\n this.isExperimentEnabled && {\n experiments: [\n {\n id: this.experiment.id,\n variant: this.experiment.variant\n ? this.experiment.variant.id\n : '0',\n platform: this.provider,\n },\n ],\n },\n );\n logger('Pulse').log(JSON.stringify(data, null, 4));\n tracker.track(eventName, data);\n }\n\n async trackMediaEvent(data) {\n try {\n if (!this.isMockAsset) {\n await this.categoryTree.fetch();\n }\n // category data is available on ready event\n const categoryPath = this.getCategoryPath(data.object.category);\n\n if (categoryPath) {\n data.object.category = categoryPath;\n }\n await this.track(\n 'engagementEvent',\n this.decorator(data, this.playerAsset),\n );\n } catch (e) {\n logger('Pulse').log('Could not track event');\n }\n }\n\n getTrackerOrNull() {\n return new Promise((resolve) => {\n const resolveTracker = () => resolve(this.tracker);\n\n if (this.tracker !== null || this.setupErrorEventEmitted) {\n resolveTracker();\n } else {\n this.once('ready', resolveTracker);\n this.once('setupError', resolveTracker);\n }\n });\n }\n\n getTracker() {\n return new Promise((resolve) => {\n const resolveTracker = () => resolve(this.tracker);\n\n if (this.tracker === null) {\n this.once('ready', resolveTracker);\n } else {\n resolveTracker();\n }\n });\n }\n\n setup() {\n // prevent asset to be changed with playnext before stream completes\n this.playerAsset = this.player.getAsset({\n shouldLogDeprecatedWarning: false,\n });\n\n this.categoryTree = CategoryTree(this.playerAsset.getVendor());\n\n this.adEvents = new AdEvents(this.player);\n this.playbackEvents = new PlaybackEvents(this.player, {\n vodInterval: this.intervals.vod,\n liveInterval: this.intervals.live,\n });\n this.uiEvents = new UiEvents(this.player);\n\n // initialize only once\n Promise.all([\n PulseTracker.init(this.provider, this.sdkConfig),\n this.isMockAsset ? null : this.categoryTree.fetch(),\n ])\n .then((data) => this.onReady(data))\n .catch(() => {\n this.setupErrorEventEmitted = true;\n this.trigger('setupError');\n });\n\n this.listenTo(this.adEvents, 'all', this.onAdEvent, this);\n if (!this.isMockAsset) {\n this.listenTo(\n this.playbackEvents,\n 'all',\n this.onPlaybackEvent,\n this,\n );\n }\n this.listenTo(this.uiEvents, 'all', this.onUiEvent, this);\n }\n\n onReady(data) {\n const [tracker] = data;\n\n this.tracker = tracker;\n this.trigger('ready');\n }\n\n attachSessionData(trackingData, data) {\n const asset = this.playerAsset;\n if (data.previousAssetId) {\n trackingData.object.previousAssetId = getMediaAssetId(\n asset.getVendor(),\n data.previousAssetId,\n );\n trackingData.object.playbackSource = data.playbackSource;\n } else if (this.previousAssetId) {\n trackingData.object.previousAssetId = getMediaAssetId(\n asset.getVendor(),\n this.previousAssetId,\n );\n trackingData.object.playbackSource = 'config';\n }\n }\n\n onPlaybackEvent(intent, data = {}) {\n const asset = this.playerAsset;\n\n /**\n * Autoplay is not set for load method thus we use value set in player constructor\n * For other events method of playback start is checked\n * Autoplay is set to true when player actually autostarts or when its started with external call (.play())\n */\n const trackingData = {\n intent,\n '@type': 'Engagement',\n position: data.position,\n // duration is in ms\n duration: data.duration * 1000,\n object: {\n '@id': getMediaAssetId(asset.getVendor(), asset.getId()),\n '@type': 'MediaAsset',\n name: asset.getTitle(),\n muted: this.jw.getMute(),\n fullscreen: this.jw.getFullscreen(),\n accessControl: asset.accessControl || 'free',\n autoplay:\n data.playMethod === null\n ? this.isAutoplay\n : data.playMethod === 'autostart' ||\n data.playMethod === 'external' ||\n data.playMethod === 'viewable',\n adSequenceCount: data.count,\n embed: this.embed,\n streamType: asset.getStreamType(),\n adblock: this.player.model.player.getAdBlock(),\n apiUrl: this.apiUrl,\n preview: Boolean(this.player.config.get('videoPreview')),\n 'spt:custom': {\n 'spt:streamProviderId': asset.getVendor(),\n },\n ...this.asset,\n },\n };\n\n const { adSequenceDuration } = this.adEvents.adData;\n if (adSequenceDuration) {\n trackingData.object.adSequenceDuration = adSequenceDuration;\n trackingData.object.adSequenceCount = adSequenceDuration.length;\n }\n\n if (data.start === true) {\n trackingData.start = true;\n }\n\n this.attachSessionData(trackingData, data);\n\n this.trackMediaEvent(trackingData);\n }\n\n onAdEvent(intent, data) {\n const asset = this.playerAsset;\n const trackingData = {\n intent,\n '@type': 'Engagement',\n position: data.position,\n // position and duration are equal because ads does not allow to seek through content\n // duration is in ms\n duration: data.position && data.position * 1000,\n object: {\n '@id': `sdrn:${this.provider}:mediaad:${data.id}`,\n '@type': 'MediaAd',\n assetType: capitalizeFirstLetter(data.type),\n muted: this.jw.getMute(),\n fullscreen: this.jw.getFullscreen(),\n autoplay: this.isAutoplay,\n mediaAssetId: getMediaAssetId(asset.getVendor(), asset.getId()),\n adSequenceCount: data.count,\n adblock: this.player.model.player.getAdBlock(),\n apiUrl: this.apiUrl,\n },\n };\n\n if (data.adSequenceDuration) {\n trackingData.object.adSequenceDuration = data.adSequenceDuration;\n trackingData.object.adSequenceCount =\n data.adSequenceDuration.length;\n }\n\n if (data.sequence) {\n trackingData.object.adSequencePosition = data.sequence;\n if (\n data.adSequenceDuration &&\n data.adSequenceDuration[data.sequence - 1]\n ) {\n trackingData.object.duration =\n data.adSequenceDuration[data.sequence - 1];\n }\n }\n\n if (data.start === true) {\n trackingData.start = true;\n }\n\n if (asset.getCategory()) {\n trackingData.object.category = this.categoryTree\n ?.getPath(asset.getCategory()?.getId())\n .map((i) => i.title)\n .join(' > ')\n .toLocaleLowerCase();\n }\n\n this.attachSessionData(trackingData, this.playbackEvents.eventData);\n\n return this.trackMediaEvent(trackingData);\n }\n\n async onUiEvent(eventName, data) {\n const asset = this.playerAsset;\n const trackingData = {\n '@type': 'View',\n object: Object.assign(data, {\n '@id': getMediaAssetId(asset.getVendor(), data.id),\n '@type': 'UIElement',\n apiUrl: this.apiUrl,\n }),\n };\n\n this.track('viewEvent', trackingData);\n }\n\n destroy() {\n this.stopListening();\n\n this.adEvents.destroy();\n this.playbackEvents.destroy();\n }\n}\n\nexport default PulseStatsPlugin;\n","import utils from 'utils/utils';\nimport locale from 'player/model/locale';\nimport PluginModel from './model';\n\nconst SVP_FLAG_NATIVE_LINK = 'svp-flag-native-link';\nconst SVP_NATIVE_LINK_OVERLAY = 'svp-native-link-overlay';\nconst SVP_NATIVE_LINK_BUTTON = 'svp-native-link-button';\nconst SVP_LOGIN_OVERLAY = 'svp-login-overlay';\n\n/**\n * Allowing using native link for playing podcasts on hermes apps\n *\n * @param options\n * @constructor\n */\nclass PodcastNativeLinkPlugin extends PluginModel {\n constructor(options) {\n super(options);\n this.link = null;\n }\n\n // eslint-disable-next-line\n getName() {\n return 'PodcastNativeLinkPlugin';\n }\n\n setup() {\n const asset = this.player.getAsset({\n shouldLogDeprecatedWarning: false,\n });\n\n if (utils.device.isHermesApp()) {\n this.link = `audio:${asset.getVendor()}:${asset.getId()}`;\n }\n\n this.listenToOnce(this.player, 'viewable', this.render, this);\n }\n\n render() {\n if (!this.link) {\n return;\n }\n\n const translations = locale.getTranslations();\n const container = this.player.getContainer();\n\n // do not show when there is login overlay\n const loginOverlay = container.querySelector(`.${SVP_LOGIN_OVERLAY}`);\n if (loginOverlay) {\n return;\n }\n\n // Native link has unsupported format and cannot be created using JW utils.createElement\n // @see https://github.schibsted.io/svp/web-player/issues/1003\n const linkAnchor = document.createElement('a');\n const linkSpan = document.createElement('span');\n linkSpan.classList.add(SVP_NATIVE_LINK_BUTTON);\n linkSpan.appendChild(\n document.createTextNode(translations.player.listen),\n );\n linkAnchor.appendChild(linkSpan);\n linkAnchor.classList.add(SVP_NATIVE_LINK_OVERLAY);\n linkAnchor.setAttribute('href', this.link);\n\n this.el = linkAnchor;\n\n utils.addClass(container, SVP_FLAG_NATIVE_LINK);\n container.appendChild(this.el);\n }\n\n destroy() {\n if (this.el) {\n const container = this.player.getContainer();\n\n utils.removeClass(container, SVP_FLAG_NATIVE_LINK);\n\n const overlay = container.querySelector(\n `.${SVP_NATIVE_LINK_OVERLAY}`,\n );\n if (overlay) {\n overlay.parentNode.removeChild(overlay);\n }\n }\n }\n}\n\nexport default PodcastNativeLinkPlugin;\n","import logger from 'utils/logger';\n\n/**\n * events hashmap playerId -> eventBus\n * each player has its own events bus\n *\n * @type Record\n */\nexport const events = {};\n\n/**\n * Homad AAB ads have single event bus for all players\n *\n * @param {CustomEvent} event\n */\nfunction parseHomadEvent(event) {\n const details = event && event.detail;\n // skip parsing when there is missing data or player is not registered\n if (!details || !events[details.containerId]) {\n return;\n }\n\n const {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n name,\n container,\n containerId,\n player,\n videoTag,\n videoTagId,\n ...data\n } = details;\n\n logger('Homad').log(details.name, data);\n\n events[details.containerId].trigger(details.name, data);\n}\n\nexport function translateHomadEvents() {\n window.addEventListener('hdEvent', parseHomadEvent);\n}\n","/**\n * @typedef {'pre'|'mid'|'post'} PotOffset\n */\n/**\n * @typedef {Record} AdSchedule\n */\n\n/**\n * @param {PotOffset} offset\n * @param {AdSchedule} adschedule\n * @returns {null|string}\n */\nfunction getAdPotTag(offset, adschedule) {\n const keys = Object.keys(adschedule);\n let tag;\n\n keys.forEach(function (key) {\n if (key.indexOf(offset) > -1) {\n tag = adschedule[key].tag;\n }\n });\n\n return tag;\n}\n\n/**\n * @param {PotOffset} potOffset\n * @returns {string|false}\n */\nfunction getTagUrl(potOffset) {\n return function (player) {\n const playlistItem = player.getPlaylist()[0];\n\n let tag;\n if (playlistItem.adschedule) {\n tag = getAdPotTag(potOffset, playlistItem.adschedule);\n }\n\n /**\n * @see https://docs.xandr.com/bundle/monetize_monetize-standard/page/topics/target-video-attributes-via-query-string-parameters.html\n */\n if (tag) {\n return tag.replace('vmap', 'ssvmap');\n }\n return false;\n };\n}\n\n/**\n * @typedef HomadConfig\n * @property {string} innerWarpper.style (yes, there is a typo)\n * @property {string} container.style\n * @property {string} video.style\n * @property {string} video.style.position\n * @property {*} video.attributes\n * @property {boolean} noClickThroughOnVideoTag\n * @property {*} outstream\n * @property {*} bypass\n * @property {*} tcf_config\n * @property {*} gdpr\n * @property {*} iqfix\n * @property {*} runInsideContainer\n * @property {*} use_videotag_as_container\n * @property {boolean} throwVideoTag\n * @property {*} vpaid\n * @property {*} takeover_ratio\n * @property {*} verticalizr\n * @property {*} ad_fallback\n * @property {*} ad_fallback_config\n * @property {*} skipOffset\n * @property {*} viewableImporession\n * @property {string} clickthrough_target\n * @property {*} welectPlacementTitle (yes, there is a typo)\n * @property {*} clickThroughBox\n * @property {string} globalConfig\n * @property {string} clientConfig\n * @property {boolean} skipable\n * @property {boolean} skipAdOnContextChange\n * @property {boolean} runInsideContainer\n * @property {boolean} adjustAdVolumeToContentPlayer\n * @property {boolean} postrollUseCompleteEvent\n * @property {number} zIndex\n * @property {string|((JWPlayer) => string)} prerollAdTag\n * @property {string|((JWPlayer) => string)} midrollAdTag\n * @property {string|((JWPlayer) => string)} postrollAdTag\n */\n\n/**\n * @type {HomadConfig}\n */\nexport const homadDefaultConfig = {\n globalConfig:\n 'https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json',\n clientConfig: '/homad-config.json',\n skipable: true,\n skipAdOnContextChange: true,\n runInsideContainer: true,\n adjustAdVolumeToContentPlayer: true,\n postrollUseCompleteEvent: false,\n // by default the ad opens in the same tab. _blank is often blocked\n clickthrough_target: '_target',\n zIndex: 200,\n prerollAdTag: getTagUrl('pre'),\n midrollAdTag: getTagUrl('mid'),\n postrollAdTag: getTagUrl('post'),\n};\n","/**\n * @param {Homad} homad\n */\nconst createProxyMethods = (homad) => ({\n /**\n * @this {PlayerModel}\n */\n onFirstFrameLoad(onFirstFrameLoad) {\n this.player.once(\n 'play',\n function () {\n this.player.once(\n 'providerFirstFrame',\n function () {\n onFirstFrameLoad.call(this, this.playlistItemId);\n },\n this,\n );\n },\n this,\n );\n },\n\n /**\n * @this {PlayerModel}\n */\n onTime(onTime, args) {\n if (!this.adPlaying && !this.adPlayerLoading) {\n onTime.apply(this, args);\n }\n },\n\n /**\n * @this {PlayerModel}\n */\n // eslint-disable-next-line consistent-return\n onPlay(onPlay, args) {\n if (!this.adPlayerLoading) {\n onPlay.apply(this, args);\n }\n },\n /**\n * @this {PlayerModel}\n */\n onPause(onPause, args) {\n if (this.adPlaying === false && !this.adPlayerLoading) {\n onPause.apply(this, args);\n }\n },\n /**\n * @this {PlayerModel}\n */\n onComplete(onComplete, args) {\n if (this.adPlaying === false && !this.adPlayerLoading) {\n onComplete.apply(this, args);\n } else {\n this.listenToOnce(\n homad,\n 'continueContent',\n function () {\n onComplete.apply(this, args);\n },\n this,\n );\n }\n },\n});\n\n/**\n * Override player methods to play well with Homad\n * @param {PlayerModel} player\n * @param {Homad} homad\n */\nexport const applyPlayerMixin = (player, homad) => {\n const overrides = createProxyMethods(homad);\n Object.keys(overrides).forEach((name) => {\n const sourceMethod = player[name];\n\n player[name] = function (...args) {\n return overrides[name].call(player, sourceMethod, args);\n };\n });\n};\n","import utils from 'utils/utils';\n\nimport { events } from './homad/eventbus';\nimport { initializeHomadLib } from './homad/global';\nimport { applyPlayerMixin } from './homad/proxy';\nimport { waitForAdPlayer } from './homad/utils';\n\nclass Homad {\n /**\n * @param {PlayerModel} player\n */\n constructor(player) {\n initializeHomadLib();\n\n this.player = player;\n this.playerId = player.config.get('node');\n\n // Proxy Homad global events related to current player instance\n utils.extend(this, utils.Events);\n if (!events[this.playerId]) {\n events[this.playerId] = { ...utils.Events };\n }\n this.listenTo(events[this.playerId], 'all', this.trigger, this);\n\n // Override SVP Player's methods\n applyPlayerMixin(player, this);\n\n this.on('contentPlayerPlay', this.onContentPlayerPlay, player);\n this.on('adStart', this.onAdStart, player);\n this.on('continueContent', this.onContinueContent, player);\n this.on('adTime', this.onAdTime, player);\n player.on('adError', this.onPlayerAdError, player);\n player.on('adBreakStart', this.onPlayerAdBreakStart, player);\n player.on('playlistItem', this.onPlayerPlaylistItem, player);\n player.on('adPlay', this.onPlayerAdPlay, player);\n\n this.on(\n 'adComplete adSkipped adPause adPlay',\n this.forwardEventToPlayer,\n this,\n );\n\n // Find Ad player's container and video elements\n const node = player.getContainer();\n waitForAdPlayer(node).then((dom) => {\n this.container = dom.container;\n this.video = dom.video;\n this.playButton = dom.playButton;\n this.muteButton = dom.muteButton;\n this.trigger('initialize');\n });\n }\n\n /**\n * Remove player events from messaging bus\n * Prevents memory leaks\n */\n destroy() {\n this.off();\n this.stopListening();\n if (events[this.playerId]) {\n events[this.playerId].off();\n events[this.playerId].stopListening();\n\n events[this.playerId] = null;\n delete events[this.playerId];\n }\n }\n\n /**\n * @this {PlayerModel}\n */\n onContentPlayerPlay() {\n this.getContainer().classList.remove('svp-homad-loading');\n }\n\n /**\n * @this {PlayerModel}\n * @param {object} data\n * @param {\"preroll\"|\"midroll\"|\"postroll\"} data.state\n * @param {number} data.duration\n * @param {{ adID: string }[]} data.adIds\n * @param {boolean} data.adPod\n * @param {string} data.adsession_id\n * @param {string} data.clickthrough\n * @param {number} data.currentTime\n * @param {string} data.homadImpressionAdId\n */\n onAdStart(data) {\n this.adPosition = data.state;\n\n if (this.adPlaying === false) {\n this.trigger('adSlotStart', {\n position: this.adPosition,\n });\n\n this.adPlaying = true;\n }\n\n this.trigger('adStarted', {\n position: this.adPosition,\n meta: {\n duration: data.duration,\n offset: 'pre',\n },\n });\n }\n\n /**\n * @this {PlayerModel}\n */\n onContinueContent() {\n this.getContainer().classList.remove('jw-flag-ads');\n\n if (this.adPlaying === true) {\n this.trigger('adSlotComplete', {\n position: this.adPosition,\n });\n\n this.adPlaying = false;\n }\n }\n\n /**\n * @this {PlayerModel}\n * @param {number} currentTime\n * @param {number} duration\n */\n onAdTime({ currentTime, duration }) {\n if (currentTime && this.adPlaying) {\n this.trigger('adProgress', currentTime, duration);\n }\n }\n\n /**\n * Forward Homad event only if an ad is playing\n * @param {string} eventName\n */\n forwardEventToPlayer(eventName) {\n this.on(eventName, () => {\n if (this.player.adPlaying) {\n this.player.trigger(eventName);\n }\n });\n }\n\n /**\n * @this {PlayerModel}\n */\n onPlayerAdError() {\n const jw = this.player;\n const container = this.getContainer();\n\n this.hasAdBlocked = true;\n\n // just to be sure\n this.once(\n 'adStarted',\n function () {\n this.adPlayerLoading = false;\n },\n this,\n );\n\n this.once(\n 'adSlotComplete',\n function () {\n container.classList.remove('svp-homad-loading');\n },\n this,\n );\n\n this.listenToOnce(\n jw,\n 'play',\n function () {\n this.adPlayerLoading = true;\n },\n this,\n );\n\n this.listenToOnce(\n jw,\n 'pause',\n function (options) {\n // first external pause is triggered by homad\n // this equals to ad tag loaded and parsed\n if (options && options.pauseReason === 'external') {\n this.adPlayerLoading = false;\n }\n },\n this,\n );\n }\n\n /**\n * @this {PlayerModel}\n * @param {string} adposition\n */\n onPlayerAdBreakStart({ adposition } = {}) {\n const duration = this.getDuration();\n const currentTime = this.getCurrentTime();\n const container = this.getContainer();\n\n // homad has strange constraints for midroll\n if (\n adposition !== 'mid' ||\n (currentTime > 30 && duration - currentTime > 30)\n ) {\n container.classList.add('svp-homad-loading');\n\n // clean loading in case of any error\n setTimeout(function () {\n container.classList.remove('svp-homad-loading');\n }, 5000);\n\n this.listenToOnce(this.player, 'adPlay', () => {\n container.classList.remove('svp-homad-loading');\n });\n }\n }\n\n // turn off ad player loading when there is no ads\n /**\n * @this {PlayerModel}\n * @param playlistItem\n */\n onPlayerPlaylistItem(playlistItem) {\n if (playlistItem.item && !playlistItem.item.adschedule) {\n this.adPlaying = false;\n this.adPlayerLoading = false;\n }\n }\n\n /**\n * @this {PlayerModel}\n */\n onPlayerAdPlay() {\n this.adPlaying = true;\n this.adPlayerLoading = false;\n }\n}\n\nexport default Homad;\n","import { homadDefaultConfig } from './config';\nimport { translateHomadEvents } from './eventbus';\nimport homadLib from './lib';\n\nexport function initializeHomadLib() {\n const SvpPlayer = (window.SVP && window.SVP.Player) || {};\n if (SvpPlayer.isHomadLoaded) {\n return;\n }\n\n SvpPlayer.isHomadLoaded = true;\n\n const homadConfig = { ...homadDefaultConfig };\n\n // override aab config url\n if (SvpPlayer.defaults && SvpPlayer.defaults.aabConfig) {\n homadConfig.clientConfig = SvpPlayer.defaults.aabConfig;\n }\n\n translateHomadEvents();\n homadLib(homadConfig);\n}\n","/**\n * @typedef HomadDOM\n * @property {HTMLVideoElement} video\n * @property {HTMLDivElement} container\n * @property {HTMLImageElement} playButton\n * @property {HTMLImageElement} muteButton\n */\n\n/**\n * Get Ad Player from player container\n *\n * This function awaits for the HOMAD system to bootstrap in the DOM,\n * then finds the appropriate video tag and HOMAD's main container\n *\n * @param {HTMLDivElement} playerContainer\n * @return {Promise}\n */\nexport function waitForAdPlayer(playerContainer) {\n return new Promise((resolve) => {\n const handler = (event) => {\n if (event.detail && event.detail.container === playerContainer) {\n const videoElements = playerContainer.querySelectorAll('video');\n const [video] = [...videoElements].filter((v) => !v.className);\n if (video) {\n /**\n * [div] homad main container\n * └─ [div]\n * ├─ [video] click event goes to the advertiser\n * ├─ [div] time label\n * ├─ [div] controls container\n * │ ├─ [img] play button\n * │ └─ [img] mute button\n * └─ [div] overlay (to unpause)\n */\n const container = video.parentNode.parentNode;\n const controlsContainer =\n video.nextElementSibling.nextElementSibling;\n const [playButton, muteButton] =\n controlsContainer.childNodes;\n\n window.removeEventListener('hdEvent', handler);\n resolve({\n video,\n container,\n playButton,\n muteButton,\n });\n }\n }\n };\n\n window.addEventListener('hdEvent', handler);\n });\n}\n","import utils from 'utils/utils';\nimport PluginModel from '../model';\nimport Homad from './homad';\n\nimport iconPause from './icons/pause.svg';\nimport iconPlay from './icons/play.svg';\nimport iconSpeaker from './icons/speaker.svg';\nimport iconSpeakerMuted from './icons/speaker-muted.svg';\nimport iconLink from './icons/link.svg';\nimport iconFullscreen from './icons/fullscreen.svg';\nimport { createElement } from './dom';\nimport { homadAdTracker } from './tracking';\n\n/**\n *\n * @param {number} duration duration in seconds\n */\nfunction formatTime(duration) {\n const minutes = Math.floor(duration / 60);\n const seconds = Math.floor(duration - minutes * 60);\n return `${minutes.toString().padStart(2, '0')}:${seconds\n .toString()\n .padStart(2, '0')}`;\n}\n\nclass AABPlugin extends PluginModel {\n // eslint-disable-next-line class-methods-use-this\n getName() {\n return 'AABPlugin';\n }\n\n initialize() {\n this.elements = {};\n\n this.handleAdLabelClick = this.handleAdLabelClick.bind(this);\n this.handlePlayPauseClick = this.handlePlayPauseClick.bind(this);\n this.handleMuteClick = this.handleMuteClick.bind(this);\n this.handleFullscreenClick = this.handleFullscreenClick.bind(this);\n }\n\n setup() {\n // anti adblock works only for desktops\n if (utils.device.getDeviceType() !== 'desktop') {\n return;\n }\n\n this.player.once('ready', () => {\n const { aab } = window.SVP.Player.defaults;\n if (aab === true) {\n // force loading when mode is set to \"true\"\n this.initializeHomad();\n } else if (aab === 'auto') {\n // detect if adblock exist for \"auto\" mode\n this.player.model.player.once('adBlock', () => {\n this.initializeHomad();\n });\n }\n });\n }\n\n initializeHomad() {\n const pulse = this.player.getPlugin('PulseStats');\n this.homad = new Homad(this.player.model);\n homadAdTracker(this.player.model, this.homad, pulse);\n this.homad.once('initialize', this.onHomadReady, this);\n }\n\n /**\n * Initialize ad player\n */\n onHomadReady() {\n this.createControls(this.homad.container);\n\n this.hideHomadNativeControls();\n\n this.player.getContainer().classList.remove('jw-state-buffering');\n\n this.attachEventListeners();\n this.onMuteToggle({ type: this.homad.video.muted ? 'mute' : 'unmute' });\n\n const { setAdPlaying, setAdComplete } = this.getPlaybackState();\n this.player.model.once('adSlotStart', setAdPlaying);\n this.player.model.once('adSlotComplete', setAdComplete);\n }\n\n destroy() {\n if (this.homad) {\n this.homad.destroy();\n }\n this.detachEventListeners();\n super.destroy();\n }\n\n hideHomadNativeControls() {\n const { container } = this.homad;\n const [mainDiv] = [...container.childNodes].filter(\n (c) => c.childNodes.length > 0,\n );\n [...mainDiv.childNodes].forEach((element) => {\n if (element.tagName.toLowerCase() !== 'video') {\n element.style.cssText =\n 'display: none !important; z-index: unset !important';\n }\n });\n }\n\n /**\n * @param {HTMLDivElement} container Homad main element\n */\n createControls(container) {\n const muteButton = createElement('button', {});\n const playButton = createElement('button', {});\n const fullscreenButton = createElement('button', {});\n\n playButton.innerHTML = iconPause;\n fullscreenButton.innerHTML = iconFullscreen;\n\n const labelText = createElement('strong', {}, 'ANNONSE (00:00)');\n const iconPlaceholder = createElement('div', {});\n iconPlaceholder.innerHTML = iconLink;\n\n const label = createElement(\n 'a',\n {\n href: '#',\n target: '_blank',\n rel: 'noopener',\n },\n [\n iconPlaceholder,\n createElement('div', { class: 'aab-labels' }, [\n labelText,\n createElement('span', {}, 'Gå til annonsør'),\n ]),\n ],\n );\n\n // Controlbar\n const controls = createElement(\n 'div',\n {\n class: 'aab-layout',\n },\n [\n createElement('div', { class: 'aab-controls' }, [muteButton]),\n createElement('div', { class: 'aab-spacer' }),\n createElement('div', { class: 'aab-controls' }, [\n playButton,\n label,\n createElement('div', {\n class: 'aab-spacer',\n }),\n fullscreenButton,\n ]),\n ],\n );\n\n this.elements = {\n muteButton,\n playButton,\n fullscreenButton,\n labelText,\n label,\n controls,\n };\n\n // Append the whole controls' container to the DOM\n container.appendChild(controls);\n }\n\n attachEventListeners() {\n const { label, muteButton, fullscreenButton, playButton } =\n this.elements;\n\n label.addEventListener('click', this.handleAdLabelClick);\n muteButton.addEventListener('click', this.handleMuteClick);\n fullscreenButton.addEventListener('click', this.handleFullscreenClick);\n playButton.addEventListener('click', this.handlePlayPauseClick);\n\n this.listenTo(this.homad, 'adPlay', this.onAdPlay, this);\n this.listenTo(this.homad, 'adPause', this.onAdPause, this);\n this.listenTo(this.homad, 'adTime', this.onAdTime, this);\n this.listenTo(this.homad, 'mute unmute', this.onMuteToggle, this);\n }\n\n detachEventListeners() {\n try {\n const { label, muteButton, fullscreenButton, playButton } =\n this.elements;\n label.removeEventListener('click', this.handleAdLabelClick);\n muteButton.removeEventListener('click', this.handleMuteClick);\n fullscreenButton.removeEventListener(\n 'click',\n this.handleFullscreenClick,\n );\n playButton.removeEventListener('click', this.handlePlayPauseClick);\n } catch (err) {\n // noop\n }\n }\n\n onAdPlay() {\n this.elements.playButton.innerHTML = iconPause;\n }\n\n onAdPause() {\n this.elements.playButton.innerHTML = iconPlay;\n }\n\n onAdTime() {\n const { duration, currentTime } = this.homad.video;\n const { labelText } = this.elements;\n labelText.innerText = `ANNONSE (${formatTime(duration - currentTime)})`;\n }\n\n handleAdLabelClick(event) {\n const { video } = this.homad;\n video.click();\n video.pause();\n event.preventDefault();\n }\n\n handlePlayPauseClick() {\n this.homad.playButton.click();\n }\n\n onMuteToggle({ type }) {\n const { muteButton } = this.elements;\n muteButton.innerHTML = type === 'mute' ? iconSpeakerMuted : iconSpeaker;\n }\n\n getPlaybackState() {\n const playerClassList = this.player.getContainer().classList;\n const adStarted = ['jw-flag-ads', 'svp-homad-playing'];\n\n const useClasses = (add, remove) => {\n playerClassList.add(...add);\n playerClassList.remove(...remove);\n };\n\n return {\n setAdPlaying: () => useClasses(adStarted, ['svp-homad-loading']),\n setAdComplete: () => useClasses([], adStarted),\n };\n }\n\n handleFullscreenClick() {\n try {\n const jwplayer = this.player.model.player;\n jwplayer.setFullscreen();\n } catch (e) {\n // fullscreen did not work\n }\n }\n\n handleMuteClick() {\n this.homad.muteButton.click();\n }\n}\n\nexport default AABPlugin;\n","/**\n * @param {PlayerModel} player\n * @param {Homad} homad\n * @param {PulseStatsPlugin} pulse\n */\nexport function homadAdTracker(player, homad, pulse) {\n let adSequencePosition = 0;\n let adSequenceCount = 0;\n let adIds = [];\n\n if (pulse) {\n const resetSequence = () => {\n adSequencePosition = 0;\n adSequenceCount = 0;\n };\n\n /**\n * @param {Object} data Homad event details\n * @param {{ adID: string }[]} data.adIds\n * @param {'preroll'|'midroll'|'postroll'} data.state\n * @param {number} data.duration\n * @param {number} data.currentTime\n */\n const onHomadAdStart = (data) => {\n const { adEvents } = pulse;\n\n if (!adSequencePosition) {\n adSequenceCount = data.adIds.length;\n }\n\n adSequencePosition += 1;\n adIds = [...data.adIds];\n const { adID } = adIds[adIds.length - 1];\n\n Object.assign(adEvents.adData, {\n type: data.state,\n // duration in milliseconds\n duration: data.duration * 1000,\n // Both Homad and JWplayer can't seem to poroperly extract adId value from VAST response\n // This bug prevents Watch and Complete tracking events from being dispatched\n // We're going to use homadImpressionAdId until this is fixed for Homad\n id: adID || data.homadImpressionAdId,\n sequence: adSequencePosition,\n podcount: adSequenceCount,\n position: 0,\n });\n\n // Simulate 'adEvents.onAdMeta' call\n if (!adEvents.adData.adSequenceDuration) {\n adEvents.adData.adSequenceDuration = Array(adSequenceCount);\n }\n\n if (data.state === 'preroll') {\n // duration in seconds\n adEvents.adData.adSequenceDuration[adSequencePosition - 1] =\n data.duration;\n }\n\n // Trigger Pulse MediaAd:Play event\n adEvents.onAdPlay();\n };\n\n const onHomadAdPause = () => {\n pulse.adEvents.onAdPause();\n };\n\n const onHomadAdTime = (data) => {\n pulse.adEvents.onAdProgress(data.currentTime);\n };\n\n // MediaAd.Watch\n homad.on('adTime', onHomadAdTime);\n\n // MediaAd.Play\n homad.on('adStart', onHomadAdStart);\n\n // MediaAd.Pause\n homad.on('adPause', onHomadAdPause);\n\n // MediaAd.Stop\n homad.on('adComplete', pulse.adEvents.onAdFinished, pulse.adEvents);\n\n player.on('playlistItem', resetSequence);\n homad.on('adRequest', resetSequence);\n }\n}\n","import utils from 'utils/utils';\nimport videoPreviewHelper from 'utils/video-preview';\nimport locale from '../model/locale';\n\n/**\n * @param {Object} playlistItem\n * @param {number} playlistItem.id\n */\nfunction playNextFromPlaylist(playlistItem) {\n const { asset } = this;\n const { masterAsset } = this.model;\n\n if (!asset || !masterAsset || asset.getId() === playlistItem.id) {\n return;\n }\n\n const nextAssetData =\n masterAsset.getId() === playlistItem.id\n ? utils.extend({}, masterAsset.attributes)\n : masterAsset\n .get('playlist')\n .find((assetData) => assetData.id === playlistItem.id);\n\n if (!nextAssetData) {\n return;\n }\n\n this.setAsset(nextAssetData);\n}\n\n/**\n * Player initialized and single playlistItem is laoded\n * @param {Object} playlistItem\n */\nexport function onPlaylistItem(playlistItem) {\n const container = this.getContainer();\n // add class for live streams\n\n utils.removeClass(container, 'svp-player-live');\n\n if (this.model.getStream().isLive()) {\n utils.addClass(container, 'svp-player-live');\n\n const icon = container.getElementsByClassName('jw-icon-display')[0];\n\n if (icon) {\n // add translation for live button via data-label\n icon.setAttribute('data-label', locale.translate('Live button'));\n }\n }\n\n const videoElement = container.querySelector('video.jw-video');\n\n if (videoElement) {\n videoElement.loop = this.config.get('repeat');\n }\n\n if (\n !this.model.config.shouldApplyTextToSpeechSkin() &&\n !this.model.stream.isAudio()\n ) {\n videoPreviewHelper.addVideoPreviewElement.call(this);\n }\n\n playNextFromPlaylist.call(this, playlistItem);\n\n this.trigger('playlistItem');\n}\n","/**\n * Stream completed, fired for every item in playlist\n * Clear settings which are only for one stream\n * @param {string} reason\n */\nexport function onComplete(reason) {\n if (!this.isCompleted) {\n this.isCompleted = true;\n\n this.config.set('time', null);\n this.config.set('chapter', null);\n\n this.trigger('complete', reason);\n }\n}\n","import { onPlaylistItem } from './playlist';\nimport { onComplete } from './complete';\nimport { onError } from './error';\n\n/**\n * Remove single plugin instance\n * Clear all listeners\n * Remove from plugins hashmap\n *\n * @param {PluginModel} plugin\n */\nexport function destroyPlugin(plugin) {\n if (plugin.off) {\n plugin.off();\n }\n plugin.destroy();\n\n this.stopListening(plugin);\n delete this.plugins[plugin.getName()];\n}\n\n/**\n * Proxy player events\n */\nexport function onPlayerEvent(event, ...args) {\n let callFunction;\n\n switch (event) {\n case 'playlistItem':\n callFunction = onPlaylistItem.bind(this, ...args);\n break;\n case 'complete':\n callFunction = onComplete.bind(this, ...args);\n break;\n case 'error':\n callFunction = onError.bind(this, ...args);\n break;\n default:\n callFunction = this.trigger.bind(this, event, ...args);\n }\n\n callFunction();\n}\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport ServerTime from 'utils/server-time';\nimport Asset from '../model/asset';\nimport NextAsset from '../model/next-asset';\nimport Stream from '../model/stream';\nimport PausePlugin from '../plugins/pause';\nimport AgeLimitPlugin from '../plugins/age-limit';\nimport SponsorLabelPlugin from '../plugins/sponsor-label';\nimport PodcastExperimentPlugin, {\n prepareVariantsForExperiment,\n chooseVariant,\n} from '../plugins/podcast-experiment';\nimport CountdownPlugin from '../plugins/countdown';\nimport RecommendedPlugin from '../plugins/recommended';\nimport PulseStatsPlugin from '../plugins/pulse-stats';\nimport PodcastNativeLinkPlugin from '../plugins/podcast-native-link';\nimport AABPlugin from '../plugins/anti-adblock';\nimport statusCode from '../playback/config/status-codes';\n\nimport { clearError, onError } from './error';\nimport { destroyPlugin } from './helpers';\n\n/**\n * this always points to Player object\n * @memberOf {Player}\n */\nexport async function onAssetReady() {\n const { config: configuration } = this;\n\n const stream = new Stream(this.asset.attributes);\n const settings = configuration.getSettings();\n const node = document.getElementById(configuration.get('node'));\n const hasPlaylist = stream.hasPlaylist();\n\n if (node) {\n clearError(node);\n }\n\n // turn off recommended plugin for all tts assets\n if (this.model.config.shouldApplyTextToSpeechSkin(stream)) {\n this.config.set('recommended', false);\n }\n\n const isAssetFromPlaylist = this.model.isAssetFromPlaylist(stream.getId());\n\n if (!isAssetFromPlaylist) {\n const masterAsset = hasPlaylist\n ? new Asset(utils.extend({}, this.asset.attributes))\n : null;\n this.model.setMasterAsset(masterAsset);\n }\n\n // add hasNext checking\n stream.set(\n 'hasNext',\n !hasPlaylist ||\n !isAssetFromPlaylist ||\n !stream.isDisabledNextVideo() ||\n NextAsset.hasPlayNext(this.asset),\n );\n\n if (this.asset.get('access')) {\n const access = Object.keys(this.asset.get('access'))[0] || null;\n stream.set('access', access);\n }\n\n configuration.setStream(stream);\n\n // cleanup plugins as they maybe not required for new stream\n utils.each(this.plugins, destroyPlugin, this);\n\n this.addPlugin(new AABPlugin());\n\n // set start time if chapter is provided (not applicable for playlists)\n if (!hasPlaylist && !isAssetFromPlaylist && configuration.get('chapter')) {\n const chapter = this.asset.getChapter(configuration.get('chapter'));\n\n if (chapter) {\n stream.set('playAhead', chapter.timeline);\n }\n }\n\n // set playahead time\n if (!isAssetFromPlaylist && configuration.get('time')) {\n stream.set('playAhead', configuration.get('time'));\n }\n\n if (configuration.hasRecommended()) {\n this.addPlugin(\n new RecommendedPlugin({\n settings: configuration.getRecommended(),\n }),\n );\n }\n\n // stream is not available yet, display countdown\n if (\n stream.getTimeToStart() > 0 &&\n !configuration.get('disableCountdownPlugin')\n ) {\n // countdown is disable in preview mode on non live streams\n if (settings.preview !== true || stream.isLive()) {\n this.addPlugin(\n new CountdownPlugin({\n streamStart: new Date(\n ServerTime.getTime() + stream.getTimeToStart() * 1000,\n ),\n }),\n );\n\n // play stream after countdown ends\n this.on('countdown:end', this.play, this);\n }\n }\n\n if (this.asset.getAgeLimit() > -1) {\n this.addPlugin(\n new AgeLimitPlugin({\n ageLimit: this.asset.getAgeLimit(),\n settings: configuration.getAgeLimit(),\n }),\n );\n }\n\n if (configuration.get('showSponsorLabel') && this.asset.isSponsored()) {\n this.addPlugin(\n new SponsorLabelPlugin({\n sponsor: this.asset.getCategory().getTitle(),\n }),\n );\n }\n\n const metadata = this.asset.get('metadata') || {};\n\n let experiment;\n let isExperimentEnabled;\n // do not load an experiment feature when the player is in preview mode\n const isPodcastWithExperiment =\n settings.preview !== true &&\n metadata.experimentId &&\n metadata.isPodcast === 'true';\n\n if (isPodcastWithExperiment) {\n try {\n let experimentRange = JSON.parse(\n sessionStorage.getItem('svpExperimentRange'),\n );\n if (!experimentRange) {\n experimentRange = Math.random() * 100;\n sessionStorage.setItem(\n 'svpExperimentRange',\n JSON.stringify(experimentRange),\n );\n }\n experiment = {\n id: metadata.experimentId,\n variant: chooseVariant({\n variants: prepareVariantsForExperiment(metadata),\n rangeNumber: experimentRange,\n }),\n };\n\n const userStatusCfg = configuration.get('userStatus');\n let userStatus = {};\n if (typeof userStatusCfg === 'function') {\n userStatus = await userStatusCfg(this.asset);\n } else {\n userStatus = await (userStatusCfg || {});\n }\n if (\n userStatus.loggedIn &&\n !userStatus.hasProduct &&\n experiment.variant.Type === 'Subscription'\n ) {\n isExperimentEnabled = true;\n } else if (userStatus.loggedIn) {\n isExperimentEnabled = false;\n } else {\n isExperimentEnabled = true;\n }\n\n if (isExperimentEnabled) {\n this.addPlugin(\n new PodcastExperimentPlugin(experiment, {\n loginUrl: await configuration.get('loginUrl'),\n subscriptionUrl:\n await configuration.get('subscriptionUrl'),\n articleUrl: await configuration.get('articleUrl'),\n }),\n );\n }\n } catch (error) {\n logger('ExperimentPlugin').error(\n 'An error occur while initializing experiment',\n error,\n );\n }\n }\n\n /**\n * Disable Pulse tracking for mock/ads only playback\n */\n\n const pulseConfig = configuration.get('pulse');\n if (pulseConfig?.provider) {\n this.addPlugin(\n new PulseStatsPlugin(\n {\n ...pulseConfig,\n tts: {\n enabled: stream.hasTextSpeech(),\n },\n },\n experiment,\n isExperimentEnabled,\n stream.isMock(),\n ),\n );\n }\n\n this.addPlugin(new PausePlugin());\n\n if (\n (stream.isAudio() || configuration.shouldApplyTextToSpeechSkin()) &&\n configuration.get('nativeLink') !== false\n ) {\n this.addPlugin(new PodcastNativeLinkPlugin());\n }\n\n // set stream to display error\n this.model.setStream(stream);\n\n configuration\n .isStreamPlayable()\n .then(() => {\n // restart asset state\n // this.isCompleted = false;\n this.trigger('assetReady');\n })\n .catch(({ code, referenceId }) => {\n this.trigger('assetError', {\n message: statusCode(code),\n code,\n referenceId,\n });\n\n onError.call(this, {\n type: 'assetError',\n // message is translated in next functions\n message: statusCode(code),\n code,\n referenceId,\n });\n });\n}\n","/* eslint-disable no-multi-assign */\n\nconst loadedStylesheets = [];\n\n/**\n * @param {string} href\n * @param {() => void} onSuccess\n * @param {() => void} onError\n */\n// eslint-disable-next-line consistent-return\nfunction loadStylesheet(href, onSuccess, onError) {\n if (loadedStylesheets.indexOf(href) > -1) {\n return onSuccess();\n }\n\n const callback = onSuccess || function () {};\n const head = document.getElementsByTagName('head')[0];\n const link = document.createElement('link');\n\n link.rel = 'stylesheet';\n link.type = 'text/css';\n link.href = href;\n\n let done = false;\n\n link.onreadystatechange = link.onload = function () {\n if (\n !done &&\n (!this.readyState ||\n this.readyState === 'loaded' ||\n this.readyState === 'complete')\n ) {\n done = true;\n callback();\n\n // Handle memory leak in IE\n link.onload = link.onreadystatechange = null;\n }\n };\n\n link.onerror = function () {\n loadedStylesheets.splice(loadedStylesheets.indexOf(href), 1);\n onError();\n };\n\n loadedStylesheets.push(href);\n head.appendChild(link);\n}\n\n/**\n * @param {string} path\n */\nexport const styleLoader = (path) =>\n new Promise((resolve, reject) => {\n loadStylesheet(path, resolve, reject);\n });\n","import utils from 'utils/utils';\n/**\n * Check if preroll is scheduled in configuration\n *\n * @param {*} config\n * @returns {boolean}\n */\nfunction hasPreroll(config) {\n const playlistItem = config && config.playlist[0];\n let result = false;\n\n if (playlistItem.adschedule) {\n utils.each(playlistItem.adschedule, function (slot) {\n if (slot && slot.offset === 'pre') {\n result = true;\n }\n });\n }\n\n return result;\n}\n\n/**\n * Check if given stream can be autoplayed\n * Rules for autoplay depends on device but also on flags given to playback\n *\n * @deprecated new autoplay policies require starting of video to detect if autoplay will work\n * @param {*} config - JW Configuration\n * @returns {boolean}\n */\nfunction canAutoplay(config) {\n var canDeviceAutoplay = utils.device.canAutoplay();\n\n // enable autoplay for devices with disabled ads and at least muted autoplay ability ios10\n var result = canDeviceAutoplay === 'always';\n\n if (canDeviceAutoplay === 'muted' && !hasPreroll(config)) {\n result = true;\n }\n\n return result;\n}\n\nexport default {\n canAutoplay: canAutoplay,\n};\n","import utils from 'utils/utils';\nimport * as icons from 'icons';\nimport * as audioIcons from 'icons/audio';\n\n/** @type {object} */\nconst iconsMap = {\n '.jw-svg-icon-play': icons.play,\n '.jw-svg-icon-pause': icons.pause,\n '.jw-skip-icon .jw-svg-icon-next': icons.chevronRight,\n '.jw-svg-icon-settings': icons.settings,\n '.jw-svg-icon-sharing': icons.share,\n\n '.jw-svg-icon-cc-on': icons.captions,\n '.jw-svg-icon-cc-off': icons.captions,\n\n '.jw-svg-icon-volume-0': icons.audioMuted,\n '.jw-svg-icon-volume-50': icons.audioHalf,\n '.jw-svg-icon-volume-100': icons.audio,\n\n '.jw-svg-icon-fullscreen-on': icons.fullscreenOn,\n '.jw-svg-icon-fullscreen-off': icons.fullscreenOff,\n\n info: icons.info,\n};\n\n/** @type {object} */\nconst audioIconsMap = Object.freeze({\n '.jw-svg-icon-play': audioIcons.playIcon,\n '.jw-svg-icon-pause': audioIcons.pauseIcon,\n '.jw-svg-icon-replay': audioIcons.replayIcon,\n '.jw-svg-icon-rewind': audioIcons.rewind10Icon,\n\n '.jw-svg-icon-volume-0': audioIcons.audioOffIcon,\n '.jw-svg-icon-volume-50': audioIcons.audioHalfIcon,\n '.jw-svg-icon-volume-100': audioIcons.audioOnIcon,\n});\n\n/**\n * @param {string} name\n */\nexport function getIcon(name) {\n return iconsMap[name];\n}\n\n/**\n * @param withAudioIcons\n * @return {object}\n */\nfunction getReplaceableIconsMap(withAudioIcons) {\n if (!withAudioIcons) {\n return iconsMap;\n }\n\n return utils.merge(iconsMap, audioIconsMap);\n}\n\n/**\n * @param {PlayerModel} svpPlayer\n */\nexport default function loadIcons(svpPlayer) {\n const jwPlayer = svpPlayer.player;\n const stream = svpPlayer.getStream();\n const isAudioStream = stream ? stream.isAudio() : false;\n const replaceableIconsMap = getReplaceableIconsMap(isAudioStream);\n\n jwPlayer.once('playlist', () => {\n const container = svpPlayer.getContainer();\n\n utils.each(replaceableIconsMap, (customIcon, selector) => {\n const replaceableIcons = Array.prototype.slice.call(\n container.querySelectorAll(selector),\n );\n\n if (!replaceableIcons.length) {\n return;\n }\n\n utils.each(replaceableIcons, (replaceableIcon) => {\n if (!replaceableIcon) {\n return;\n }\n\n const svpIcon = utils.createNode(customIcon);\n svpIcon.setAttribute(\n 'class',\n replaceableIcon.getAttribute('class'),\n );\n replaceableIcon.parentNode.replaceChild(\n svpIcon,\n replaceableIcon,\n );\n });\n });\n });\n}\n","import { ensureIfControlsLoaded } from './jw-controls';\n\nconst submenuHandler = async (container) => {\n await ensureIfControlsLoaded(container);\n\n container\n .querySelector('.jw-controlbar .jw-button-container')\n .addEventListener('click', (event) => {\n const { target } = event;\n\n // eslint-disable-next-line no-console\n if (\n target.classList.contains('jw-settings-submenu-button') ||\n target.classList.contains('jw-settings-sharing')\n ) {\n const submenu = container.querySelector('.jw-settings-menu');\n\n const right = Math.round(\n container.offsetWidth -\n (target.offsetLeft + target.offsetWidth / 2) -\n submenu.offsetWidth / 2,\n );\n\n submenu.style.right = `${right}px`;\n }\n });\n};\n\nexport default (svpPlayer) => {\n if (!svpPlayer.player.getControls()) {\n return;\n }\n\n svpPlayer.on('ready', () => submenuHandler(svpPlayer.getContainer()));\n};\n","import { getConfig } from '../config/sharing';\n\nconst FACEBOOK_SHARE_URL = 'http://www.facebook.com/sharer/sharer.php?u=';\nconst TWITTER_SHARE_URL = 'https://twitter.com/intent/tweet?url=';\n\n/**\n * Check if link uses JW MEDIAID replacement\n * @param link\n * @return {*|boolean}\n */\nconst hasMediaId = (link) => link && link.indexOf('MEDIAID') > -1;\n\n/**\n * Create sharing url to services like twitter or facebook\n *\n * @param root\n * @param link\n * @return {string}\n */\nconst getSharingLink = (root, link = window.location.href) =>\n `${root}${encodeURIComponent(link)}`;\n\n/**\n * Update node element only if exists and value is correctly set\n * @param el\n * @param value\n */\nconst updateElement = (el, value) => {\n if (el && value) {\n el.value = value;\n }\n};\n\n/**\n * Replace JW Sharing button event listener\n *\n * @param sourceEl\n * @param link\n */\nconst replaceElement = (sourceEl, link) => {\n if (sourceEl) {\n const newEl = sourceEl.cloneNode(true);\n sourceEl.parentNode.replaceChild(newEl, sourceEl);\n\n newEl.addEventListener(\n 'click',\n () => {\n window.open(link, '_blank');\n },\n true,\n );\n }\n};\n\n/**\n * Update JW sharing box to work with our playnext\n *\n * @param container\n * @param stream\n * @param options\n */\nconst updateSharingBox = (container, stream, options) => {\n const { link, code } =\n getConfig({\n stream,\n options,\n }) || {};\n\n // mediaid is supported natively so we do not touch anything when it's passed\n if (code && hasMediaId(code) === false) {\n updateElement(\n container.querySelector(\n '.jw-sharing-copy[aria-label=embed] .jw-sharing-textarea',\n ),\n code,\n );\n }\n\n // link can be undefined\n if (link && hasMediaId(link) === false) {\n updateElement(\n container.querySelector(\n '.jw-sharing-copy[aria-label=link] .jw-sharing-textarea',\n ),\n link,\n );\n\n // this is tricky way to replace JW sharing buttons\n // facebook and twitter are replaced with custom sharing elements\n // this allows dynamic configuration via function\n replaceElement(\n container.querySelector('.jw-sharing-link[aria-label=facebook]'),\n getSharingLink(FACEBOOK_SHARE_URL, link),\n );\n replaceElement(\n container.querySelector('.jw-sharing-link[aria-label=twitter]'),\n getSharingLink(TWITTER_SHARE_URL, link),\n );\n }\n};\n\nexport default (svpPlayer) => {\n svpPlayer.on('initialPlay', () =>\n updateSharingBox(\n svpPlayer.getContainer(),\n svpPlayer.getStream(),\n svpPlayer.config.get('sharing'),\n ),\n );\n};\n","import utils from 'utils/utils';\nimport { APPNEXUS_PROVIDER_ID } from 'player/services/api';\n\nconst APPNEXUS_CLASS_NAME = 'svp-appnxs';\nconst SVP_FLAG_STOPPED = 'svp-flag-stopped';\n\nconst handleAppnexusClass = (container, vendor) => {\n // handle ads only playback\n // class name is scrambled to avoid adblockers\n if (vendor === APPNEXUS_PROVIDER_ID) {\n utils.addClass(container, APPNEXUS_CLASS_NAME);\n } else {\n utils.removeClass(container, APPNEXUS_CLASS_NAME);\n }\n};\n\nexport { APPNEXUS_CLASS_NAME, SVP_FLAG_STOPPED, handleAppnexusClass };\n\nexport default function (svpPlayerModel) {\n svpPlayerModel.on('playlistItem', () => {\n const container = svpPlayerModel.getContainer();\n\n handleAppnexusClass(container, svpPlayerModel.getStream().getVendor());\n\n container.classList.remove(SVP_FLAG_STOPPED);\n });\n\n svpPlayerModel.on('complete', (reason) => {\n const container = svpPlayerModel.getContainer();\n\n if (reason === 'stop') {\n container.classList.add(SVP_FLAG_STOPPED);\n }\n });\n}\n","const getLevelSettingsIcon = (container) =>\n container.querySelector('.jw-icon-settings');\n\nconst handleLevelSettingsIcon = (data, icon) => {\n if (icon) {\n icon.style.display = '';\n\n // hide settings icon when there is only one level available\n // usually this is a case for iOS or when hls has limited bitrate\n if (data && data.levels && data.levels.length === 1) {\n icon.style.display = 'none';\n }\n }\n};\n\nexport default (svpPlayer) => {\n svpPlayer.on(\n 'playlistItem',\n function () {\n this.listenToOnce(svpPlayer.player, 'levels', (levels) =>\n handleLevelSettingsIcon(\n levels,\n getLevelSettingsIcon(svpPlayer.getContainer()),\n ),\n );\n },\n this,\n );\n};\n","/**\n * @param {PlayerModel & Eventable} svpPlayerModel\n * @returns {HTMLDivElement}\n */\nfunction getTitleNode(svpPlayerModel) {\n const container = svpPlayerModel.getContainer();\n return container.getElementsByClassName('jw-nextup-title')[0];\n}\n\n/**\n * @param {PlayerModel & Eventable} svpPlayerModel\n */\nexport default function (svpPlayerModel) {\n const { player: jwPlayer } = svpPlayerModel;\n\n jwPlayer.on('nextShown', (playlistItem) => {\n const nextUpTitle = getTitleNode(svpPlayerModel);\n nextUpTitle.innerHTML =\n playlistItem.itemsShown[0].svp.stream.get('title');\n });\n\n jwPlayer.on('nextAutoAdvance', () => {\n const nextUpTitle = getTitleNode(svpPlayerModel);\n nextUpTitle.innerHTML = '';\n });\n\n jwPlayer.on('nextClick', () => {\n const nextUpTitle = getTitleNode(svpPlayerModel);\n nextUpTitle.innerHTML = '';\n });\n}\n","import { styleLoader } from 'utils/style-loader';\n\nimport audioSkinResolver from './skin/audioSkinResolver';\nimport loadIcons, { getIcon } from './skin/icons-loader';\nimport settingsMenu from './skin/settings-menu';\nimport configButton from './skin/config-button';\nimport sharingBox from './skin/sharing-box';\nimport { ttsSkinResolver } from './skin/tts-skin';\nimport { floatingSkinResolver } from './skin/floating-skin';\nimport containerClass from './skin/container-class';\nimport levelsIcon from './skin/levels-icon';\nimport nextUp from './skin/nextUp';\n\n/**\n * @param {object} jwConfig\n * @param {function} loader\n * @return {object}\n */\nexport function skinLoader(jwConfig, loader = styleLoader) {\n // disable multiple loading of JW skin\n if (jwConfig.skin && jwConfig.skin.url) {\n loader(jwConfig.skin.url);\n\n if (jwConfig.skin.name) {\n jwConfig.skin = {\n name: jwConfig.skin.name,\n };\n } else {\n delete jwConfig.skin;\n }\n }\n\n return jwConfig;\n}\n\n/**\n * Load SVP Skin\n *\n * @param {PlayerModel} svpPlayerModel\n */\nexport default function svpSkin(svpPlayerModel) {\n ttsSkinResolver(svpPlayerModel);\n audioSkinResolver(svpPlayerModel);\n settingsMenu(svpPlayerModel);\n configButton(svpPlayerModel, {\n icon: getIcon('info'),\n });\n loadIcons(svpPlayerModel);\n sharingBox(svpPlayerModel);\n containerClass(svpPlayerModel);\n levelsIcon(svpPlayerModel);\n nextUp(svpPlayerModel);\n floatingSkinResolver(svpPlayerModel);\n}\n","import locale from 'player/model/locale';\n\nexport function floatingSkinResolver(svpPlayer) {\n svpPlayer.on('adSlotStart', () => {\n const container = svpPlayer.getContainer();\n const floatBarTitle = container.querySelector('.jw-float-bar-title');\n if (floatBarTitle) {\n container.querySelector('.jw-float-bar-title').innerHTML =\n locale.getTranslations().player?.close;\n }\n });\n}\n","import { copyToClipboard } from 'utils/clipboard';\n\nexport default (svpPlayer, { icon }) => {\n if (!svpPlayer.player.getControls()) {\n return;\n }\n\n let isLoaded = false;\n\n svpPlayer.once('ready', () => {\n const container = svpPlayer.getContainer();\n\n container.addEventListener(\n 'contextmenu',\n () => {\n if (isLoaded === false) {\n const item = container.querySelectorAll(\n '.jw-rightclick-list .jw-rightclick-item',\n )[0];\n if (!item) {\n return;\n }\n\n item.classList.add('svp-config-link');\n\n const infoNode = document.createElement('span');\n infoNode.innerHTML = icon;\n infoNode.classList.add('jw-icon', 'svp-config-info');\n infoNode.dataset.tip = 'Click to copy';\n\n item.appendChild(infoNode);\n\n infoNode.addEventListener(\n 'click',\n async () => {\n const config = svpPlayer.config.dump();\n\n infoNode.classList.add('svp-link-tip');\n infoNode.dataset.tip = 'Copied';\n\n copyToClipboard(config);\n\n setTimeout(() => {\n infoNode.classList.remove('svp-link-tip');\n }, 300);\n },\n false,\n );\n\n isLoaded = true;\n }\n },\n false,\n );\n });\n};\n","const copyToClipboard = (data) => {\n const el = document.createElement('textarea');\n el.value = data;\n el.setAttribute('readonly', '');\n el.style.position = 'absolute';\n el.style.left = '-9999px';\n document.body.appendChild(el);\n el.focus();\n el.select();\n\n try {\n document.execCommand('copy');\n } catch (err) {\n // eslint-disable-next-line no-console\n console.log('Unable to copy');\n }\n\n document.body.removeChild(el);\n};\n\nexport { copyToClipboard };\n","import utils from 'utils/utils';\nimport device from 'utils/device';\nimport logger from 'utils/logger';\nimport autoplay from './config/autoplay';\nimport appnexus from './ads/appnexus';\nimport preventAdSeeking from './ads/prevent-seeking';\nimport { onAdEventImpression } from './ads/relevant-yield';\n\nimport { youboraSdk } from './youbora';\nimport svpSkin, { skinLoader } from './skin';\n\n/**\n * TODO: Incomplete type?\n * @typedef AdBreak\n * @prtoperty {string} type\n * @property {number} offset\n * @property {Object} vmap\n */\n\n/**\n * @param {Config} config\n */\nconst PlayerModel = function (config) {\n /**\n * JW Player instance\n * @type {jwplayer.JWPlayer}\n */\n this.player = null;\n /**\n * @type {Stream}\n */\n this.stream = null;\n /**\n * @type {Config}\n */\n this.config = config;\n\n this.isInitalized = false;\n\n /**\n * Indicates whenever stream was was stopped\n * @type {boolean}\n */\n this.isStopped = false;\n\n /**\n * Current playlist item\n *\n * @type {PlaylistItem|null}\n */\n this.playlistItem = null;\n\n /**\n * Current time holder for seek and seeked events\n * Fix for JW getPosition bug\n * @type {number|null}\n */\n this.currentTime = null;\n\n /**\n * Store an asset with playlist to allow load pulse data properly on replay whole playlist\n * @type {Asset|null}\n */\n this.masterAsset = null;\n\n /**\n * Indicates if ads are currently playing\n * @type {boolean}\n */\n this.adPlaying = false;\n\n /**\n * Adposition\n *\n * @type {null} preroll|midroll|postroll\n */\n this.adPosition = null;\n\n /**\n * Ad Breaks - stores the list of all ad breaks\n *\n * @type {AdBreak[]}\n */\n this.adBreaks = [];\n};\n\n/**\n * Forward JW Events without any change of them as they fits our needs\n *\n * List of proxied events\n * 'play', 'pause'\n *\n * @param {string} event\n */\nfunction forwardEvent(event) {\n this.listenTo(this.player, event, this.trigger.bind(this, event));\n}\n\n/**\n * Simple proxy for JW Methods\n *\n * @param {string} method\n * @returns {Function}\n */\nfunction bindJwMethod(method) {\n return function () {\n const args = Array.prototype.slice.call(arguments);\n\n if (!this.player) {\n // eslint-disable-next-line no-console\n console.warn(\n `Method ${method} called before player has been initialised`,\n );\n return null;\n }\n\n return this.player[method].apply(this, args);\n };\n}\n\n/**\n * Proxy methods from JW\n * @param {string[]} methods\n * @returns {Record}\n */\nfunction forwardMethods(methods) {\n const forwardedMethods = {};\n\n utils.each(\n methods,\n function (method) {\n forwardedMethods[method] = bindJwMethod.call(this, method);\n },\n this,\n );\n\n return forwardedMethods;\n}\n\n/**\n * @param {'pre'|'mid'|'post'} slotId\n * @returns {'preroll'|'midroll'|'postroll'}\n */\nfunction getAdPosition(slotId) {\n const slotKeys = { pre: 'preroll', mid: 'midroll', post: 'postroll' };\n\n return slotKeys[slotId];\n}\n\nfunction normalizeAspectRatio(aspectRatio = 16 / 9) {\n return parseFloat(aspectRatio.toFixed(2));\n}\n\n/**\n * @param {object} meta\n */\nexport function deriveAspectRatioFromAd(meta) {\n let width = 16;\n let height = 9;\n\n try {\n switch (meta.client) {\n case 'googima': {\n const adData = meta.ima.ad.data;\n width = adData.vastMediaWidth || width;\n height = adData.vastMediaHeight || height;\n break;\n }\n case 'vast': {\n const node = meta.response.querySelector(\n `Ad:nth-child(${\n meta.sequence || 1\n }) MediaFile:last-of-type`,\n );\n width = parseInt(node.getAttribute('width'), 10) || width;\n height = parseInt(node.getAttribute('height'), 10) || height;\n\n break;\n }\n default:\n break;\n }\n\n return normalizeAspectRatio(width / height);\n } catch (err) {\n // noop\n }\n\n return undefined;\n}\n\n/**\n * @typedef AdData\n * @property {number} sequence\n * @property {number} count\n * @property {Object} meta\n */\n\n/**\n * Parse adresponse for each adslot\n *\n * @param {{response?: XMLDocument}} data\n * @returns {AdData & { source: string; raw?: Element }}\n */\nfunction parseAdData(data) {\n const { sequence } = data;\n const xml = data && data.response;\n\n let source = 'WRAPPER';\n let adSelector = 'Ad';\n let adData = null;\n\n if (xml) {\n // only when additional data is given we set source to appnexus\n if (xml.URL === data.tag) {\n source = 'INLINE';\n adSelector = `Ad[sequence=\"${sequence}\"]`;\n }\n\n adData = Array.prototype.slice.call(xml.querySelectorAll(adSelector));\n // get first element if available\n adData = adData && adData[0] ? adData[0] : null;\n }\n\n return {\n sequence: sequence,\n count: data.podcount,\n raw: adData,\n source: source,\n meta: data,\n };\n}\n\n/**\n * Initialize playback end method\n * Clear after each completion of stream or playbackEnd reached\n *\n * @param {number} playbackEnd\n */\nfunction onPlaybackEndAvailable(playbackEnd) {\n const onTime = (position) => {\n if (position > playbackEnd) {\n //\n this.trigger('playbackEnd', Math.round(position));\n }\n };\n\n this.on('time', onTime);\n\n this.once('playbackEnd complete', function () {\n this.off('time', onTime);\n });\n}\n\n/**\n * Adjusts player volume to 100% for audio assets under mobile devices or text to speech assets\n * @this {PlayerModel}\n */\nfunction adjustAudioVolumeOnMobile() {\n const isMobileAudio = device.isMobile() && this.stream.isAudio();\n if (isMobileAudio && !this.player.getMute()) {\n this.player.setVolume(100);\n }\n}\n\n/**\n * Extended ready event with info about device autoplay ability\n * @param {*} options\n * @param {*} eventData\n */\nfunction onReady(options, eventData) {\n this.trigger('ready', utils.extend(options, eventData));\n\n adjustAudioVolumeOnMobile.call(this);\n}\n\nPlayerModel.prototype = {\n initialize() {\n this.player = jwplayer(this.config.get('node'));\n this.trigger('initialize');\n },\n\n setup() {\n this.initialize();\n\n // player could not be setup\n if (!this.player.setup) {\n // eslint-disable-next-line no-console\n console.error(\n `SVP Player initialization error. DOM ${this.config.get(\n 'node',\n )} not found`,\n );\n return;\n }\n\n this.getConfig().then((config) => {\n // speedup lookup\n const { player } = this;\n\n // load youbora only for non-mock streams and 1% traffic\n let youboraRatio = Math.random() < 0.01;\n player.setup(config);\n\n svpSkin(this);\n preventAdSeeking(this);\n\n // set 1% of views for muted autoplayed videos\n if (\n player.getMute() === true &&\n (config.autostart === true || config.autostart === 'viewable')\n ) {\n youboraRatio = Math.random() < 0.005;\n }\n\n if (\n this.stream &&\n !this.stream.isMock() &&\n !this.config.isPreviewMode() &&\n (youboraRatio ||\n this.stream.hasAccess() ||\n youboraSdk.forceLoad)\n ) {\n youboraSdk.initialize(this.player, {\n accountCode: 'schibsted',\n enableAnalytics: true,\n });\n }\n logger('JW').log('config', config);\n\n // forward native JW events without changing their behaviour\n utils.each(\n [\n 'seek',\n 'displayClick',\n 'captionsChanged',\n 'adPause',\n 'adPlay',\n 'autostartNotAllowed',\n 'adClick',\n 'fullscreen',\n 'volume',\n 'mute',\n 'nextShown',\n 'nextAutoAdvance',\n 'nextClick',\n 'relatedReady',\n 'playlistComplete',\n 'playbackRateChanged',\n 'cast',\n 'float',\n ],\n forwardEvent,\n this,\n );\n\n this.listenTo(player, 'error setupError', this.onError, this);\n this.listenTo(\n player,\n 'playlistItem',\n this.onPlaylistItemLoad,\n this,\n );\n\n this.listenTo(player, 'play', this.onPlay, this);\n this.listenTo(player, 'pause', this.onPause, this);\n this.listenTo(player, 'complete', this.onComplete, this);\n this.listenTo(\n player,\n 'ready',\n onReady.bind(this, {\n canAutoplay: autoplay.canAutoplay(config),\n }),\n );\n\n this.listenTo(player, 'mute', () => {\n adjustAudioVolumeOnMobile.call(this);\n });\n\n this.listenTo(player, 'time', this.onTime, this);\n this.listenTo(player, 'viewable', this.onViewable, this);\n this.listenTo(\n player,\n 'autostartNotAllowed',\n this.onAutostartNotAllowed,\n this,\n );\n\n this.listenTo(player, 'meta', this.onMeta, this);\n\n this.listenTo(\n player,\n 'adsManager',\n ({ adsManager }) => {\n adsManager.addEventListener(\n window.google.ima.AdEvent.Type.IMPRESSION,\n onAdEventImpression,\n );\n },\n this,\n );\n this.listenTo(\n player,\n 'metadataCueParsed',\n this.onMetadataCueParsed,\n this,\n );\n\n this.listenTo(\n player,\n 'seek',\n function (data) {\n this.currentTime = data.offset;\n },\n this,\n );\n this.listenTo(\n player,\n 'seeked',\n function () {\n this.trigger('seeked', this.currentTime);\n // clearing has to occur after seekend event as getCurrentTime needs it\n this.currentTime = null;\n },\n this,\n );\n\n this.once(\n 'initialPlay',\n function () {\n this.listenToOnce(\n player,\n 'captionsList',\n function () {\n this.trigger(\n 'captionsList',\n this.getCaptionsList(),\n );\n },\n this,\n );\n },\n this,\n );\n\n this.on('initialPlay', () => {\n this.isStopped = false;\n });\n\n this.listenTo(\n player,\n 'adImpression',\n function (data) {\n if (data && data.adposition) {\n this.adPosition = getAdPosition(data.adposition);\n }\n\n if (this.adPlaying === false) {\n this.trigger('adSlotStart', {\n position: this.adPosition,\n response: data && data.response,\n meta: data,\n });\n\n this.adPlaying = true;\n }\n\n this.trigger('adStarted', {\n position: this.adPosition,\n response: data && data.response,\n meta: data,\n aspectRatio: deriveAspectRatioFromAd(data),\n });\n\n if (data && data.response) {\n this.trigger('adData', parseAdData(data));\n }\n },\n this,\n );\n\n this.listenTo(\n player,\n 'adError',\n function (data) {\n if (data) {\n if (data.adposition) {\n this.adPosition = getAdPosition(data.adposition);\n }\n this.trigger('adError', data);\n }\n },\n this,\n );\n\n this.listenTo(\n player,\n 'adTime',\n function (data) {\n if (data.position && data.duration) {\n this.trigger(\n 'adProgress',\n data.position,\n data.duration,\n );\n }\n },\n this,\n );\n\n this.on(\n 'adSlotStart',\n function () {\n this.listenToOnce(\n player,\n 'adBreakEnd',\n function () {\n if (this.adPlaying === true) {\n this.trigger('adSlotComplete', {\n position: this.adPosition,\n });\n\n this.adPlaying = false;\n }\n },\n this,\n );\n },\n this,\n );\n\n this.listenTo(\n player,\n 'adSkipped',\n function () {\n this.trigger('adSkipped');\n },\n this,\n );\n\n this.listenTo(\n player,\n 'adComplete',\n function () {\n this.trigger('adFinished');\n },\n this,\n );\n\n this.listenTo(\n player,\n 'adSchedule',\n function (data) {\n this.adBreaks = data.adbreaks || [];\n },\n this,\n );\n\n this.listenTo(\n player,\n 'adBreakEnd',\n function ({ offset }) {\n // find the next ad with the distance less or equal 1s to the current one\n const nextAd = this.adBreaks.find(\n (ad) => ad.offset > offset && ad.offset - offset <= 1,\n );\n if (nextAd) {\n // workaround: using setTimeout to make seek work\n setTimeout(() => this.player.seek(nextAd.offset));\n }\n },\n this,\n );\n\n this.listenTo(\n player,\n 'adLoadedXML',\n function (data) {\n if (data && data.xml) {\n this.trigger('adLoadedXML', data.xml);\n }\n },\n this,\n );\n\n this.isInitalized = true;\n\n logger('JW').log((log) => {\n this.listenTo(player, 'all', function (event) {\n if (['bufferChange'].indexOf(event) < 0) {\n log(event, Array.prototype.slice.call(arguments, 1));\n }\n });\n });\n\n this.trigger('setup');\n });\n },\n\n /**\n * @param {Stream} stream\n * @param {boolean} [disableAutoplay]\n */\n playNext(stream, { disableAutoplay }) {\n // clear time\n this.stream = stream;\n\n this.complete('playNext');\n\n if (!this.isInitalized) {\n this.setup();\n } else {\n this.getConfig(stream).then((config) => {\n this.player.load(config.playlist);\n\n if (disableAutoplay) {\n return;\n }\n\n // stream is not available yet, display countdown\n if (stream.getTimeToStart() < 0) {\n // enable autoplay if stream is not available\n this.player.play(true);\n } else {\n this.player.stop();\n }\n });\n }\n },\n\n /**\n * @param {Asset|null} [asset=null]\n */\n setMasterAsset(asset = null) {\n this.masterAsset = asset;\n },\n\n /**\n * Checks if the current playlist contains a given asset\n * @param {number} assetId\n * @returns {boolean}\n */\n isAssetFromPlaylist(assetId) {\n return (\n this.masterAsset != null &&\n (this.masterAsset.getId() === assetId ||\n this.masterAsset\n .get('playlist')\n .some((assetData) => assetData.id === assetId))\n );\n },\n\n /**\n * Immediately completes currently playing stream\n */\n complete() {\n this.adPlaying = false;\n\n // trigger complete event only when stream is not finished to prevent double 'complete' event triggering\n if (\n this.getCurrentTime() > 0 &&\n this.getCurrentTime() !== this.getDuration()\n ) {\n this.trigger('complete');\n }\n },\n\n /**\n * Get DOM Node where player is inserted\n * @returns {HTMLElement}\n */\n getContainer() {\n return this.player.getContainer();\n },\n\n /**\n * @returns {jwplayer.JWPlayer}\n */\n getPlayer() {\n return this.player;\n },\n\n /**\n * Get playback volume\n * @returns {number}\n */\n getVolume() {\n return this.player.getVolume();\n },\n\n /**\n * Set playback volume\n * @param {number} volume\n */\n setVolume(volume) {\n this.player.setVolume(volume);\n },\n\n /**\n * Get playback rate\n * @returns {number}\n */\n getPlaybackRate() {\n return this.player.getPlaybackRate();\n },\n\n /**\n * Set playback rate\n * @param {number} rate\n */\n setPlaybackRate(rate) {\n this.player.setPlaybackRate(rate);\n },\n\n /**\n * Get mute flag\n * @returns {boolean}\n */\n getMute() {\n return this.player.getMute();\n },\n\n /**\n * Set mute param in player\n * @param {boolean} [value]\n */\n setMute(value) {\n this.player.setMute(value);\n },\n\n /**\n * Seek\n * @param {number} time\n */\n seek(time) {\n this.player.seek(time);\n },\n\n /**\n * Get player config. Method is asynchronous due to loading info from api\n *\n * @param {Stream} stream\n */\n getConfig(stream) {\n const nextStream = stream || this.getStream();\n\n return this.config\n .getJwConfig(nextStream)\n .then(skinLoader)\n .catch((reason) => {\n this.trigger('error', reason);\n });\n },\n\n /**\n * Set stream data\n *\n * @param {Stream} stream\n */\n setStream(stream) {\n this.stream = stream;\n },\n\n /**\n * Get current stream loaded with player\n *\n * @returns {Stream|null}\n */\n getStream() {\n return this.stream;\n },\n\n /**\n * Check is ad is playing or not\n * @returns {boolean}\n */\n isAdPlaying() {\n return this.adPlaying;\n },\n\n /**\n * Load given stream\n * Perform all required checks before stream playback\n *\n * @returns {Promise}\n */\n loadStream() {\n return new Promise((resolve) => {\n // for lazy loaded player\n if (!this.isInitalized) {\n this.setup();\n this.player.on('ready', resolve);\n } else {\n resolve();\n }\n });\n },\n\n /**\n * Play stream\n */\n play() {\n // ensure stream is loaded properly\n this.loadStream().then(this.player.play.bind(this.player));\n },\n\n /**\n * Pause stream\n * @param force state\n */\n pause(force) {\n this.player.pause(force);\n },\n\n /**\n * Stop playback\n * @returns {Promise}\n */\n async stop() {\n // playlistitemId is set when first frame is shown\n // stop shouldn't change stream when it was not played\n if (this.isStopped === false) {\n this.trigger('complete', 'stop');\n\n const { playlist } = await this.getConfig();\n\n this.player.load(playlist);\n this.player.stop();\n\n // reset playlist item to allow replaying this stream\n this.playlistItem = null;\n\n this.isStopped = true;\n }\n },\n\n /**\n * Destroy the player instance, reset DOM, clean up listeners\n */\n remove() {\n this.trigger('remove');\n this.off();\n\n if (this.player) {\n this.pause(true);\n\n this.player.remove();\n this.player.off();\n }\n },\n\n /**\n * Get stream duration\n *\n * @returns {number}\n */\n getDuration() {\n const duration = this.player.getDuration();\n\n if (duration < 0) {\n return -duration;\n }\n\n return duration;\n },\n\n /**\n * Get current playback time\n *\n * @returns {number}\n */\n getCurrentTime() {\n let { currentTime } = this;\n\n if (currentTime) {\n return currentTime;\n }\n\n // player not initialized (error/geoblock)\n // return 0\n if (!this.player) {\n return 0;\n }\n\n currentTime = this.player.getPosition();\n\n if (currentTime < 0) {\n return this.getDuration() + currentTime;\n }\n\n return this.player.getPosition();\n },\n\n /**\n * @returns {string}\n */\n getState() {\n if (this.isAdPlaying()) {\n return 'adPlaying';\n }\n\n return this.player.getState();\n },\n\n /**\n * @returns {boolean}\n */\n getFloating() {\n return this.player.getFloating();\n },\n\n /**\n * @param {boolean} shouldFloat\n */\n setFloating(shouldFloat) {\n return this.player.setFloating(shouldFloat);\n },\n\n /**\n * @returns {boolean|undefined}\n */\n // eslint-disable-next-line consistent-return\n getAdBlock() {\n if (this.player) {\n return this.player.getAdBlock();\n }\n },\n\n /**\n * Get poster for current stream\n * Poster may be changed in config\n *\n * @param {Stream} stream\n * @param {HTMLElement} container\n * @returns {string|null}\n */\n getPoster(stream, container) {\n return this.config.getPoster(stream, container);\n },\n\n /**\n * Get list of captions extended by data from api\n *\n * @returns {{ id: string; label: string; language?: string; default?: boolean }[]}\n */\n getCaptionsList() {\n const playerCaptions = this.player.getCaptionsList();\n const captions = this.getStream().getCaptions();\n\n // merge player captions data with result from api\n utils.each(playerCaptions, (caption) => {\n utils.each(captions, (item) => {\n if (caption.id === item.url) {\n caption.language = item.language;\n caption.default = item.default;\n }\n });\n });\n\n return playerCaptions;\n },\n\n /**\n * Set current captions\n * @param {number|string} index string is language key, number is index in array\n */\n setCurrentCaptions(index) {\n let newIndex = index || 0;\n\n if (!utils.isNumber(index)) {\n utils.each(this.getCaptionsList(), (caption, captionsIndex) => {\n if (caption && caption.language === index) {\n newIndex = captionsIndex;\n }\n });\n\n // fallback to off in case index is not found in captions array\n if (!utils.isNumber(newIndex)) {\n newIndex = 0;\n }\n }\n\n // set captions in player\n this.player.setCurrentCaptions(newIndex);\n },\n\n /**\n * Handle all errors from player\n */\n onError(data) {\n logger('SVP').error(data);\n const { code } = data;\n const message = data.message ? data.message.toString() : '';\n\n /**\n * Some errors do not prevent playback to play\n * thus they should be omitted\n */\n const skipErrors = [\n 'Captions failed to load', // could not load\n 'Casting failed to load', // chrome disabled\n ];\n\n // skip errors\n if (skipErrors.indexOf(message) > -1) {\n return;\n }\n\n this.trigger('error', {\n message,\n code,\n });\n },\n\n /**\n * Event triggered before first stream play\n * Useful for statistics\n * @param {PlaylistItem} playlistItem\n */\n onPlaylistItemLoad(playlistItem) {\n // cleanup any previous beforePlay event (playnext after countdown or error)\n this.stopListening(this.player, 'beforePlay');\n\n // trigger this event every time new playlist item is loaded\n this.listenToOnce(\n this.player,\n 'beforePlay',\n function () {\n if (this.stream.getTimeToStart() < 0) {\n this.trigger('initialPlay');\n }\n },\n this,\n );\n\n // ads should not if stream has future start time\n // attach event only for secure streams\n if (this.stream.isSecure()) {\n // reload playlist only if token expired\n // play method do this out of the box\n this.listenToOnce(\n this.player,\n 'displayClick',\n function () {\n if (\n !this.config.hasValidToken() &&\n this.player.getState() !== 'playing'\n ) {\n this.play();\n }\n },\n this,\n );\n }\n\n this.trigger('playlistItem', playlistItem.item);\n\n // clear ad playing flag for current content\n // important when changing stream while adslot is playing\n this.adPlaying = false;\n\n this.listenToOnce(this.player, 'firstFrame', () => {\n this.playlistItemId = playlistItem.item.id;\n this.onFirstFrameLoad(this.playlistItemId);\n });\n\n this.playlistItem = playlistItem.item;\n\n // for streams which end time is not equal to video length\n const playbackEndTime = this.stream.getPlaybackTime('end');\n\n // attach playback listener\n if (playbackEndTime > 0) {\n onPlaybackEndAvailable.call(this, playbackEndTime);\n }\n },\n\n /**\n * Time\n *\n * @param {number} position - current playback time\n * @param {number} duration - current stream duration\n */\n onTime({ position, duration }) {\n if (position < 0) {\n this.trigger('time', -(duration - position), -duration);\n } else {\n this.trigger('time', position, duration);\n }\n },\n\n /**\n * Triggered on first frame of content playback - after ads\n * @param {number} playlistItemId\n */\n onFirstFrameLoad(playlistItemId) {\n // first play of stream\n const mediaType = this.stream.get('mediaType');\n const startTime = this.stream.getPlaybackTime('begin') || 0;\n\n /**\n * Remove \"jw-flag-media-audio\" class when media type is video\n * but was not recognized properly to fix poster image issues\n */\n if (mediaType === 'video') {\n utils.removeClass(this.getContainer(), 'jw-flag-media-audio');\n }\n\n this.once('time', () => {\n // check if currently set video id is the same as played one\n // it can happen when playnext is called before assetPlay\n if (playlistItemId === this.stream.getId()) {\n this.trigger('assetPlay', startTime);\n }\n });\n },\n\n onViewable(eventData) {\n const { viewable } = eventData;\n\n this.trigger('viewable', {\n viewable,\n });\n },\n\n /**\n * @param {string} data.reason\n */\n onAutostartNotAllowed(data) {\n const { reason } = data;\n\n if (reason === 'autoplayDisabled') {\n this.player.setMute(false);\n }\n },\n\n /**\n * Schedule midroll to\n * @param {number} slotDuration\n * @param {number|'NOW'} startTime\n * @returns {Promise}\n */\n async createMidroll(slotDuration, startTime) {\n const midroll = appnexus.createMidroll({\n tag: await this.config.getLiveMidrollTag(slotDuration),\n startTime,\n });\n\n const onTimeChange = () =>\n midroll.setTime(this.player.getCurrentTime());\n\n midroll.onReady(() => {\n this.on('time', onTimeChange);\n // cleanup when stream has changed or finished\n this.on('complete', () => this.off('time', onTimeChange));\n });\n\n midroll.onEnter(\n function (adTag) {\n const position = -Math.abs(this.player.getPosition());\n this.off('time', onTimeChange);\n\n this.once('adSlotComplete', () => {\n this.listenToOnce(this.player, 'providerFirstFrame', () => {\n this.player.seek(position);\n });\n });\n\n this.player.loadAdTag(adTag);\n }.bind(this),\n );\n },\n\n /**\n * Handling midrolls with scte35 tags in HLS live\n * @param data\n */\n onMetadataCueParsed(data) {\n if (!this.stream.isLive()) {\n return;\n }\n\n const { tag, content, start } = data.metadata || {};\n\n if (tag === 'EXT-X-CUE-OUT') {\n this.createMidroll(parseInt(content, 10), start);\n } else if (tag === 'EXT-X-CUE-IN') {\n this.player.skipAd();\n }\n },\n\n /**\n * Handling midrolls in RTMP live streams\n * @param data\n */\n onMeta(data) {\n if (!this.stream.isLive()) {\n return;\n }\n\n const params = data.metadata && data.metadata.TXXX;\n\n if (params) {\n // Workaround for live midrolls SCTE-35 tags in Safari\n // @see https://github.schibsted.io/svp/platform/issues/328\n if (params.insertAd && device.isSafari()) {\n const duration = parseInt(params.insertAd, 10);\n this.createMidroll(duration, 'NOW');\n }\n\n // Workaround for live midrolls SCTE-35 tags in Safari\n // @see https://github.schibsted.io/svp/platform/issues/328\n if (params.cancelAd === 'now' && device.isSafari()) {\n this.player.skipAd();\n }\n }\n },\n\n onPlay(data) {\n this.trigger('play', {\n playReason: data.playReason,\n });\n },\n onPause(data) {\n utils.removeClass(this.getContainer(), 'jw-state-buffering');\n\n this.trigger('pause', data);\n },\n\n /**\n * Correct event flow for end of streaming\n */\n onComplete() {\n // wait until postroll will finish\n this.trigger('complete');\n },\n};\n\n/**\n * Extend player with events\n * Add methods from JW which are used without any rewriting\n */\nutils.extend(\n PlayerModel.prototype,\n utils.Events,\n forwardMethods.call(PlayerModel.prototype, ['getCurrentCaptions']),\n);\n\n/* jshint newcap: false */\nexport default PlayerModel;\n","/**\n * @returns {{init: (el: HTMLVideoElement|null) => void, remove: () => void}}\n */\nconst handle = () => {\n let supposedCurrentTime = 0;\n let video = null;\n\n const onSeeking = () => {\n // guard against infinite recursion:\n // user seeks, seeking is fired, currentTime is modified, seeking is fired, current time is modified, ....\n if (Math.abs(video.currentTime - supposedCurrentTime) > 0.01) {\n video.currentTime = supposedCurrentTime;\n }\n };\n\n const onTimeUpdate = () => {\n if (!video.seeking) {\n supposedCurrentTime = video.currentTime;\n }\n };\n\n /**\n * @param {HTMLVideoElement|null} videoElement\n */\n const init = (videoElement) => {\n video = videoElement;\n\n if (video) {\n // prevent user from seeking\n video.addEventListener('seeking', onSeeking);\n video.addEventListener('timeupdate', onTimeUpdate);\n }\n };\n\n const remove = () => {\n if (video) {\n video.removeEventListener('seeking', onSeeking);\n video.removeEventListener('timeupdate', onTimeUpdate);\n }\n };\n\n return {\n init,\n remove,\n };\n};\n\n/**\n * @param {SvpPlayer} svpPlayer\n */\nconst load = (svpPlayer) => {\n const handler = handle();\n\n /**\n * Get video tag from SVP Player\n * Use class selector to avoid grabbing preview or homad video elements\n *\n * @param {Player} player\n * @returns {Element|null}\n */\n const getVideo = (player) =>\n player.getContainer().querySelector('video.jw-video');\n\n /**\n * Add prevent seeking handler for every adslot\n */\n const onAdSlotStart = () => {\n handler.init(getVideo(svpPlayer));\n };\n\n /**\n * Remove it when ad completes\n */\n const onAdSlotComplete = () => {\n handler.remove();\n };\n\n svpPlayer.on('adSlotStart', onAdSlotStart);\n svpPlayer.on('adError adSlotComplete', onAdSlotComplete);\n};\n\nexport { handle };\nexport default load;\n","import { scriptLoader } from 'utils/script-loader';\nimport logger from 'utils/logger';\nimport { createClass as createPluginClass } from 'player/plugins/model';\n\n/**\n * @type {Record}\n */\nconst plugins = {};\n\nconst Plugins = {\n /**\n * @param {PluginModel} plugin\n */\n register(plugin) {\n const name = plugin.getName();\n\n // register the same plugin only once\n if (!plugins[name]) {\n plugins[name] = createPluginClass(plugin);\n }\n },\n\n load(options) {\n // no plugins provided, complete immediately\n if (!options) {\n // timeout for proper event listener fire\n return Promise.resolve();\n }\n\n const scripts = Object.keys(options);\n\n // do not change this to an arrow function - it breaks iOS playback\n async function loadPlugin(pluginSrc) {\n try {\n await scriptLoader(pluginSrc);\n } catch (error) {\n logger().error(`An error occur while loading ${pluginSrc}`);\n }\n\n return pluginSrc;\n }\n\n return Promise.all(scripts.map(loadPlugin));\n },\n\n /**\n * @param {string} name\n * @returns {PluginModel|undefined}\n */\n get(name) {\n return plugins[name];\n },\n};\n\nexport default Plugins;\n","/* eslint-disable no-restricted-syntax */\nexport function copyProperties(target, source) {\n for (const key of Reflect.ownKeys(source)) {\n if (key !== 'constructor' && key !== 'prototype' && key !== 'name') {\n const desc = Object.getOwnPropertyDescriptor(source, key);\n Object.defineProperty(target, key, desc);\n }\n }\n}\n","import utils from 'utils/utils';\nimport config from 'player/config';\nimport { styleLoader } from 'utils/style-loader';\nimport Provider from '../playback/provider';\nimport SvpPlugins from '../plugins';\nimport { onPlayerEvent } from './helpers';\n\n/**\n * @param {Object} options - Caution, param is bound in constructor\n * @param {Object} settings\n */\nexport function onceConfigReady(options, settings) {\n this.model = new Provider(this.config);\n\n // important listeners has to be attached before setup\n this.listenTo(this.model, 'all', onPlayerEvent, this);\n\n this.listenTo(\n this.model,\n 'play',\n function () {\n this.isCompleted = false;\n },\n this,\n );\n\n // turn on cachebreaker for preview mode\n if (settings && settings.preview === true) {\n config.api.cb = true;\n }\n\n // once per player instance error append stylesheet\n this.once(\n 'error',\n function () {\n styleLoader(this.config.get('skin').url);\n },\n this,\n );\n\n Promise.all([\n new Promise((resolve) => {\n const handleReady = () => {\n resolve();\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n this.off('assetError', handleError);\n };\n\n const handleError = (error) => {\n resolve(error);\n this.off('assetError', handleReady);\n };\n\n this.once('assetReady', handleReady);\n this.once('assetError', handleError);\n }),\n SvpPlugins.load(options.plugins),\n ]).then(([error]) => {\n utils.each(options.plugins, (pluginConfig, plugin) => {\n const Plugin = SvpPlugins.get(pluginConfig.name || plugin);\n\n if (Plugin) {\n // support for new loading method\n this.addPlugin(new Plugin(pluginConfig.config || pluginConfig));\n }\n });\n\n if (!error) {\n this.model.setup();\n }\n });\n\n // asset can be passed as id or an object\n this.setAsset(options.asset || options.id);\n}\n","import utils from 'utils/utils';\nimport logger from 'utils/logger';\nimport ServerTime from 'utils/server-time';\nimport { warnOnce } from 'utils/warn-once';\nimport config from 'player/config';\nimport locale from './model/locale';\nimport Asset from './model/asset';\nimport Config from './playback/config';\nimport Domain from './model/domain';\nimport Recommended from './model/recommended';\nimport { APPNEXUS_PROVIDER_ID } from './services/api';\nimport { getMockAsset } from './services/api/asset';\nimport PulseTracker from './plugins/pulse-stats/tracker';\n\nimport { onAssetError } from './events/error';\nimport { onAssetReady } from './events/asset';\nimport { onComplete } from './events/complete';\nimport { onceConfigReady } from './events/config';\nimport { destroyPlugin } from './events/helpers';\n\n/**\n * @constructor\n * @param {Config} configuration\n */\nconst Player = function (configuration) {\n const options = { ...configuration };\n\n // sync browser time with server\n if (!options.serverTime) {\n ServerTime.fetch(config.time);\n }\n\n // Little bit of monkey patching\n config.api.vendor = options.vendor || 'vgtv';\n config.env =\n config.env === 'production'\n ? 'production'\n : options.env || config.env || 'production';\n\n // Restrict player on blacklisted domains\n if (Domain.isBlacklisted(options.vendor)) {\n return;\n }\n\n logger('SVP').log('config', utils.extend({}, options));\n\n /**\n * Allow to embed player without asset\n * This can be useful for preloading player\n * Appnexus vendor is for displaying ads only playback\n */\n if (\n options.vendor === APPNEXUS_PROVIDER_ID ||\n options.id === -1 ||\n (!options.id && !options.asset)\n ) {\n options.asset = getMockAsset();\n delete options.id;\n }\n\n // load locales for player\n // norwegian by default\n if (typeof options.locale === 'string') {\n locale.setTranslations(config.translations(options.locale));\n }\n\n // bind player api to pass it as last argument in adn function\n if (options.adn) {\n options.adn.svpPlayer = this;\n }\n\n // create configuration for SVP player\n this.config = new Config();\n this.listenToOnce(this.config, 'ready', onceConfigReady, this);\n\n this.config.initialize(options);\n\n // set dynamic api url\n if (options.api) {\n config.api.url = options.api;\n }\n\n // set dynamic related api url\n if (options.relatedUrl) {\n config.api.relatedApiUrl = options.relatedUrl;\n }\n\n // allow to override token api url\n if (options.tokenUrl) {\n config.api.tokenUrl = options.tokenUrl;\n } else if (options.api) {\n config.api.tokenUrl = options.api.replace('api/v1/', 'token/v1/');\n }\n\n // allow to override thumbnails api url\n if (options.thumbnailsUrl) {\n config.api.thumbnailsUrl = options.thumbnailsUrl;\n } else if (options.api) {\n config.api.thumbnailsUrl = options.api.replace(\n 'api/v1',\n 'thumbnails/v1',\n );\n }\n\n if (options.vmapUrl) {\n config.api.vmapUrl = options.vmapUrl;\n }\n\n /**\n * Available plugins\n * PausePlugin, EndposterPlugin, ChaptersPlugin, ContinuePlayingPlugin\n *\n * Plugins registered by default (can not be removed)\n * CountdownPlugin, AgeLimitPlugin\n * @type {Object}\n */\n this.plugins = {};\n\n /**\n * Check if stream has completed playback\n * @type {boolean}\n */\n this.isCompleted = false;\n\n this.isPlayNextAvailable = true;\n\n // fetch config for privileged settings to speedup setup\n if (options.settings) {\n Domain.fetch(options.vendor);\n }\n\n /**\n * Prefetch Pulse tracking library\n */\n if (options.pulse?.provider) {\n PulseTracker.load();\n }\n\n logger('SVP').log(\n function (message) {\n this.on('all', function (event) {\n message(event, Array.prototype.slice.call(arguments, 1));\n });\n }.bind(this),\n );\n};\n\n/**\n * Player public API\n */\nPlayer.prototype = {\n /**\n * Play\n * @param {number} position - seconds\n */\n play(position) {\n // stream will play only if publication date is valid\n const stream = this.model.getStream();\n if (stream.getTimeToStart() < 0 && !stream.isPast()) {\n if (position) {\n this.once('play', this.seek.bind(this, position));\n }\n\n this.model.play();\n }\n },\n\n /**\n * Pause playback\n * @param {boolean} [force] - toggle playback when param is omitted\n */\n pause(force) {\n // pause with force can start stream which is wrong\n if (this.model.getStream().getTimeToStart() < 0) {\n this.model.pause(!force);\n }\n },\n\n /**\n * Seek in seconds\n * @param {number} time\n */\n seek(time) {\n this.model.seek(time);\n },\n\n /**\n * Destroy the player instance, reset DOM, clean up listeners\n */\n remove() {\n utils.each(this.plugins, destroyPlugin, this);\n this.stopListening();\n\n if (this.model) {\n this.model.remove();\n }\n },\n\n /**\n * Play next asset by given id\n *\n * @param {number} id\n * @param {Object} [options]\n * @param {Object} [options.pulse]\n * @param {number} [options.time]\n * @param {boolean} [options.disableAutoplay]\n */\n playNext(id, options = {}) {\n const onNextAssetReady = function () {\n const stream = this.model.getStream();\n const { disableAutoplay, time } = options;\n\n if (time) {\n stream.set('playAhead', time);\n }\n\n // trick to avoid create of new stream as it's set in assetReady\n this.model.playNext(stream, { disableAutoplay });\n this.isPlayNextAvailable = true;\n }.bind(this);\n\n if (this.isPlayNextAvailable) {\n const reason = options.pulse?.playbackSource || 'manualNext';\n // complete current stream\n onComplete.call(this, reason);\n\n // block multiple occurences\n this.isPlayNextAvailable = false;\n\n this.once('assetReady', onNextAssetReady, this);\n\n this.once(\n 'assetError',\n function () {\n if (this.model?.player) {\n this.pause();\n }\n\n this.isPlayNextAvailable = true;\n this.off('assetReady', onNextAssetReady);\n },\n this,\n );\n\n // trigger play next always after complete to keep event order the same\n // for videos which completed or has been interrupted with play next\n this.trigger('playNext', id, options);\n this.setAsset(id);\n }\n },\n\n /**\n * Set playback rate\n *\n * @param {number} rate - Accepts any numeric value between 0.25 and 4. The playback rate is clamped if rate is out of range.\n */\n setPlaybackRate(rate) {\n this.model.setPlaybackRate(rate);\n },\n\n /**\n * Get playback rate\n * @returns {number}\n */\n getPlaybackRate() {\n return this.model.getPlaybackRate();\n },\n\n /**\n * Set playback volume\n *\n * @param {number} volume - number between 0 and 100\n */\n setVolume(volume) {\n this.model.setVolume(volume);\n },\n\n /**\n * Get playback volume\n * @returns {number}\n */\n getVolume() {\n return this.model.getVolume();\n },\n\n /**\n * Set mute value for playback\n * Toggling this param will preserve volume value\n *\n * @param {boolean} [value=true]\n */\n setMute(value = true) {\n this.model.setMute(value);\n },\n\n /**\n * Get playback muted state\n * @returns {boolean}\n */\n getMute() {\n return this.model.getMute();\n },\n\n /**\n * Get player state\n * @returns {string}\n */\n getState() {\n return this.model.getState();\n },\n\n /**\n * @returns {boolean}\n */\n getFloating() {\n return this.model.getFloating();\n },\n\n /**\n * @param {boolean} shouldFloat\n */\n setFloating(shouldFloat) {\n return this.model.setFloating(shouldFloat);\n },\n\n /**\n * Get stream duration\n *\n * @returns {number}\n */\n getDuration() {\n return this.model.getDuration();\n },\n\n /**\n * Get current playback time\n * @returns {number}\n */\n getCurrentTime() {\n return this.model.getCurrentTime();\n },\n\n /**\n * Get current captions list\n * @returns {{ id: string; label: string; language?: string; default?: boolean }[]}\n */\n getCaptionsList() {\n return this.model.getCaptionsList();\n },\n\n /**\n * Get currently playing captions\n * @returns {number}\n */\n getCurrentCaptions() {\n return this.model.getCurrentCaptions();\n },\n\n /**\n * Set current captions by passing its index\n * Setting 0 will hide all captions\n * @param {number} index\n */\n setCurrentCaptions(index) {\n return this.model.setCurrentCaptions(index);\n },\n\n /**\n * Get Player DOM Node\n *\n * @returns {HTMLElement|null}\n */\n getContainer() {\n return this.model.getContainer();\n },\n\n /**\n * @returns {jwplayer.JWPlayer}\n */\n getJWPlayer() {\n return this.model.getPlayer();\n },\n\n getRawConfig() {\n return this.config.getRaw();\n },\n\n /**\n * Get current server time\n *\n * @return {number}\n */\n getServerTime() {\n return ServerTime.getTime();\n },\n\n /**\n * @returns {Promise}\n */\n stop() {\n return this.model.stop();\n },\n\n /**\n * Set asset resource\n * @param {Asset|number} asset - Asset model or stream id\n */\n async setAsset(asset) {\n // cleanup old asset\n if (this.asset) {\n this.stopListening(this.asset);\n this.asset.destroy();\n this.asset = null;\n }\n\n // change asset to object if it is a number\n if (utils.isNumber(asset)) {\n // eslint-disable-next-line no-param-reassign\n asset = {\n id: asset,\n };\n }\n\n this.asset = asset instanceof Asset ? asset : new Asset(asset);\n\n // set vendor for player's default if nothing has been passed\n if (!this.asset.getVendor()) {\n this.asset.set('vendor', this.config.get('vendor'));\n }\n\n // asset is ready if status field is in response\n if (this.asset.get('status')) {\n onAssetReady.call(this);\n } else {\n try {\n await this.asset.fetch();\n onAssetReady.call(this);\n } catch (error) {\n onAssetError.call(this, error);\n }\n }\n },\n\n /**\n * @returns {Asset|null}\n */\n getAsset({ shouldLogDeprecatedWarning = true } = {}) {\n if (shouldLogDeprecatedWarning) {\n warnOnce(\n 'get-asset',\n 'SVP Player SKD deprecation warning\\ngetAsset will be removed in version @schibsted-svp/web-player@4.0.0\\nPlease use getRawAsset instead',\n );\n }\n return this.asset;\n },\n\n /**\n * @returns {import('@schibsted-svp/svp-api-types').Asset|undefined}\n */\n getRawAsset() {\n return this.asset.getRawAsset();\n },\n\n /**\n * Get next asset\n * @return {Promise}\n */\n async getNextAsset() {\n const { next } = this.config.getRecommended() || {};\n if (next === false) {\n return null;\n }\n\n const recommendedPlugin = this.getPlugin('RecommendedPlugin');\n if (!recommendedPlugin) {\n return null;\n }\n if (recommendedPlugin.nextAsset) {\n return recommendedPlugin.nextAsset;\n }\n\n const recommended = new Recommended({\n asset: this.getAsset({ shouldLogDeprecatedWarning: false }),\n });\n const { nextAsset, source } = await recommended.getNextAsset(next);\n recommendedPlugin.nextAsset = nextAsset;\n recommendedPlugin.nextAssetSource = source;\n\n return recommendedPlugin.nextAsset;\n },\n\n /**\n * Add plugin to the player\n *\n * @param {PluginModel} plugin\n */\n addPlugin(plugin) {\n const proxyPluginEvent = function (event, ...args) {\n this.trigger(`${plugin.getName()}:${event}`, ...args);\n };\n\n plugin.setPlayer(this);\n this.listenTo(plugin, 'all', proxyPluginEvent, this);\n\n this.plugins[plugin.getName()] = plugin;\n },\n\n /**\n * Get plugin by name\n *\n * @param {string} plugin - name of the plugin\n * @returns {PluginModel|undefined}\n */\n getPlugin(plugin) {\n return this.plugins[plugin];\n },\n};\n\n/**\n * Checks if device can autoplay stream\n * @deprecated new autoplay policies require starting of video to detect if autoplay will work\n * @returns {boolean}\n */\nPlayer.canDeviceAutoplay = function () {\n // eslint-disable-next-line no-console\n if (console?.warn) {\n // eslint-disable-next-line no-console\n console.warn(\n 'SVP Player SKD deprecation warning. ' +\n 'Due to changes in browser policies, player will detect itself if it can autoplay.',\n );\n }\n\n return utils.device.canAutoplay();\n};\n\nutils.extend(Player.prototype, utils.Events);\n\nexport default Player;\n","import config from 'player/config';\nimport Player from 'player/player';\nimport image from 'utils/image';\nimport utils from 'utils/utils';\n\nimport locale from 'player/model/locale';\nimport Domain from 'player/model/domain';\n\nimport { youboraSdk } from 'player/playback/youbora';\nimport SvpPlugins from './player/plugins';\n\nconst SVP = {};\nSVP.Player = Player;\nSVP.Player.Plugins = SvpPlugins;\nSVP.Player.version = config.version;\n\n// by default antiadblock is turned off\nObject.defineProperty(SVP.Player, 'defaults', {\n get() {\n return this.__defaults || {};\n },\n set(value) {\n // if params are not object then\n // override and force to object\n if (value !== Object(value)) {\n // eslint-disable-next-line no-param-reassign\n value = {};\n }\n\n Object.defineProperty(SVP.Player, '__defaults', {\n value: value,\n enumerable: false,\n configurable: false,\n writable: false,\n });\n },\n});\n\n/**\n * Load youbora plugin unless it is turn off in SVP.default\n * @type {boolean}\n */\nconst loadYoubora = (options) => {\n // youbora plugin can be disabled completely\n try {\n const forceLoad = localStorage.svpYoubora === 'true';\n if (!utils.device.isBot() && (forceLoad || options !== false)) {\n youboraSdk.load(options, forceLoad);\n }\n } catch (e) {\n // could not load youbora plugin\n }\n};\n\nconst setLocale = (language = 'no') => {\n locale.setTranslations(config.translations(language));\n};\n\nconst preInitialize = () => {\n image.initialize(\n utils.extend(config.images, {\n getPixelRatio: utils.device.getPixelRatio,\n }),\n );\n\n Domain.initialize(window.location.hostname);\n};\n\nconst postInitialize = () => {\n // do not override locale set from config\n const wasLocaleSet = Object.keys(locale.getTranslations()).length !== 0;\n if (!wasLocaleSet) {\n // set locale for all players\n setLocale(SVP.Player.defaults.locale);\n }\n\n loadYoubora(SVP.Player.defaults.youbora);\n};\n\nexport default SVP;\nexport { preInitialize, postInitialize };\n","import codeToString, * as STATUS_CODES from '../playback/config/status-codes';\n\nconst translations = {\n en: {\n id: 'en',\n // Countdown plugin\n 'Video will start at': 'Video will start at',\n 'Video will start in': 'Video will start in',\n\n 'ageLimit-0': 'A',\n\n // SponsorOverlay plugin\n 'Ad from': 'Ad from',\n\n // months is special case for translating month to human readable form\n months: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]:\n 'Sorry. An error occured. Try again later.',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]:\n 'The video failed to play due to geoblock restrictions.',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_TOKEN)]:\n 'This video can not be played because it is protected. Try again later.',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]:\n 'Sorry. This video is unavailable.',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]:\n 'Sorry. This video is not active.',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]:\n 'Sorry. This video is unavailable.',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]:\n 'Network issues. Please check your internet connection',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]:\n 'Sorry. An error occured. Try again later.',\n\n // sharing box heading\n Sharing: 'Share this video',\n 'Live button': 'Live',\n\n // error message\n 'Error code': 'Error code',\n\n // closed captions\n en_GB: 'English',\n es_ES: 'Español',\n nb_NO: 'Bokmål',\n sv_SE: 'Swedish',\n\n 'Audio video switch': 'Audio video switch',\n 'Playing audio only': 'Playing audio only',\n\n ads: {\n // jw ad messages\n admessage: 'The ad will end in xx seconds',\n cuetext: 'Advertisement',\n skipmessage: 'Skip ad in xx',\n skiptext: 'Skip',\n podmessage: 'Ad __AD_POD_CURRENT__ of __AD_POD_LENGTH__',\n loadingAd: 'Loading ad',\n },\n\n player: {\n listen: 'Listen',\n playback: 'Start playback',\n loginToListen: 'Sign in to listen',\n subscribeToListen: 'Subscribe to listen',\n seconds: 'sec',\n minutes: 'min',\n hours: 'h',\n playbackSpeed: 'Toggle Audio playback speed. Current speed is',\n },\n tts: {\n play: 'Listen to the story',\n replay: 'Listen again',\n minute: 'minute',\n minutes: 'minutes',\n second: 'second',\n seconds: 'seconds',\n },\n },\n no: {\n id: 'no',\n // Countdown plugin\n 'Video will start at': 'Videoen starter',\n 'Video will start in': 'Videoen starter om',\n\n 'ageLimit-0': 'A',\n\n // SponsorOverlay plugin\n 'Ad from': 'Annonse fra',\n\n // months is special case for translating month to human readable form\n months: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'Mai',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Okt',\n 'Nov',\n 'Des',\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]:\n 'Beklager, en feil oppstod. Prøv å spill av videoen senere',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]:\n 'Denne videoen er kun tilgjengelig i Norge',\n // token for stream is incorrect\n [codeToString(STATUS_CODES.NOT_ACTIVE_TOKEN)]:\n 'Denne videoen kan dessverre ikke spilles av da den er beskyttet. Prøv igjen senere.',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]:\n 'Beklager, videoen er ikke tilgjengelig',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]:\n 'Beklager, videoen er ikke tilgjengelig',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]:\n 'Beklager, vi har ikke rettigheter til å vise videoen lenger',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]:\n 'Kunne ikke spille av video, venligst sjekk internettforbindelsen din',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]:\n 'Beklager, en feil oppstod. Prøv å spill av videoen senere',\n\n // jw player error messages\n 'This video cannot be played because of a technical error.':\n 'Kunne ikke spille av video på grunn av en teknisk feil',\n 'Sorry, the video player failed to load.':\n 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n 'This video file cannot be played.': 'Kunne ikke spille av video',\n 'The live stream is either down or has ended.':\n 'Livesendingen er nede eller er avsluttet',\n 'There was a problem providing access to protected content.':\n 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n 'This video cannot be played because of a problem with your internet connection.':\n 'Kunne ikke spille av video, venligst sjekk
internettforbindelsen din',\n\n // sharing box heading\n Sharing: 'Del denne videoen',\n 'Live button': 'Direkte',\n\n // error message\n 'Error code': 'Feilkode',\n\n // closed captions\n en_GB: 'English',\n es_ES: 'Español',\n nb_NO: 'Bokmål',\n sv_SE: 'Svensk',\n\n ads: {\n admessage: 'Annonsen slutter om xx',\n cuetext: 'Annonse',\n skipmessage: 'Hopp over om xx',\n skiptext: 'Hopp over',\n podmessage: 'Annonse __AD_POD_CURRENT__ av __AD_POD_LENGTH__',\n loadingAd: 'Laster annonse',\n },\n player: {\n player: 'Videospiller',\n play: 'Spill',\n playback: 'Start avspilling',\n pause: 'Pause',\n volume: 'Volum',\n prev: 'Forrige',\n next: 'Neste',\n cast: 'Chromecast',\n airplay: 'AirPlay',\n fullscreen: 'Fullskjerm',\n playlist: 'Spilleliste',\n hd: 'Kvalitet',\n cc: 'Undertekster',\n audioTracks: 'Lydspor',\n playbackRates: 'Avspillingshastighet',\n replay: 'Spill igjen',\n buffer: 'Laster inn',\n more: 'Mer',\n liveBroadcast: 'Live',\n loadingAd: 'Laster annonse',\n rewind: 'Spol tilbake 10 sekunder',\n nextUp: \"Neste' video\",\n nextUpClose: 'Lukk neste',\n related: 'Relaterte videoer',\n close: 'Lukk',\n settings: ' Innstillinger',\n unmute: 'Slå på lyd',\n copied: 'Kopiert',\n forward: 'Spol fram 30 sekunder',\n loginToListen: 'Logg inn for å lytte',\n subscribeToListen: 'Abonner for å lytte',\n listen: 'Lytt',\n seconds: 'sek',\n minutes: 'min',\n hours: 't',\n playbackSpeed: 'Endre avspillingshastighet. Nåværende hastighet er',\n },\n tts: {\n play: 'Lytt til saken',\n replay: 'Lytt igjen',\n minute: 'minutt',\n minutes: 'minutter',\n second: 'sekund',\n seconds: 'sekunder',\n },\n },\n\n se: {\n id: 'se',\n // Countdown plugin\n 'Video will start at': 'Videon är tillgänglig',\n 'Video will start in': 'Videon är tillgänglig om',\n\n 'ageLimit-0': 'A',\n\n // SponsorOverlay plugin\n 'Ad from': 'Annons från',\n\n // months is special case for translating month to human readable form\n months: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'Maj',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Okt',\n 'Nov',\n 'Dec',\n ],\n // general troubles, we don't know exactly what had happen\n [codeToString(STATUS_CODES.GENERAL_ERROR)]:\n 'Något gick fel. Försök igen senare.',\n // stream is available only in certain areas/countries\n [codeToString(STATUS_CODES.NOT_ACTIVE_GEOBLOCKED)]:\n 'Vi har tyvärr endast rättigheter att spela detta innehåll i Sverige',\n // token for stream is incorrect\n [codeToString(STATUS_CODES.NOT_ACTIVE_TOKEN)]:\n 'Denna video kan inte spelas upp eftersom den är skyddad. Försök igen senare.',\n // stream is 404 (wrong/deleted from akamai)\n [codeToString(STATUS_CODES.NOT_FOUND)]: 'Videon är inte tillgänglig',\n // asset is not active\n [codeToString(STATUS_CODES.NOT_ACTIVE)]: 'Videon är inte tillgänglig',\n // asset's flight times are in the past\n [codeToString(STATUS_CODES.NOT_ACTIVE_PAST)]:\n 'Videon är inte tillgänglig',\n // network error while playing live stream\n [codeToString(STATUS_CODES.NETWORK_ERROR)]:\n 'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n // token can not be retrieved\n [codeToString(STATUS_CODES.TOKEN_FETCH_ERROR)]:\n 'Token kunde inte hämtas',\n\n // jw player error messages\n 'This video cannot be played because of a technical error.':\n 'Den här videon kan inte spelas på grund av ett tekniskt fel',\n 'Sorry, the video player failed to load.':\n 'Något gick fel. Försök igen senare',\n 'This video file cannot be played.': 'Det gick inte att spela videon',\n 'The live stream is either down or has ended.':\n 'Live överföring är antingen nere eller har slutat',\n 'There was a problem providing access to protected content.':\n 'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n 'This video cannot be played because of a problem with your internet connection.':\n 'Något gick fel. Kolla gärna din internet koppling och försök lite senare',\n\n // sharing box heading\n Sharing: 'Dela',\n 'Live button': 'Live',\n\n // error message\n 'Error code': 'Felkod',\n\n // closed captions\n en_GB: 'English',\n es_ES: 'Español',\n nb_NO: 'Bokmål',\n sv_SE: 'Sverige',\n\n ads: {\n admessage: 'Annons xx sekunder',\n cuetext: 'Annons',\n skipmessage: 'Skippa annons om xx',\n skiptext: 'Skippa',\n podmessage: 'Annons __AD_POD_CURRENT__ av __AD_POD_LENGTH__',\n loadingAd: 'Laddar annons',\n },\n player: {\n player: 'Videospelare',\n play: 'Spela',\n playback: 'Spela video',\n pause: 'Pausa',\n volume: 'Volym',\n prev: 'Förra',\n next: 'Nästa',\n cast: 'Chromecast',\n airplay: 'AirPlay',\n fullscreen: 'Fullskärm',\n playlist: 'Spellista',\n hd: 'Kvalitet',\n cc: 'Undertexter',\n audioTracks: 'Ljudspår',\n playbackRates: 'Uppspelningshastighet',\n replay: 'Spela igen',\n buffer: 'Laddar',\n more: 'Mer',\n liveBroadcast: 'Live',\n loadingAd: 'Laddar annons',\n rewind: 'Spola tillbaka 10 sekunder',\n nextUp: 'Nästa',\n nextUpClose: 'Stäng',\n related: 'Fler videos',\n close: 'Stäng',\n settings: 'Inställningar',\n unmute: 'Slå på ljud',\n copied: 'Kopierad',\n forward: 'Spola framåt 30 sekunder',\n loginToListen: 'Logga in för att lyssna',\n subscribeToListen: 'Prenumerera för att lyssna',\n listen: 'Lyssna',\n seconds: 'sek',\n minutes: 'min',\n hours: 't',\n playbackSpeed:\n 'Växla ljuduppspelningshastighet. Aktuell hastighet är',\n },\n tts: {\n play: 'Lyssna på artikeln',\n replay: 'Lyssna igen',\n minute: 'minut',\n minutes: 'minuter',\n second: 'sekund',\n seconds: 'sekunder',\n },\n },\n} as const;\n\ntype LanguageKeys = keyof typeof translations;\ntype LanguageTranslations = (typeof translations)[LanguageKeys];\n\nexport function getTranslations(locale: LanguageKeys): LanguageTranslations {\n return translations[locale];\n}\n","import { getTranslations } from './config/translations';\nimport jwKeys from './config/jw-keys';\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ndeclare const __BUILD_VERSION__: string;\n\nconst VERSION = __BUILD_VERSION__;\n\nconst config = {\n version: VERSION,\n player: {\n keys: jwKeys,\n },\n /**\n * SVP API configuration\n */\n api: {\n url: 'https://svp.vg.no/svp/api/v1/',\n cb: false,\n tokenUrl: 'https://svp.vg.no/svp/token/v1/',\n thumbnailsUrl: 'https://svp.vg.no/svp/thumbnails/v1/',\n relatedApiUrl: 'https://related.stream.schibsted.media',\n vmapUrl: 'https://vmap.stream.schibsted.media',\n\n vendor: null,\n /**\n * API identifier\n */\n identifier: 'svp-player',\n\n /**\n * Get full endpoint url to requested resource\n */\n getUrl(vendor: string, endpoint: string): string {\n const joiner = endpoint.indexOf('?') > -1 ? '&' : '?';\n let url = `${this.url + vendor + endpoint + joiner}appName=${\n this.identifier\n }`;\n\n if (this.cb === true) {\n url += `&cb=${Math.random() * 10000}`;\n }\n\n return url;\n },\n },\n\n ads: {\n appnexus: {\n vmap: 'https://ib.adnxs.com/vmap',\n ptv: 'https://ib.adnxs.com/ptv',\n cr: 'https://ib.adnxs.com/cr',\n ast: 'https://acdn.adnxs.com/ast/ast.js',\n debug: false,\n },\n },\n\n cdn: {\n svp: `https://cdn.stream.schibsted.media/player/${VERSION}`,\n player: 'https://cdn.stream.schibsted.media/jw/jwplayer-8.34.5',\n youbora:\n 'https://smartplugin.youbora.com/v6/js/adapters/jwplayer/6.8.1/sp.min.js',\n poster: `https://cdn.stream.schibsted.media/player/${VERSION}/img/poster.gif`,\n fonts: {\n Graphik: {\n 400: `https://cdn.stream.schibsted.media/player/fonts/Graphik.woff`,\n 500: `https://cdn.stream.schibsted.media/player/fonts/Graphik-Medium.woff`,\n 600: `https://cdn.stream.schibsted.media/player/fonts/Graphik-Semibold.woff`,\n },\n },\n },\n\n time: 'https://time.akamai.com',\n\n images: {\n sizes: {\n poster: {\n autoHeight: [\n 380, 480, 580, 680, 780, 800, 980, 1080, 1440, 2048,\n ],\n autoWidth: [452, 613, 740, 900, 1080, 1440],\n },\n },\n },\n\n liveVideoPreview: 'livepreview',\n videoPreview: {\n default: 'preview_360p',\n vgtv: 'preview_vivi_category',\n },\n\n /**\n * Default skins for providers\n */\n skins: {\n default: {\n url: `https://cdn.stream.schibsted.media/player/${VERSION}/css/player.css`,\n name: 'svp-default jw-skin-seven',\n },\n },\n\n about: {\n vgtv: {\n link: 'http://www.vgtv.no/',\n text: 'VGTV',\n },\n },\n\n sharing: {\n global: {\n sites: ['facebook', 'twitter'],\n },\n\n vgtv: {\n link: 'http://www.vgtv.no/#!/MEDIAID',\n code: '',\n },\n },\n\n domains: {\n blacklist: {\n global: [],\n ab: ['*avpixlat.info', '*exponerat.net'],\n },\n\n whitelist: {\n global: [\n '*localhost',\n '*schibsted.io',\n '*schibsted.media',\n '*schibsted.ws',\n '*schibsted.se',\n '*smp.no',\n '*plan3dev.se',\n '*plan3.se',\n '*vg.no',\n '*vgtv.no',\n '*vgnett.no',\n '*aftonbladet.se',\n '*aftenposten.no',\n '*ap.no',\n '*sa.no',\n '*aftenbladet.no',\n '*vglive.no',\n '*e24.no',\n\n // brandstudio cms\n '*vev.design',\n // stream cluster\n '*pubops.net',\n\n '*adresseavisen.no',\n '*polarismedia.no',\n '*adressa.no',\n '*bt.no',\n '*fvn.no',\n\n '*htmlinstant.com',\n '*ht.no',\n '*rbnett.no',\n '*itromso.no',\n '*folkebladet.no',\n '*framtidinord.no',\n '*osloby.no',\n '*av-avis.no',\n '*medianorge.no',\n '*herokuapp.com',\n '*bergenstidende.no',\n '*bonansa.no',\n '*sysla.no',\n '*bygdanytt.no',\n '*vestnytt.no',\n '*strilen.no',\n '*snd.no',\n '*fedrelandsvennen.no',\n '*lister24.no',\n '*l-a.no',\n '*lindesnesfyr.no',\n\n // Polaris related newspapers\n // addressa.no\n '*adressa.no',\n '*avisa-st.no',\n '*banett.no',\n '*fosna-folket.no',\n '*hitra-froya.no',\n '*innherred.no',\n '*mb.no',\n '*bladet.no',\n '*opdalingen.no',\n '*tronderbladet.no',\n // rbnett\n '*rbnett.no',\n '*andalsnes-avis.no',\n '*driva.no',\n // smp newspaper\n '*smp.no',\n '*dolen.no',\n '*fjordabladet.no',\n '*fjt.no',\n '*fjordingen.no',\n '*fjuken.no',\n '*heroynytt.no',\n '*morenytt.no',\n '*sunnmoringen.no',\n '*vigga.no',\n '*vikebladet.no',\n // itromso.no\n '*itromso.no',\n '*framtidinord.no',\n // ht.no\n '*ht.no',\n '*vol.no',\n // t-a.no\n '*t-a.no',\n '*namdalsavisa.no',\n // other polaris newspapers\n '*altaposten.no',\n '*folkebladet.no',\n '*svd.se',\n // marketplaces\n '*finn.no',\n '*familieklubben.no',\n '*tek.no',\n\n // testing env\n '*mylocal.com',\n ],\n },\n\n preview: {\n global: [\n '*vgnett.no',\n '*svp.schibsted.io',\n '*cms.schibsted.media',\n '*localhost',\n '*pubops.net',\n '*stream.schibsted.media',\n ],\n },\n },\n\n vendors: {\n se: ['ab', 'svd'],\n },\n\n translations: getTranslations,\n};\n\nexport default config;\n","import config from '../config';\n\nconfig.env = 'production';\nexport default config;\n","export default {\n default: 'OjqkBWp9VpYP8utpWdzBZ+eZIJhcfOW5U9g4/w==',\n //\n '100sport': 'Uq5GO7mRz+oxp7pVh3bZEvDEBzEYRTG4h3sr1Q==',\n ab: 'qK+optxkJTV2KblAIiLdoWze6AAGxX5Qxeb57A==',\n adressa: 'BQs7m1EiK0wlK8xAZQgJwU1a4OskbKgoYRSEfA==',\n adressabrandstudio: 'fuz93B3kwPfLDZv+opQh6xasO9nRkraYSbQP0A==',\n altaposten: 'Y0grkUQ6BaCat409fP7mPqr1SbDS+LntWrQIpg==',\n ap: 'ElscszbjUK+A0En7My3UPpJ/4MlOUOn+fiU2/w==',\n bt: 'wgmdmAfgbneZjUBt8ZxqiKTxVCpriTwcC06hzQ==',\n brandstudio: 'uXOJWRxZaxOSRhIisAGWsEbzn3PIhbTlCn99IQ==',\n folkebladet: 'kGoJc75y4Uq1r2kw2n883oYzGk+SrEJ2GEDQUQ==',\n fvn: '88vcnFV8g4crXq1P8jrGz8D7XqMwawGvwFmhJg==',\n harstad: 'C8hK/HIbIL3k9h4dN4xY3lHAPdjLyx7B4WGM/w==',\n itromso: 'QAPvDWM3mHi3lYOZCLqOwHZMstixgFefhc/d1Q==',\n podcast: 'X2K7i+dwWXsIR0BKyX+3C+8s4y9VOWcYgtjeJA==',\n rbnett: 'y7Z4M5Ah6dOyDH7/ZrCQjHZPb3E3xnctwkixbw==',\n riks: 'a5kTQmkeGHV+P2wOaTQvAuXEdivj2lbXoAxTbw==',\n ridenews: '6s5IkHj1LiODLxDOaYr1ze6F7F1Cun92UFuOpA==',\n sa: 'dWpue+L8nJKbDFqh9Ps3o2mxqr92MY2G9tQohg==',\n schibsted: 'Cn+pnRPeR7dlwUgy+QwoSwyu0NXoGUtxD/LVqA==',\n smp: 'eZ34FUhLc6cW3MypHSgtbYwRgbDxKLV/iaABmQ==',\n svd: 'Olwljnb5W0VdUf38yWyv3kjowR9JamQYw4RndA==',\n tronderavisa: '7azVhGsMlCm9EuRPr4EJ8RY6cyVbmAgeS1MkKw==',\n vgtv: 'edF0bFyKcM68omCq24JsMWw/CO/f6cAgS91oiQ==',\n vgtvs: 'D/kRElM9UDSgZxbEqPBESxIKamNBql5PeIabpg==',\n tvnu: 'D3dYmVFYpKAvLGpVd8pGy5WaK2ENvBtw/Ckcpg==',\n tvh: 'ruSROpB1eB80YOC8rhSGsPtRYOuyY3dVgvuENA==',\n steinkjer: '6R+PbNB3P4oBInKbvaTZ43gQ2ytS033VqoeXCw==',\n avisast: 'QcZcFVTVlh+UzfQwef0geS5SG8kfbuqpSbpBeA==',\n bladet: '1kmygQh66fY6JQRpflRV7+YGryfifrMtVFP3Yg==',\n banett: 's4vq0YvNHbJwTC4xIWv8gKbwgBhuk8lVzyOT8w==',\n innherred: '0yUhyfky20/BmQ0m34/m5xjUj7jZ+hbs6NGbaQ==',\n fosnafolket: 'URfW4iMX1EXaAMNIfXQMH4vFM45poWC3w/exaA==',\n opp: 'ZPPMwo4Hi2zY83ujh8eKtEZyLbnIDiiZ6FmM/A==',\n tronderbladet: 'QvkL/hGUNa8LhqWMWf0BBO5KIxtrY6tM/V9YzA==',\n stjordalsnytt: 'Vrr3fuhtCbYFD65BiG71D7LG85GJGbhJtsG0gg==',\n mn24: '/C0MEydhFzj2pHNF2s/sCJxSqmT10BN44TwB7g==',\n hitrafroya: 'dKm1wQ/c9wb8RUV17DcB0BcnWu6LwWOVwIwdOg==',\n framtidinord: 'kK2ipLqdfYIbhGdvjOthFN4jGIvUi8N40xzn4Q==',\n vaganavisa: 'EmRtKKUtomHJbI3SoSaGcUFmTH09+P1RWQJhFA==',\n vol: '5uns40a+PtZHBW63Js08tgiKxoLP9lvKzeSQhg==',\n nyttiuka: 'y3FqylNKM83/cm/EWqK8VMXaAlhZ8SugNLbLUA==',\n vikebladet: 'wjNCSWk5Pa+NP3himjg5l3SP6zJiwtfcio6Q4Q==',\n fjt: 'fwjuzLToVU9Ge7szNfMQjku/mrHv+rHKmnDWIw==',\n vestlandsnytt: 'eeXBMlgZz3eV1P40G2n8w5xNj6I26P6uPqGXrw==',\n fjuken: 'yJRnk09dbww1J8o1ZcttIz6JEWIbKQEVc2dBWA==',\n vigga: 'CVPhE9cnKo/qCEYsnKY4srRPlUX5nIkpgaYmmA==',\n dolen: '0pwgbRB6x1e0lopRdq63Z4dr9dWmCJv+y6lDjA==',\n fjordabladet: 'GSaj2C8vTpEIBol7cv22nushv81P41JejaYAYQ==',\n morenytt: 'y/F1oPTks00zkuYbKzS/J5nv1kj3F7bzP9mYyA==',\n fjordingen: 'qKK3mb0M6WSP0x2m6tivcPISciI3XcrXbQ6Ahg==',\n driva: 'UrdUWdGCy1fRuOhiW73+OquZdf4X4pEQt+wWAg==',\n andalsnes: '1R1UB8uyMZTD2ktpNUGmWwQ1rRJqdddbTr35hA==',\n nyss: 'KtxtrKsDnYN56mQzwJR0yQrt3v6txf5deJbU4Q==',\n agderposten: '1ddblFxmHMTjY92s/n4MW4UOarEg8Y0YdxnTLA==',\n lindesnes: 'BCo2euu9kUoY98D325ELxqI6xM2YkdZyg7/muQ==',\n farsund: 'qCM539Tebp04kUVjiaLyL7pkGCCDJamyVyu/zA==',\n varden: 'rKy6/CASIAoRtm+px2g9c78jIoqfW8zNaOlHMg==',\n lp: 'kKDr8twymQP1JZL6JSr+1+dnov/tgzOdcrg1TA==',\n venneslatidende: 'ssbp/U5E/VpJfjG1iKiRn4s1aEcmSJJVUvArHg==',\n gat: 'lsDEJw9LYcQHNSW7z1ANuZlP1az9SYVeVLz9nQ==',\n bomlonytt: 'JWrUR1BR1BDEvlk1D4zTVACUVUpSRmaHNPc3Ug==',\n sunnhordland: 'YNBOeqC8eCInTQKL6AAj3bUxvOBovPqzUIoGcQ==',\n klaebuposten: 'C4qzXiBP17SXr/vE8xhg24JOWtyoGDeDp5r6PQ==',\n gauldalsposten: 'eckuy2Y+Q1Ix2uLPX/mVUMHjfZGihqYYFbr9lg==',\n froya: '0hMWIeKp57C5kpW/SZZ1wt4UkFJHwmWYaCd25A==',\n bnytt: 'DZ3T3Pf0i7D5z/HvohVc0O7Nd+uA/NIaNWaWFA==',\n vnytt: 'LIf2gdiGI3pQ3xNFRA4VyY0Rw1m8Zt8INsG59w==',\n stri: 'gsS6gkjzxZM0HbwrApKOQptgKWAhLWjQiGKBqQ==',\n avavis: 'VKgcw+6bkoouV5F8wq3m3INf0/vnoAYm9A+iKw==',\n bareasane: 'EWqdeFg2tvV34V0/8Y8xPYs7nSJqhBca7YE9nA==',\n e24: 'EKxf/lgWjKyDmxngUI9GCHYadRPzPqJZ61eGsw==',\n op: 'D+Ha6SLZGzk9rTYF73CZVauhRaxcOWQJ1DcA7A==',\n r24: 'MCwzsnqjZ7mxAZIhFUaqLc9Jb6DJz16u19cJgw==',\n stord: '/XmpYhCtUCXEGxdg7Sx8uDV4H9B/S7pcoHFshw==',\n marsteinen: 'mgxyPEPhFgqBsXWID7XMFehHRtcmSV0NYBgtkQ==',\n aptts: 'iHIdsWq1mtMGYlPjI4bdBAv/Mi67voL7GPFxzQ==',\n vgtvexternal: '0CwPuvNeSfovbd5Z9E2BxESNFd0uCQuKGua/EQ==',\n wellobe: 'AB982A2pFmif19jnLW8g+9HAmRXj8WB9iLPcFQ==',\n godare: 'rW8bwL2zUArb4f17a9VzQXpPJvrKnuaB/ot6Xw==',\n nearadio: 'I3cMBc/Zc14sn4akbaJzItzyxSp9q97kKCBQ9w==',\n fitjarposten: 'Hqz/cmP6WSIqk5F322XILEoOh45aPi0IEyhvTw==',\n kulingen: 'imULXGlJMRjRsjeiEqCNTL3rBxQoWgQcCCCghQ==',\n kystogfjord: 'cI6D2aLVAUQpzIvhIXiBnMJHXlR0G2oW5pkHSw==',\n porten: 'FxTcRhFGJv+55ria65b8nOY/RzvuqG2nMjtrAw==',\n polaris: 'wUOdkU2sf3mAjVpDg/Dd1Ub16CPBWnW04+4Tlg==',\n bttts: '/qd0rFS3azoUlwYI9CvPXLPnEI+WDeZ00GeS1A==',\n vgtts: 'wT1e7ILovikqM2iJBpWxdbTZ7VUO6MXsDWpTRg==',\n};\n","export const ACTIVE = 12000;\nexport const ACTIVE_PREVIEW = 12001;\n\nexport const NOT_ACTIVE = 14001;\nexport const NOT_ACTIVE_GEOBLOCKED = 14002;\nexport const NOT_ACTIVE_TOKEN = 14005;\nexport const NOT_FOUND = 14003;\nexport const NOT_ACTIVE_PAST = 14004;\n\nexport const GENERAL_ERROR = 15000;\nexport const NETWORK_ERROR = 15101;\nexport const TOKEN_FETCH_ERROR = 15102;\n\nconst statusMessages = {\n [ACTIVE]: 'Stream active',\n [ACTIVE_PREVIEW]: 'Preview mode',\n [NOT_ACTIVE]: 'Stream is not active',\n [NOT_ACTIVE_GEOBLOCKED]:\n 'Stream failed to play due to geoblock restrictions',\n [NOT_ACTIVE_TOKEN]: 'Stream failed to play due to unauthorized access',\n [NOT_FOUND]: 'Stream not found',\n [NOT_ACTIVE_PAST]: 'Stream has been unpublished',\n [GENERAL_ERROR]: 'General error',\n [NETWORK_ERROR]: 'Network error',\n [TOKEN_FETCH_ERROR]: 'Token fetch error',\n};\n\n/**\n * Get localized messages\n *\n * @param {number} errorCode\n */\nexport default (errorCode) =>\n statusMessages[errorCode] || statusMessages[GENERAL_ERROR];\n","/* jshint ignore:start */\n/* eslint-disable */\n\nvar isLoaded = false;\nvar exportz = {};\n\nexport default function (conf) {\n if (!isLoaded) {\n isLoaded = true;\n\n (function(k) {\n k = k || {}; (function(l) {\n function b() { this.u = 'setup'; }l.g = b; b.prototype = {\n c: function(a) { a = a && typeof a === 'number' && a > 0 ? Math.round(a) : 10; for (var g = '', e = 0; e < a; e++)g += String.fromCharCode((Math.random() < 0.5 ? 65 : 97) + Math.floor(26 * Math.random())); return g; },\n A: function(a) {\n function g(d) {\n var a = '';\n var c;\n var g;\n for (c = 7; c >= 0; c--)g = d >>> 4 * c & 15, a += g.toString(16);return a;\n }function e(d, a) { return d << a | d >>> 32 - a; }\n var c;\n var h;\n var b = Array(80);\n var l = 1732584193;\n var q = 4023233417;\n var p = 2562383102;\n var k = 271733878;\n var t = 3285377520;\n var f;\n var m;\n var n;\n var r;\n var d;\n a = a && typeof a === 'string'\n ? a : '';f = a.length;var u = [];for (c = 0; c < f - 3; c += 4)h = a.charCodeAt(c) << 24 | a.charCodeAt(c + 1) << 16 | a.charCodeAt(c + 2) << 8 | a.charCodeAt(c + 3), u.push(h);switch (f % 4) { case 0: c = 2147483648; break; case 1: c = a.charCodeAt(f - 1) << 24 | 8388608; break; case 2: c = a.charCodeAt(f - 2) << 24 | a.charCodeAt(f - 1) << 16 | 32768; break; case 3: c = a.charCodeAt(f - 3) << 24 | a.charCodeAt(f - 2) << 16 | a.charCodeAt(f - 1) << 8 | 128; }for (u.push(c); u.length % 16 != 14;)u.push(0);u.push(f >>> 29);u.push(f << 3 & 4294967295);for (a = 0; a < u.length; a += 16) {\n for (c = 0; c < 16; c++)b[c] = u[a + c]; for (c = 16; c <= 79; c++)b[c] = e(b[c - 3] ^ b[c - 8] ^ b[c - 14] ^ b[c - 16], 1); h = l; f = q; m = p; n = k; r = t; for (c = 0; c <= 19; c++)d = e(h, 5) + (f & m | ~f & n) + r + b[c] + 1518500249 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 20; c <= 39; c++)d = e(h, 5) + (f ^ m ^ n) + r + b[c] + 1859775393 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 40; c <= 59; c++)d = e(h, 5) + (f & m | f & n | m & n) + r + b[c] + 2400959708 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; for (c = 60; c <= 79; c++)d = e(h, 5) + (f ^ m ^ n) + r + b[c] + 3395469782 & 4294967295, r = n, n = m, m = e(f, 30), f = h, h = d; l = l + h & 4294967295; q = q + f & 4294967295; p = p + m & 4294967295; k = k + n\n & 4294967295; t = t + r & 4294967295;\n }return (g(l) + g(q) + g(p) + g(k) + g(t)).toLowerCase();\n },\n j: function(a) {\n for (var g = '', e, c, b, l, k, q, p = 0; p < a.length;) {\n e = a.charCodeAt(p++), c = a.charCodeAt(p++), b = a.charCodeAt(p++), l = e >> 2, e = (e & 3) << 4 | c >> 4, k = (c & 15) << 2 | b >> 6, q = b & 63, isNaN(c) ? k = q = 64 : isNaN(b) && (q = 64), g = g + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(l) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(e) + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(k)\n + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.charAt(q);\n } return g;\n },\n fireEvent: function(a, g, b) {\n var c = this.u;\n var h = document.createEvent('CustomEvent');\n b.state = c;h.initCustomEvent(g, !1, !1, b);a.dispatchEvent(h);\n },\n l: function(a, g, b) { g || (g = 'hdEvent'); b || (b = window); this.fireEvent(b, g, a); },\n track: function(a, b, e) {\n if (e) {\n if (!homad || !homad.M)window.setTimeout(function() { this.track(a, b, e); }.bind(this), 500); else if (homad.isEnabled) {\n var c = `${homad.T()}?homad_track_key=${encodeURIComponent(a)}&homad_track_value=${\n encodeURIComponent(b)}`; homad.o(c, !0); c = homad.o(c, !0); c.data.homad_url_prefix_alias = ''; c.data.homad_track_key = encodeURIComponent(a); c.data.homad_track_value = encodeURIComponent(b); homad.P(c, function() {});\n }\n }\n }\n };\n }(k)); var v = k.g || v; new v(); var w = new v(); (function(l) {\n function b(a) { this.data = a || {}; }l.f = b; b.S = function(a, b) {\n var e = {};\n var c;\n for (c in b)e[c] = b[c];for (c in a)e[c] = a[c];return e;\n }; b.w = { code: '1000', type: 'penalty', message: '' }; b.V = { code: '1001', type: 'mediaerror', message: '' }; b.C = { code: '1002', type: 'vpaid', message: '' };\n b.O = { code: '1003', type: 'emptyVast', message: '' }; b.F = { code: '1004', type: 'malformattedXML' }; b.J = { code: '1005', type: 'adStart' }; b.G = { code: '1006', type: 'adFirstQuartile' }; b.I = { code: '1007', type: 'adMidPoint' }; b.K = { code: '1008', type: 'adThirdQuartile' }; b.i = { code: '1009', type: 'adComplete' }; b.H = { code: '1010', type: 'adImpressionsCalled' }; b.B = { code: '1011', type: 'vastLoadingFailed' }; b.U = { code: '1012', type: 'noCreative' }; b.R = { code: '1013', type: 'emptyVastFromHomadServerEvent', message: '' }; b.D = {\n code: '1014',\n type: 'wrapperLimitReached',\n message: ''\n }; b.L = { code: '1015', type: 'clickthrough', message: '' }; b.N = { code: '1016', type: 'continueContent', message: '' }; b.X = { code: '1017', type: 'variableDeletedEvent', message: '' }; b.W = { code: '1018', type: 'noVariableSettingEvent', message: '' }; b.prototype = {};\n }(k)); var z = k.f || z; (function(l) {\n function b() {}l.h = b; b.prototype = {\n s: function(a) {\n var b = 0;\n var e;\n var c;\n var h;\n if (a.length == 0) return b;e = 0;for (h = a.length; e < h; e++)c = a.charCodeAt(e), b = (b << 5) - b + c, b |= 0;return Math.abs(b);\n },\n m: function() {\n return Math.round(Date.now() / 1E3 / 3600 / 24) + navigator.appCodeName\n + navigator.appName + navigator.appVersion + navigator.userAgent + navigator.platform + (navigator.language || navigator.i || 'x');\n },\n a: function(a) { a = parseInt(a); if (a >= 65 && a <= 90 || a >= 97 && a <= 122) return String.fromCharCode(a); if (a <= 0) return ''; if (a < 65) return this.a(a + 65); if (a > 90) return this.a(Math.round(a / 2)); },\n reverse: function(a) { for (var b = '', e = a.length - 1, b = ''; e >= 0; b += a[e--]);return b; },\n b: function() {\n for (var a = this.s(`${this.m()}`), a = (`${a}${this.reverse(`${a}`)}`).match(/.{1,2}/g), b = '', e = 0; e < a.length; e++)b += this.a(a[e]); b.length == 0\n && (b = 'zork'); return b;\n },\n v: function() { return `${this.b()}2`; }\n };\n }(k)); var y = k.h || y; (function() {\n function l() {\n if (p)conf.startPlayer && eval(conf.startPlayer), document.fp_error = !0, document.hd_ready = !0; else {\n var d = document.createElement('script');d.type = 'text/javascript';d.src = `https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=${w.c(10)}`;d.onerror = e;document.head.firstChild ? document.head.insertBefore(d, document.head.firstChild) : document.head.appendChild(d);\n var d = new y();\n var a = document.createEvent('CustomEvent');\n conf.version = '20170704_0930_802';a.initCustomEvent(d.b(), !1, !1, conf);window.setInterval(function() { window.dispatchEvent(a); }, 500);b();\n }\n }function b() { var d = new y(); r = window.setTimeout(function() { a(); }, 15E3); window.addEventListener(d.v(), function() { window.clearTimeout(r); }); }function a() {\n for (var d = document.getElementsByTagName('video'), a = 0; a < d.length; a++) { try { d[a] && d[a].pause && typeof d[a].pause === 'function' && d[a].pause(); } catch (b) {}d[a].parentNode.removeChild(d[a]); }d = document.getElementsByTagName('object'); for (a = 0; a < d.length; a++)d[a].parentNode.removeChild(d[a]);\n d = document.getElementsByClassName('video-wrapper'); for (a = 0; a < d.length; a++)d[a] && d[a].parentNode && d[a].parentNode.removeChild(d[a]); d = document.getElementsByClassName('videoplayer'); for (a = 0; a < d.length; a++)d[a] && d[a].parentNode && d[a].parentNode.removeChild(d[a]); if (window.self != window.top) for (d = window.document; d.hasChildNodes();)d.removeChild(d.lastChild);\n }function g() {\n if (t) {\n var d = `fail-init-100.gif${v()}`; k(t, function() {}, function() {}, {\n homad_url_prefix_alias: f,\n homad_url_suffix_base64: w.j(d),\n homad_url_suffix: d,\n homad_hash_guessed: 'true'\n });\n }w.l(z.w); x && typeof x === 'function' ? x() : (a(), window.setInterval(a, 500), window.setTimeout(a, 1500));\n }function e() { var a = document.createElement('script'); a.type = 'text/javascript'; a.src = `https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/hd-main.js?cache=${w.c(10)}`; a.onerror = g; document.head.firstChild ? document.head.insertBefore(a, document.head.firstChild) : document.head.appendChild(a); }function c(a) { p || (p = !q(a.enabled)); l(); }function h(a) {\n a && a.server && a.server[0]\n && (t = (`${a.server[1]}`).replace('[hash]', w.A(`${(new Date()).getTime()}`)), f = 'homadvastimpressions'); p ? l() : (p = !q(a.enabled)) ? l() : k(a.config, c, l);\n }function k(a, b, c, e) {\n var f = new XMLHttpRequest(); f.onreadystatechange = function() { if (b && f.readyState == 4 && f.status == 200) { var a = {}; try { a = JSON.parse(f.responseText); } catch (d) { a.enabled = 'false'; }b(a); }c && f.readyState == 4 && f.status != 200 && c(f); }; try {\n if (e) {\n f.open('POST', a, !0); a = e; e = ''; for (var g in a)e += `&${g}=${encodeURIComponent(a[g])}`; e = e.substr(1); f.setRequestHeader('Content-type',\n 'application/x-www-form-urlencoded'); f.send(e);\n } else f.open('GET', a, !0), f.send();\n } catch (h) { c && c(f); }\n }function v() { var a = '?c=unknown'; window && window.location && window.location.hostname && (a = `?c=${window.location.hostname}`); return a; }function q(a) { return a == 'True' || a == 'true' || a == 1 || a == '1' || a == 1; }\n var p = !1;\n var x = conf.onFailure;\n var t = '';\n var f = '';\n var m = !1;\n var n = 0;\n var r = !1;\n k(conf.globalConfig, function(a) { p ? l() : p = !q(a.enabled); });typeof conf.clientConfig === 'string' ? k(conf.clientConfig, h, function() {\n window.setTimeout(function() {\n k(conf.clientConfig,\n h, function() { window.setTimeout(g, 1500); });\n }, 500);\n }) : m = window.setInterval(function() { var a = ''; try { a = conf.clientConfig(), n++, a ? (h(a), window.clearInterval(m)) : n >= 50 && (window.clearInterval(m), g()); } catch (b) {} }, 100);\n }());\n }).call(exportz, exportz);\n }\n}\n","/* eslint-disable no-multi-assign */\n\n/**\n * @param {string} path\n * @param {(value: *) => void} onSuccess\n * @param {(reason?: *) => void} onError\n */\nfunction loadScript(path, onSuccess, onError) {\n var script = document.createElement('script'),\n done = false;\n\n const callback = onSuccess || function () {};\n\n script.type = 'text/javascript';\n script.src = path;\n script.async = true;\n script.onreadystatechange = script.onload = function () {\n if (\n !done &&\n (!this.readyState ||\n this.readyState === 'loaded' ||\n this.readyState === 'complete')\n ) {\n done = true;\n callback();\n\n // Handle memory leak in IE\n script.onload = script.onreadystatechange = null;\n }\n };\n\n script.onerror = onError;\n\n document.body.appendChild(script);\n}\n\n/**\n * @param {string} path\n */\nexport const scriptLoader = (path) =>\n new Promise((resolve, reject) => {\n loadScript(path, resolve, reject);\n });\n","/**\n * Server time helper required for syncing browser time with stream vendors servers (SMP Stream)\n */\nconst ServerTime = {\n time: null,\n responseTime: null,\n fetched: false,\n\n /**\n * @param {string} url\n * @returns {Promise}\n */\n fetch: function (url) {\n return new Promise((resolve) => {\n /**\n * @param {number} time\n */\n const resolveRequest = (time) => {\n this.time = time;\n this.responseTime = Date.now();\n resolve();\n };\n\n fetch(url)\n .then((result) => result.text())\n .then(\n (text) => {\n const serverTime = parseInt(text, 10);\n\n if (Number.isNaN(Number(serverTime))) {\n // set current microtime if server will return value different than int\n resolveRequest(Date.now());\n } else {\n // adjust to miliseconds\n resolveRequest(serverTime * 1000);\n ServerTime.fetched = true;\n }\n },\n function () {\n resolveRequest(Date.now());\n },\n );\n });\n },\n\n /**\n * @returns {number}\n */\n getTime: function () {\n return this.time + (Date.now() - this.responseTime);\n },\n};\n\nexport default ServerTime;\n","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"
\\n
\\n
\\n \\n \\n
\\n
\\n \\n
\\n
\\n
\\n\"","module.exports = \"
\\n
\\\">
\\n\\n
\\n \\n \\n \\n
\\n\\n \\n
\"","module.exports = \"\\n\"","module.exports = \"\\n <%= closeIcon %>\\n\\n\\n <%= next.getTitle() %>\\n ');\\\">\\n s\\\">\\n Next <%= nextIcon %>\\n );\\\">\\n \\n\\n\"","module.exports = \"\\n\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import config from 'player/config';\nimport { scriptLoader } from 'utils/script-loader';\nimport ServerTime from 'utils/server-time';\n\n// eslint-disable-next-line\nconst loadSvpLibrary = () => {\n return import(/* webpackMode: \"eager\" */ './index').then((SVP) => [\n SVP.default,\n SVP.preInitialize,\n SVP.postInitialize,\n ]);\n};\n\n/**\n * @param {Window} root\n */\nconst loadJwPlayer = async (root) => {\n const PLAYER_LIB = `${config.cdn.player}/jwplayer.js`;\n\n return scriptLoader(PLAYER_LIB).then((jwplayer = root.jwplayer) => {\n root.jwplayer = jwplayer;\n });\n};\n\n(async function (root) {\n // onSvpPlayerReady is required callback to handle due to SDK async loading\n const onReady = root.onSvpPlayerReady;\n\n await Promise.all([ServerTime.fetch(config.time), loadJwPlayer(root)]);\n\n const library = await loadSvpLibrary();\n const [SVP, preInitialize, postInitialize] = library || [];\n\n if (!root?.SVP || root.SVP?.isLoaded !== true) {\n root.SVP = SVP;\n root.SVP.isLoaded = true;\n\n preInitialize();\n\n if (window.dispatchEvent) {\n const event = document.createEvent('Event');\n event.initEvent('onSvpPlayerReady', false, true);\n window.dispatchEvent(event);\n }\n\n if (onReady) {\n onReady();\n }\n\n postInitialize();\n }\n})(window);\n"],"names":["idCounter","_","jwplayer","getLength","obj","undefined","isEmpty","length","Array","isArray","Object","prototype","toString","call","isArguments","keys","uniqueId","prefix","id","Events","eventSplitter","eventsApi","iteratee","events","name","callback","opts","names","i","context","test","split","onApi","options","handlers","ctx","listening","count","push","internalOn","_events","_listeners","on","this","listenTo","_listenId","listeningTo","_listeningTo","thisId","objId","offApi","listeners","ids","remaining","j","handler","_callback","off","stopListening","onceMap","map","offer","once","apply","arguments","bind","listenToOnce","triggerEvents","args","ev","l","a1","a2","a3","triggerApi","objEvents","cb","allEvents","all","slice","concat","trigger","Math","max","unbind","userAgent","navigator","userAgentMatch","regex","match","lazyUserAgentMatch","isIETrident","isIPad","maxTouchPoints","isEdge","isAndroid","isTablet","result","indexOf","isMobile","isIOS","version","isAppleIOS","exec","parseInt","isIPhone","isSafari","isIE","isFirefox","isDesktop","isSamsungInternet","isHermesApp","isBot","getChromeVersion","raw","getPixelRatio","devicePixelRatio","window","getDeviceType","canAutoplay","isMergeableObject","val","cloneIfNecessary","value","optionsArgument","clone","deepmerge","defaultArrayMerge","target","source","destination","forEach","e","array","arrayMerge","key","mergeObject","Error","reduce","prev","next","jwUtils","utils","jwUnderscore","extend","assign","merge","each","isNumber","data","Number","isString","String","isObject","type","createNode","createElement","addClass","element","classList","add","removeClass","remove","template","cache","tmpl","str","Function","replace","join","document","getElementById","innerHTML","device","time","shareTimeToSeconds","hours","minutes","seconds","compact","number","zeroPad","string","getTimeFormatted","timestamp","floor","getScrollSnapPrefix","scrollSnapSupport","documentElement","style","jsonToUrl","encodeURIComponent","counters","log","counter","console","isEnabled","block","itemKey","localStorage","getItem","error","unshift","warned","translations","translate","substitute","setTranslations","getMonthName","date","months","getMonth","getTranslations","async","makeFetch","url","response","fetch","ok","json","Promise","reject","APPNEXUS_PROVIDER_ID","assetAdditionalData","relatedApi","path","query","config","api","relatedApiUrl","VIDEO","Blob","Uint8Array","getById","vendor","assetId","endpoint","getUrl","get","attr","attributes","set","oldVal","cloneDeep","structuredClone","JSON","parse","stringify","Category","initialize","additional","images","background","main","image","logo","playerLogo","playerLogoImage","getId","getTitle","Model","unifyTimestamp","Asset","getRawAsset","rawAsset","settings","ageLimit","flightTimes","start","end","category","chapters","chapter","index","timeline","nextAsset","tags","_embedded","playlist","asset","getVendor","getStreamType","getNextAssetId","destroy","getAgeLimit","isSponsored","metadata","sponsored","toLowerCase","getChapter","chapterIndex","getChapters","getThumbnail","getCategory","isAudio","getImageQuality","pixelRatio","getImageTransform","width","height","min","cacheKey","transformSizes","sizes","transformType","maxDimension","dimensions","size","normalizeTransformSize","curr","abs","getClosestSize","transform","getImageSrc","imageId","extension","objectToString","prop","hasOwnProperty","capitalizeFirstLetter","charAt","toUpperCase","isDomainInArray","origin","domains","domain","pos","domainBeginning","len","inherit","parent","child","Domain","preview","na","vendors","resolve","getPermissions","then","item","global","isBlacklisted","blacklist","fetchToken","params","isFetching","text","expire","Date","now","TOKEN_FETCH_ERROR","constructor","assetAccess","maxBitrate","request","configuration","hasAccess","isValid","expiry","tokenUrl","getValue","Stream","title","streams","hls","streamUrls","mp4","status","streamType","mediaType","assetType","streamConfiguration","snapshots","captions","playback","begin","externalId","duration","disableNextVideo","chunkDuration","isPodcast","hasSubtitlesInHls","tts","Boolean","tts_articleId","videoPreviews","entries","metadataKey","metadataValue","includes","showAds","cuePoints","hasProperty","property","properties","getDuration","getCuePoints","isSecure","isMock","isGeoblocked","isLive","wasLive","isActive","isPast","isFuture","ServerTime","getTime","hasPlaylist","isDisabledNextVideo","hasPlayableSource","getTimeToStart","isOnHttp","location","protocol","startsWith","streamUrl","getPoster","getAllPreviewsUrls","getVideoPreviewUrl","getChunkDuration","getSnapshots","thumbnailsUrl","hasSnapshots","getCaptions","hasMp4Streams","getPlaybackTime","position","getExternalId","hasAdsDisabled","hasTextSpeech","getVmapApiUrl","supplyType","queryParams","URLSearchParams","gdpr","gdpr_consent","vmapUrl","getRandomId","random","getRelevantYieldConfig","stream","relevantDigital","scriptLoader","loadRelevantScript","scriptUrl","adTagUrls","cmd","_config$consentManage","prebidConfig","consentManagement","cmpApi","userId","ortb2","user","eids","uids","atype","ext","stype","userSync","userIds","addPrebidConfig","slots","defineVideoSlots","values","adSlots","adSlot","custParams","s","getSlotElementId","loadPrebid","configId","collapseEmptyDivs","collapseBeforeAdFetch","allowedDivIds","noSlotReload","allowedPlacementType","onSlotAndUnit","slot","unit","xandrKeywords","fromEntries","filter","pbAdUnit","bids","b","bidder","keywords","loadVideoUrls","urls","loadAdTagUrls","scheduleSlots","adtTagUrls","current","offset","tag","jwAdScheduleSlots","hasNext","startTime","adsConfig","preroll","extra","cuePoint","midroll","postroll","getJwAdsConfig","onAdEventImpression","adIds","getAd","getAdId","getWrapperAdIds","Auction","registerImpressionByAdId","buildUrlString","round","getVmapTag","ads","appnexus","vmap","OVERRIDE_SLOT_PARAM","OVERRIDE_SLOT_TAG_ID","JwAdsConfig","overriddenParams","urlParams","search","has","slotName","creativeId","tagId","getOverriddenParams","setParams","getTag","adSlotConfig","adLabel","adConfig","overriddenId","format","cr","appnexusTag","ptv","getConfig","getParams","memberId","member","getJwAdSchedule","clientConfig","getAdsConfig","schedule","getAdPlacements","adPlacements","globalParams","placements","placementId","tagOptions","globalOptions","parseAdPlacements","getClientConfig","adn","svpAdConfig","publisherName","countryCode","se","slotIds","appnexusTagBuilder","svpPlayer","logger","relevantYield","adSchedule","adOptions","maxDuration","vmaxduration","hasEntered","onEnterCallback","setTime","onEnter","onReady","globals","sharing","locale","defaults","code","heading","chromecastApps","CB3CFFEE","C6559D78","E43A13ED","B6C9EA8E","E64998E3","A7738716","A5965089","appendChild","c","createTextNode","HTMLElement","tagName","children","attribute","setAttribute","ensureIfControlsLoaded","container","querySelector","checkIfControlsLoaded","requestAnimationFrame","waitForControls","TTS_SKIN_CLASS_NAME","JW_AUDIO_MODE_MAX_HEIGHT","DEFAULT_TTS_PLAYBACK_RATES","classNames","pluralize","n","singular","plural","timeToText","minute","second","fontLoadingPromise","closeSettingsMenu","event","contains","controls","currentTarget","settingsMenu","preventDefault","stopPropagation","click","DEFAULT_USE_AUDIO_SKIN","CN_FORWARD_BUTTON","CN_DURATION_INFO","CN_PLAYBACK_RATE","COVER","COVER_CONTAINER","PLAYBACK_RATES","forwardIcon","forward30Icon","shouldUseAudioSkin","shouldApplyTextToSpeechSkin","youboraSdk","state","forceLoad","load","cdn","youbora","player","Plugin","setAdapter","adapters","JWPlayer","Config","node","env","autoplay","poster","repeat","minDvrWindow","skin","skins","default","about","link","token","disableCountdownPlugin","jwDefaults","base","preload","horizontalVolumeSlider","getMaxBitrate","setStream","Token","getRaw","rawOptions","isPreviewMode","getSettings","dump","playerContainer","clientWidth","clientHeight","ttsSkinOption","currentStream","getVideoPreviewMetadataKey","videoPreview","isCustomMetadataKey","allPreviewsKeys","liveVideoPreview","isAudioWithoutCustomTitle","getDescription","getLiveSyncDuration","getToken","hasValidToken","getStreamUrl","isStreamPlayable","STATUS_CODES","fetched","_response$text","referenceId","htmlError","_htmlError$split","at","catch","getPlaylistItems","playlistStreams","getChromecastAppId","vendorEntry","find","entry","getJwConfig","abouttext","aboutlink","floating","localization","plugins","cast","customAppId","liveSyncDuration","jwConfig","promise","playlistSettings","getPlaylistSettings","playlistOptions","description","forceImaClientLoading","addPlaylistMetadata","playlistItem","mediaId","mediaid","starttime","addSnapshots","tracks","file","kind","addCaptions","caption","label","language","sources","advertising","client","vmapParams","adschedule","shouldEnableIma","some","endsWith","maxRedirects","autoplayMuted","autoplayadsmuted","vpaidcontrols","preloadAds","addAppnexusAds","svp","addPlaylistFactory","applyPlaylistAdding","addSharing","playbackRates","playbackRateControls","applyTtsOption","native","renderCaptionsNatively","setCaptions","canAutostart","autostart","mute","hasPreroll","autopause","autoPause","viewability","pauseAds","setPlaybackOptions","isPrebidEnabled","checkIsPrebidEnabled","content_id","owner","addYoubora","jw","hasRecommended","getRecommended","getLiveMidrollTag","_options$floating$dis","_options$floating","_options$floating$mod","_options$floating2","dismissible","mode","defineProperty","permissions","whitelist","freeze","writable","getRelatedAssets","limit","createResponse","AssetModel","hasPlayNext","fetchNextById","fetchNextFromRelatedEngine","assets","getNext","fetchNext","reason","getNextAsset","getItems","mapResponse","fetchFromRelated","PulseTrackerLoader","trackers","pulse","q","init","provider","sdkConfig","getTracker","storedTracker","PROVIDER_TRACKER_ID","altEventHandler","pulseEventHandler","useBeaconWhenAvailable","tracker","PLAYER_CONTAINER_CLASS_NAME","PREVIEW_CONTAINER_CLASS_NAME","PREVIEW_ELEMENT_CLASS_NAME","queryVideoPreviewElements","previewContainer","previewElement","removeVideoPreviewElement","model","getContainer","removeChild","createPreviewElement","loop","muted","addVideoPreviewElement","getStream","previewUrl","src","play","clearError","previousErrorNode","getElementsByClassName","parentNode","displayError","message","errorIcon","posterSrc","errorNode","onError","details","translatedMessage","statusCode","GENERAL_ERROR","errorDetails","stop","onAssetError","videoPreviewHelper","NOT_FOUND","NOT_ACTIVE","isLoaded","apntag","firstLoad","ast","defineTag","tagConfig","targetId","debug","loadTags","onEvent","showTag","refreshTag","refresh","resizeTag","dimmensions","resizeAd","offEvent","Eventable","BackboneEvents","PluginModel","super","el","getName","setup","setPlayer","PausePlugin","maxDisplays","displayCounter","withAdTag","sourceMethod","adPlacement","withCounter","getBoundingClientRect","containerId","appnexusAdId","adId","adData","isAdTagLoaded","show","getState","pauseReason","getViewable","hide","onPause","timerId","onSeek","clearTimeout","setTimeout","onResumeClick","pause","render","adTagOptions","appnexusAdContainerId","pauseTemplate","closeIcon","playButton","closeButton","addEventListener","hideAfter","sponsor","pluginName","adFrom","SVP_LOGIN_OVERLAY","assertUppercased","actual","expected","chooseVariant","variants","rangeNumber","winner","Percentage","percentage","prepareVariantsForExperiment","variantIds","experimentMetadataKeys","isLoginVariantType","variant","Type","loginUrl","subscriptionUrl","articleUrl","getButtonText","loginToListen","isSubscriptionVariantType","subscribeToListen","listen","buttonText","uiElementId","getUiElementId","pulseStatsPlugin","PulseStats","playbackEvents","track","productType","object","redirectUrl","linkAnchor","linkSpan","experimentOverlay","leadingZeros","numValue","numLen","num","streamStart","liveDOM","countdownDOM","isPlaylistRegenerated","countdownTemplate","intervalId","setInterval","diff","getDiff","isCountdownActive","currentState","getDate","getHours","getMinutes","newDiff","shouldRegeneratePlaylist","regeneratePlaylist","clearInterval","ceil","playNext","clear","nextAssetSource","disableNext","getThumbnailUrl","initSnapScroll","scrollSnapPrefix","gridItem","getByClass","onGridItemClicked","dataset","onPlaybackStart","recommended","Recommended","getAsset","shouldLogDeprecatedWarning","gridItemsReady","grid","items","onInitialize","fetchDuration","countdownTime","isAssetFromPlaylist","onPlaybackComplete","onTimeNextVisible","onPlayNextVisible","timeout","transitionDuration","onNextAssetReady","Image","nextAssetTemplate","countdown","nextIcon","onGridItemsReady","gridTemplate","onGridVisible","onAssetReplay","className","previousEl","recommendedTemplate","adSequenceDuration","beforeUnload","self","onAdSlotComplete","onPlaylistItem","onAdSlotStart","onAdStarted","onAdError","onAdProgress","onAdFinished","onAdPause","onAdPlay","onPauseAdVisible","slotData","adErrorData","sendAttemptEvent","sendStopEvent","removeEventListener","meta","_adData$adschedule","sequence","podcount","adposition","watchData","previousTime","session","createSession","beforeStreamStart","onBeforeUnload","playMethod","vodInterval","liveInterval","onAssetPlay","onPlay","onPlayNext","onLiveTime","onTime","playbackSource","onRecommendedPlay","jwRelatedPlugin","onComplete","playReason","eventData","previousAssetId","getCurrentTime","getPlugin","getPosition","trackTimeEvent","defaultInterval","customInterval","eventInterval","isCustomIntervalFalsy","wasViewed","viewable","eventTime","onRecommendedVisible","ui","CategoryTree","categories","Map","getPath","categoryId","_this$categories","parentId","_this$categories2","instances","getMediaAssetId","getImageUrl","experiment","isExperimentEnabled","isMockAsset","_options$engagementIn","_options$engagementIn2","_options$engagementIn3","decorator","intervals","engagementIntervals","live","vod","embed","setupErrorEventEmitted","enabled","playerAsset","accessControl","access","getTags","imageUrl","accessLevel","getAssetLevel","_experiment$variant","accessLevelName","getAssetLevelName","_experiment$variant2","originAssetId","apiUrl","isAutoplay","getCategoryPath","categoryPath","categoryTree","eventName","experiments","platform","trackMediaEvent","getTrackerOrNull","resolveTracker","adEvents","AdEvents","PlaybackEvents","uiEvents","UiEvents","PulseTracker","onAdEvent","onPlaybackEvent","onUiEvent","attachSessionData","trackingData","intent","getMute","fullscreen","getFullscreen","adSequenceCount","adblock","getAdBlock","mediaAssetId","_this$categoryTree","_asset$getCategory","adSequencePosition","toLocaleLowerCase","SVP_FLAG_NATIVE_LINK","SVP_NATIVE_LINK_OVERLAY","overlay","parseHomadEvent","detail","videoTag","videoTagId","getTagUrl","potOffset","getPlaylist","getAdPotTag","homadDefaultConfig","globalConfig","skipable","skipAdOnContextChange","runInsideContainer","adjustAdVolumeToContentPlayer","postrollUseCompleteEvent","clickthrough_target","zIndex","prerollAdTag","midrollAdTag","postrollAdTag","createProxyMethods","homad","onFirstFrameLoad","playlistItemId","adPlaying","adPlayerLoading","SvpPlayer","SVP","Player","isHomadLoaded","homadConfig","aabConfig","homadLib","initializeHomadLib","playerId","applyPlayerMixin","overrides","onContentPlayerPlay","onAdStart","onContinueContent","onAdTime","onPlayerAdError","onPlayerAdBreakStart","onPlayerPlaylistItem","onPlayerAdPlay","forwardEventToPlayer","videoElements","querySelectorAll","video","v","controlsContainer","nextElementSibling","muteButton","childNodes","dom","adPosition","currentTime","hasAdBlocked","elements","handleAdLabelClick","handlePlayPauseClick","handleMuteClick","handleFullscreenClick","aab","initializeHomad","Homad","resetSequence","onHomadAdStart","adID","homadImpressionAdId","onHomadAdPause","onHomadAdTime","homadAdTracker","onHomadReady","createControls","hideHomadNativeControls","attachEventListeners","onMuteToggle","setAdPlaying","setAdComplete","getPlaybackState","detachEventListeners","mainDiv","cssText","fullscreenButton","iconPause","iconFullscreen","labelText","iconPlaceholder","iconLink","href","rel","class","err","iconPlay","innerText","padStart","formatTime","iconSpeakerMuted","iconSpeaker","playerClassList","adStarted","useClasses","setFullscreen","playNextFromPlaylist","masterAsset","nextAssetData","assetData","setAsset","icon","videoElement","isCompleted","destroyPlugin","plugin","onPlayerEvent","callFunction","onAssetReady","setMasterAsset","NextAsset","addPlugin","AABPlugin","RecommendedPlugin","CountdownPlugin","AgeLimitPlugin","SponsorLabelPlugin","experimentId","experimentRange","sessionStorage","setItem","userStatusCfg","userStatus","loggedIn","hasProduct","PodcastExperimentPlugin","pulseConfig","PulseStatsPlugin","PodcastNativeLinkPlugin","loadedStylesheets","styleLoader","onSuccess","head","getElementsByTagName","done","onreadystatechange","onload","readyState","onerror","splice","loadStylesheet","canDeviceAutoplay","iconsMap","icons","info","audioIconsMap","audioIcons","hasMediaId","getSharingLink","root","updateElement","replaceElement","sourceEl","newEl","cloneNode","replaceChild","open","APPNEXUS_CLASS_NAME","SVP_FLAG_STOPPED","levels","handleLevelSettingsIcon","display","getTitleNode","svpPlayerModel","skinLoader","loader","svpSkin","useTextSpeechSkin","fonts","Graphik","weight","font","FontFace","loadFonts","updateDetailTexts","durationText","textContent","durationReplayText","_svpPlayer$getContain","buttonContainer","replacePlayerPoster","replay","altText","cuetext","insertBefore","createAdElements","ttsSkinResolver","jwPlayer","useAudioSkin","seekForward","seek","changePlaybackRate","rate","getPlaybackRate","nextRateIndex","findIndex","currentRate","setPlaybackRate","playbackRate","getControls","playbackRateButton","playbackRateButtonText","toFixed","playbackSpeed","forwardTooltip","forward","displayControl","cover","forwardButton","durationInfo","addButton","playbackRateIcon","displayStyle","translatePlayerConfig","audioSkinResolver","submenu","right","offsetWidth","offsetLeft","submenuHandler","infoNode","tip","left","body","focus","select","execCommand","copyToClipboard","configButton","replaceableIconsMap","customIcon","selector","replaceableIcons","replaceableIcon","svpIcon","getAttribute","loadIcons","updateSharingBox","sharingBox","handleAppnexusClass","containerClass","levelsIcon","itemsShown","nextUp","_locale$getTranslatio","close","PlayerModel","isInitalized","isStopped","adBreaks","forwardEvent","bindJwMethod","method","warn","getAdPosition","slotId","pre","mid","post","deriveAspectRatioFromAd","ima","ad","vastMediaWidth","vastMediaHeight","aspectRatio","parseFloat","normalizeAspectRatio","onPlaybackEndAvailable","playbackEnd","adjustAudioVolumeOnMobile","setVolume","youboraRatio","handle","supposedCurrentTime","onSeeking","onTimeUpdate","seeking","getVideo","preventAdSeeking","accountCode","enableAnalytics","onPlaylistItemLoad","onViewable","onAutostartNotAllowed","onMeta","adsManager","google","AdEvent","IMPRESSION","onMetadataCueParsed","getCaptionsList","xml","adSelector","URL","parseAdData","adbreaks","nextAd","disableAutoplay","complete","getPlayer","getVolume","volume","setMute","nextStream","isAdPlaying","loadStream","force","getFloating","setFloating","shouldFloat","playerCaptions","setCurrentCaptions","newIndex","captionsIndex","playbackEndTime","createMidroll","slotDuration","onTimeChange","adTag","loadAdTag","content","skipAd","TXXX","insertAd","cancelAd","methods","forwardedMethods","register","CustomPluginModel","Reflect","ownKeys","desc","getOwnPropertyDescriptor","copyProperties","createPluginClass","scripts","pluginSrc","onceConfigReady","Provider","handleReady","handleError","SvpPlugins","pluginConfig","_options$pulse","serverTime","createObjectURL","relatedUrl","isPlayNextAvailable","_options$pulse2","_this$model","getCurrentCaptions","getJWPlayer","getRawConfig","getServerTime","recommendedPlugin","_console","Plugins","__defaults","enumerable","configurable","preInitialize","hostname","postInitialize","setLocale","svpYoubora","loadYoubora","en","codeToString","Sharing","en_GB","es_ES","nb_NO","sv_SE","admessage","skipmessage","skiptext","podmessage","loadingAd","no","airplay","hd","cc","audioTracks","buffer","more","liveBroadcast","rewind","nextUpClose","related","unmute","copied","VERSION","__BUILD_VERSION__","ab","adressa","adressabrandstudio","altaposten","ap","bt","brandstudio","folkebladet","fvn","harstad","itromso","podcast","rbnett","riks","ridenews","sa","schibsted","smp","svd","tronderavisa","vgtv","vgtvs","tvnu","tvh","steinkjer","avisast","bladet","banett","innherred","fosnafolket","opp","tronderbladet","stjordalsnytt","mn24","hitrafroya","framtidinord","vaganavisa","vol","nyttiuka","vikebladet","fjt","vestlandsnytt","fjuken","vigga","dolen","fjordabladet","morenytt","fjordingen","driva","andalsnes","nyss","agderposten","lindesnes","farsund","varden","lp","venneslatidende","gat","bomlonytt","sunnhordland","klaebuposten","gauldalsposten","froya","bnytt","vnytt","stri","avavis","bareasane","e24","op","r24","stord","marsteinen","aptts","vgtvexternal","wellobe","godare","nearadio","fitjarposten","kulingen","kystogfjord","porten","polaris","bttts","vgtts","identifier","joiner","autoHeight","autoWidth","sites","ACTIVE","ACTIVE_PREVIEW","NOT_ACTIVE_GEOBLOCKED","NOT_ACTIVE_TOKEN","NOT_ACTIVE_PAST","NETWORK_ERROR","statusMessages","errorCode","exportz","conf","k","u","g","a","fromCharCode","A","d","h","f","m","r","p","t","charCodeAt","isNaN","fireEvent","createEvent","initCustomEvent","dispatchEvent","M","T","o","homad_url_prefix_alias","homad_track_key","homad_track_value","P","w","S","V","C","O","F","J","G","I","K","H","B","U","R","D","L","N","X","W","z","appCodeName","appName","appVersion","reverse","y","startPlayer","eval","fp_error","hd_ready","firstChild","top","hasChildNodes","lastChild","homad_url_suffix_base64","homad_url_suffix","homad_hash_guessed","x","server","XMLHttpRequest","responseText","substr","setRequestHeader","send","onFailure","script","loadScript","responseTime","resolveRequest","module","exports","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","Symbol","toStringTag","loadJwPlayer","PLAYER_LIB","_root$SVP","onSvpPlayerReady","library","initEvent"],"sourceRoot":""}