{"version":3,"sources":["webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/live/live-countdown.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/live/live-countdown.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/live.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/live.js","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/live.css","webpack://mediasite-player/../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/live/live-countdown.css"],"names":["localize","LiveCountdown","videojs","constructor","player","options","bind","super","this","daysContainer","addTimeContainer","daysHoursSeparator","addTimeSeparator","hoursContainer","hoursMinutesSeparator","minutesContainer","minutesSecondsSeparator","secondsContainer","startTime","unixTime","interval","setInterval","updateTime","ready","timeUnit","timeValue","GenericComponent","timeContainer","name","addClass","timeNumberContainer","el","textContent","addChild","timeWordContainer","timeSeparator","createEl","tag","props","attributes","Object","assign","className","call","formatTimeToTwoDigits","time","toLocaleString","minimumIntegerDigits","useGrouping","calculateDisplayTimes","diff","days","Math","floor","doubleDigitDays","hours","doubleDigitHours","minutes","doubleDigitMinutes","seconds","Date","now","daysValueComponent","getChild","hoursValueComponent","minutesValueComponent","secondsValueComponent","displayTimes","removeChild","innerText","countdownOverlay","document","querySelector","ONE_HUNDRED_DAYS_IN_MS","classList","remove","removeClass","add","clearInterval","onTimerFinished","hide","dispose","SECONDS_TO_MILLISECONDS","SEGMENT_LENGTH_TO_UNSAFE_SECONDS","2000","4000","6000","8000","9000","10000","LIVE_ENDED_EVENT_ID","LOCALE","window","SiteData","ApplicationData","Culture","_status","WeakMap","_interval","_lastLiveEventTimeMs","_liveIndicatorComponent","_countdownComponent","_overlayComponent","_liveBroadcastEndedMessage","_liveBroadcastNotification","LivePlugin","log","init","presentationId","playStatus","enableCountdown","delayLiveIndicationUntilPresentationDate","segmentLength","enableDvr","liveStartUnixTimeInMs","lastLiveEventTime","liveEndTime","paramProvider","QueryStringParamProvider","location","search","getParamFromOptions","autoMute","getParam","toLowerCase","autoplay","muted","notifications","setupMuteNotification","trackingThreshold","one","_liveIndicatorCompone","get","on","set","reporting","includeBookmark","tech_","waitUntilSafe","Promise","resolve","reject","safeSegmentLength","timeSinceLiveStarted","setTimeout","endLive","pause","timedEvents","liveBroadcastMessage","showMessage","uncloseable","liveTeardown","delete","playcover","showPlayButton","clickable","liveIndicatorComponent","overlayComponent","usingPlugin","removeComponent","off","liveTracker","behindLiveEdge","settings","enableSeeking","seekToLiveEdge","getLiveStatus","then","status","lastLiveEventTimeMs","currentTime","getLiveEvents","playbackTicket","liveEvents","length","event","max","eventType","LiveTimelineEventType","timeLeft","id","payload","type","payloadType","multistream","getSlideStream","addSlide","PresentationStatus","broadcastBeginComponent","broadcastBeginLabel","broadcastDateComponent","broadcastDate","toLocaleTimeString","hour","minute","date","Intl","DateTimeFormat","year","month","day","format","TIME_DATE_BROADCAST_LABEL","replacePlaceholders","countdownComponent","Overlay","position","OverlayPosition","broadcastStartTimeLabel","addComponent","currentStatus","newStatus","trigger","loader","loadPresentation","visible","text","liveBroadcastId","timeout","Infinity","livePausedNotication","hasDisplayItem","error","loadingSpinner","show","errorDisplay","code","MediaErrorType","media","getMedia","reset","src","load","errorChecks","self","msToDelay","notYetEndedCallback","success","___CSS_LOADER_EXPORT___","push","module"],"mappings":"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","file":"live.6676d87a28acdb9c6d54.js","sourcesContent":["import videojs from 'video.js';\r\n\r\nimport './live-countdown.css';\r\n\r\nconst DAYS_IN_MS = 1000 * 60 * 60 * 24;\r\nconst HOURS_IN_MS = 1000 * 60 * 60;\r\nconst MINUTES_IN_MS = 1000 * 60;\r\nconst SECONDS_IN_MS = 1000;\r\n\r\nconst DAYS_TO_HOURS = 24;\r\nconst DAYS_TO_MINUTES = 24 * 60;\r\nconst DAYS_TO_SECONDS = 24 * 60 * 60;\r\n\r\nconst HOURS_TO_MINUTES = 60;\r\nconst HOURS_TO_SECONDS = 60 * 60;\r\n\r\nconst MINUTES_TO_SECONDS = 60;\r\n\r\nconst ONE_HUNDRED_DAYS_IN_MS = 1000 * 60 * 60 * 24 * 100;\r\n\r\nlet localize\r\n\r\nexport class LiveCountdown extends videojs.getComponent('Component') {\r\n /**\r\n * \r\n * @param {videojs.Player} player\r\n * @param {any} options\r\n */\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n\r\n //Add css to display time denominations\r\n this.daysContainer = this.addTimeContainer('Days', '00');\r\n this.daysHoursSeparator = this.addTimeSeparator();\r\n this.hoursContainer = this.addTimeContainer('Hours', '00');\r\n this.hoursMinutesSeparator = this.addTimeSeparator();\r\n this.minutesContainer = this.addTimeContainer('Minutes', '00');\r\n this.minutesSecondsSeparator = this.addTimeSeparator();\r\n this.secondsContainer = this.addTimeContainer('Seconds', '00');\r\n\r\n this.startTime = options.unixTime;\r\n //Update time display every second\r\n this.interval = this.setInterval(this.updateTime, 1000);\r\n\r\n player.ready(() => {\r\n this.updateTime();\r\n })\r\n }\r\n\r\n\r\n //Create individual containers for denominations of time\r\n //Return time value component to easily change the value\r\n addTimeContainer(timeUnit, timeValue) {\r\n const GenericComponent = videojs.getComponent('Component');\r\n\r\n //Create wrapper for entire container\r\n const timeContainer = new GenericComponent(this.player(), {\r\n name: `${timeUnit}Container`\r\n });\r\n timeContainer.addClass(`time-wrapper-${timeUnit}`)\r\n\r\n //Create div for time value\r\n const timeNumberContainer = new GenericComponent(this.player(), {\r\n name: `${timeUnit}ValueContainer`\r\n })\r\n timeNumberContainer.el().textContent = `${timeValue}`;\r\n timeNumberContainer.addClass(`time-number-wrapper-${timeUnit}`)\r\n timeContainer.addChild(timeNumberContainer)\r\n\r\n //Create div for time label\r\n const timeWordContainer = new GenericComponent(this.player())\r\n timeWordContainer.el().textContent = `${localize(timeUnit)}`;\r\n timeWordContainer.addClass(`time-word-wrapper-${timeUnit}`)\r\n timeContainer.addChild(timeWordContainer)\r\n\r\n //Add container to live countdown\r\n this.addChild(timeContainer);\r\n\r\n //return time value container to easily change display\r\n return timeContainer;\r\n }\r\n\r\n addTimeSeparator() {\r\n const GenericComponent = videojs.getComponent('Component');\r\n\r\n //create colon display\r\n const timeSeparator = new GenericComponent(this.player());\r\n timeSeparator.el().textContent = ':';\r\n timeSeparator.addClass('time-separator');\r\n\r\n //add to live countdown\r\n this.addChild(timeSeparator);\r\n\r\n //return for changing and removing\r\n return timeSeparator;\r\n }\r\n\r\n createEl(tag, props = {}, attributes = {}) {\r\n tag = 'div';\r\n props = Object.assign({\r\n className: 'mediasite-player__live-countdown'\r\n });\r\n\r\n return super.createEl.call(this, tag, props, attributes);\r\n }\r\n\r\n formatTimeToTwoDigits(time) {\r\n return time.toLocaleString('en-US', {\r\n minimumIntegerDigits: 2,\r\n useGrouping: false\r\n })\r\n }\r\n\r\n calculateDisplayTimes(diff) {\r\n //Calculate and display number of days until presentation start date with 2 digits\r\n const days = Math.floor((-1 * diff) / DAYS_IN_MS);\r\n const doubleDigitDays = this.formatTimeToTwoDigits(days);\r\n //Calculate and display number of hours until presentation start date with 2 digits\r\n const hours = Math.floor((-1 * diff) / HOURS_IN_MS) - (days * DAYS_TO_HOURS);\r\n const doubleDigitHours = this.formatTimeToTwoDigits(hours);\r\n //Calculate and display number of minutes until presentation start date with 2 digits\r\n const minutes = Math.floor((-1 * diff) / MINUTES_IN_MS) - (days * DAYS_TO_MINUTES) - (hours * HOURS_TO_MINUTES);\r\n const doubleDigitMinutes = this.formatTimeToTwoDigits(minutes);\r\n //Calculate and display number of seconds until presentation start date with 2 digits\r\n const seconds = Math.floor((-1 * diff) / SECONDS_IN_MS) - (days * DAYS_TO_SECONDS) - (hours * HOURS_TO_SECONDS) - (minutes * MINUTES_TO_SECONDS);\r\n const doubleDigitSeconds = this.formatTimeToTwoDigits(seconds);\r\n\r\n return {\r\n days: doubleDigitDays,\r\n hours: doubleDigitHours,\r\n minutes: doubleDigitMinutes,\r\n seconds: doubleDigitSeconds\r\n }\r\n }\r\n\r\n updateTime() {\r\n const diff = Date.now() - this.startTime;\r\n\r\n const daysValueComponent = this.daysContainer.getChild('DaysValueContainer');\r\n const hoursValueComponent = this.hoursContainer.getChild('HoursValueContainer');\r\n const minutesValueComponent = this.minutesContainer.getChild('MinutesValueContainer');\r\n const secondsValueComponent = this.secondsContainer.getChild('SecondsValueContainer');\r\n\r\n\r\n const displayTimes = this.calculateDisplayTimes(diff);\r\n\r\n //Update time displayed on playcover\r\n if (displayTimes.days === '00') {\r\n this.removeChild(this.daysContainer);\r\n this.removeChild(this.daysHoursSeparator);\r\n } else {\r\n daysValueComponent.el().innerText = displayTimes.days;\r\n }\r\n hoursValueComponent.el().innerText = displayTimes.hours;\r\n minutesValueComponent.el().innerText = displayTimes.minutes;\r\n secondsValueComponent.el().innerText = displayTimes.seconds;\r\n\r\n const countdownOverlay = document.querySelector('.countdown-overlay');\r\n\r\n //Hide countdown display if start time is 100 or greater days away\r\n if (diff < (ONE_HUNDRED_DAYS_IN_MS * -1)) {\r\n this.addClass('vjs-hidden');\r\n //Add/remove class when timer is visible for styling purposes\r\n countdownOverlay.classList.remove('countdown-timer-visible');\r\n }\r\n else if (diff < 0) {\r\n this.removeClass('vjs-hidden');\r\n //Add/remove class when timer is visible for styling purposes\r\n countdownOverlay.classList.add('countdown-timer-visible');\r\n }\r\n if (diff > 0) {\r\n // We've passed the start time\r\n this.clearInterval(this.interval);\r\n this.options()?.onTimerFinished();\r\n this.hide();\r\n }\r\n }\r\n\r\n dispose() {\r\n super.dispose();\r\n this.clearInterval(this.interval);\r\n }\r\n}\r\n","import api from \"!../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../../node_modules/css-loader/dist/cjs.js!../../../../node_modules/postcss-loader/dist/cjs.js!./live-countdown.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import api from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../../../node_modules/css-loader/dist/cjs.js!../../../node_modules/postcss-loader/dist/cjs.js!./live.css\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","import videojs from 'video.js';\r\n\r\nimport { getLiveStatus, PresentationStatus, LiveTimelineEventType, TimedEventType, MediaErrorType } from '../../api/presentation';\r\nimport { QueryStringParamProvider } from '../../implementations/player-page/helpers.js';\r\nimport { getLiveEvents } from '../../api/player';\r\nimport { replacePlaceholders } from '../../util/localization.js';\r\n\r\nimport { LiveCountdown } from './live/live-countdown.js';\r\nimport Overlay, { OverlayPosition } from '../../components/overlay.js';\r\n\r\nimport './live.css';\r\n\r\nconst SECONDS_TO_MILLISECONDS = 1000;\r\n\r\nconst STATUS_CHECK_TIMEOUT = 10000;\r\n\r\nconst SEGMENT_LENGTH_TO_UNSAFE_SECONDS = {\r\n 2000: 9000,\r\n 4000: 15000,\r\n 6000: 13000,\r\n 8000: 27000,\r\n 9000: 30000,\r\n 10000: 30000\r\n};\r\n\r\nconst RETRY_DELAY = 1000;\r\n\r\nconst DEFAULT_SAFE_SEGMENT_LENGTH = 4000;\r\nconst LIVE_EVENT_POLL_AHEAD_WINDOW = 60000;\r\nconst LIVE_ENDED_EVENT_ID = 'live-ended';\r\n\r\nconst LOCALE = (window.SiteData ?? window.ApplicationData?.SiteData)?.Culture;\r\n\r\nconst _status = new WeakMap();\r\nconst _interval = new WeakMap();\r\nconst _lastLiveEventTimeMs = new WeakMap(); // Todo: init with the time of the latest event from GetPlayerOptions (if applicable)\r\n\r\nconst _liveIndicatorComponent = new WeakMap();\r\nconst _countdownComponent = new WeakMap();\r\nconst _overlayComponent = new WeakMap();\r\nconst _liveBroadcastEndedMessage = new WeakMap();\r\nconst _liveBroadcastNotification = new WeakMap();\r\nlet localize;\r\n\r\n/**\r\n * The Live module.<br><br>\r\n * Note: this module is optional and might not be available on every MediasitePlayer instance.\r\n * @member {LivePlugin|undefined} live\r\n * @memberof MediasitePlayer#\r\n */\r\n\r\n/**\r\n * Manages the playback of live streams.\r\n * @hideconstructor\r\n * @extends {external:\"videojs.Plugin\"}\r\n **/\r\nclass LivePlugin extends videojs.getPlugin('plugin') {\r\n /**\r\n * \r\n * @param {videojs.Player} player\r\n * @param {Object} [options]\r\n * @param {string} [options.presentationId]\r\n * @param {string} [options.playStatus]\r\n * @param {number} [options.unixTime]\r\n */\r\n constructor(player, options) {\r\n localize = player.localize?.bind(player);\r\n super(player, options);\r\n this.log('Loaded live plugin.');\r\n }\r\n\r\n /**\r\n * \r\n * @param {Object} options\r\n * @param {string} options.presentationId\r\n * @param {PresentationStatus} options.playStatus\r\n * @param {number} options.unixTime\r\n * @param {boolean} options.enableCountdown\r\n * @param {boolean} options.delayLiveIndicationUntilPresentationDate\r\n */\r\n init(options) {\r\n const player = this.player;\r\n\r\n const { presentationId, playStatus, unixTime, enableCountdown, delayLiveIndicationUntilPresentationDate } = options;\r\n\r\n this.presentationId = presentationId;\r\n this.segmentLength = DEFAULT_SAFE_SEGMENT_LENGTH;\r\n this.unixTime = unixTime;\r\n this.enableCountdown = enableCountdown;\r\n this.delayLiveIndicationUntilPresentationDate = delayLiveIndicationUntilPresentationDate;\r\n this.enableDvr = false;\r\n\r\n this.liveStartUnixTimeInMs = 0;\r\n this.lastLiveEventTime = -1;\r\n this.liveEndTime = -1;\r\n\r\n //in player-page.js, we're looking at the URL paramater 'autostart/autoplay' and then setting the player's autoplay\r\n //to true if it exists and is true\r\n //for live videos though, we want autostart to be default functionality\r\n //rather than impacting it for all videos, we'll change the logic for just live videos\r\n //where if the URL parameter 'autostart' doesn't exist as well as if it is true, set autoplay to true\r\n const paramProvider = new QueryStringParamProvider(location.search);\r\n if (paramProvider.getParamFromOptions(['autostart', 'autoplay']) === null) {\r\n const autoMute = paramProvider.getParam('automute')?.toLowerCase();\r\n //if someone wants to try and auto start without muting, that's on them\r\n if (autoMute === 'false') {\r\n player.autoplay(\"play\");\r\n } else {\r\n //keeps notification for being muted from being thrown twice\r\n if (!player.autoplay() && autoMute !== 'true') {\r\n player.muted(true);\r\n player.notifications().setupMuteNotification();\r\n }\r\n player.autoplay(true);\r\n }\r\n }\r\n\r\n player.getChild('LiveTracker').options({ trackingThreshold: 0 });\r\n player.one('play', () => {\r\n _liveIndicatorComponent.get(this)?.dispose();\r\n });\r\n this.on(this.player, 'play', this.#handlePlay);\r\n\r\n _interval.set(this, setInterval(() => void this.#handleInterval(), STATUS_CHECK_TIMEOUT));\r\n this.player.reporting().includeBookmark = false;\r\n this.#updateStatus(playStatus);\r\n\r\n this.on(this.player, 'error', this.#handleMediaError)\r\n this.on(this.player.tech_, 'retryplaylist', this.#handleRetryPlaylist)\r\n }\r\n\r\n set lastLiveEventTime(time) {\r\n _lastLiveEventTimeMs.set(this, time);\r\n }\r\n\r\n get lastLiveEventTime() {\r\n return _lastLiveEventTimeMs.get(this);\r\n }\r\n\r\n #handlePlay() {\r\n if (this.player.liveTracker.behindLiveEdge() && !this.player.settings().enableSeeking) {\r\n this.log('Seeking to live edge because DVR playback is disabled.');\r\n this.player.liveTracker.seekToLiveEdge();\r\n }\r\n }\r\n\r\n #checkLiveStatus() {\r\n getLiveStatus(this.presentationId).then(status => {\r\n this.liveStartUnixTimeInMs = status.liveStartUnixTimeInMs;\r\n this.#updateStatus(status.playStatus);\r\n });\r\n }\r\n\r\n #checkLiveEvents() {\r\n const lastLiveEventTimeMs = Math.floor(this.lastLiveEventTime || -1);\r\n const currentTime = Math.floor(this.player.currentTime() * SECONDS_TO_MILLISECONDS) + LIVE_EVENT_POLL_AHEAD_WINDOW;\r\n\r\n getLiveEvents(this.player?.reporting?.().playbackTicket, currentTime, lastLiveEventTimeMs).then(liveEvents => {\r\n if (liveEvents.length > 0) {\r\n for (const event of liveEvents) {\r\n this.lastLiveEventTime = Math.max(event.time, lastLiveEventTimeMs);\r\n switch (event.eventType) {\r\n case LiveTimelineEventType.PresentationEnd: {\r\n //Presentation will end at event.Time\r\n this.liveEndTime = event.time ?? -1;\r\n //Timeout as backup for Live Ended event with 1 second buffer, in case we get stuck before reaching event\r\n const timeLeft = event.time - (this.player.currentTime() * SECONDS_TO_MILLISECONDS) + (1 * SECONDS_TO_MILLISECONDS);\r\n setTimeout(this.endLive.bind(this), timeLeft);\r\n\r\n this.player.timedEvents().add({\r\n id: LIVE_ENDED_EVENT_ID,\r\n time: event.time / SECONDS_TO_MILLISECONDS\r\n }, () => void this.endLive())\r\n\r\n break;\r\n }\r\n case LiveTimelineEventType.TimedEvent: {\r\n this.player.timedEvents().add({\r\n id: event.id,\r\n payload: event.payload,\r\n type: event.payloadType,\r\n time: event.time / SECONDS_TO_MILLISECONDS\r\n });\r\n break;\r\n }\r\n case LiveTimelineEventType.Slide: {\r\n const slideStream = this.player.multistream().getSlideStream();\r\n slideStream.addSlide(event)\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n #handleInterval() {\r\n const currentStatus = _status.get(this);\r\n switch (currentStatus) {\r\n case PresentationStatus.Live:\r\n case PresentationStatus.LivePaused: {\r\n if (this.player?.reporting?.().playbackTicket) {\r\n this.#checkLiveEvents();\r\n }\r\n this.#checkLiveStatus();\r\n break;\r\n }\r\n case PresentationStatus.OpenForLive:\r\n case PresentationStatus.ScheduledForLive: {\r\n this.#checkLiveStatus();\r\n break;\r\n }\r\n default: {\r\n // No action needed.\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns a Promise that resolves when the live stream has been running long enough for us to safely begin playback.\r\n * @returns {Promise}\r\n **/\r\n waitUntilSafe() {\r\n return new Promise((resolve, reject) => {\r\n // Determine how long to wait before setting the source. HLS streams can involve some amount of delay,\r\n // so if we try to load before the server is ready then there will be errors loading the initial segment(s).\r\n\r\n const safeSegmentLength = SEGMENT_LENGTH_TO_UNSAFE_SECONDS[this.segmentLength];\r\n const timeSinceLiveStarted = Date.now() - this.liveStartUnixTimeInMs;\r\n const delay = timeSinceLiveStarted > safeSegmentLength ? 0 : safeSegmentLength - timeSinceLiveStarted;\r\n\r\n setTimeout(resolve, delay);\r\n });\r\n }\r\n\r\n /**\r\n * @type {PresentationStatus}\r\n */\r\n get status() {\r\n return _status.get(this);\r\n }\r\n\r\n //#region Live Playcover Methods\r\n\r\n #createBroadcastStartTimeLabel() {\r\n const GenericComponent = videojs.getComponent('Component');\r\n\r\n //create broadcast start time label wrapper\r\n const broadcastBeginComponent = new GenericComponent(this.player);\r\n broadcastBeginComponent.addClass('broadcast-start-time-label')\r\n\r\n //create broadcast start time label description div\r\n const broadcastBeginLabel = new GenericComponent(this.player);\r\n broadcastBeginLabel.el().textContent = localize(\"The broadcast will begin:\")\r\n\r\n //create broadcast start time label datetime div\r\n const broadcastDateComponent = new GenericComponent(this.player)\r\n const broadcastDate = new Date(this.unixTime)\r\n const time = broadcastDate.toLocaleTimeString([LOCALE], { hour: 'numeric', minute: '2-digit' })\r\n const date = new Intl.DateTimeFormat([LOCALE], { year: 'numeric', month: 'long', day: 'numeric' }).format(broadcastDate);\r\n const TIME_DATE_BROADCAST_LABEL = localize('%%0%% on %%1%%');\r\n broadcastDateComponent.el().textContent = replacePlaceholders(TIME_DATE_BROADCAST_LABEL, time, date)\r\n\r\n //add description and datetime divs to wrapper\r\n broadcastBeginComponent.addChild(broadcastBeginLabel);\r\n broadcastBeginComponent.addChild(broadcastDateComponent);\r\n\r\n //return entire label component\r\n return broadcastBeginComponent;\r\n }\r\n\r\n #createLiveCountdownDisplay() {\r\n const countdownComponent = new LiveCountdown(this.player, {\r\n unixTime: this.unixTime,\r\n onTimerFinished: () => this.#checkLiveStatus()\r\n });\r\n _countdownComponent.set(this, countdownComponent);\r\n return countdownComponent;\r\n }\r\n\r\n #createScheduledForLivePlaycover() {\r\n let overlayComponent = _overlayComponent.get(this);\r\n if (!overlayComponent) {\r\n //Create live playcover overlay component\r\n overlayComponent = new Overlay(this.player, {\r\n position: OverlayPosition.Center,\r\n });\r\n _overlayComponent.set(this, overlayComponent);\r\n\r\n //Add 'The broadcast will begin:...' div to playcover\r\n const broadcastStartTimeLabel = this.#createBroadcastStartTimeLabel();\r\n overlayComponent.addChild(broadcastStartTimeLabel);\r\n\r\n //If countdown enabled, add countdown to playcover\r\n if (this.enableCountdown) {\r\n const countdownComponent = this.#createLiveCountdownDisplay();\r\n overlayComponent.addChild(countdownComponent);\r\n }\r\n overlayComponent.addClass('countdown-overlay')\r\n this.player.playcover().addComponent(overlayComponent);\r\n }\r\n }\r\n\r\n //endregion\r\n\r\n /**\r\n * @private\r\n * @param {string} status\r\n */\r\n #updateStatus(status) {\r\n const currentStatus = _status.get(this);\r\n let newStatus = status;\r\n if (newStatus === PresentationStatus.Live && this.delayLiveIndicationUntilPresentationDate && Date.now() < this.unixTime) {\r\n newStatus = PresentationStatus.ScheduledForLive;\r\n }\r\n\r\n if (newStatus !== currentStatus) {\r\n _status.set(this, newStatus);\r\n this.player.trigger('livestatuschanged', newStatus);\r\n switch (newStatus) {\r\n case PresentationStatus.Live:\r\n case PresentationStatus.LivePaused: {\r\n if (this.player.autoplay()) {\r\n //MVP 689: Don't mute on live pause/resume\r\n if (currentStatus !== PresentationStatus.Live && currentStatus !== PresentationStatus.LivePaused) {\r\n this.player.loader().loadPresentation().then(() => {\r\n this.player.playcover().visible = false;\r\n });\r\n }\r\n }\r\n else {\r\n this.player.playcover().showPlayButton = true;\r\n this.player.playcover().clickable = true;\r\n\r\n const liveIndicatorComponent = new Overlay(this.player, {\r\n position: OverlayPosition.TopLeft,\r\n text: localize('Live'),\r\n className: 'mediasite-player__live-indicator'\r\n });\r\n _liveIndicatorComponent.set(this, liveIndicatorComponent);\r\n this.player.playcover().addComponent(liveIndicatorComponent);\r\n }\r\n\r\n _overlayComponent.get(this)?.dispose();\r\n _countdownComponent.get(this)?.dispose();\r\n\r\n this.#handleLiveNotification(newStatus);\r\n break;\r\n }\r\n case PresentationStatus.OpenForLive:\r\n case PresentationStatus.ScheduledForLive: {\r\n // Presentation hasn't started yet.\r\n // Show a countdown or \"broadcast will begin\" message if the live broadcast hasn't started yet\r\n this.player.playcover().showPlayButton = false;\r\n this.player.playcover().clickable = false;\r\n\r\n this.#createScheduledForLivePlaycover();\r\n\r\n break;\r\n }\r\n case PresentationStatus.LiveEnded:\r\n case PresentationStatus.OnDemand:\r\n case PresentationStatus.NotAvailable: {\r\n break;\r\n }\r\n default: {\r\n this.log(`Status not implemented: \"${newStatus}\"`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n #handleLiveNotification(status) {\r\n if (status === PresentationStatus.LivePaused) {\r\n const liveBroadcastId = this.player.notifications().add(localize('Live broadcast was paused'), {\r\n timeout: Infinity,\r\n });\r\n\r\n _liveBroadcastNotification.set(this, liveBroadcastId);\r\n } else if (status === PresentationStatus.Live) {\r\n const livePausedNotication = _liveBroadcastNotification.get(this);\r\n\r\n if (livePausedNotication) {\r\n this.player.notifications().add(localize('Live broadcast has resumed'), {\r\n timeout: Infinity,\r\n });\r\n if (this.player.notifications().hasDisplayItem(livePausedNotication)) {\r\n this.player.notifications().remove(livePausedNotication);\r\n } \r\n _liveBroadcastNotification.set(this, null);\r\n }\r\n } \r\n }\r\n\r\n //#region Live Ending Methods\r\n\r\n /**\r\n * Ends live playback and notifies the user that the presentation has ended.\r\n */\r\n endLive() {\r\n if (!_liveBroadcastEndedMessage.get(this)) {\r\n this.player.pause();\r\n this.player.timedEvents().remove(LIVE_ENDED_EVENT_ID);\r\n\r\n //Store Ended message so we don't overlay ended messages on each other.\r\n const liveBroadcastMessage = this.player.showMessage('Live broadcast has ended.', { uncloseable: !this.enableDvr });\r\n _liveBroadcastEndedMessage.set(this, liveBroadcastMessage);\r\n\r\n this.player.pause();\r\n this.player.removeClass('vjs-waiting');\r\n this.liveTeardown();\r\n }\r\n }\r\n\r\n /**\r\n * Teardown live\r\n * */\r\n liveTeardown() {\r\n clearInterval(_interval.get(this));\r\n _interval.delete(this);\r\n\r\n this.player.playcover().showPlayButton = false;\r\n this.player.playcover().clickable = false;\r\n\r\n _liveIndicatorComponent.get(this)?.dispose();\r\n _overlayComponent.get(this)?.dispose();\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Error Handling Methods\r\n\r\n #handleRetryPlaylist() {\r\n // Live presentation media can end abruptly if the live-end countdown on the\r\n // recorder is cancelled early. This can cause the the media element's\r\n // buffer to run dry, resulting in a stalled player waiting to reach the end event.\r\n // This is especially truewith Smooth Streaming content. We don't want the user\r\n // to be stuck in a loading state indefinitely and would like to ensure\r\n // that the player UI makes it into presentation-ended state.\r\n\r\n // Though the presentation ended event may be scheduled for some time in the\r\n // future, if we've seen it come from the server, we're safe to just\r\n // transition to the presentation-ended state.\r\n if (this.#haveSeenPresentationEndEvent() && this.enableDvr === false) {\r\n this.log('The media element raised an exception at the end of a live presentation. liveEndTime = ' + this.liveEndTime);\r\n this.endLive();\r\n return;\r\n }\r\n }\r\n\r\n #handleMediaError(error) {\r\n const currentStatus = _status.get(this);\r\n\r\n switch (currentStatus) {\r\n case PresentationStatus.Live:\r\n case PresentationStatus.LivePaused:\r\n this.player.loadingSpinner.show();\r\n this.player.loadingSpinner.addClass('vjs-waiting');\r\n this.player.errorDisplay.hide();\r\n const error = this.player.error();\r\n if ((error.code === MediaErrorType.NetworkError || error.code === MediaErrorType.SrcNotSupported)) {\r\n this.log(\"Error loading presentation, reloading.\")\r\n setTimeout(() => {\r\n const media = this.player.getMedia();\r\n this.player.reset();\r\n this.player.muted(true);\r\n this.player.src(media.src);\r\n this.player.load();\r\n }, RETRY_DELAY);\r\n } else {\r\n this.#errorChecks();\r\n }\r\n break;\r\n case PresentationStatus.LiveEnded:\r\n case PresentationStatus.NotAvailable:\r\n case PresentationStatus.OnDemand:\r\n // Looks like a live presentation ended and we were lucky enough to get\r\n // a play status update before the media error. Woo-hoo!\r\n this.log('The media element raised an exception after a transition to LiveEnded or NotAvailable.');\r\n this.endLive();\r\n break;\r\n default:\r\n this.errorChecks();\r\n break;\r\n } \r\n };\r\n\r\n /**\r\n * Series of checks when an error occurs to make sure the presentation hasn't ended before displaying the error message\r\n **/\r\n #errorChecks() {\r\n const self = this;\r\n // Live presentation media can end abruptly if the live-end countdown on the\r\n // recorder is cancelled early. This can cause the the media element's\r\n // buffer to run dry, resulting in a media error. This is especially true\r\n // with Smooth Streaming content. We don't want to bother the user with these\r\n // errors and would like to ensure that the player UI makes it into\r\n // presentation-ended state.\r\n\r\n // Though the presentation ended event may be scheduled for some time in the\r\n // future, if we've seen it come from the server, we're safe to just\r\n // transition to the presentation-ended state.\r\n if (this.#haveSeenPresentationEndEvent() && this.enableDvr === false) {\r\n this.log('The media element raised an exception at the end of a live presentation. liveEndTime = ' + this.liveEndTime);\r\n this.endLive();\r\n return;\r\n }\r\n\r\n // Immediately check the server for a Presentation End event.\r\n this.#checkServerForPresentationEndEvent(0, function () {\r\n\r\n // We didn't get an End event, but we can't give up yet. \r\n // The server caches live events for some seconds, so we need \r\n // to check again after an appropriate delay to be sure \r\n // that the cache isn't hiding our sacred End event.\r\n var delay = 5.1 * SECONDS_TO_MILLISECONDS; // Cache expiration is set to 5 seconds.\r\n this.#checkServerForPresentationEndEvent(delay, function () {\r\n // Huh, this looks like an actual error.\r\n // I guess we should report it.\r\n self.#reportError()\r\n });\r\n });\r\n }\r\n\r\n #reportError() {\r\n this.log(this.player.error());\r\n //Sometimes if there is an error, the spinner stays spinning over the error message\r\n //In cases where we know there is an error and want to show it, we remove the spinner if it exists\r\n const loadingSpinner = this.player.getChild('LoadingSpinner');\r\n if (loadingSpinner != null) {\r\n loadingSpinner.hide();\r\n }\r\n }\r\n\r\n #haveSeenPresentationEndEvent() {\r\n return (this.liveEndTime > 0);\r\n }\r\n\r\n #checkServerForPresentationEndEvent(msToDelay, notYetEndedCallback) {\r\n this.log('Checking the server for the Presentation Ended event. Delay = ' + msToDelay);\r\n setTimeout(function () {\r\n getLiveEvents(function (success) {\r\n if (this.#haveSeenPresentationEndEvent() && this.enableDvr === false) {\r\n this.log('The media element raised an exception at the end of a live presentation. liveEndTime = ' + this.liveEndTime);\r\n this.endLive();\r\n } else {\r\n notYetEndedCallback();\r\n }\r\n });\r\n }, msToDelay);\r\n }\r\n\r\n //endregion\r\n\r\n dispose() {\r\n const liveIndicatorComponent = _liveIndicatorComponent.get(this);\r\n const overlayComponent = _overlayComponent.get(this);\r\n\r\n if (this.player?.usingPlugin('playcover')) {\r\n this.player.playcover().removeComponent(overlayComponent);\r\n this.player.playcover().removeComponent(liveIndicatorComponent);\r\n }\r\n if (this.player?.usingPlugin('timedEvents')) {\r\n this.player.timedEvents().remove(LIVE_ENDED_EVENT_ID);\r\n }\r\n this.off(this.player, 'play', this.#handlePlay);\r\n\r\n clearInterval(_interval.get(this));\r\n\r\n super.dispose();\r\n }\r\n}\r\n\r\nexport { LivePlugin };\r\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".mediasite-player__live-indicator {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.mediasite-player__live-indicator::before {\\r\\n content: \\\"\\\";\\r\\n display: inline-block;\\r\\n width: 1em;\\r\\n height: 1em;\\r\\n background-color: red;\\r\\n border-radius: .5em;\\r\\n margin-right: .5em;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./../../../../../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/live.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,aAAa;IACb,mBAAmB;AACvB;;AAEA;IACI,WAAW;IACX,qBAAqB;IACrB,UAAU;IACV,WAAW;IACX,qBAAqB;IACrB,mBAAmB;IACnB,kBAAkB;AACtB\",\"sourcesContent\":[\".mediasite-player__live-indicator {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n}\\r\\n\\r\\n.mediasite-player__live-indicator::before {\\r\\n content: \\\"\\\";\\r\\n display: inline-block;\\r\\n width: 1em;\\r\\n height: 1em;\\r\\n background-color: red;\\r\\n border-radius: .5em;\\r\\n margin-right: .5em;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".countdown-overlay {\\r\\n font-size: var(--playcover-font-size);\\r\\n max-width: 90%;\\r\\n max-height: 70%;\\r\\n padding: 1em 2em;\\r\\n border-radius: 8px;\\r\\n}\\r\\n\\r\\n.countdown-overlay.countdown-timer-visible {\\r\\n padding-top: 2em;\\r\\n}\\r\\n\\r\\n.countdown-label {\\r\\n font-size: 2em;\\r\\n}\\r\\n\\r\\n.broadcast-start-time-label {\\r\\n font-size: 1.5em;\\r\\n}\\r\\n\\r\\n.mediasite-player__live-countdown {\\r\\n line-height: 1;\\r\\n padding: 1em 0em;\\r\\n}\\r\\n\\r\\n.time-wrapper-Days, .time-wrapper-Hours, .time-wrapper-Minutes, .time-wrapper-Seconds {\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.time-number-wrapper-Days, .time-number-wrapper-Hours, .time-number-wrapper-Minutes, .time-number-wrapper-Seconds {\\r\\n font-size: 4.2em;\\r\\n}\\r\\n\\r\\n.time-word-wrapper-Days, .time-word-wrapper-Hours, .time-word-wrapper-Minutes, .time-word-wrapper-Seconds {\\r\\n font-size: 1.2em;\\r\\n}\\r\\n\\r\\n.time-separator {\\r\\n width: 0.5em;\\r\\n display: inline-block;\\r\\n font-size: 4.2em;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n@media (min-width: 0px) and (max-width: 350px) {\\r\\n .countdown-overlay {\\r\\n font-size: calc(0.7 * var(--playcover-font-size));\\r\\n max-width: 95%;\\r\\n padding: 1em 1em;\\r\\n }\\r\\n}\\r\\n@media (min-width: 350px) and (max-width: 450px) {\\r\\n .countdown-overlay {\\r\\n font-size: calc(0.7 * var(--playcover-font-size));\\r\\n }\\r\\n}\\r\\n\\r\\n@media (min-width: 450px) and (max-width: 550px) {\\r\\n .countdown-overlay {\\r\\n font-size: calc(0.8 * var(--playcover-font-size));\\r\\n }\\r\\n}\\r\\n\\r\\n@media (min-width: 550px) and (max-width: 650px) {\\r\\n .countdown-overlay {\\r\\n font-size: calc(0.9 * var(--playcover-font-size));\\r\\n }\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./../../../../../GitLabRunner/builds/MaDYF1-sx/0/espial/mediasite/server/mvp/Mediasite/Server/Player/Player/src/plugins/conditional/live/live-countdown.css\"],\"names\":[],\"mappings\":\"AAAA;IACI,qCAAqC;IACrC,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,kBAAkB;AACtB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,cAAc;AAClB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,cAAc;IACd,gBAAgB;AACpB;;AAEA;IACI,qBAAqB;AACzB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,gBAAgB;AACpB;;AAEA;IACI,YAAY;IACZ,qBAAqB;IACrB,gBAAgB;IAChB,mBAAmB;AACvB;;AAEA;IACI;QACI,iDAAiD;QACjD,cAAc;QACd,gBAAgB;IACpB;AACJ;AACA;IACI;QACI,iDAAiD;IACrD;AACJ;;AAEA;IACI;QACI,iDAAiD;IACrD;AACJ;;AAEA;IACI;QACI,iDAAiD;IACrD;AACJ\",\"sourcesContent\":[\".countdown-overlay {\\r\\n font-size: var(--playcover-font-size);\\r\\n max-width: 90%;\\r\\n max-height: 70%;\\r\\n padding: 1em 2em;\\r\\n border-radius: 8px;\\r\\n}\\r\\n\\r\\n.countdown-overlay.countdown-timer-visible {\\r\\n padding-top: 2em;\\r\\n}\\r\\n\\r\\n.countdown-label {\\r\\n font-size: 2em;\\r\\n}\\r\\n\\r\\n.broadcast-start-time-label {\\r\\n font-size: 1.5em;\\r\\n}\\r\\n\\r\\n.mediasite-player__live-countdown {\\r\\n line-height: 1;\\r\\n padding: 1em 0em;\\r\\n}\\r\\n\\r\\n.time-wrapper-Days, .time-wrapper-Hours, .time-wrapper-Minutes, .time-wrapper-Seconds {\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.time-number-wrapper-Days, .time-number-wrapper-Hours, .time-number-wrapper-Minutes, .time-number-wrapper-Seconds {\\r\\n font-size: 4.2em;\\r\\n}\\r\\n\\r\\n.time-word-wrapper-Days, .time-word-wrapper-Hours, .time-word-wrapper-Minutes, .time-word-wrapper-Seconds {\\r\\n font-size: 1.2em;\\r\\n}\\r\\n\\r\\n.time-separator {\\r\\n width: 0.5em;\\r\\n display: inline-block;\\r\\n font-size: 4.2em;\\r\\n vertical-align: top;\\r\\n}\\r\\n\\r\\n@media (min-width: 0px) and (max-width: 350px) {\\r\\n .countdown-overlay {\\r\\n font-size: calc(0.7 * var(--playcover-font-size));\\r\\n max-width: 95%;\\r\\n padding: 1em 1em;\\r\\n }\\r\\n}\\r\\n@media (min-width: 350px) and (max-width: 450px) {\\r\\n .countdown-overlay {\\r\\n font-size: calc(0.7 * var(--playcover-font-size));\\r\\n }\\r\\n}\\r\\n\\r\\n@media (min-width: 450px) and (max-width: 550px) {\\r\\n .countdown-overlay {\\r\\n font-size: calc(0.8 * var(--playcover-font-size));\\r\\n }\\r\\n}\\r\\n\\r\\n@media (min-width: 550px) and (max-width: 650px) {\\r\\n .countdown-overlay {\\r\\n font-size: calc(0.9 * var(--playcover-font-size));\\r\\n }\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n"],"sourceRoot":""}